<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>57372</bug_id>
          
          <creation_ts>2011-03-29 11:58:31 -0700</creation_ts>
          <short_desc>LevelDB backend for IndexedDB</short_desc>
          <delta_ts>2011-04-28 03:14:44 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>58343</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jeremy Orlow">jorlow</reporter>
          <assigned_to name="Hans Wennborg">hans</assigned_to>
          <cc>abarth</cc>
    
    <cc>andreip</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dgrogan</cc>
    
    <cc>dgrogan</cc>
    
    <cc>eric</cc>
    
    <cc>jorlow</cc>
    
    <cc>steveblock</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>375626</commentid>
    <comment_count>0</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-29 11:58:31 -0700</bug_when>
    <thetext>LevelDB backend for IndexedDB</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375627</commentid>
    <comment_count>1</comment_count>
      <attachid>87384</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-29 11:59:00 -0700</bug_when>
    <thetext>Created attachment 87384
patch by hans</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375638</commentid>
    <comment_count>2</comment_count>
      <attachid>87386</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-29 12:02:16 -0700</bug_when>
    <thetext>Created attachment 87386
patch by hans</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375641</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-03-29 12:03:04 -0700</bug_when>
    <thetext>Attachment 87384 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;]&quot; exit_code: 1

Total errors found: 0 in 0 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375671</commentid>
    <comment_count>4</comment_count>
    <who name="David Grogan">dgrogan</who>
    <bug_when>2011-03-29 12:38:54 -0700</bug_when>
    <thetext>
Just a few bike-sheddy questions.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:84
&gt; +static int64_t decodeInt(const std::string&amp; s)

It appears leveldb only stores strings and these functions convert our data types to types that leveldb can store?

If these are good encoding routines would it be appropriate to migrate them to the leveldb side?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:128
&gt; +        unsigned char hi = (u &gt;&gt; 8) &amp; 0xff;

what does &amp;ing with 0xff do?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375919</commentid>
    <comment_count>5</comment_count>
      <attachid>87386</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-29 17:22:52 -0700</bug_when>
    <thetext>Comment on attachment 87386
patch by hans

View in context: https://bugs.webkit.org/attachment.cgi?id=87386&amp;action=review

ok...that&apos;s enough for one day

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:29
&gt; +#if ENABLE(INDEXED_DATABASE)

This should have some additional feature define for leveldb.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:41
&gt; +

This file needs a big block comment describing the file format and a couple sentences about the design goals.  There&apos;s no way the code can be the documentation for something like this...

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:63
&gt; +    for (size_t i = 0; i &lt; s.length(); i++) {

++i

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:64
&gt; +        unsigned char c = s[i];

this seems slightly unnecessary, but *shrug*

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:65
&gt; +        printf(&quot;%02x&quot;, (int)c);

static_cast?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:73
&gt; +    std::string ret;

maybe resize?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:88
&gt; +    for (size_t i = 0; i  &lt; s.length(); i++) {

++i

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:90
&gt; +        ret = ret &lt;&lt; 8 | c;

&lt;&lt;=

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:101
&gt; +        unsigned char c = n &amp; (128 - 1);

0x7F maybe is a bit more clear?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:111
&gt; +static const char* decodeVarInt(const char *p, int64_t &amp;foundInt)

Anywhere that we pass a pointer, we need to pass the max size.  If this crosses the size, it should probably return NULL.  And the caller should probably handle it.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:116
&gt; +        foundInt = (foundInt &lt;&lt; 7) | (*p &amp; (128 - 1));

0x7F seems more clear/standard

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:129
&gt; +        unsigned char lo = u &amp; 0xff;

earlier you skipped the &amp; 0xff...maybe be consistent?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:144
&gt; +    for (size_t i = 0; i &lt; s.length(); i+=2) {

i += 2

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:193
&gt; +    std::string ret;

Please document with FIXMEs all the places we should be sizing a string ahead of time.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:241
&gt; +static int countBytes(int64_t n)

The name isn&apos;t super clear here.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:268
&gt; +static const char* decodePrefix(const char* p, int64_t&amp; databaseId, int64_t&amp; objectStoreId, int64_t&amp; indexId)

Here and elsewhere, we need to be more careful to ensure that we&apos;re not reading invalid p memory.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:274
&gt; +    int indexBytes = (firstByte &amp; 0x7) + 1;

this is 0x3 right?

Anything else you can think of that might be off like this?  Can you check?  Cause that&apos;d be bad...

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:308
&gt; +static std::string makeKey(int64_t databaseId, int64_t objectStoreId, int64_t indexId, int nbr, const String&amp; str)

s/nbr/number/...and what number?

These make key methods are kind of confusing and seem somewhat ad-hoc...  Like, if you do a number and then a string, the string is encoded with its length.  Otherwise not.  I feel like you should probably name these proper names rather than just overloading makeKey since subtleties creep in with each overloaded version.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:356
&gt; +    else if (!s.ok()) {

if you just returned, then do an if, not else if

of course, this coudl jsut be an ASSERT

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:379
&gt; +static bool getString(leveldb::DB* db, const std::string&amp; key, String* foundString)

I feel like the names might not be descriptive enough?  It&apos;s not clear that, for example, I wouldn&apos;t use this to get a normal key out of the object store data that happens to be a string.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:389
&gt; +    else if (!s.ok()) {

ASSERT

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:414
&gt; +class MyComparator : public leveldb::Comparator {

Couldn&apos;t we just call it Comparator?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:445
&gt; +        if (*p != *q) return *p - *q; // FIXME: Think this through.

Yeah, this will screw up locality....  It seems worth doing the initial decode always

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:457
&gt; +        if (a1 == 0) {

This logic would be so much easier to follow if you had good variable names.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:618
&gt; +    void FindShortestSeparator(std::string*, const leveldb::Slice&amp;) const {} // FIXME: Ignore?

No, we should definitely implement this and the following.  Unfortunately, I don&apos;t have any great ideas about how not to nearly duplicate all the above logic for each one.  A lot of the ways I could think of to make it cleaner would likely make it slower as well.  Maybe just ignore for now, but &quot;fix&quot; it once we&apos;re sure our file format is stable and add a comment saying that whenever one is changed, all need to be?  It&apos;s going to be hard to catch errors in this with layout tests tho....

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:620
&gt; +} myComparator;

couldn&apos;t we just call it comparator?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:651
&gt; +        pathBase2 = &quot;/tmp/in-mem-leveldb&quot;;

ASSERT_NOT_REACHED here until we figure out what we should do.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:655
&gt; +        // FIXME: Is there any other thing we could possibly do to recover at this point? If so, do it rather than just erroring out.

I think thi sis fine.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:656
&gt; +        LOG_ERROR(&quot;Unabled to create LocalStorage database path %s&quot;, pathBase.utf8().data());

LocalStorage?

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:659
&gt; +    String path = pathByAppendingComponent(pathBase2, securityOrigin-&gt;databaseIdentifier() + &quot;.indexeddb.leveldb&quot;);

We&apos;re going to have one big one shared eventually...but I guess this is OK for now.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:665
&gt; +    // FIXME: We need a custom comparator. Byte-wise comparison won&apos;t work :(

delete

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1574
&gt; +    IndexCursorImpl(leveldb::DB* db, const std::string&amp; lowKey, bool lowOpen, const std::string&amp; highKey, bool highOpen, bool forward)

I know this class is private, but you shoudl probably hide the constructor and add a create method.

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1594
&gt; +    //printf(&quot;IndexCursor::loadCurrentRow()\n&quot;);

If you think this debug code will still be useful, I&apos;m OK with it staying in a bit longer as long as you have a FIXME at the top to remove it soon.  Ideally remove it before landing though or make it use WebKit&apos;s standard logging methods (...which I think exist somewhere...?).

&gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1599
&gt; +    const char* p = m_iterator-&gt;key().data();

not a fan of these variable names.  or p or q</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376167</commentid>
    <comment_count>6</comment_count>
      <attachid>87495</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-30 03:25:04 -0700</bug_when>
    <thetext>Created attachment 87495
full patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376168</commentid>
    <comment_count>7</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-30 03:26:46 -0700</bug_when>
    <thetext>Thanks for reviewing, Jeremy. I&apos;ve uploaded the full patch so it&apos;s easier to see how it all fits together.

Will start addressing your comments during the day.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376169</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-03-30 03:27:35 -0700</bug_when>
    <thetext>Attachment 87495 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Last 3072 characters of output:
nd comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1389:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1390:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1391:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1392:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1406:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1459:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1460:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1461:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1462:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1463:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1464:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1515:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1516:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1517:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1553:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1554:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1555:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1594:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1595:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1596:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1624:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1639:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp:301:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 189 in 17 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376448</commentid>
    <comment_count>9</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-30 10:30:49 -0700</bug_when>
    <thetext>Adding andreip to keep him in the loop to.


(In reply to comment #4)
&gt; Just a few bike-sheddy questions.
&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:84
&gt; &gt; +static int64_t decodeInt(const std::string&amp; s)
&gt; 
&gt; It appears leveldb only stores strings and these functions convert our data types to types that leveldb can store?
&gt; 
&gt; If these are good encoding routines would it be appropriate to migrate them to the leveldb side?

Yeah, we could look into that when this code is more stable (the functions might still change a bit).

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:128
&gt; &gt; +        unsigned char hi = (u &gt;&gt; 8) &amp; 0xff;
&gt; 
&gt; what does &amp;ing with 0xff do?

I think that was just me being paranoid :) Removed.

(In reply to comment #5)
&gt; (From update of attachment 87386 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=87386&amp;action=review
&gt; 
&gt; ok...that&apos;s enough for one day
&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:29
&gt; &gt; +#if ENABLE(INDEXED_DATABASE)
&gt; 
&gt; This should have some additional feature define for leveldb.
I&apos;ve now put it behind ENABLE(LEVELDB).

&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:41
&gt; &gt; +
&gt; 
&gt; This file needs a big block comment describing the file format and a couple sentences about the design goals.  There&apos;s no way the code can be the documentation for something like this...

Yup, will do this.

I&apos;d also like to write some class that can represent, encode, and decode all keys rather than having that stuff spread out everywhere. 

It should make the code much more clear, and it could probably be made more efficient too.

I&apos;ll see if I can get something together tomorrow.

&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:63
&gt; &gt; +    for (size_t i = 0; i &lt; s.length(); i++) {
&gt; 
&gt; ++i
Done.

&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:64
&gt; &gt; +        unsigned char c = s[i];
&gt; 
&gt; this seems slightly unnecessary, but *shrug*
Yeah, won&apos;t land that anyway.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:65
&gt; &gt; +        printf(&quot;%02x&quot;, (int)c);
&gt; 
&gt; static_cast?
Ditto.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:73
&gt; &gt; +    std::string ret;
&gt; 
&gt; maybe resize?
Yes, I&apos;ll look into this.

Also, does anyone know which is fastest, or otherwise preferred?

string s;
s.reserve(some_size);

Or:

string s(some_size, &apos;\0&apos;);

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:88
&gt; &gt; +    for (size_t i = 0; i  &lt; s.length(); i++) {
&gt; 
&gt; ++i
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:90
&gt; &gt; +        ret = ret &lt;&lt; 8 | c;
&gt; 
&gt; &lt;&lt;=
Nah, I want to or in c at the same time..?
Adding parentheses to make this more clear.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:101
&gt; &gt; +        unsigned char c = n &amp; (128 - 1);
&gt; 
&gt; 0x7F maybe is a bit more clear?
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:111
&gt; &gt; +static const char* decodeVarInt(const char *p, int64_t &amp;foundInt)
&gt; 
&gt; Anywhere that we pass a pointer, we need to pass the max size.  If this crosses the size, it should probably return NULL.  And the caller should probably handle it.

Adding the max size (but in form of a &quot;limit&quot; pointer). Checking return values in some places, but will add more checks.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:116
&gt; &gt; +        foundInt = (foundInt &lt;&lt; 7) | (*p &amp; (128 - 1));
&gt; 
&gt; 0x7F seems more clear/standard
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:129
&gt; &gt; +        unsigned char lo = u &amp; 0xff;
&gt; 
&gt; earlier you skipped the &amp; 0xff...maybe be consistent?
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:144
&gt; &gt; +    for (size_t i = 0; i &lt; s.length(); i+=2) {
&gt; 
&gt; i += 2
Rewrote that code.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:193
&gt; &gt; +    std::string ret;
&gt; 
&gt; Please document with FIXMEs all the places we should be sizing a string ahead of time.
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:241
&gt; &gt; +static int countBytes(int64_t n)
&gt; 
&gt; The name isn&apos;t super clear here.
Okay, trying countNonZeroBytes.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:268
&gt; &gt; +static const char* decodePrefix(const char* p, int64_t&amp; databaseId, int64_t&amp; objectStoreId, int64_t&amp; indexId)
&gt; 
&gt; Here and elsewhere, we need to be more careful to ensure that we&apos;re not reading invalid p memory.
&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:274
&gt; &gt; +    int indexBytes = (firstByte &amp; 0x7) + 1;
&gt; 
&gt; this is 0x3 right?
Ouch, you&apos;re right. Good catch.

&gt; 
&gt; Anything else you can think of that might be off like this?  Can you check?  Cause that&apos;d be bad...
Not that I can think of, but I will keep looking. Btw, is there any way we could test this in our existing suite? Can webkit_unittests reach into WebCore, for example?

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:308
&gt; &gt; +static std::string makeKey(int64_t databaseId, int64_t objectStoreId, int64_t indexId, int nbr, const String&amp; str)
&gt; 
&gt; s/nbr/number/...and what number?
&gt; 
&gt; These make key methods are kind of confusing and seem somewhat ad-hoc...  Like, if you do a number and then a string, the string is encoded with its length.  Otherwise not.  I feel like you should probably name these proper names rather than just overloading makeKey since subtleties creep in with each overloaded version.

Yeah, this needs to be structured better.. it should all go into that key representation/encoding/decoding thing I&apos;m thinking of.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:356
&gt; &gt; +    else if (!s.ok()) {
&gt; 
&gt; if you just returned, then do an if, not else if
&gt; 
&gt; of course, this coudl jsut be an ASSERT
Fixed this.

I think the style bot checks for this.. I&apos;ll address all those issues before uploading.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:379
&gt; &gt; +static bool getString(leveldb::DB* db, const std::string&amp; key, String* foundString)
&gt; 
&gt; I feel like the names might not be descriptive enough?  It&apos;s not clear that, for example, I wouldn&apos;t use this to get a normal key out of the object store data that happens to be a string.

Yeah, I&apos;m not sure it&apos;s worth keeping these (getString/putString/getInt/putInt) around actually..

Would renaming to getWTFString be better for now?

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:389
&gt; &gt; +    else if (!s.ok()) {
&gt; 
&gt; ASSERT
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:414
&gt; &gt; +class MyComparator : public leveldb::Comparator {
&gt; 
&gt; Couldn&apos;t we just call it Comparator?

Sure. Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:445
&gt; &gt; +        if (*p != *q) return *p - *q; // FIXME: Think this through.
&gt; 
&gt; Yeah, this will screw up locality....  It seems worth doing the initial decode always

How do you mean screw up locality?

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:457
&gt; &gt; +        if (a1 == 0) {
&gt; 
&gt; This logic would be so much easier to follow if you had good variable names.

Yes. I want to rewrite this in the context of a class that actually knows what the data means. That would make it easier to assign variable names.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:618
&gt; &gt; +    void FindShortestSeparator(std::string*, const leveldb::Slice&amp;) const {} // FIXME: Ignore?
&gt; 
&gt; No, we should definitely implement this and the following.  Unfortunately, I don&apos;t have any great ideas about how not to nearly duplicate all the above logic for each one.  A lot of the ways I could think of to make it cleaner would likely make it slower as well.  Maybe just ignore for now, but &quot;fix&quot; it once we&apos;re sure our file format is stable and add a comment saying that whenever one is changed, all need to be?  It&apos;s going to be hard to catch errors in this with layout tests tho....

Changing the FIXME.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:620
&gt; &gt; +} myComparator;
&gt; 
&gt; couldn&apos;t we just call it comparator?

Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:651
&gt; &gt; +        pathBase2 = &quot;/tmp/in-mem-leveldb&quot;;
&gt; 
&gt; ASSERT_NOT_REACHED here until we figure out what we should do.

But I need this to be able to run DumpRenderTree. Adding a FIXME.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:655
&gt; &gt; +        // FIXME: Is there any other thing we could possibly do to recover at this point? If so, do it rather than just erroring out.
&gt; 
&gt; I think thi sis fine.
Ok.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:656
&gt; &gt; +        LOG_ERROR(&quot;Unabled to create LocalStorage database path %s&quot;, pathBase.utf8().data());
&gt; 
&gt; LocalStorage?
Heh, I think this has been copied multiple times :) Fixing.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:659
&gt; &gt; +    String path = pathByAppendingComponent(pathBase2, securityOrigin-&gt;databaseIdentifier() + &quot;.indexeddb.leveldb&quot;);
&gt; 
&gt; We&apos;re going to have one big one shared eventually...but I guess this is OK for now.

Added FIXME.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:665
&gt; &gt; +    // FIXME: We need a custom comparator. Byte-wise comparison won&apos;t work :(
&gt; 
&gt; delete
Done.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1574
&gt; &gt; +    IndexCursorImpl(leveldb::DB* db, const std::string&amp; lowKey, bool lowOpen, const std::string&amp; highKey, bool highOpen, bool forward)
&gt; 
&gt; I know this class is private, but you shoudl probably hide the constructor and add a create method.

Happy to do it, but I thought that was mostly a Chromium WebKit-layer thing? Or does it apply all over?

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1594
&gt; &gt; +    //printf(&quot;IndexCursor::loadCurrentRow()\n&quot;);
&gt; 
&gt; If you think this debug code will still be useful, I&apos;m OK with it staying in a bit longer as long as you have a FIXME at the top to remove it soon.  Ideally remove it before landing though or make it use WebKit&apos;s standard logging methods (...which I think exist somewhere...?).

Nah, removing. Keeping the printString function around for a little while, though.

&gt; 
&gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1599
&gt; &gt; +    const char* p = m_iterator-&gt;key().data();
&gt; 
&gt; not a fan of these variable names.  or p or q

Yeah, I need to do something about the key handling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376451</commentid>
    <comment_count>10</comment_count>
      <attachid>87566</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-30 10:31:29 -0700</bug_when>
    <thetext>Created attachment 87566
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>376469</commentid>
    <comment_count>11</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-03-30 10:52:08 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #4)
&gt; &gt; This should have some additional feature define for leveldb.
&gt; I&apos;ve now put it behind ENABLE(LEVELDB).

You need both LEVELDB and INDEXED_DATABASE

&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cp
&gt; Also, does anyone know which is fastest, or otherwise preferred?
&gt; 
&gt; string s;
&gt; s.reserve(some_size);

I&apos;d be surprised if this weren&apos;t the same or faster than the other.  It seems cleaner too.

&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:241
&gt; &gt; &gt; +static int countBytes(int64_t n)
&gt; &gt; 
&gt; &gt; The name isn&apos;t super clear here.
&gt; Okay, trying countNonZeroBytes.

But 0 returns 1...so the name is not quite right.  Maybe just usedBytes with a comment that 0 uses 1?


&gt; &gt; Anything else you can think of that might be off like this?  Can you check?  Cause that&apos;d be bad...
&gt; Not that I can think of, but I will keep looking. Btw, is there any way we could test this in our existing suite? Can webkit_unittests reach into WebCore, for example?

I don&apos;t see why not.  We should only use this for stuff that layout tests can&apos;t cover, but this is definitely one of them.

&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:379
&gt; &gt; &gt; +static bool getString(leveldb::DB* db, const std::string&amp; key, String* foundString)
&gt; &gt; 
&gt; &gt; I feel like the names might not be descriptive enough?  It&apos;s not clear that, for example, I wouldn&apos;t use this to get a normal key out of the object store data that happens to be a string.
&gt; 
&gt; Yeah, I&apos;m not sure it&apos;s worth keeping these (getString/putString/getInt/putInt) around actually..
&gt; 
&gt; Would renaming to getWTFString be better for now?

I think you&apos;re right that all of this just needs to be in its own class (or namespace) and such.  That should help make it more clear.

&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:445
&gt; &gt; &gt; +        if (*p != *q) return *p - *q; // FIXME: Think this through.
&gt; &gt; 
&gt; &gt; Yeah, this will screw up locality....  It seems worth doing the initial decode always
&gt; 
&gt; How do you mean screw up locality?

Hm...last night I thought I had come up with an example where this would make the sort order different than if you just compared the following 3 numbers. But now that I think about it, it seems like it shouldn&apos;t affect it.  As long as it doesn&apos;t, this is fine.


&gt; &gt; 
&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:651
&gt; &gt; &gt; +        pathBase2 = &quot;/tmp/in-mem-leveldb&quot;;
&gt; &gt; 
&gt; &gt; ASSERT_NOT_REACHED here until we figure out what we should do.
&gt; 
&gt; But I need this to be able to run DumpRenderTree. Adding a FIXME.

Hmm....well we definitely want DRT to be able to run the file backed version as well as the in-memory version if there&apos;s any substantial differences.  We may need a layoutTestController method to control this?

&gt; &gt; 
&gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1574
&gt; &gt; &gt; +    IndexCursorImpl(leveldb::DB* db, const std::string&amp; lowKey, bool lowOpen, const std::string&amp; highKey, bool highOpen, bool forward)
&gt; &gt; 
&gt; &gt; I know this class is private, but you shoudl probably hide the constructor and add a create method.
&gt; 
&gt; Happy to do it, but I thought that was mostly a Chromium WebKit-layer thing? Or does it apply all over?

It&apos;s a protect ourselves from memory leaks thing.  It&apos;s too easy to forget adoptRef.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377317</commentid>
    <comment_count>12</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-31 10:38:25 -0700</bug_when>
    <thetext>It&apos;s still a work in progress, but I&apos;ve started working on refactoring the key handling stuff.

The idea is to have a class for every key type, that knows how to encode, decode, and compare keys of its type.

I&apos;ve implemented the classes, and rewritten the Comparator to use it, but still need to replace all the places in the code where keys are created. Hoping to get this done tomorrow.

Please let me know what you think.



(In reply to comment #11)
&gt; (In reply to comment #9)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; This should have some additional feature define for leveldb.
&gt; &gt; I&apos;ve now put it behind ENABLE(LEVELDB).
&gt; 
&gt; You need both LEVELDB and INDEXED_DATABASE
Done.

&gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cp
&gt; &gt; Also, does anyone know which is fastest, or otherwise preferred?
&gt; &gt; 
&gt; &gt; string s;
&gt; &gt; s.reserve(some_size);
&gt; 
&gt; I&apos;d be surprised if this weren&apos;t the same or faster than the other.  It seems cleaner too.
&gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:241
&gt; &gt; &gt; &gt; +static int countBytes(int64_t n)
&gt; &gt; &gt; 
&gt; &gt; &gt; The name isn&apos;t super clear here.
&gt; &gt; Okay, trying countNonZeroBytes.
&gt; 
&gt; But 0 returns 1...so the name is not quite right.  Maybe just usedBytes with a comment that 0 uses 1?
Will do.

&gt; 
&gt; 
&gt; &gt; &gt; Anything else you can think of that might be off like this?  Can you check?  Cause that&apos;d be bad...
&gt; &gt; Not that I can think of, but I will keep looking. Btw, is there any way we could test this in our existing suite? Can webkit_unittests reach into WebCore, for example?
&gt; 
&gt; I don&apos;t see why not.  We should only use this for stuff that layout tests can&apos;t cover, but this is definitely one of them.

Good, I&apos;ll write some tests for this.

&gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:379
&gt; &gt; &gt; &gt; +static bool getString(leveldb::DB* db, const std::string&amp; key, String* foundString)
&gt; &gt; &gt; 
&gt; &gt; &gt; I feel like the names might not be descriptive enough?  It&apos;s not clear that, for example, I wouldn&apos;t use this to get a normal key out of the object store data that happens to be a string.
&gt; &gt; 
&gt; &gt; Yeah, I&apos;m not sure it&apos;s worth keeping these (getString/putString/getInt/putInt) around actually..
&gt; &gt; 
&gt; &gt; Would renaming to getWTFString be better for now?
&gt; 
&gt; I think you&apos;re right that all of this just needs to be in its own class (or namespace) and such.  That should help make it more clear.
&gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:445
&gt; &gt; &gt; &gt; +        if (*p != *q) return *p - *q; // FIXME: Think this through.
&gt; &gt; &gt; 
&gt; &gt; &gt; Yeah, this will screw up locality....  It seems worth doing the initial decode always
&gt; &gt; 
&gt; &gt; How do you mean screw up locality?
&gt; 
&gt; Hm...last night I thought I had come up with an example where this would make the sort order different than if you just compared the following 3 numbers. But now that I think about it, it seems like it shouldn&apos;t affect it.  As long as it doesn&apos;t, this is fine.
&gt; 
&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:651
&gt; &gt; &gt; &gt; +        pathBase2 = &quot;/tmp/in-mem-leveldb&quot;;
&gt; &gt; &gt; 
&gt; &gt; &gt; ASSERT_NOT_REACHED here until we figure out what we should do.
&gt; &gt; 
&gt; &gt; But I need this to be able to run DumpRenderTree. Adding a FIXME.
&gt; 
&gt; Hmm....well we definitely want DRT to be able to run the file backed version as well as the in-memory version if there&apos;s any substantial differences.  We may need a layoutTestController method to control this?

Yeah, I&apos;ll have to look into this.

&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; /Users/jorlow/Desktop/IDBLevelDBBackingStore.cpp:1574
&gt; &gt; &gt; &gt; +    IndexCursorImpl(leveldb::DB* db, const std::string&amp; lowKey, bool lowOpen, const std::string&amp; highKey, bool highOpen, bool forward)
&gt; &gt; &gt; 
&gt; &gt; &gt; I know this class is private, but you shoudl probably hide the constructor and add a create method.
&gt; &gt; 
&gt; &gt; Happy to do it, but I thought that was mostly a Chromium WebKit-layer thing? Or does it apply all over?
&gt; 
&gt; It&apos;s a protect ourselves from memory leaks thing.  It&apos;s too easy to forget adoptRef.

Ok, will fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377319</commentid>
    <comment_count>13</comment_count>
      <attachid>87761</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-03-31 10:38:54 -0700</bug_when>
    <thetext>Created attachment 87761
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377889</commentid>
    <comment_count>14</comment_count>
      <attachid>87877</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-01 10:15:47 -0700</bug_when>
    <thetext>Created attachment 87877
Patch

Uploading the latest changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384013</commentid>
    <comment_count>15</comment_count>
      <attachid>89206</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-12 08:35:27 -0700</bug_when>
    <thetext>Created attachment 89206
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384018</commentid>
    <comment_count>16</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-12 08:38:45 -0700</bug_when>
    <thetext>I&apos;ve just uploaded a new version of this patch. It&apos;s significantly smaller, as it&apos;s rebased on top of the patch from Bug 57827.

All encoding, decoding, and comparison of keys are now handled by designated key classes, and I&apos;ve tried to clean it up as much as possible in general.

I know it&apos;s a huge patch, but your input is very much appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384036</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-12 08:54:22 -0700</bug_when>
    <thetext>Attachment 89206 did not build on chromium:
Build output: http://queues.webkit.org/results/8396010</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384049</commentid>
    <comment_count>18</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-12 09:14:33 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Attachment 89206 [details] did not build on chromium:
&gt; Build output: http://queues.webkit.org/results/8396010

It fails to build because the leveldb library hasn&apos;t been added to the WebKit/chromium/DEPS file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384110</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-04-12 10:25:07 -0700</bug_when>
    <thetext>Attachment 89206 did not build on chromium:
Build output: http://queues.webkit.org/results/8392478</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384112</commentid>
    <comment_count>20</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-12 10:26:19 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; Attachment 89206 [details] [details] did not build on chromium:
&gt; &gt; Build output: http://queues.webkit.org/results/8396010
&gt; 
&gt; It fails to build because the leveldb library hasn&apos;t been added to the WebKit/chromium/DEPS file.

It probably should be added in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384114</commentid>
    <comment_count>21</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-12 10:30:50 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #18)
&gt; &gt; (In reply to comment #17)
&gt; &gt; &gt; Attachment 89206 [details] [details] [details] did not build on chromium:
&gt; &gt; &gt; Build output: http://queues.webkit.org/results/8396010
&gt; &gt; 
&gt; &gt; It fails to build because the leveldb library hasn&apos;t been added to the WebKit/chromium/DEPS file.
&gt; 
&gt; It probably should be added in this patch.

I already uploaded a patch in Bug 58343.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384199</commentid>
    <comment_count>22</comment_count>
      <attachid>89206</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-12 11:41:14 -0700</bug_when>
    <thetext>Comment on attachment 89206
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=89206&amp;action=review

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:46
&gt; +// FIXME: Do this more properly.

Why is this necessary?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:53
&gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.

Explicitly mention that the std::strings don&apos;t have any particular encoding and usually aren&apos;t null terminated.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:56
&gt; +// of fields. Each key in the backing store starts with a ternary prefix: (database id, object store id, index id). For each, 0 is reserved for meta-data.

Explain that ordering is important for locality.  Maybe briefly talk about the groupings that are most important to preserve and why.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:67
&gt; +// Database meta-data:

Mention the 4th entry is a byte.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:74
&gt; +// Object store meta-data:

Mention the 4th entry is a byte, 5th is variable length, 6th is byte.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:83
&gt; +// Index meta-data:

Mention the 4th entry is a byte, 5th is variable length, 6th is variable length, 7th is byte.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:91
&gt; +//     &lt;database id, 0, 0, 150, object store id&gt;                   =&gt; existence implies the object store id is in the free list [ObjectStoreFreeListKey]

Mention the 4th entry is a byte, 5th is variable length.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:98
&gt; +//     &lt;database id, object store id, 1, user key&gt; =&gt; &quot;version&quot;, serialized script value [ObjectStoreDataKey]

Mention the 4th entry is a byte.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:102
&gt; +//     &lt;database id, object store id, 2, user key&gt; =&gt; &quot;version&quot; [ExistsEntryKey]

Mention the 4th is a byte.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:106
&gt; +//     &lt;database id, object store id, index id, user key, sequence number&gt; =&gt; &quot;version&quot;, user key [IndexDataKey]

4th is variable length encoded....so this means that the variable length encoding must always place 0-30 (or however many we reserve) before the first index id.

It might be worth changing the schema a bit so this isn&apos;t required though.  Given that 99.99% of the data will be object store data or index data, maybe instead of every key having &lt;var, var, var&gt; every field should have &lt;var, var, byte, var&gt;?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:114
&gt; +//     collected.)

Explain how they&apos;re GCed.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:136
&gt; +static std::string maxIDBKey()

Not sure this name is good.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:138
&gt; +    return encodeByte(5); // Null type.

Why not 39?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:141
&gt; +static std::string minIDBKey()

ditto

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:173
&gt; +static std::string encodeVarInt(int64_t n)

Once you&apos;ve done an optimizing pass on this stuff, you should ask Jeff/Sanjay to take a look.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:188
&gt; +static const char* decodeVarInt(const char *p, const char* limit, int64_t* foundInt)

s/*/&amp;/ is the webkit way

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:206
&gt; +    for (unsigned i = 0; i &lt; s.length(); ++i) {

Maybe comment that this attempts to be endian independent?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:242
&gt; +static const char* decodeStringWithLen(const char* p, const char* limit, String* foundString)

s/*/&amp;/ is the webkit way

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:260
&gt; +    char* p = reinterpret_cast&lt;char*&gt;(&amp;x);

Will this be different on different platforms?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:262
&gt; +        ret.append(1, p[i]);

Can you append more than one at a time?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:271
&gt; +    char* x = reinterpret_cast&lt;char*&gt;(d);

I wonder how the compiler handles this register wise.  I wonder if it&apos;d be faster to create an array, decode into that, and then do one cast at the end?  (Same above?)

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:283
&gt; +        return encodeByte(5);

Probably better to make these things constants?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:296
&gt; +    }

Does this compile on all platforms?  You may need an assert not reached and a dummy return.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:299
&gt; +static const char* decodeIDBKey(const char* p, const char* limit, RefPtr&lt;IDBKey&gt;* foundKey)

s/*/&amp;/ is the webkit way

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:306
&gt; +    String s;

You could use {}&apos;s within your case for scoping

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:310
&gt; +    case 5:

This should be non-sparse numbers starting from 0.  If we need to add more in-between, we can use a lookup table.  If its sparse, the switch will be slower.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:336
&gt; +        ASSERT_NOT_REACHED();

Move out of switch, i think.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:353
&gt; +    case 40:

What&apos;s 40?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:426
&gt; +static int countNonZeroBytes(int64_t n)

Probably not necessary.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:483
&gt; +    KeyPrefix() {}

Maybe this should do an implicit decode and decode should go away?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:518
&gt; +        int databaseIdBytes = countNonZeroBytes(m_databaseId);

You should probably just encode them and then extract the bytes used.  Should be faster and safer.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:568
&gt; +        if (m_indexId &gt;= 30)

It&apos;s probably worth making these constants.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:585
&gt; +        return prefix.encode() + encodeByte(kTypeByte);

I think this would be more clear with a global constant (grouped with other similar ones) that has a more descriptive name.  Same below.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:602
&gt; +class DatabaseFreeListKey {

Everything up until this point r=me with comments.  Don&apos;t have time to look at the rest closely tho...

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1453
&gt; +        return false;

don&apos;t return a bool

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1560
&gt; +        return false;

ditto

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1586
&gt; +        return false;

Without write batches, this would leave us inconsistent...I guess we&apos;re fine though..?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1646
&gt; +    m_db-&gt;Delete(leveldb::WriteOptions(), ObjectStoreMetaDataKey::encode(databaseId, objectStoreId, 0));

Just delete the range..?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1653
&gt; +    putString(m_db.get(), ObjectStoreFreeListKey::encode(databaseId, objectStoreId), &quot;&quot;);

Why do you need to do a put with the free list key?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1658
&gt; +    if (!deleteRange(m_db.get(), IndexMetaDataKey::encode(databaseId, objectStoreId, 0, 0), IndexMetaDataKey::encode(databaseId, objectStoreId, INT64_MAX, 0)))

Not super fond of ranges with stuff like INT64_MAX.  Would rather deleteRange(&lt;db, os, 0&gt;, CLOSED, &lt;db, os+1, 0&gt;, OPEN)

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1717
&gt; +    // FIXME: Have a think about what happens when this wraps around. It shouldn&apos;t be a problem, I think.

What if there&apos;s overlap though..?

I&apos;d just assert on it not wrapping for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>384203</commentid>
    <comment_count>23</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-12 11:41:57 -0700</bug_when>
    <thetext>I posted some comments, but I doubt I&apos;m going to be able to finish the review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385101</commentid>
    <comment_count>24</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-13 11:55:35 -0700</bug_when>
    <thetext>Thanks very much for the review, Jeremy!

(In reply to comment #22)
&gt; (From update of attachment 89206 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89206&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:46
&gt; &gt; +// FIXME: Do this more properly.
&gt; 
&gt; Why is this necessary?
You mean the FIXME or the #defines themselves?

The #defines are there because I don&apos;t think MSVC defines those macros. The FIXME is there because it felt kind of hacky.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:53
&gt; &gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.
&gt; 
&gt; Explicitly mention that the std::strings don&apos;t have any particular encoding and usually aren&apos;t null terminated.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:56
&gt; &gt; +// of fields. Each key in the backing store starts with a ternary prefix: (database id, object store id, index id). For each, 0 is reserved for meta-data.
&gt; 
&gt; Explain that ordering is important for locality.  Maybe briefly talk about the groupings that are most important to preserve and why.

Done. Which groupings are you considering to be more important than others?

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:67
&gt; &gt; +// Database meta-data:
&gt; 
&gt; Mention the 4th entry is a byte.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:74
&gt; &gt; +// Object store meta-data:
&gt; 
&gt; Mention the 4th entry is a byte, 5th is variable length, 6th is byte.
Done. (Actually, the 6th is a varint.. i have a FIXME for that)

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:83
&gt; &gt; +// Index meta-data:
&gt; 
&gt; Mention the 4th entry is a byte, 5th is variable length, 6th is variable length, 7th is byte.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:91
&gt; &gt; +//     &lt;database id, 0, 0, 150, object store id&gt;                   =&gt; existence implies the object store id is in the free list [ObjectStoreFreeListKey]
&gt; 
&gt; Mention the 4th entry is a byte, 5th is variable length.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:98
&gt; &gt; +//     &lt;database id, object store id, 1, user key&gt; =&gt; &quot;version&quot;, serialized script value [ObjectStoreDataKey]
&gt; 
&gt; Mention the 4th entry is a byte.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:102
&gt; &gt; +//     &lt;database id, object store id, 2, user key&gt; =&gt; &quot;version&quot; [ExistsEntryKey]
&gt; 
&gt; Mention the 4th is a byte.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:106
&gt; &gt; +//     &lt;database id, object store id, index id, user key, sequence number&gt; =&gt; &quot;version&quot;, user key [IndexDataKey]
&gt; 
&gt; 4th is variable length encoded....so this means that the variable length encoding must always place 0-30 (or however many we reserve) before the first index id.
&gt; 

I&apos;m not sure I understand, please elaborate.

&gt; It might be worth changing the schema a bit so this isn&apos;t required though.  Given that 99.99% of the data will be object store data or index data, maybe instead of every key having &lt;var, var, var&gt; every field should have &lt;var, var, byte, var&gt;?

I&apos;m very happy to do any schema changes to make things simpler :) But I&apos;d prefer to do it in later patches.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:114
&gt; &gt; +//     collected.)
&gt; 
&gt; Explain how they&apos;re GCed.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:136
&gt; &gt; +static std::string maxIDBKey()
&gt; 
&gt; Not sure this name is good.

Hmm, I was thinking that it&apos;s the maximum value key (in terms of sort order).. name suggestions are welcome.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:138
&gt; &gt; +    return encodeByte(5); // Null type.
&gt; 
&gt; Why not 39?

I use the value 10 for string keys, and these &quot;null&quot; keys have even higher precedence, so I used 5. It&apos;s at the other end of the scale from the minIDBKey(), so to speak.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:141
&gt; &gt; +static std::string minIDBKey()
&gt; 
&gt; ditto
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:173
&gt; &gt; +static std::string encodeVarInt(int64_t n)
&gt; 
&gt; Once you&apos;ve done an optimizing pass on this stuff, you should ask Jeff/Sanjay to take a look.
Will do.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:188
&gt; &gt; +static const char* decodeVarInt(const char *p, const char* limit, int64_t* foundInt)
&gt; 
&gt; s/*/&amp;/ is the webkit way
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:206
&gt; &gt; +    for (unsigned i = 0; i &lt; s.length(); ++i) {
&gt; 
&gt; Maybe comment that this attempts to be endian independent?
Well, it doesn&apos;t really.. and like I think you point out below, the encoding of double&apos;s are not endian independent. Do you think we should go for being endian independent? Are LevelDB files themselves endian independent?

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:242
&gt; &gt; +static const char* decodeStringWithLen(const char* p, const char* limit, String* foundString)
&gt; 
&gt; s/*/&amp;/ is the webkit way
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:260
&gt; &gt; +    char* p = reinterpret_cast&lt;char*&gt;(&amp;x);
&gt; 
&gt; Will this be different on different platforms?
Yes, I believe the byte order will be different.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:262
&gt; &gt; +        ret.append(1, p[i]);
&gt; 
&gt; Can you append more than one at a time?
Ah, yeah we probably don&apos;t need to loop here, but can call the string constructor directly. Doing that.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:271
&gt; &gt; +    char* x = reinterpret_cast&lt;char*&gt;(d);
&gt; 
&gt; I wonder how the compiler handles this register wise.  I wonder if it&apos;d be faster to create an array, decode into that, and then do one cast at the end?  (Same above?)

In this case, I expect the compiler to unroll it and generate something beautiful :) I&apos;ll be happy to revisit when I start to profile and tune.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:283
&gt; &gt; +        return encodeByte(5);
&gt; 
&gt; Probably better to make these things constants?
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:296
&gt; &gt; +    }
&gt; 
&gt; Does this compile on all platforms?  You may need an assert not reached and a dummy return.
Adding that to be sure.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:299
&gt; &gt; +static const char* decodeIDBKey(const char* p, const char* limit, RefPtr&lt;IDBKey&gt;* foundKey)
&gt; 
&gt; s/*/&amp;/ is the webkit way
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:306
&gt; &gt; +    String s;
&gt; 
&gt; You could use {}&apos;s within your case for scoping
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:310
&gt; &gt; +    case 5:
&gt; 
&gt; This should be non-sparse numbers starting from 0.  If we need to add more in-between, we can use a lookup table.  If its sparse, the switch will be slower.
Ok. Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:336
&gt; &gt; +        ASSERT_NOT_REACHED();
&gt; 
&gt; Move out of switch, i think.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:353
&gt; &gt; +    case 40:
&gt; 
&gt; What&apos;s 40?
It&apos;s now kIDBKeyMinKeyTypeByte. It&apos;s a key that sorts as lower than any other key, i.e. what minIDBKey() returns.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:426
&gt; &gt; +static int countNonZeroBytes(int64_t n)
&gt; 
&gt; Probably not necessary.
Ah, this correlates with your comment at :518.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:483
&gt; &gt; +    KeyPrefix() {}
&gt; 
&gt; Maybe this should do an implicit decode and decode should go away?
But then we can&apos;t return an error status.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:518
&gt; &gt; +        int databaseIdBytes = countNonZeroBytes(m_databaseId);
&gt; 
&gt; You should probably just encode them and then extract the bytes used.  Should be faster and safer.

But I use this for reserving space in the string before-hand. I&apos;m happy to change this if you think it&apos;s really better.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:568
&gt; &gt; +        if (m_indexId &gt;= 30)
&gt; 
&gt; It&apos;s probably worth making these constants.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:585
&gt; &gt; +        return prefix.encode() + encodeByte(kTypeByte);
&gt; 
&gt; I think this would be more clear with a global constant (grouped with other similar ones) that has a more descriptive name.  Same below.
I&apos;m not sure what you mean. Do you mean just replace the SchemaVersionKey class with a global std::string constant?

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:602
&gt; &gt; +class DatabaseFreeListKey {
&gt; 
&gt; Everything up until this point r=me with comments.  Don&apos;t have time to look at the rest closely tho...
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1453
&gt; &gt; +        return false;
&gt; 
&gt; don&apos;t return a bool
Oops. Thanks for noticing.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1560
&gt; &gt; +        return false;
&gt; 
&gt; ditto
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1586
&gt; &gt; +        return false;
&gt; 
&gt; Without write batches, this would leave us inconsistent...I guess we&apos;re fine though..?
hmm yeah, we&apos;ll handle this nicely when we have transactions.. but I&apos;ll add a FIXME to make this more robust.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1646
&gt; &gt; +    m_db-&gt;Delete(leveldb::WriteOptions(), ObjectStoreMetaDataKey::encode(databaseId, objectStoreId, 0));
&gt; 
&gt; Just delete the range..?
Yeah, doing that.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1653
&gt; &gt; +    putString(m_db.get(), ObjectStoreFreeListKey::encode(databaseId, objectStoreId), &quot;&quot;);
&gt; 
&gt; Why do you need to do a put with the free list key?
When we delete an object store, we should stick that object store id back in the free list.. doesn&apos;t that make sense?

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1658
&gt; &gt; +    if (!deleteRange(m_db.get(), IndexMetaDataKey::encode(databaseId, objectStoreId, 0, 0), IndexMetaDataKey::encode(databaseId, objectStoreId, INT64_MAX, 0)))
&gt; 
&gt; Not super fond of ranges with stuff like INT64_MAX.  Would rather have deleteRange(&lt;db, os, 0&gt;, CLOSED, &lt;db, os+1, 0&gt;, OPEN)

Yeah, I&apos;m not super happy either. But I would rather have e.g. the IndexMetaDataKey class to know the right range to delete.. it feels a little brittle to use explicit numbers in the ranges, because it&apos;s hard for the reader to see if there may be anything unintentionally caught in between.

But I can see your point.. because of the way the schema is set up, deleting an object store should ideally be as simple as deleting a single range.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1717
&gt; &gt; +    // FIXME: Have a think about what happens when this wraps around. It shouldn&apos;t be a problem, I think.
&gt; 
&gt; What if there&apos;s overlap though..?
&gt; 
&gt; I&apos;d just assert on it not wrapping for now.
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385106</commentid>
    <comment_count>25</comment_count>
      <attachid>89423</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-13 11:56:17 -0700</bug_when>
    <thetext>Created attachment 89423
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385154</commentid>
    <comment_count>26</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-13 12:46:31 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; Thanks very much for the review, Jeremy!
&gt; 
&gt; (In reply to comment #22)
&gt; &gt; (From update of attachment 89206 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89206&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:46
&gt; &gt; &gt; +// FIXME: Do this more properly.
&gt; &gt; 
&gt; &gt; Why is this necessary?
&gt; You mean the FIXME or the #defines themselves?
&gt; 
&gt; The #defines are there because I don&apos;t think MSVC defines those macros. The FIXME is there because it felt kind of hacky.

FWIW, the couple places I saw these used were

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:56
&gt; &gt; &gt; +// of fields. Each key in the backing store starts with a ternary prefix: (database id, object store id, index id). For each, 0 is reserved for meta-data.
&gt; &gt; 
&gt; &gt; Explain that ordering is important for locality.  Maybe briefly talk about the groupings that are most important to preserve and why.
&gt; 
&gt; Done. Which groupings are you considering to be more important than others?

They were mentioned in the design doc.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:106
&gt; &gt; &gt; +//     &lt;database id, object store id, index id, user key, sequence number&gt; =&gt; &quot;version&quot;, user key [IndexDataKey]
&gt; &gt; 
&gt; &gt; 4th is variable length encoded....so this means that the variable length encoding must always place 0-30 (or however many we reserve) before the first index id.
&gt; &gt; 
&gt; 
&gt; I&apos;m not sure I understand, please elaborate.

Never mind.  If you&apos;re always decoding the numbers and comparing that way, this isn&apos;t an issue.  For some reason, I thought you might do binary compares.

&gt; &gt; It might be worth changing the schema a bit so this isn&apos;t required though.  Given that 99.99% of the data will be object store data or index data, maybe instead of every key having &lt;var, var, var&gt; every field should have &lt;var, var, byte, var&gt;?
&gt; 
&gt; I&apos;m very happy to do any schema changes to make things simpler :) But I&apos;d prefer to do it in later patches.

Actually I&apos;m not sure this matters much.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:206
&gt; &gt; &gt; +    for (unsigned i = 0; i &lt; s.length(); ++i) {
&gt; &gt; 
&gt; &gt; Maybe comment that this attempts to be endian independent?
&gt; Well, it doesn&apos;t really.. and like I think you point out below, the encoding of double&apos;s are not endian independent. Do you think we should go for being endian independent? Are LevelDB files themselves endian independent?

If it&apos;s easy, sure.  But I guess the chances of people migrating from one endianness to another are probably not large.  On the other hand, the rest of leveldb supports it, so it probably makes sense.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:271
&gt; &gt; &gt; +    char* x = reinterpret_cast&lt;char*&gt;(d);
&gt; &gt; 
&gt; &gt; I wonder how the compiler handles this register wise.  I wonder if it&apos;d be faster to create an array, decode into that, and then do one cast at the end?  (Same above?)
&gt; 
&gt; In this case, I expect the compiler to unroll it and generate something beautiful :) I&apos;ll be happy to revisit when I start to profile and tune.

Yeah, that&apos;s likely.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:483
&gt; &gt; &gt; +    KeyPrefix() {}
&gt; &gt; 
&gt; &gt; Maybe this should do an implicit decode and decode should go away?
&gt; But then we can&apos;t return an error status.

Hm.  At least add some boolean that keeps track of whether it&apos;s initialized or not and add ASSERTs.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:518
&gt; &gt; &gt; +        int databaseIdBytes = countNonZeroBytes(m_databaseId);
&gt; &gt; 
&gt; &gt; You should probably just encode them and then extract the bytes used.  Should be faster and safer.
&gt; 
&gt; But I use this for reserving space in the string before-hand. I&apos;m happy to change this if you think it&apos;s really better.

Sure.  Save it to a temp, then reserve, then append.  I think it&apos;s important for the safety aspect.  It&apos;s a bad idea to assume both functions will return the same number when we can simply look at the results&apos; length.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:585
&gt; &gt; &gt; +        return prefix.encode() + encodeByte(kTypeByte);
&gt; &gt; 
&gt; &gt; I think this would be more clear with a global constant (grouped with other similar ones) that has a more descriptive name.  Same below.
&gt; I&apos;m not sure what you mean. Do you mean just replace the SchemaVersionKey class with a global std::string constant?

kTypeByte is not clear.  It should be kWhatIsThisByteFor.  And they should all be defined in a block at the top of the file, I think.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1653
&gt; &gt; &gt; +    putString(m_db.get(), ObjectStoreFreeListKey::encode(databaseId, objectStoreId), &quot;&quot;);
&gt; &gt; 
&gt; &gt; Why do you need to do a put with the free list key?
&gt; When we delete an object store, we should stick that object store id back in the free list.. doesn&apos;t that make sense?

Ohhh yeahhhhh.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1658
&gt; &gt; &gt; +    if (!deleteRange(m_db.get(), IndexMetaDataKey::encode(databaseId, objectStoreId, 0, 0), IndexMetaDataKey::encode(databaseId, objectStoreId, INT64_MAX, 0)))
&gt; &gt; 
&gt; &gt; Not super fond of ranges with stuff like INT64_MAX.  Would rather have deleteRange(&lt;db, os, 0&gt;, CLOSED, &lt;db, os+1, 0&gt;, OPEN)
&gt; 
&gt; Yeah, I&apos;m not super happy either. But I would rather have e.g. the IndexMetaDataKey class to know the right range to delete.. it feels a little brittle to use explicit numbers in the ranges, because it&apos;s hard for the reader to see if there may be anything unintentionally caught in between.
&gt; 
&gt; But I can see your point.. because of the way the schema is set up, deleting an object store should ideally be as simple as deleting a single range.

I guess you can leave it as is, but it feels dirty.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385176</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-13 13:26:15 -0700</bug_when>
    <thetext>Attachment 89423 did not build on chromium:
Build output: http://queues.webkit.org/results/8399382</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385471</commentid>
    <comment_count>28</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-13 20:17:06 -0700</bug_when>
    <thetext>Attachment 89423 did not build on chromium:
Build output: http://queues.webkit.org/results/8401550</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385713</commentid>
    <comment_count>29</comment_count>
      <attachid>89423</attachid>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2011-04-14 06:28:25 -0700</bug_when>
    <thetext>Comment on attachment 89423
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=89423&amp;action=review

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:45
&gt; +// FIXME: Do this more properly.

Can you include &lt;limits.h&gt;? That is used elsewhere in WebCore and has these defines already, I think.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:52
&gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.

std::string in WebCore? That&apos;s strongly discouraged as far as I can tell. I do realize that std::string is required by leveldb but is this really the right thing to do here? Are there precedents in WebCore where std::string is used?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385715</commentid>
    <comment_count>30</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-14 06:31:27 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:56
&gt; &gt; &gt; &gt; +// of fields. Each key in the backing store starts with a ternary prefix: (database id, object store id, index id). For each, 0 is reserved for meta-data.
&gt; &gt; &gt; 
&gt; &gt; &gt; Explain that ordering is important for locality.  Maybe briefly talk about the groupings that are most important to preserve and why.
&gt; &gt; 
&gt; &gt; Done. Which groupings are you considering to be more important than others?
&gt; 
&gt; They were mentioned in the design doc.
Done.

&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:206
&gt; &gt; &gt; &gt; +    for (unsigned i = 0; i &lt; s.length(); ++i) {
&gt; &gt; &gt; 
&gt; &gt; &gt; Maybe comment that this attempts to be endian independent?
&gt; &gt; Well, it doesn&apos;t really.. and like I think you point out below, the encoding of double&apos;s are not endian independent. Do you think we should go for being endian independent? Are LevelDB files themselves endian independent?
&gt; 
&gt; If it&apos;s easy, sure.  But I guess the chances of people migrating from one endianness to another are probably not large.  On the other hand, the rest of leveldb supports it, so it probably makes sense.
Adding a FIXME for this.

&gt; 
&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:483
&gt; &gt; &gt; &gt; +    KeyPrefix() {}
&gt; &gt; &gt; 
&gt; &gt; &gt; Maybe this should do an implicit decode and decode should go away?
&gt; &gt; But then we can&apos;t return an error status.
&gt; 
&gt; Hm.  At least add some boolean that keeps track of whether it&apos;s initialized or not and add ASSERTs.
Done. I also noticed GCC warns about this in Release builds because of inlining.

&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:518
&gt; &gt; &gt; &gt; +        int databaseIdBytes = countNonZeroBytes(m_databaseId);
&gt; &gt; &gt; 
&gt; &gt; &gt; You should probably just encode them and then extract the bytes used.  Should be faster and safer.
&gt; &gt; 
&gt; &gt; But I use this for reserving space in the string before-hand. I&apos;m happy to change this if you think it&apos;s really better.
&gt; 
&gt; Sure.  Save it to a temp, then reserve, then append.  I think it&apos;s important for the safety aspect.  It&apos;s a bad idea to assume both functions will return the same number when we can simply look at the results&apos; length.
You&apos;re right. Done.

&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:585
&gt; &gt; &gt; &gt; +        return prefix.encode() + encodeByte(kTypeByte);
&gt; &gt; &gt; 
&gt; &gt; &gt; I think this would be more clear with a global constant (grouped with other similar ones) that has a more descriptive name.  Same below.
&gt; &gt; I&apos;m not sure what you mean. Do you mean just replace the SchemaVersionKey class with a global std::string constant?
&gt; 
&gt; kTypeByte is not clear.  It should be kWhatIsThisByteFor.  And they should all be defined in a block at the top of the file, I think.
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385717</commentid>
    <comment_count>31</comment_count>
      <attachid>89574</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-14 06:31:56 -0700</bug_when>
    <thetext>Created attachment 89574
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>385802</commentid>
    <comment_count>32</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-14 09:23:23 -0700</bug_when>
    <thetext>Attachment 89574 did not build on chromium:
Build output: http://queues.webkit.org/results/8401720</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>386308</commentid>
    <comment_count>33</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-14 19:36:24 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; (From update of attachment 89423 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89423&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:45
&gt; &gt; +// FIXME: Do this more properly.
&gt; 
&gt; Can you include &lt;limits.h&gt;? That is used elsewhere in WebCore and has these defines already, I think.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:52
&gt; &gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.
&gt; 
&gt; std::string in WebCore? That&apos;s strongly discouraged as far as I can tell. I do realize that std::string is required by leveldb but is this really the right thing to do here? Are there precedents in WebCore where std::string is used?

These are bindings to a library which uses it, so avoiding it here isn&apos;t going to help anything but will make the code much more complicated and ugly.

I believe angle uses some basic STL types.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>386399</commentid>
    <comment_count>34</comment_count>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2011-04-14 22:57:18 -0700</bug_when>
    <thetext>(In reply to comment #33)
&gt; (In reply to comment #29)
&gt; &gt; (From update of attachment 89423 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89423&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:45
&gt; &gt; &gt; +// FIXME: Do this more properly.
&gt; &gt; 
&gt; &gt; Can you include &lt;limits.h&gt;? That is used elsewhere in WebCore and has these defines already, I think.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:52
&gt; &gt; &gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.
&gt; &gt; 
&gt; &gt; std::string in WebCore? That&apos;s strongly discouraged as far as I can tell. I do realize that std::string is required by leveldb but is this really the right thing to do here? Are there precedents in WebCore where std::string is used?
&gt; 
&gt; These are bindings to a library which uses it, so avoiding it here isn&apos;t going to help anything but will make the code much more complicated and ugly.
&gt; 
&gt; I believe angle uses some basic STL types.

Ok, if there&apos;s a precedent,  then fine. I was also thinking that if LevelDB ends up being used in other places, it&apos;d be neater to have a wrapper that only uses Webcore types, similar to how we wrap SQLite. But that can be done once there is another user for LevelDB.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>386417</commentid>
    <comment_count>35</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-14 23:44:24 -0700</bug_when>
    <thetext>(In reply to comment #34)
&gt; (In reply to comment #33)
&gt; &gt; (In reply to comment #29)
&gt; &gt; &gt; (From update of attachment 89423 [details] [details] [details])
&gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89423&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:45
&gt; &gt; &gt; &gt; +// FIXME: Do this more properly.
&gt; &gt; &gt; 
&gt; &gt; &gt; Can you include &lt;limits.h&gt;? That is used elsewhere in WebCore and has these defines already, I think.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:52
&gt; &gt; &gt; &gt; +// LevelDB stores key/value pairs. Keys and values are strings of bytes, normally of type std::string.
&gt; &gt; &gt; 
&gt; &gt; &gt; std::string in WebCore? That&apos;s strongly discouraged as far as I can tell. I do realize that std::string is required by leveldb but is this really the right thing to do here? Are there precedents in WebCore where std::string is used?
&gt; &gt; 
&gt; &gt; These are bindings to a library which uses it, so avoiding it here isn&apos;t going to help anything but will make the code much more complicated and ugly.
&gt; &gt; 
&gt; &gt; I believe angle uses some basic STL types.
&gt; 
&gt; Ok, if there&apos;s a precedent,  then fine. I was also thinking that if LevelDB ends up being used in other places, it&apos;d be neater to have a wrapper that only uses Webcore types, similar to how we wrap SQLite. But that can be done once there is another user for LevelDB.

std::string is only used internally to talk to levelDB.  Much like how WebCore types are used in the WebKit layer but not exposed to the public api.  Anything else that&apos;s using levelDB will need to do something similar though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>386537</commentid>
    <comment_count>36</comment_count>
      <attachid>89772</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-15 05:50:18 -0700</bug_when>
    <thetext>Created attachment 89772
Patch

Uploading new patch that introduces a wrapper for LevelDB, and makes sure that std::string is only used in WebCore/platform/leveldb. The wrapper is not complete, but I figure we can add to it later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>386879</commentid>
    <comment_count>37</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-15 13:45:40 -0700</bug_when>
    <thetext>Attachment 89772 did not build on chromium:
Build output: http://queues.webkit.org/results/8450220</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387630</commentid>
    <comment_count>38</comment_count>
      <attachid>89772</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-18 04:23:21 -0700</bug_when>
    <thetext>Comment on attachment 89772
Patch

(These are comments from looking over the code with Steve.)

View in context: https://bugs.webkit.org/attachment.cgi?id=89772&amp;action=review

&gt; Source/WebCore/WebCore.gypi:864
&gt; +            &apos;platform/leveldb/LevelDBSlice.h&apos;,

probably need to add to all build files...

&gt; Source/WebCore/platform/leveldb/LevelDBDatabase.cpp:42
&gt; +    : m_db(0)

Let&apos;s use an OwnPtr

&gt; Source/WebCore/platform/leveldb/LevelDBIterator.cpp:40
&gt; +    delete m_iterator;

OwnPtr

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:41
&gt; +#include &lt;leveldb/slice.h&gt;

Drop these...

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:53
&gt; +// The std::strings don&apos;t have any particular encoding, and aren&apos;t null terminated.

s/std::string/Vector&lt;char&gt;/

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:358
&gt; +        p = decodeStringWithLen(p, limit, s);

s/WithLen/WithLength/, this probably applies here and there

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:506
&gt; +        : m_databaseId(-1)

have a constant instead of -1

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:571
&gt; +            ASSERT(p.m_indexId == m_indexId);

debug stuff.. should not be landed

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1393
&gt; +            ptrB = IndexMetaDataKey::decode(b.data(), endB, &amp;metaDataKeyB);

could we do some templating to avoid repeating this all the time? possibly a FIXME

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1518
&gt; +class Comparator : public leveldb::Comparator {

Wrap this one too, and then we don&apos;t need to ever expose leveldb::Slice.

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1679
&gt; +            LOG_ERROR(&quot;it not valid\n&quot;);

nicer messages</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387716</commentid>
    <comment_count>39</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-18 07:49:14 -0700</bug_when>
    <thetext>Thanks very much for your help Steve! Uploading new version of the patch...

(In reply to comment #38)
&gt; (From update of attachment 89772 [details])
&gt; (These are comments from looking over the code with Steve.)
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89772&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/WebCore.gypi:864
&gt; &gt; +            &apos;platform/leveldb/LevelDBSlice.h&apos;,
&gt; 
&gt; probably need to add to all build files...
Done.

&gt; 
&gt; &gt; Source/WebCore/platform/leveldb/LevelDBDatabase.cpp:42
&gt; &gt; +    : m_db(0)
&gt; 
&gt; Let&apos;s use an OwnPtr
Done.

&gt; 
&gt; &gt; Source/WebCore/platform/leveldb/LevelDBIterator.cpp:40
&gt; &gt; +    delete m_iterator;
&gt; 
&gt; OwnPtr
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:41
&gt; &gt; +#include &lt;leveldb/slice.h&gt;
&gt; 
&gt; Drop these...
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:53
&gt; &gt; +// The std::strings don&apos;t have any particular encoding, and aren&apos;t null terminated.
&gt; 
&gt; s/std::string/Vector&lt;char&gt;/
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:358
&gt; &gt; +        p = decodeStringWithLen(p, limit, s);
&gt; 
&gt; s/WithLen/WithLength/, this probably applies here and there
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:506
&gt; &gt; +        : m_databaseId(-1)
&gt; 
&gt; have a constant instead of -1
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:571
&gt; &gt; +            ASSERT(p.m_indexId == m_indexId);
&gt; 
&gt; debug stuff.. should not be landed
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1393
&gt; &gt; +            ptrB = IndexMetaDataKey::decode(b.data(), endB, &amp;metaDataKeyB);
&gt; 
&gt; could we do some templating to avoid repeating this all the time? possibly a FIXME
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1518
&gt; &gt; +class Comparator : public leveldb::Comparator {
&gt; 
&gt; Wrap this one too, and then we don&apos;t need to ever expose leveldb::Slice.
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1679
&gt; &gt; +            LOG_ERROR(&quot;it not valid\n&quot;);
&gt; 
&gt; nicer messages
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387717</commentid>
    <comment_count>40</comment_count>
      <attachid>90035</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-18 07:49:58 -0700</bug_when>
    <thetext>Created attachment 90035
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387725</commentid>
    <comment_count>41</comment_count>
      <attachid>90036</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-18 08:06:17 -0700</bug_when>
    <thetext>Created attachment 90036
Patch

Rebase.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387734</commentid>
    <comment_count>42</comment_count>
      <attachid>90036</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2011-04-18 08:18:19 -0700</bug_when>
    <thetext>Comment on attachment 90036
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387771</commentid>
    <comment_count>43</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-18 09:13:52 -0700</bug_when>
    <thetext>Committed r84149: &lt;http://trac.webkit.org/changeset/84149&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>387926</commentid>
    <comment_count>44</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-18 12:20:41 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/84149 might have broken GTK Linux 32-bit Debug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388102</commentid>
    <comment_count>45</comment_count>
      <attachid>89772</attachid>
    <who name="David Grogan">dgrogan</who>
    <bug_when>2011-04-18 15:27:29 -0700</bug_when>
    <thetext>Comment on attachment 89772
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=89772&amp;action=review

Less of a review and more just basic questions.  I&apos;ve given up on understanding this in one go.

Is there an option in about:flags to use leveldb?  How did you test this as you were developing it?  Manually loading layout tests in your local build of chromium?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:42
&gt; +#include &lt;string&gt;

The idea is to flesh out the wrapper such that these last 3 includes aren&apos;t needed here?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:109
&gt; +//     &lt;database id, 0, 0, 201, object store id, utf16 index name&gt; =&gt; index id [IndexNamesKey]

It seems as if 0 in the objectstore id field implies 0 in the index id field.  If that&apos;s true, can we leave out writing the second 0?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:309
&gt; +    for (size_t i = 0; i &lt; sizeof(*d); ++i)

Can we not use memcpy here?  Is stuff from &lt;cstring&gt; forbidden?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1527
&gt; +    void FindShortestSeparator(std::string*, const leveldb::Slice&amp;) const {} // FIXME: Implement eventually.

What are these two methods for?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1568
&gt; +        ASSERT_NOT_REACHED(); // FIXME: We need to handle this case for incognito and DumpRenderTree.

This is what &quot;:memory:&quot; is used for in IDBSQLiteBackingStore?  It&apos;s a magic value that something up the callstack detects?

&gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1576
&gt; +    // FIXME: We should eventually use the same LevelDB database for all origins.

Why?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388368</commentid>
    <comment_count>46</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-19 02:18:33 -0700</bug_when>
    <thetext>(In reply to comment #45)
&gt; (From update of attachment 89772 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89772&amp;action=review
&gt; 
&gt; Less of a review and more just basic questions.  I&apos;ve given up on understanding this in one go.
&gt; 
&gt; Is there an option in about:flags to use leveldb?  How did you test this as you were developing it?  Manually loading layout tests in your local build of chromium?

There is a command-line flag: --indexeddb-use-leveldb.
To test this, I had a local hack that made DumpRenderTree use leveldb, and ran the layout tests, as well as just opening them with the browser.

But we&apos;re going to need something more automated. I&apos;ll probably write a browser test that runs the layout tests in the browser with --indexeddb-use-leveldb set.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:42
&gt; &gt; +#include &lt;string&gt;
&gt; 
&gt; The idea is to flesh out the wrapper such that these last 3 includes aren&apos;t needed here?

Crap, the whole point of doing the wrappers was to be able to remove this include.. and then I forgot to remove it :-p Fixing at Bug 58872.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:109
&gt; &gt; +//     &lt;database id, 0, 0, 201, object store id, utf16 index name&gt; =&gt; index id [IndexNamesKey]
&gt; 
&gt; It seems as if 0 in the objectstore id field implies 0 in the index id field.  If that&apos;s true, can we leave out writing the second 0?

Yeah, but I&apos;d rather try and re-think the key coding schema to be more easy to implement (beacuse it&apos;s quite a big chunk of code know), rather than packing it tighter.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:309
&gt; &gt; +    for (size_t i = 0; i &lt; sizeof(*d); ++i)
&gt; 
&gt; Can we not use memcpy here?  Is stuff from &lt;cstring&gt; forbidden?

We probably could, but I&apos;m thinking the compiler will unroll this loop, and it will just become one 64-bit load/store pair.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1527
&gt; &gt; +    void FindShortestSeparator(std::string*, const leveldb::Slice&amp;) const {} // FIXME: Implement eventually.
&gt; 
&gt; What are these two methods for?

I don&apos;t remember the details. As far as I understand, they&apos;re optional to implement, but beneficial to performance, so we really should implement them eventually.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1568
&gt; &gt; +        ASSERT_NOT_REACHED(); // FIXME: We need to handle this case for incognito and DumpRenderTree.
&gt; 
&gt; This is what &quot;:memory:&quot; is used for in IDBSQLiteBackingStore?  It&apos;s a magic value that something up the callstack detects?

Yes, I believe SQLite has a flag or something that allows for an in-memory database. LevelDB doesn&apos;t have anything like that, so we&apos;ll have to build something. Possibly, we could hack up the Chromium env_ or port_ files to support a similar &quot;:memory&quot; prefix that will cause the database to be in-memory, or possibly in /tmp.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1576
&gt; &gt; +    // FIXME: We should eventually use the same LevelDB database for all origins.
&gt; 
&gt; Why?

For performance: having one LevelDB database for each origin is going to cause more fragmentation and worse performance than having them all in one.

I think we&apos;ll keep them separate for now though, until we&apos;re confident that we can handle error cases and corruption more gracefully.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388383</commentid>
    <comment_count>47</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2011-04-19 02:59:46 -0700</bug_when>
    <thetext>From the penut gallery:

(In reply to comment #46)
&gt; (In reply to comment #45)
&gt; &gt; (From update of attachment 89772 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=89772&amp;action=review
&gt; &gt; 
&gt; &gt; Less of a review and more just basic questions.  I&apos;ve given up on understanding this in one go.
&gt; &gt; 
&gt; &gt; Is there an option in about:flags to use leveldb?  How did you test this as you were developing it?  Manually loading layout tests in your local build of chromium?
&gt; 
&gt; There is a command-line flag: --indexeddb-use-leveldb.
&gt; To test this, I had a local hack that made DumpRenderTree use leveldb, and ran the layout tests, as well as just opening them with the browser.
&gt; 
&gt; But we&apos;re going to need something more automated. I&apos;ll probably write a browser test that runs the layout tests in the browser with --indexeddb-use-leveldb set.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:42
&gt; &gt; &gt; +#include &lt;string&gt;
&gt; &gt; 
&gt; &gt; The idea is to flesh out the wrapper such that these last 3 includes aren&apos;t needed here?
&gt; 
&gt; Crap, the whole point of doing the wrappers was to be able to remove this include.. and then I forgot to remove it :-p Fixing at Bug 58872.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:109
&gt; &gt; &gt; +//     &lt;database id, 0, 0, 201, object store id, utf16 index name&gt; =&gt; index id [IndexNamesKey]
&gt; &gt; 
&gt; &gt; It seems as if 0 in the objectstore id field implies 0 in the index id field.  If that&apos;s true, can we leave out writing the second 0?
&gt; 
&gt; Yeah, but I&apos;d rather try and re-think the key coding schema to be more easy to implement (beacuse it&apos;s quite a big chunk of code know), rather than packing it tighter.

Totally agree.  Remember that this data will be a VERY small fraction of all data, so packing it slightly tighter doesn&apos;t matter much.  Fast and correct comparing will be more important than a few bytes.

Actually, what might be best overall is to look at how to adjust the schema so it&apos;s not super hard to implement the optional methods on the comparator.  Because those will make things faster and more compact.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:309
&gt; &gt; &gt; +    for (size_t i = 0; i &lt; sizeof(*d); ++i)
&gt; &gt; 
&gt; &gt; Can we not use memcpy here?  Is stuff from &lt;cstring&gt; forbidden?
&gt; 
&gt; We probably could, but I&apos;m thinking the compiler will unroll this loop, and it will just become one 64-bit load/store pair.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1527
&gt; &gt; &gt; +    void FindShortestSeparator(std::string*, const leveldb::Slice&amp;) const {} // FIXME: Implement eventually.
&gt; &gt; 
&gt; &gt; What are these two methods for?
&gt; 
&gt; I don&apos;t remember the details. As far as I understand, they&apos;re optional to implement, but beneficial to performance, so we really should implement them eventually.

These are what I&apos;m talking about in my previous comment, btw...

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1568
&gt; &gt; &gt; +        ASSERT_NOT_REACHED(); // FIXME: We need to handle this case for incognito and DumpRenderTree.
&gt; &gt; 
&gt; &gt; This is what &quot;:memory:&quot; is used for in IDBSQLiteBackingStore?  It&apos;s a magic value that something up the callstack detects?
&gt; 
&gt; Yes, I believe SQLite has a flag or something that allows for an in-memory database. LevelDB doesn&apos;t have anything like that, so we&apos;ll have to build something. Possibly, we could hack up the Chromium env_ or port_ files to support a similar &quot;:memory&quot; prefix that will cause the database to be in-memory, or possibly in /tmp.

If at all possible, we shouldn&apos;t write anything to disk...even temporarily.  And if you do, you should go to great effort to make sure it gets deleted even in the event of crashes and such.

&gt; &gt; &gt; Source/WebCore/storage/IDBLevelDBBackingStore.cpp:1576
&gt; &gt; &gt; +    // FIXME: We should eventually use the same LevelDB database for all origins.
&gt; &gt; 
&gt; &gt; Why?
&gt; 
&gt; For performance: having one LevelDB database for each origin is going to cause more fragmentation and worse performance than having them all in one.

Relatedly, it also means that we only need to optimize for the case of big databases rather than also optimizing for small (or uncommonly accessed) databases.  (Hm.  One could even imagine more agressive compression on higher leveldb levels to that effect...)

&gt; I think we&apos;ll keep them separate for now though, until we&apos;re confident that we can handle error cases and corruption more gracefully.

Sounds sane.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393936</commentid>
    <comment_count>48</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-04-27 16:18:30 -0700</bug_when>
    <thetext>This patch contains many OwnPtr infelicities.  It&apos;s almost never correct in WebKit to call delete.  Whenever you&apos;re calling delete, you probably meant to use an OwnPtr.  Also, when transferring ownership of memory, please use PassOwnPtr to document that ownership is being transfered and to allow the compiler to help us avoid memory safety bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393939</commentid>
    <comment_count>49</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-04-27 16:21:24 -0700</bug_when>
    <thetext>Also, this patch contains incorrect header includes.  Headers in WTF should be included as follows:

#include &lt;wtf/OwnPtr.h&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393944</commentid>
    <comment_count>50</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-04-27 16:23:49 -0700</bug_when>
    <thetext>Methods that allocate memory should be named with &quot;create&quot; not with &quot;new&quot;.  For example:

newIterator =&gt; createIterator</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393948</commentid>
    <comment_count>51</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-04-27 16:25:47 -0700</bug_when>
    <thetext>Sounds like we should roll this out, given Adam&apos;s complaints, unless a follow-up bug is underway?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393949</commentid>
    <comment_count>52</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-04-27 16:26:13 -0700</bug_when>
    <thetext>(In reply to comment #51)
&gt; Sounds like we should roll this out, given Adam&apos;s complaints, unless a follow-up bug is underway?

I&apos;m fixing it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>394329</commentid>
    <comment_count>53</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-28 03:14:44 -0700</bug_when>
    <thetext>(In reply to comment #52)
&gt; (In reply to comment #51)
&gt; &gt; Sounds like we should roll this out, given Adam&apos;s complaints, unless a follow-up bug is underway?
&gt; 
&gt; I&apos;m fixing it.

Thanks very much for fixing this, Adam.

Living and learning. (For future reference, the fix was in Bug 59656.)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87384</attachid>
            <date>2011-03-29 11:59:00 -0700</date>
            <delta_ts>2011-03-29 12:02:16 -0700</delta_ts>
            <desc>patch by hans</desc>
            <filename>IDBLevelDBBackingStore.cpp</filename>
            <type>text/plain</type>
            <size>60648</size>
            <attacher name="Jeremy Orlow">jorlow</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CiAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAogKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOwogKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5o
IgojaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgoKI2lmIEVOQUJMRShJTkRFWEVE
X0RBVEFCQVNFKQoKI2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKI2luY2x1ZGUgIkZpbGVTeXN0ZW0u
aCIKI2luY2x1ZGUgIklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgojaW5jbHVkZSAiSURCS2V5UmFu
Z2UuaCIKI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCiNpbmNsdWRlIDxpbmNsdWRlL2NvbXBh
cmF0b3IuaD4KI2luY2x1ZGUgPGluY2x1ZGUvZGIuaD4KI2luY2x1ZGUgPGluY2x1ZGUvaXRlcmF0
b3IuaD4KI2luY2x1ZGUgPGluY2x1ZGUvc2xpY2UuaD4KI2luY2x1ZGUgPHN0cmluZz4KCi8vIEZJ
WE1FOiBkZWNvZGluZyByb3V0aW5lcyBtdWNoIGJlIG1vcmUgcm9idXN0LiBXZSBjYW4ndCBjcmFz
aCB0aGUgYnJvd3NlciBpZgovLyBkYXRhIGlzbid0IHdoYXQgd2UgZXhwZWN0IQoKbmFtZXNwYWNl
IFdlYkNvcmUgewoKSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiBmYWN0b3J5LCBsZXZl
bGRiOjpEQiogZGIpCiAgICA6IG1faWRlbnRpZmllcihpZGVudGlmaWVyKQogICAgLCBtX2ZhY3Rv
cnkoZmFjdG9yeSkKICAgICwgbV9kYihkYikKewogICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5n
U3RvcmUoaWRlbnRpZmllciwgdGhpcyk7Cn0KCklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJM
ZXZlbERCQmFja2luZ1N0b3JlKCkKewogICAgbV9mYWN0b3J5LT5yZW1vdmVJREJCYWNraW5nU3Rv
cmUobV9pZGVudGlmaWVyKTsKfQoKc3RhdGljIHZvaWQgcHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpz
dHJpbmcmIHMpCnsKICAgIHByaW50ZigiMHgiKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cy5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgY2hhciBjID0gc1tpXTsKICAgICAg
ICBwcmludGYoIiUwMngiLCAoaW50KWMpOwogICAgfQp9CgpzdGF0aWMgc3RkOjpzdHJpbmcgZW5j
b2RlSW50KGludDY0X3QgbikKewogICAgQVNTRVJUKG4gPj0gMCk7CiAgICBpZiAoMCkgcHJpbnRT
dHJpbmcoIiIpOyAvLyBGSVhNRTogRHVtbXkgdG8gcHJldmVudCBtZXRob2Qtbm90LXVzZWQtd2Fy
bmluZy4KICAgIHN0ZDo6c3RyaW5nIHJldDsKCiAgICBkbyB7CiAgICAgICAgdW5zaWduZWQgY2hh
ciBjID0gbjsKICAgICAgICByZXQuYXBwZW5kKDEsIHN0YXRpY19jYXN0PGNoYXI+KGMpKTsKICAg
ICAgICBuID4+PSA4OwogICAgfSB3aGlsZSAobik7CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGlj
IGludDY0X3QgZGVjb2RlSW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQp7CiAgICBpbnQ2NF90IHJl
dCA9IDA7CgogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgcy5sZW5ndGgoKTsgaSsrKSB7CiAg
ICAgICAgdW5zaWduZWQgY2hhciBjID0gc1tpXTsKICAgICAgICByZXQgPSByZXQgPDwgOCB8IGM7
CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZVZhcklu
dChpbnQ2NF90IG4pCnsKICAgIHN0ZDo6c3RyaW5nIHJldDsKCiAgICBkbyB7CiAgICAgICAgdW5z
aWduZWQgY2hhciBjID0gbiAmICgxMjggLSAxKTsKICAgICAgICBuID4+PSA3OwogICAgICAgIGlm
IChuKQogICAgICAgICAgICBjIHw9IDEyODsKICAgICAgICByZXQuYXBwZW5kKDEsIHN0YXRpY19j
YXN0PGNoYXI+KGMpKTsKICAgIH0gd2hpbGUgKG4pOwoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRp
YyBjb25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciAqcCwgaW50NjRfdCAmZm91bmRJ
bnQpCnsKICAgIGZvdW5kSW50ID0gMDsKCiAgICBkbyB7CiAgICAgICAgZm91bmRJbnQgPSAoZm91
bmRJbnQgPDwgNykgfCAoKnAgJiAoMTI4IC0gMSkpOwogICAgfSB3aGlsZSAoKnArKyAmIDEyOCk7
CgogICAgcmV0dXJuIHA7Cn0KCnN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVTdHJpbmcoY29uc3Qg
U3RyaW5nJiBzKQp7CiAgICBzdGQ6OnN0cmluZyByZXQ7CgogICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewogICAgICAgIFVDaGFyIHUgPSBzW2ldOwogICAgICAg
IHVuc2lnbmVkIGNoYXIgaGkgPSAodSA+PiA4KSAmIDB4ZmY7CiAgICAgICAgdW5zaWduZWQgY2hh
ciBsbyA9IHUgJiAweGZmOwogICAgICAgIHJldC5hcHBlbmQoMSwgaGkpOwogICAgICAgIHJldC5h
cHBlbmQoMSwgbG8pOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBTdHJpbmcgZGVj
b2RlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQp7CiAgICAvL3ByaW50ZigiZGVjb2RlU3Ry
aW5nIHMgPSIpOwogICAgLy9wcmludFN0cmluZyhzKTsKICAgIC8vcHJpbnRmKCJcbiIpOwogICAg
U3RyaW5nIHJldDsKCiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrPTIp
IHsKICAgICAgICBBU1NFUlQoaSArIDEgPCBzLmxlbmd0aCgpKTsKICAgICAgICB1bnNpZ25lZCBj
aGFyIGhpID0gc1tpXTsKICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gc1tpICsgMV07CiAgICAg
ICAgVUNoYXIgdSA9IGhpIDw8IDggfCBsbzsKICAgICAgICByZXQuYXBwZW5kKHUpOwogICAgfQoK
ICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVTdHJpbmdXaXRoTGVu
KGNvbnN0IFN0cmluZyYgcykKewogICAgc3RkOjpzdHJpbmcgcmV0ID0gZW5jb2RlVmFySW50KHMu
bGVuZ3RoKCkpOwogICAgcmV0ICs9IGVuY29kZVN0cmluZyhzKTsKICAgIC8vcHJpbnRmKCJlbmNv
ZGVTdHJpbmdXaXRoTGVuIHMgPSAlc1xuIiwgcy5hc2NpaSgpLmRhdGEoKSk7CiAgICAvL3ByaW50
ZigicmV0ID0gIik7IHByaW50U3RyaW5nKHJldCk7IHByaW50ZigiXG4iKTsKICAgIHJldHVybiBy
ZXQ7Cn0KCnN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuKGNvbnN0IGNoYXIq
IHAsIFN0cmluZyYgZm91bmRTdHJpbmcpCnsKICAgIGludDY0X3QgbGVuOwogICAgcCA9IGRlY29k
ZVZhckludChwLCBsZW4pOwoKICAgIGZvdW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHN0ZDo6c3Ry
aW5nKHAsIGxlbiAqIDIpKTsKICAgIHAgKz0gbGVuICogMjsKICAgIHJldHVybiBwOwp9CgpzdGF0
aWMgc3RkOjpzdHJpbmcgZW5jb2RlRG91YmxlKGRvdWJsZSB4KQp7CiAgICBzdGQ6OnN0cmluZyBy
ZXQ7CiAgICBjaGFyICpwID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJngpOwogICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBzaXplb2YoeCk7IGkrKykKICAgICAgICByZXQuYXBwZW5kKDEsIHBb
aV0pOwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZURvdWJsZShj
b25zdCBjaGFyKiBwLCBkb3VibGUqIGQpCnsKICAgIGNoYXIgKnggPSByZWludGVycHJldF9jYXN0
PGNoYXIqPihkKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKCpkKTsgaSsrKQog
ICAgICAgICp4KysgPSAqcCsrOwogICAgcmV0dXJuIHA7Cn0KCnN0YXRpYyBzdGQ6OnN0cmluZyBl
bmNvZGVLZXkoY29uc3QgSURCS2V5JiBrZXkpCnsKICAgIHN0ZDo6c3RyaW5nIHJldDsKCiAgICBz
d2l0Y2goa2V5LnR5cGUoKSkgewogICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgogICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgIHJldHVybiAiIjsKICAgIGNhc2UgSURCS2V5OjpT
dHJpbmdUeXBlOgogICAgICAgIHJldC5hcHBlbmQoMSwgJ1x4MCcpOwogICAgICAgIHJldCArPSBl
bmNvZGVTdHJpbmdXaXRoTGVuKGtleS5zdHJpbmcoKSk7CiAgICAgICAgcmV0dXJuIHJldDsKICAg
IGNhc2UgSURCS2V5OjpEYXRlVHlwZToKICAgICAgICByZXQuYXBwZW5kKDEsICdceDEnKTsKICAg
ICAgICByZXQgKz0gZW5jb2RlRG91YmxlKGtleS5kYXRlKCkpOwogICAgICAgIHJldHVybiByZXQ7
CiAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToKICAgICAgICByZXQuYXBwZW5kKDEsICdceDIn
KTsKICAgICAgICByZXQgKz0gZW5jb2RlRG91YmxlKGtleS5udW1iZXIoKSk7CiAgICAgICAgcmV0
dXJuIHJldDsKICAgIH0KfQoKc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZUtleShjb25zdCBjaGFy
KiBwLCBSZWZQdHI8SURCS2V5PiYgZm91bmRLZXkpIHsKICAgIGNoYXIgdHlwZSA9ICpwKys7CiAg
ICBTdHJpbmcgczsKICAgIGRvdWJsZSBkOwoKICAgIHN3aXRjaCh0eXBlKSB7CiAgICBjYXNlIDA6
CiAgICAgICAgLy8gU3RyaW5nLgogICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIHMp
OwogICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CiAgICAgICAgcmV0
dXJuIHA7CiAgICBjYXNlIDE6CiAgICAgICAgLy8gRGF0ZS4KICAgICAgICBwID0gZGVjb2RlRG91
YmxlKHAsICZkKTsKICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlRGF0ZShkKTsKICAg
ICAgICByZXR1cm4gcDsKICAgIGNhc2UgMjoKICAgICAgICAvLyBOdW1iZXIuCiAgICAgICAgcCA9
IGRlY29kZURvdWJsZShwLCAmZCk7CiAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZU51
bWJlcihkKTsKICAgICAgICByZXR1cm4gcDsKICAgIGRlZmF1bHQ6CiAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCnN0YXRpYyBpbnQgY291bnRC
eXRlcyhpbnQ2NF90IG4pCnsKICAgIGludCBjID0gMTsKICAgIHdoaWxlIChuID4+PSA4KQogICAg
ICAgIGMrKzsKICAgIHJldHVybiBjOwp9CgpzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQp7
CiAgICBpbnQgZGF0YWJhc2VCeXRlcyA9IGNvdW50Qnl0ZXMoZGF0YWJhc2VJZCk7CiAgICBpbnQg
b2JqZWN0U3RvcmVCeXRlcyA9IGNvdW50Qnl0ZXMob2JqZWN0U3RvcmVJZCk7CiAgICBpbnQgaW5k
ZXhCeXRlcyA9IGNvdW50Qnl0ZXMoaW5kZXhJZCk7CgogICAgQVNTRVJUKGRhdGFiYXNlQnl0ZXMg
PD0gOCk7CiAgICBBU1NFUlQob2JqZWN0U3RvcmVCeXRlcyA8PSA4KTsKICAgIEFTU0VSVChpbmRl
eEJ5dGVzIDw9IDQpOwoKICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKGRhdGFiYXNlQnl0
ZXMgLSAxKSA8PCA1IHwgKG9iamVjdFN0b3JlQnl0ZXMgLSAxKSA8PCAyIHwgKGluZGV4Qnl0ZXMg
LSAxKTsKICAgIHN0ZDo6c3RyaW5nIHMoMSwgZmlyc3RCeXRlKTsKICAgIHMgKz0gZW5jb2RlSW50
KGRhdGFiYXNlSWQpOwogICAgcyArPSBlbmNvZGVJbnQob2JqZWN0U3RvcmVJZCk7CiAgICBzICs9
IGVuY29kZUludChpbmRleElkKTsKCiAgICByZXR1cm4gczsKfQoKc3RhdGljIGNvbnN0IGNoYXIq
IGRlY29kZVByZWZpeChjb25zdCBjaGFyKiBwLCBpbnQ2NF90JiBkYXRhYmFzZUlkLCBpbnQ2NF90
JiBvYmplY3RTdG9yZUlkLCBpbnQ2NF90JiBpbmRleElkKQp7CiAgICB1bnNpZ25lZCBjaGFyIGZp
cnN0Qnl0ZSA9ICpwKys7CgogICAgaW50IGRhdGFiYXNlQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1
KSAmIDB4NykgKyAxOwogICAgaW50IG9iamVjdFN0b3JlQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiAy
KSAmIDB4NykgKyAxOwogICAgaW50IGluZGV4Qnl0ZXMgPSAoZmlyc3RCeXRlICYgMHg3KSArIDE7
CgogICAgZGF0YWJhc2VJZCA9IGRlY29kZUludChzdGQ6OnN0cmluZyhwLCBkYXRhYmFzZUJ5dGVz
KSk7CiAgICBwICs9IGRhdGFiYXNlQnl0ZXM7CiAgICBvYmplY3RTdG9yZUlkID0gZGVjb2RlSW50
KHN0ZDo6c3RyaW5nKHAsIG9iamVjdFN0b3JlQnl0ZXMpKTsKICAgIHAgKz0gb2JqZWN0U3RvcmVC
eXRlczsKICAgIGluZGV4SWQgPSBkZWNvZGVJbnQoc3RkOjpzdHJpbmcocCwgaW5kZXhCeXRlcykp
OwogICAgcCArPSBpbmRleEJ5dGVzOwoKICAgIHJldHVybiBwOwp9CgpzdGF0aWMgc3RkOjpzdHJp
bmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBpbnQgbmJyKQp7CiAgICBzdGQ6OnN0cmluZyBzID0gbWFrZUtleShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKICAgIGNoYXIgYyA9IG5icjsKICAgIHMu
YXBwZW5kKCZjLCAxKTsKICAgIHJldHVybiBzOwp9CgpzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtl
eShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQp7CiAgICBzdGQ6OnN0cmluZyBzID0gbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKICAgIHMgKz0gc3RyOwogICAg
cmV0dXJuIHM7Cn0KCnN0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IHN0ZDo6c3Ry
aW5nJiBzdHIsIGludDY0X3QgdmVyc2lvbikKewogICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgc3RyKTsKICAgIHMgKz0gZW5jb2Rl
VmFySW50KHZlcnNpb24pOwogICAgcmV0dXJuIHM7Cn0KCnN0YXRpYyBzdGQ6OnN0cmluZyBtYWtl
S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGludCBuYnIsIGNvbnN0IFN0cmluZyYgc3RyKQp7CiAgICBzdGQ6OnN0cmluZyBzID0g
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIpOwogICAgcyAr
PSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cik7CiAgICByZXR1cm4gczsKfQoKc3RhdGljIHN0ZDo6
c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgaW50IG5icjEsIGludDY0X3QgbmJyMikKewogICAgc3RkOjpzdHJp
bmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7
CiAgICBzICs9IGVuY29kZVZhckludChuYnIyKTsKICAgIHJldHVybiBzOwp9CgpzdGF0aWMgc3Rk
OjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyLCBjb25zdCBTdHJpbmcmIHN0cjEsIGNvbnN0IFN0
cmluZyYgc3RyMikKewogICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyLCBzdHIxKTsKICAgIHMgKz0gZW5jb2RlU3RyaW5nV2l0
aExlbihzdHIyKTsKICAgIHJldHVybiBzOwp9CgpzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBpbnQgbmJyMSwgaW50NjRfdCBuYnIyLCBpbnQ2NF90IG5icjMpCnsKICAgIHN0ZDo6c3RyaW5n
IHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG5icjEpOwog
ICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMik7CiAgICBzICs9IGVuY29kZVZhckludChuYnIzKTsK
ICAgIHJldHVybiBzOwp9CgpzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyMSwg
aW50NjRfdCBuYnIyLCBpbnQ2NF90IG5icjMsIGludCBuYnI0KQp7CiAgICBzdGQ6OnN0cmluZyBz
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIxKTsKICAg
IHMgKz0gZW5jb2RlVmFySW50KG5icjIpOwogICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMyk7CiAg
ICBzICs9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KG5icjQpOwogICAgcmV0dXJuIHM7Cn0K
CnN0YXRpYyBib29sIGdldEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBr
ZXksIGludDY0X3QqIGZvdW5kSW50KQp7CiAgICAvL3ByaW50ZigiZ2V0SW50ICIpOwogICAgLy9w
cmludFN0cmluZyhrZXkpOwogICAgLy9wcmludGYoIlxuIik7CiAgICBzdGQ6OnN0cmluZyByZXN1
bHQ7CiAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMo
KSwgbGV2ZWxkYjo6U2xpY2Uoa2V5KSwgJnJlc3VsdCk7CgogICAgaWYgKHMuSXNOb3RGb3VuZCgp
KQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGVsc2UgaWYgKCFzLm9rKCkpIHsKICAgICAgICAv
L3ByaW50ZigiRmFpbGVkIGdldEludDogJXNcbiIsIHMuVG9TdHJpbmcoKS5jX3N0cigpKTsKICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgIH0KCiAgICAqZm91bmRJbnQgPSBkZWNvZGVJ
bnQocmVzdWx0KTsKICAgIC8vcHJpbnRmKCJyZXN1bHQ6ICVkXG4iLCAoaW50KSpmb3VuZEludCk7
CiAgICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wgcHV0SW50KGxldmVsZGI6OkRCKiBkYiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50NjRfdCB2YWx1ZSkKewogICAgLy9wcmludGYoInB1
dEludCAoJWQpICIsIChpbnQpdmFsdWUpOwogICAgLy9wcmludFN0cmluZyhrZXkpOwogICAgLy9w
cmludGYoIlxuIik7CiAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQobGV2ZWxkYjo6V3Jp
dGVPcHRpb25zKCksIGtleSwgZW5jb2RlSW50KHZhbHVlKSk7CiAgICBpZiAoIXMub2soKSkgewog
ICAgICAgIC8vcHJpbnRmKCJGYWlsZWQgcHV0SW50OiAlc1xuIiwgcy5Ub1N0cmluZygpLmNfc3Ry
KCkpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpzdGF0
aWMgYm9vbCBnZXRTdHJpbmcobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5
LCBTdHJpbmcqIGZvdW5kU3RyaW5nKQp7CiAgICAvL3ByaW50ZigiZ2V0U3RyaW5nICIpOwogICAg
Ly9wcmludFN0cmluZyhrZXkpOwogICAgLy9wcmludGYoIlxuIik7CiAgICBzdGQ6OnN0cmluZyBy
ZXN1bHQ7CiAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlv
bnMoKSwgbGV2ZWxkYjo6U2xpY2Uoa2V5KSwgJnJlc3VsdCk7CgogICAgaWYgKHMuSXNOb3RGb3Vu
ZCgpKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGVsc2UgaWYgKCFzLm9rKCkpIHsKICAgICAg
ICAvL3ByaW50ZigiZmFsZWQgZ2V0U3RyaW5nOiAlc1xuIiwgcy5Ub1N0cmluZygpLmNfc3RyKCkp
OwogICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgfQoKICAgICpmb3VuZFN0cmluZyA9
IGRlY29kZVN0cmluZyhyZXN1bHQpOwogICAgLy9wcmludGYoInJlc3VsdDogIik7IHByaW50U3Ry
aW5nKHJlc3VsdCk7IHByaW50ZigiXG4iKTsKICAgIHJldHVybiB0cnVlOwp9CgpzdGF0aWMgYm9v
bCBwdXRTdHJpbmcobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyBrZXksIGNvbnN0
IFN0cmluZyYgdmFsdWUpCnsKICAgIC8vcHJpbnRmKCJwdXRTdHJpbmcgIik7CiAgICAvL3ByaW50
ZigiKHZhbHVlOiAiKTsKICAgIC8vcHJpbnRTdHJpbmcoZW5jb2RlU3RyaW5nKHZhbHVlKSk7CiAg
ICAvL3ByaW50ZigiKSBrZXk6ICIpOwogICAgLy9wcmludFN0cmluZyhrZXkpOwogICAgLy9wcmlu
dGYoIlxuIik7CiAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQobGV2ZWxkYjo6V3JpdGVP
cHRpb25zKCksIGtleSwgZW5jb2RlU3RyaW5nKHZhbHVlKSk7CiAgICBpZiAoIXMub2soKSkKICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKfQoKbmFtZXNwYWNlIHsKY2xhc3Mg
TXlDb21wYXJhdG9yIDogcHVibGljIGxldmVsZGI6OkNvbXBhcmF0b3IgewogICAgcHVibGljOgog
ICAgaW50IENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNvbnN0IGxldmVsZGI6OlNs
aWNlJiBiKSBjb25zdCB7CiAgICAgICAgLy9wcmludGYoIkNvbXBhcmVcbiIpOwogICAgICAgIC8v
cHJpbnRmKCJhOiAiKTsgcHJpbnRTdHJpbmcoYS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOwog
ICAgICAgIC8vcHJpbnRmKCJiOiAiKTsgcHJpbnRTdHJpbmcoYi5Ub1N0cmluZygpKTsgcHJpbnRm
KCJcbiIpOwogICAgICAgIGludCB4ID0gUmVhbENvbXBhcmUoYSwgYik7CiAgICAgICAgLy9wcmlu
dGYoIlJlc3VsdDogJWRcbiIsIHgpOwogICAgICAgIHJldHVybiB4OwogICAgfQogICAgaW50IFhD
b21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikg
Y29uc3QgewogICAgICAgIC8vcHJpbnRmKCJYQ29tcGFyZVxuIik7CiAgICAgICAgLy9wcmludGYo
ImE6ICIpOyBwcmludFN0cmluZyhhLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7CiAgICAgICAg
Ly9wcmludGYoImI6ICIpOyBwcmludFN0cmluZyhiLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7
CiAgICAgICAgaW50IHggPSBSZWFsQ29tcGFyZShhLCBiKTsKICAgICAgICAvL3ByaW50ZigiUmVz
dWx0OiAlZFxuIiwgeCk7CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CiAgICBpbnQgQ29tcGFyZUlu
ZGV4S2V5cyhjb25zdCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIp
IGNvbnN0IHsKICAgICAgICByZXR1cm4gUmVhbENvbXBhcmUoYSwgYiwgdHJ1ZSk7CiAgICB9CiAg
ICBpbnQgUmVhbENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNvbnN0IGxldmVsZGI6
OlNsaWNlJiBiLCBib29sIGluZGV4S2V5cyA9IGZhbHNlKSBjb25zdCB7CiAgICAgICAgaW50NjRf
dCBhMSwgYTIsIGEzOwogICAgICAgIGludDY0X3QgYjEsIGIyLCBiMzsKCiAgICAgICAgY29uc3Qg
Y2hhciogYV9lbmQgPSBhLmRhdGEoKSArIGEuc2l6ZSgpOwogICAgICAgIGNvbnN0IGNoYXIqIGJf
ZW5kID0gYi5kYXRhKCkgKyBiLnNpemUoKTsKCiAgICAgICAgY29uc3QgY2hhciAqcCA9IGEuZGF0
YSgpOwogICAgICAgIGNvbnN0IGNoYXIgKnEgPSBiLmRhdGEoKTsKCiAgICAgICAgaWYgKCpwICE9
ICpxKSByZXR1cm4gKnAgLSAqcTsgLy8gRklYTUU6IFRoaW5rIHRoaXMgdGhyb3VnaC4KCiAgICAg
ICAgcCA9IGRlY29kZVByZWZpeChwLCBhMSwgYTIsIGEzKTsKICAgICAgICBxID0gZGVjb2RlUHJl
Zml4KHEsIGIxLCBiMiwgYjMpOwoKICAgICAgICAvL3ByaW50ZigiYTEgPSAlOGQgYTIgPSAlOGQg
YTMgPSAlOGRcbiIsIChpbnQpYTEsIChpbnQpYTIsIChpbnQpYTMpOwogICAgICAgIC8vcHJpbnRm
KCJiMSA9ICU4ZCBiMiA9ICU4ZCBiMyA9ICU4ZFxuIiwgKGludCliMSwgKGludCliMiwgKGludCli
Myk7CgogICAgICAgIGlmIChhMSAhPSBiMSkgcmV0dXJuIGExIC0gYjE7CiAgICAgICAgaWYgKGEy
ICE9IGIyKSByZXR1cm4gYTIgLSBiMjsKICAgICAgICBpZiAoYTMgIT0gYjMpIHJldHVybiBhMyAt
IGIzOwoKICAgICAgICBpZiAoYTEgPT0gMCkgewogICAgICAgICAgICAvLyBHbG9iYWwgbWV0YS1k
YXRhLiBOZXh0IGZpZWxkIGlzIGEgbnVtYmVyLgogICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGE0
ID0gKnArKzsKICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiNCA9ICpxKys7CgogICAgICAgICAg
ICAvL3ByaW50ZigiYTQgPSAlOGRcbiIsIChpbnQpYTQpOwogICAgICAgICAgICAvL3ByaW50Zigi
YjQgPSAlOGRcbiIsIChpbnQpYjQpOwoKICAgICAgICAgICAgaWYgKGE0ICE9IGI0KSByZXR1cm4g
YTQgLSBiNDsKCiAgICAgICAgICAgIGlmIChhNCA9PSAwIHx8IGE0ID09IDEpIHsKICAgICAgICAg
ICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGE0ID09IDEwMCkgewogICAg
ICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIERhdGFiYXNlIGlkLgogICAgICAgICAgICAg
ICAgcCA9IGRlY29kZVZhckludChwLCBhNSk7CiAgICAgICAgICAgICAgICBxID0gZGVjb2RlVmFy
SW50KHEsIGI1KTsKICAgICAgICAgICAgICAgIHJldHVybiBhNSAtIGI1OwogICAgICAgICAgICB9
IGVsc2UgaWYgKGE0ID09IDIwMSkgewogICAgICAgICAgICAgICAgU3RyaW5nIGE2LCBiNjsgLy8g
T3JpZ2luIG5hbWUuCiAgICAgICAgICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBh
Nik7CiAgICAgICAgICAgICAgICBxID0gZGVjb2RlU3RyaW5nV2l0aExlbihxLCBiNik7CiAgICAg
ICAgICAgICAgICBpZiAoYTYgIT0gYjYpIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKGE2LCBiNik7
CgogICAgICAgICAgICAgICAgU3RyaW5nIGE3LCBiNzsgLy8gRGF0YWJhc2UgbmFtZS4KICAgICAg
ICAgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGE3KTsKICAgICAgICAgICAgICAg
IHEgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHEsIGI3KTsKICAgICAgICAgICAgICAgIHJldHVybiBj
b2RlUG9pbnRDb21wYXJlKGE3LCBiNyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg
ICAgICAvL3ByaW50ZigiYTQgPSAlZFxuIiwgKGludClhNCk7CiAgICAgICAgICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYTIgPT0g
MCkgeyAvLyBhMSAhPSAwCiAgICAgICAgICAgIC8vIERhdGFiYXNlIG1ldGEtZGF0YS4gTmV4dCBm
aWVsZCBpcyBhIG51bWJlci4KCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYTQgPSAqcCsrOwog
ICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI0ID0gKnErKzsKCiAgICAgICAgICAgIGlmIChhNCAh
PSBiNCkgcmV0dXJuIGE0IC0gYjQ7CgogICAgICAgICAgICBpZiAoYTQgPT0gMCB8fCBhNCA9PSAx
IHx8IGE0ID09IDIgfHwgYTQgPT0gMykgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAg
ICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gNTApIHsKICAgICAgICAgICAgICAgIC8vIE9iamVjdCBz
dG9yZSBtZXRhLWRhdGEuCgogICAgICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVj
dCBzdG9yZSBpZC4KICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTUpOwogICAg
ICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiNSk7CgogICAgICAgICAgICAgICAgaWYg
KGE1ICE9IGI1KSByZXR1cm4gYTUgLSBiNTsKCiAgICAgICAgICAgICAgICBpbnQ2NF90IGE2LCBi
NjsgLy8ga2V5IHBhdGgsIGF1dG8gaW5jLCBldGMuCiAgICAgICAgICAgICAgICBwID0gZGVjb2Rl
VmFySW50KHAsIGE2KTsKICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYjYpOwog
ICAgICAgICAgICAgICAgcmV0dXJuIGE2IC0gYjY7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQg
PT0gMTAwKSB7CiAgICAgICAgICAgICAgICAvLyBJbmRleCBtZXRhLWRhdGEuCgogICAgICAgICAg
ICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KICAgICAgICAgICAgICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgYTUpOwogICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhcklu
dChxLCBiNSk7CiAgICAgICAgICAgICAgICBpZiAoYTUgIT0gYjUpIHJldHVybiBhNSAtIGI1OwoK
ICAgICAgICAgICAgICAgIGludDY0X3QgYTYsIGI2OyAvLyBJbmRleCBpZC4KICAgICAgICAgICAg
ICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTYpOwogICAgICAgICAgICAgICAgcSA9IGRlY29kZVZh
ckludChxLCBiNik7CiAgICAgICAgICAgICAgICBpZiAoYTYgIT0gYjYpIHJldHVybiBhNiAtIGI2
OwoKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYTcsIGI3OyAvLyBOYW1lLCB1bmlxdWUs
IGtleSBwYXRoLgogICAgICAgICAgICAgICAgYTcgPSAqcCsrOwogICAgICAgICAgICAgICAgYjcg
PSAqcSsrOwogICAgICAgICAgICAgICAgcmV0dXJuIGE3IC0gYjc7CiAgICAgICAgICAgIH0gZWxz
ZSBpZiAoYTQgPT0gMTUwKSB7CiAgICAgICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgaWQgZnJl
ZS1saXN0LgoKICAgICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBPYmplY3Qgc3RvcmUg
aWQuCiAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKICAgICAgICAgICAg
ICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYjUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGE1IC0g
YjU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMTUxKSB7CiAgICAgICAgICAgICAgICAv
LyBJbmRleCBpZCBmcmVlLWxpc3QuCgogICAgICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8v
IE9iamVjdCBzdG9yZSBpZC4KICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTUp
OwogICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiNSk7CiAgICAgICAgICAgICAg
ICBpZiAoYTUgIT0gYjUpIHJldHVybiBhNSAtIGI1OwoKICAgICAgICAgICAgICAgIGludDY0X3Qg
YTYsIGI2OyAvLyBJbmRleCBpZC4KICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwg
YTYpOwogICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiNik7CiAgICAgICAgICAg
ICAgICByZXR1cm4gYTYgLSBiNjsKICAgICAgICAgICAgfSBlbHNlIGlmIChhNCA9PSAyMDApIHsK
ICAgICAgICAgICAgICAgIC8vIE9iamVjdCBzdG9yZSBuYW1lIC0+IGlkIG1hcHBpbmcuCgogICAg
ICAgICAgICAgICAgU3RyaW5nIGE1LCBiNTsgLy8gT2JqZWN0IHN0b3JlIG5hbWUuCiAgICAgICAg
ICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBhNSk7CiAgICAgICAgICAgICAgICBx
ID0gZGVjb2RlU3RyaW5nV2l0aExlbihxLCBiNSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29k
ZVBvaW50Q29tcGFyZShhNSwgYjUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGE0ID09IDIwMSkg
ewogICAgICAgICAgICAgICAgLy8gSW5kZXggbmFtZSAtPiBpbmRleCBpZCBtYXBwaW5nLgoKICAg
ICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBPYmplY3Qgc3RvcmUgaWQuCiAgICAgICAg
ICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKICAgICAgICAgICAgICAgIHEgPSBkZWNv
ZGVWYXJJbnQocSwgYjUpOwogICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KSByZXR1cm4gYTUg
LSBiNTsKCiAgICAgICAgICAgICAgICBTdHJpbmcgYTYsIGI2OyAvLyBJbmRleCBuYW1lLgogICAg
ICAgICAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgYTYpOwogICAgICAgICAgICAg
ICAgcSA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocSwgYjYpOwogICAgICAgICAgICAgICAgcmV0dXJu
IGNvZGVQb2ludENvbXBhcmUoYTYsIGI2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0
dXJuIGE0IC0gYjQ7CiAgICAgICAgfSBlbHNlIGlmIChhMyA9PSAxIHx8IGEzID09IDIpIHsgLy8g
YTEgIT0gMCwgYTIgIT0gMAogICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgZGF0YSBvciAiZXhp
c3RzIiBkYXRhLgoKICAgICAgICAgICAgaWYgKHAgPT0gYV9lbmQgJiYgcSA9PSBiX2VuZCkgcmV0
dXJuIDA7CiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT0gYV9lbmQpIHJldHVybiAtMTsKICAgICAg
ICAgICAgZWxzZSBpZiAocSA9PSBiX2VuZCkgcmV0dXJuIDE7CgogICAgICAgICAgICBSZWZQdHI8
SURCS2V5PiBhNCwgYjQ7IC8vIFVzZXIga2V5LgogICAgICAgICAgICBwID0gZGVjb2RlS2V5KHAs
IGE0KTsKICAgICAgICAgICAgcSA9IGRlY29kZUtleShxLCBiNCk7CgogICAgICAgICAgICBpZiAo
YTQtPmlzTGVzc1RoYW4oYjQuZ2V0KCkpKSByZXR1cm4gLTE7CiAgICAgICAgICAgIGVsc2UgaWYg
KGE0LT5pc0VxdWFsKGI0LmdldCgpKSkgcmV0dXJuIDA7CiAgICAgICAgICAgIGVsc2UgcmV0dXJu
IDE7CiAgICAgICAgfSBlbHNlIGlmIChhMyA+PSAzMCkgewogICAgICAgICAgICAvLyBJbmRleCBk
YXRhLgoKICAgICAgICAgICAgYm9vbCBhSGFzS2V5ID0gKHAgIT0gKGEuZGF0YSgpICsgYS5zaXpl
KCkpKTsKICAgICAgICAgICAgYm9vbCBiSGFzS2V5ID0gKHEgIT0gKGIuZGF0YSgpICsgYi5zaXpl
KCkpKTsKCiAgICAgICAgICAgIGlmICghYUhhc0tleSAmJiBiSGFzS2V5KSByZXR1cm4gLTE7CiAg
ICAgICAgICAgIGVsc2UgaWYgKGFIYXNLZXkgJiYgIWJIYXNLZXkpIHJldHVybiAxOwogICAgICAg
ICAgICBlbHNlIGlmICghYUhhc0tleSAmJiAhYkhhc0tleSkgcmV0dXJuIDA7CgogICAgICAgICAg
ICBSZWZQdHI8SURCS2V5PiBhNCwgYjQ7CiAgICAgICAgICAgIHAgPSBkZWNvZGVLZXkocCwgYTQp
OwogICAgICAgICAgICBxID0gZGVjb2RlS2V5KHEsIGI0KTsKCiAgICAgICAgICAgIGlmIChhNC0+
aXNMZXNzVGhhbihiNC5nZXQoKSkpIHJldHVybiAtMTsKICAgICAgICAgICAgZWxzZSBpZiAoIWE0
LT5pc0VxdWFsKGI0LmdldCgpKSkgcmV0dXJuIDE7CgogICAgICAgICAgICBpZiAoaW5kZXhLZXlz
KSB7CiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIG51bWJlci4KICAgICAgICAgICAgICAg
IHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQ2NF90IGE1LCBiNTsgLy8g
InZlcnNpb24iCiAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTUpOwogICAgICAgICAg
ICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsKCiAgICAgICAgICAgIC8vcHJpbnRmKCJhNSA9ICVk
LCBiNSA9ICVkXG4iLCAoaW50KWE1LCAoaW50KWI1KTsKICAgICAgICAgICAgcmV0dXJuIGE1IC0g
YjU7CiAgICAgICAgfQoKICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICByZXR1
cm4gMDsKICAgIH0KCiAgICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3QgeyByZXR1cm4gImlkYl9j
bXAxIjsgfQogICAgdm9pZCBGaW5kU2hvcnRlc3RTZXBhcmF0b3Ioc3RkOjpzdHJpbmcqLCBjb25z
dCBsZXZlbGRiOjpTbGljZSYpIGNvbnN0IHt9IC8vIEZJWE1FOiBJZ25vcmU/CiAgICB2b2lkIEZp
bmRTaG9ydFN1Y2Nlc3NvcihzdGQ6OnN0cmluZyopIGNvbnN0IHt9IC8vIEZJWE1FOiBJZ25vcmU/
Cn0gbXlDb21wYXJhdG9yOwp9CgpzdGF0aWMgYm9vbCBzZXRVcE1ldGFkYXRhKGxldmVsZGI6OkRC
KiBkYikKewogICAgLy9wcmludGYoInNldFVwTWV0YWRhdGFcbiIpOwogICAgY29uc3Qgc3RkOjpz
dHJpbmcgbWV0YURhdGFLZXkgPSBtYWtlS2V5KDAsIDAsIDAsIDApOwoKICAgIGludDY0X3Qgc2No
ZW1hVmVyc2lvbjsKICAgIGlmICghZ2V0SW50KGRiLCBtZXRhRGF0YUtleSwgJnNjaGVtYVZlcnNp
b24pKSB7CiAgICAgICAgLy9wcmludGYoImZhaWxlZCB0byBnZXQgc2NoZW1hVmVyc2lvblxuIik7
CiAgICAgICAgc2NoZW1hVmVyc2lvbiA9IDA7CiAgICAgICAgaWYgKCFwdXRJbnQoZGIsIG1ldGFE
YXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkgewogICAgICAgICAgICAvL3ByaW50ZigiZmFpbGVkIHRv
IHB1dCBzY2hlbWFWZXJzaW9uIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9
CiAgICB9CgogICAgLy9wcmludGYoImdvdCBzY2hlbWF2ZXJzaW9uOiAlZFxuIiwgKGludClzY2hl
bWFWZXJzaW9uKTsKCiAgICBpZiAoc2NoZW1hVmVyc2lvbiAhPSAwKQogICAgICAgIHJldHVybiBm
YWxzZTsgLy8gRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhpcyB2ZXJzaW9uLgoKICAgIHJl
dHVybiB0cnVlOwp9CgpQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmlu
ZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmlsZUlkZW50
aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSkKewogICAgU3RyaW5nIHBhdGhC
YXNlMiA9IHBhdGhCYXNlOwoKICAgIGlmIChwYXRoQmFzZTIuaXNFbXB0eSgpKSB7CiAgICAgICAg
cGF0aEJhc2UyID0gIi90bXAvaW4tbWVtLWxldmVsZGIiOwogICAgfQoKICAgIGlmICghbWFrZUFs
bERpcmVjdG9yaWVzKHBhdGhCYXNlMikpIHsKICAgICAgICAvLyBGSVhNRTogSXMgdGhlcmUgYW55
IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRvIHRvIHJlY292ZXIgYXQgdGhpcyBwb2lu
dD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3QgZXJyb3Jpbmcgb3V0LgogICAgICAgIExP
R19FUlJPUigiVW5hYmxlZCB0byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFiYXNlIHBhdGggJXMi
LCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIFN0
cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlMiwgc2VjdXJpdHlP
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIubGV2ZWxkYiIpOwoKICAg
IGxldmVsZGI6OkRCKiBkYjsKICAgIGxldmVsZGI6Ok9wdGlvbnMgb3B0aW9uczsKICAgIG9wdGlv
bnMuY29tcGFyYXRvciA9ICZteUNvbXBhcmF0b3I7CiAgICBvcHRpb25zLmNyZWF0ZV9pZl9taXNz
aW5nID0gdHJ1ZTsKICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgY3VzdG9tIGNvbXBhcmF0b3IuIEJ5
dGUtd2lzZSBjb21wYXJpc29uIHdvbid0IHdvcmsgOigKICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0
dXMgPSBsZXZlbGRiOjpEQjo6T3BlbihvcHRpb25zLCBwYXRoLnV0ZjgoKS5kYXRhKCksICZkYik7
CgogICAgaWYgKCFzdGF0dXMub2soKSkgewogICAgICAgIC8vIEZJWE1FOiBJZiBjb21wYXJhdG9y
IG5hbWUgY2hhbmdlZCwgYmxvdyBhd2F5IHRoZSBvbGQgZGF0YWJhc2UgYW5kIHN0YXJ0IGEgbmV3
IG9uZS4KICAgICAgICAvL3ByaW50ZigiREI6Ok9wZW4gZmFpbGVkOiAlc1xuIiwgc3RhdHVzLlRv
U3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgUmVmUHRyPElE
QkxldmVsREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZShmaWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CgogICAgaWYgKCFz
ZXRVcE1ldGFkYXRhKGJhY2tpbmdTdG9yZS0+bV9kYi5nZXQoKSkpCiAgICAgICAgcmV0dXJuIDA7
CgogICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5yZWxlYXNlKCk7Cn0KCmJvb2wgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1l
LCBTdHJpbmcmIGZvdW5kVmVyc2lvbiwgaW50NjRfdCYgZm91bmRJZCkKewogICAgYm9vbCBvayA9
IGdldEludChtX2RiLmdldCgpLCBtYWtlS2V5KDAsIDAsIDAsIDIwMSwgbV9pZGVudGlmaWVyLCBu
YW1lKSwgJmZvdW5kSWQpOwogICAgaWYgKCFvaykgewogICAgICAgIC8vcHJpbnRmKCJmb3VuZCBu
byBtZXRhZGF0YSBmb3IgZGF0YWJhc2VcbiIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0K
CiAgICAvL3ByaW50ZigiZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGE6IGZvdW5kIGRhdGFiYXNl
IGlkOiAlZFxuIiwgKGludClmb3VuZElkKTsKCiAgICBvayA9IGdldFN0cmluZyhtX2RiLmdldCgp
LCBtYWtlS2V5KGZvdW5kSWQsIDAsIDAsIDIpLCAmZm91bmRWZXJzaW9uKTsKICAgIGlmICghb2sp
CiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vcHJpbnRmKCJleHRyYWN0SURCRGF0YWJhc2VN
ZXRhRGF0YTogZm91bmQgdmVyc2lvbjogJXNcbiIsIGZvdW5kVmVyc2lvbi5hc2NpaSgpLmRhdGEo
KSk7CgogICAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBpbnQ2NF90IGdldE5ld0RhdGFiYXNlSWQo
bGV2ZWxkYjo6REIqIGRiKQp7CiAgICAvLyBMb29rIGluIGZyZWUtbGlzdC4KICAgIHN0ZDo6c3Ry
aW5nIHN0YXJ0S2V5ID0gbWFrZUtleSgwLCAwLCAwLCAxMDApOwogICAgc3RkOjpzdHJpbmcgc3Rv
cEtleSA9IG1ha2VLZXkoMCwgMCwgMCwgMTAxKTsKCiAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0
b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CiAgICBmb3Ig
KGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmUo
aXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKICAgICAgICBpbnQ2NF90IGEs
IGIsIGM7CiAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CiAgICAgICAg
cCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKCiAgICAgICAgdW5zaWduZWQgY2hhciBkID0g
KnArKzsKICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gMTAwKTsKCiAgICAgICAgaW50NjRf
dCBkYXRhYmFzZUlkOwogICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgZGF0YWJhc2VJZCk7Cgog
ICAgICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlv
bnMoKSwgaXQtPmtleSgpKTsKICAgICAgICBBU1NFUlQocy5vaygpKTsKCiAgICAgICAgLy9wcmlu
dGYoImZvdW5kIGRhdGFiYXNlSWQgaW4gZnJlZS1saXN0OiAlZFxuIiwgKGludClkYXRhYmFzZUlk
KTsKICAgICAgICByZXR1cm4gZGF0YWJhc2VJZDsKICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVy
ZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KICAgIGludDY0X3QgbWF4RGF0YWJhc2VJZDsKICAg
IGlmICghZ2V0SW50KGRiLCBtYWtlS2V5KDAsIDAsIDAsIDEpLCAmbWF4RGF0YWJhc2VJZCkpCiAg
ICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CgogICAgaW50NjRfdCBkYXRhYmFzZUlkID0gbWF4RGF0
YWJhc2VJZCArIDE7CiAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KDAsIDAsIDAsIDEp
LCBkYXRhYmFzZUlkKTsKICAgIGlmICghb2spIHsKICAgICAgICAvL3ByaW50Zigic2V0dGluZyBt
YXggZGF0YWJhc2UgaWQgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cgog
ICAgcmV0dXJuIGRhdGFiYXNlSWQ7Cgp9Cgpib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNl
dElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZl
cnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKewogICAgLy9wcmludGYo
InNldElEQkRhdGFiYXNlTWV0YURhdGEgKHZlcnNpb246ICVzKVxuIiwgdmVyc2lvbi5hc2NpaSgp
LmRhdGEoKSk7CgogICAgaWYgKGludmFsaWRSb3dJZCkgewogICAgICAgIHJvd0lkID0gZ2V0TmV3
RGF0YWJhc2VJZChtX2RiLmdldCgpKTsKCiAgICAgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwg
bWFrZUtleSgwLCAwLCAwLCAyMDEsIG1faWRlbnRpZmllciwgbmFtZSksIHJvd0lkKSkKICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICghcHV0U3RyaW5nKG1fZGIuZ2V0KCks
IG1ha2VLZXkocm93SWQsIDAsIDAsIDIpLCB2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gZmFsc2U7
CgogICAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2Jq
ZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhz
LCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKQp7CiAgICAvL3ByaW50Zigi
Z2V0T2JqZWN0U3RvcmVzXG4iKTsKCiAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgNTAsIDEsIDApOwogICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1h
a2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTEpOwoKICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRv
cj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOwogICAgZm9y
IChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIG15Q29tcGFyYXRvci5Db21wYXJl
KGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CiAgICAgICAgaW50NjRfdCBh
LCBiLCBjOwogICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuZGF0YSgpOwogICAgICAg
IHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CiAgICAgICAgQVNTRVJUKGEgPT0gZGF0YWJh
c2VJZCk7CiAgICAgICAgQVNTRVJUKGIgPT0gMCk7CiAgICAgICAgQVNTRVJUKGMgPT0gMCk7Cgog
ICAgICAgIHVuc2lnbmVkIGNoYXIgZCA9ICpwKys7CiAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBk
ID09IDUwKTsKCiAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkOwogICAgICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgb2JqZWN0U3RvcmVJZCk7CiAgICAgICAgLy9wcmludGYoIkZvdW5kIG9iamVj
dFN0b3JlSWQ6ICVkXG4iLCAoaW50KW9iamVjdFN0b3JlSWQpOwoKICAgICAgICAvL3ByaW50Zigi
aXQtPmtleSgpOiAiKTsgcHJpbnRTdHJpbmcoaXQtPmtleSgpLlRvU3RyaW5nKCkpOyBwcmludGYo
IlxuIik7CgogICAgICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQt
PnZhbHVlKCkuVG9TdHJpbmcoKSk7CiAgICAgICAgLy9wcmludGYoIk5hbWU6ICVzXG4iLCBvYmpl
Y3RTdG9yZU5hbWUuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgIGl0LT5OZXh0KCk7CiAgICAgICAg
Ly9wcmludGYoIml0LT5rZXkoKTogIik7IHByaW50U3RyaW5nKGl0LT5rZXkoKS5Ub1N0cmluZygp
KTsgcHJpbnRmKCJcbiIpOwogICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRmKCJpdCBu
b3QgdmFsaWRcbiIpOyByZXR1cm47IH0KICAgICAgICBTdHJpbmcga2V5UGF0aCA9IGRlY29kZVN0
cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsKICAgICAgICBpdC0+TmV4dCgpOwogICAgICAg
IGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRmKCJpdCBub3QgdmFsaWRcbiIpOyByZXR1cm47IH0K
ICAgICAgICBib29sIGF1dG9JbmNyZW1lbnQgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOwogICAgICAg
IGl0LT5OZXh0KCk7CiAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmludGYoIml0IG5vdCB2
YWxpZFxuIik7IHJldHVybjsgfQogICAgICAgIC8vIElzIGV2aWNhdGFibGUKICAgICAgICBpdC0+
TmV4dCgpOwogICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRmKCJpdCBub3QgdmFsaWRc
biIpOyByZXR1cm47IH0KICAgICAgICAvLyBMYXN0IHZlcnNpb24KICAgICAgICBpdC0+TmV4dCgp
OwogICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRmKCJpdCBub3QgdmFsaWRcbiIpOyBy
ZXR1cm47IH0KICAgICAgICAvLyBNYXhpbXVtIGluZGV4IGlkIGV2ZXIgYWxsb2NhdGVkCgogICAg
ICAgIGZvdW5kSWRzLmFwcGVuZChvYmplY3RTdG9yZUlkKTsKICAgICAgICBmb3VuZE5hbWVzLmFw
cGVuZChvYmplY3RTdG9yZU5hbWUpOwogICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtleVBh
dGgpOwogICAgICAgIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmFwcGVuZChhdXRvSW5jcmVtZW50
KTsKICAgIH0KfQoKc3RhdGljIGludDY0X3QgZ2V0TmV3T2JqZWN0U3RvcmVJZChsZXZlbGRiOjpE
QiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKewogICAgLy8gTG9vayBpbiBmcmVlLWxpc3QuCiAg
ICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUwKTsK
ICAgIHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MSk7
CgogICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxk
Yjo6UmVhZE9wdGlvbnMoKSkpOwogICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxp
ZCgpICYmIG15Q29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+
TmV4dCgpKSB7CiAgICAgICAgaW50NjRfdCBhLCBiLCBjOwogICAgICAgIGNvbnN0IGNoYXIqIHAg
PSBpdC0+a2V5KCkuZGF0YSgpOwogICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7
CgogICAgICAgIHVuc2lnbmVkIGNoYXIgZCA9ICpwKys7CiAgICAgICAgQVNTRVJUX1VOVVNFRChk
LCBkID09IDE1MCk7CgogICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKICAgICAgICBwID0g
ZGVjb2RlVmFySW50KHAsIG9iamVjdFN0b3JlSWQpOwoKICAgICAgICBsZXZlbGRiOjpTdGF0dXMg
cyA9IGRiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CiAgICAg
ICAgQVNTRVJUKHMub2soKSk7CgogICAgICAgIC8vcHJpbnRmKCJmb3VuZCBvYmplY3RTdG9yZUlk
IGluIGZyZWUtbGlzdDogJWRcbiIsIChpbnQpb2JqZWN0U3RvcmVJZCk7CgogICAgICAgIHJldHVy
biBvYmplY3RTdG9yZUlkOwogICAgfQoKICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVyZSB3YXMg
bm8gZnJlZS1saXN0LgogICAgaW50NjRfdCBtYXhPYmplY3RTdG9yZUlkOwogICAgaWYgKCFnZXRJ
bnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMyksICZtYXhPYmplY3RTdG9yZUlkKSkK
ICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKCiAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQg
PSBtYXhPYmplY3RTdG9yZUlkICsgMTsKICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgMyksIG9iamVjdFN0b3JlSWQpOwogICAgaWYgKCFvaykgewogICAg
ICAgIC8vcHJpbnRmKCJzZXR0aW5nIG1heCBvYmplY3Qgc3RvcmUgaWQgZmFpbGVkXG4iKTsKICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIG9iamVjdFN0b3JlSWQ7Cn0KCmJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRh
YmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBh
dXRvSW5jcmVtZW50LCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpCnsKICAgIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCA9IGdldE5ld09iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCk7CgogICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFi
YXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgbmFtZSk7CiAgICBpZiAoIW9rKSB7
IHByaW50ZigiZmFpbGVkIHRvIHNldCBuYW1lXG4iKTsgcmV0dXJuIGZhbHNlOyB9CgogICAgb2sg
PSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2Jq
ZWN0U3RvcmVJZCwgMSksIGtleVBhdGgpOwogICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0
byBzZXQgbmFtZVxuIik7IHJldHVybiBmYWxzZTsgfQoKICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0
KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDIpLCBhdXRv
SW5jcmVtZW50KTsKICAgIGlmICghb2spIHsgcHJpbnRmKCJmYWlsZWQgdG8gc2V0IGF1dG9JbmNy
ZW1lbnRcbiIpOyByZXR1cm4gZmFsc2U7IH0KCiAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBt
YWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAzKSwgZmFsc2UpOwog
ICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgaXNFdmljYXRhYmxlXG4iKTsgcmV0
dXJuIGZhbHNlOyB9CgogICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFz
ZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNCksIDEpOwogICAgaWYgKCFvaykgeyBwcmlu
dGYoImZhaWxlZCB0byBzZXQgbGFzdCB2ZXJzaW9uXG4iKTsgcmV0dXJuIGZhbHNlOyB9CgogICAg
Ly8gRklYTUU6IE5vdCBzdXJlIHdlIGV2ZW4gbmVlZCB0byBzZXQgdGhpcz8KICAgIG9rID0gcHV0
SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3Jl
SWQsIDUpLCAzMCk7CiAgICBpZiAoIW9rKSB7IHByaW50ZigiZmFpbGVkIHRvIHNldCBtYXggaW5k
ZXggaWRcbiIpOyByZXR1cm4gZmFsc2U7IH0KCiAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBt
YWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDIwMCwgbmFtZSksIG9iamVjdFN0b3JlSWQpOwogICAg
aWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgb2JqZWN0IHN0b3JlIGlkXG4iKTsgcmV0
dXJuIGZhbHNlOyB9CgogICAgYXNzaWduZWRPYmplY3RTdG9yZUlkID0gb2JqZWN0U3RvcmVJZDsK
CiAgICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UobGV2ZWxkYjo6REIq
IGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgYmVnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmQpCnsK
ICAgIC8vcHJpbnRmKCJkZWxldGVSYW5nZSAoYmVnaW46ICIpOwogICAgLy9wcmludFN0cmluZyhi
ZWdpbik7CiAgICAvL3ByaW50ZigiLCBlbmQ6ICIpOwogICAgLy9wcmludFN0cmluZyhlbmQpOwog
ICAgLy9wcmludGYoIilcbiIpOwoKICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGIt
Pk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKICAgIGZvciAoaXQtPlNlZWso
YmVnaW4pOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0b3IuWENvbXBhcmUoaXQtPmtleSgpLCBl
bmQpIDwgMDsgaXQtPk5leHQoKSkgewogICAgICAgIC8vcHJpbnRmKCJkZWxldGVSYW5nZSwga2V5
OiAiKTsKICAgICAgICAvL3ByaW50U3RyaW5nKGl0LT5rZXkoKS5Ub1N0cmluZygpKTsKICAgICAg
ICAvL3ByaW50ZigiXG4iKTsKICAgICAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5EZWxldGUo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CiAgICAgICAgaWYgKCFzLm9rKCkp
CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9p
ZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKewogICAgU3RyaW5nIG9iamVjdFN0b3JlTmFt
ZTsKICAgIGdldFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUw
LCBvYmplY3RTdG9yZUlkLCAwKSwgJm9iamVjdFN0b3JlTmFtZSk7CgogICAgbV9kYi0+RGVsZXRl
KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBv
YmplY3RTdG9yZUlkLCAwKSk7CiAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25z
KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDEpKTsKICAg
IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMikpOwogICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6
OldyaXRlT3B0aW9ucygpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9y
ZUlkLCAzKSk7CiAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpKTsKICAgIG1fZGItPkRl
bGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1
MCwgb2JqZWN0U3RvcmVJZCwgNSkpOwoKICAgIC8vIEluc2VydCBpbnRvIGZyZWUtbGlzdC4KICAg
IHB1dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MCwgb2Jq
ZWN0U3RvcmVJZCksICIiKTsKCiAgICAvLyBGSVhNRTogRGVsZXRlIHRoZSBvYmplY3Qgc3RvcmUg
bmFtZSBmcm9tIHRoZSBtYXBwaW5nICh3ZSBuZWVkIHRvIGxvb2sgaXQgdXApCiAgICBtX2RiLT5E
ZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwg
MjAwLCBvYmplY3RTdG9yZU5hbWUpKTsKCiAgICAvLyBXZSBjb3VsZCBqdXN0IGRvIG9uZSBiaWcg
ZGVsZXRlUmFuZ2UgZm9yIHRoZSBzdHVmZiBiZWxvdy4uLgoKICAgIC8vIE9iamVjdCBzdG9yZSBk
YXRhLCBleGlzdHMgZGF0YSwgaW5kZXggZGF0YS4KICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5n
ZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgbWFrZUtleShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkpKQogICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KCiNpZiAwCiAgICAvLyBFeGlzdHMgZGF0YS4KICAgIGlmICghZGVsZXRl
UmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKSwg
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAzKSkpCiAgICAgICAgcmV0dXJuOyAv
LyBGSVhNRTogUmVwb3J0IGVycm9yLgoKICAgIC8vIEluZGV4IGRhdGEuCiAgICBpZiAoIWRlbGV0
ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMzAp
LCBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAwKSkpCiAgICAgICAgcmV0
dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgojZW5kaWYKCiAgICAvLyBJbmRleCBpZCBmcmVl
LWxpc3QKICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1
MSwgb2JqZWN0U3RvcmVJZCArIDEpKSkKICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQg
ZXJyb3IuCgogICAgLy8gSW5kZXggbWV0YS1kYXRhCiAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIu
Z2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkKSwgbWFr
ZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQgKyAxKSkpCiAgICAgICAg
cmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgoKfQoKU3RyaW5nIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKewogICAgY29uc3Qgc3RkOjpzdHJp
bmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5j
b2RlS2V5KGtleSkpOwogICAgc3RkOjpzdHJpbmcgZGF0YTsKCiAgICBsZXZlbGRiOjpTdGF0dXMg
cyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7
CiAgICBpZiAoIXMub2soKSkKICAgICAgICByZXR1cm4gU3RyaW5nKCk7CgogICAgaW50NjRfdCB2
ZXJzaW9uOwogICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7CiAgICBjb25zdCBjaGFyKiBw
ID0gZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgdmVyc2lvbik7CgogICAgcmV0dXJuIGRlY29k
ZVN0cmluZyhzdGQ6OnN0cmluZyhwLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKSk7Cn0K
Cm5hbWVzcGFjZSB7CmNsYXNzIExldmVsREJSZWNvcmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2lu
Z1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZSB7CnB1YmxpYzoKICAgIExldmVsREJSZWNv
cmRIYW5kbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHByaW1hcnlLZXksIGludDY0X3QgdmVyc2lvbikg
OiBtX3ByaW1hcnlLZXkocHJpbWFyeUtleSksIG1fdmVyc2lvbih2ZXJzaW9uKSB7fQogICAgc3Rk
OjpzdHJpbmcgcHJpbWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQogICAg
aW50NjRfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJzaW9uOyB9CnByaXZhdGU6CiAg
ICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlLZXk7IC8vIHRoZSByZXN1bHQgb2YgZW5jb2RlS2V5KElE
QktleSkgYmFzaWNhbGx5LgogICAgaW50NjRfdCBtX3ZlcnNpb247Cn07Cn0KCnN0YXRpYyBpbnQ2
NF90IGdldE5ld1ZlcnNpb25OdW1iZXIobGV2ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKewogICAgaW50NjRfdCBsYXN0VmVyc2lvbjsKICAg
IGlmICghZ2V0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9y
ZUlkLCA0KSwgJmxhc3RWZXJzaW9uKSkKICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CgogICAgQVNT
RVJUKGxhc3RWZXJzaW9uID49IDApOwoKICAgIGludDY0X3QgdmVyc2lvbiA9IGxhc3RWZXJzaW9u
ICsgMTsKICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwg
NTAsIG9iamVjdFN0b3JlSWQsIDQpLCB2ZXJzaW9uKTsKICAgIEFTU0VSVChvayk7CgogICAgLyog
RklYTUU6IERldGVjdCBvdmVyZmxvdz8gTm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IGl0IGFueXdh
eS4uLj8gQW5kIGl0CiAgICAgKiBwcm9iYWJseSBpc24ndCBhIGNhdGFzdHJvcGhlIGFueXdheS4u
LiAqLwoKICAgIHJldHVybiB2ZXJzaW9uOwp9Cgpib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9i
amVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgcmVjb3JkSGFuZGxlKQp7CiAgICBpbnQ2NF90IHZlcnNp
b24gPSBnZXROZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQpOwogICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVkYXRhS2V5ID0gbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBlbmNvZGVLZXkoa2V5KSk7CgogICAgbGV2
ZWxkYjo6U3RhdHVzIHMgPSBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG9iamVj
dFN0b3JlZGF0YUtleSwgZW5jb2RlVmFySW50KHZlcnNpb24pICsgZW5jb2RlU3RyaW5nKHZhbHVl
KSk7CiAgICBpZiAoIXMub2soKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgY29uc3Qgc3Rk
OjpzdHJpbmcgZXhpc3RzRW50cnlLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDIsIGVuY29kZUtleShrZXkpKTsKCiAgICBzID0gbV9kYi0+UHV0KGxldmVsZGI6OldyaXRl
T3B0aW9ucygpLCBleGlzdHNFbnRyeUtleSwgZW5jb2RlSW50KHZlcnNpb24pKTsKICAgIGlmICgh
cy5vaygpKQogICAgICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IElkZWFsbHksIHdlIHdhbnQg
dG8gcm9sbCBiYWNrIHRoZSBwdXQgYWJvdmU/CgogICAgcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYo
bmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5jb2RlS2V5KGtleSksIHZlcnNpb24pKTsKICAgIHJl
dHVybiB0cnVlOwp9Cgp2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3Rv
cmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCnsKICAgIGNvbnN0
IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCAxKTsKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQgKyAxLCAwKTsgLy8gTm90IGluY2x1ZGVkLgoKICAgIGRlbGV0ZVJhbmdl
KG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBzdG9wS2V5KTsKfQoKdm9pZCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhh
bmRsZSkKewogICAgLy9wcmludGYoImRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkXG4iKTsKCiAgICBj
b25zdCBMZXZlbERCUmVjb3JkSGFuZGxlJiBsZXZlbERCUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nh
c3Q8Y29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CiAgICBjb25zdCBz
dGQ6OnN0cmluZyBrZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEsIGxl
dmVsREJSZWNvcmRIYW5kbGUucHJpbWFyeUtleSgpKTsKCiAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5KTsKfQoKZG91YmxlIElE
QkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQp7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBz
dGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CiAgICBjb25z
dCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCAyKTsgLy8gTm90IGluY2x1ZGVkLgoKICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQo
bV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOwoKICAgIGludCBtYXhO
dW1lcmljS2V5ID0gMDsKCiAgICAvLyBGSVhNRTogVGhpcyBpcyB2ZXJ5IHNhZmUsIGJ1dCB2ZXJ5
IHNsb3cuIEl0J3MgY2FjaGVkIG9uZSBsYXllciB1cCwgYnV0CiAgICAvLyBJJ20gbm90IHN1cmUg
dGhhdCdzIGdvb2QgZW5vdWdoPwogICAgLy8gQWxzbywgd2UgY291bGQgcHJvYmFibHkgYmUgc21h
cnRlciB3aXRoIHRoZSBpdGVyYXRvciByYW5nZS4uLgoKICAgIGZvciAoaXQtPlNlZWsoc3RhcnRL
ZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BL
ZXkpIDwgMDsgaXQtPk5leHQoKSkgewogICAgICAgIGludDY0X3QgYSwgYiwgYzsKCiAgICAgICAg
Y29uc3QgY2hhciogcCA9IGRlY29kZVByZWZpeChpdC0+a2V5KCkuVG9TdHJpbmcoKS5jX3N0cigp
LCBhLCBiLCBjKTsKICAgICAgICBBU1NFUlQoYSA9PSBkYXRhYmFzZUlkKTsKICAgICAgICBBU1NF
UlQoYiA9PSBvYmplY3RTdG9yZUlkKTsKICAgICAgICBBU1NFUlQoYyA9PSAxKTsKCiAgICAgICAg
UmVmUHRyPElEQktleT4ga2V5OwogICAgICAgIGRlY29kZUtleShwLCBrZXkpOwoKICAgICAgICBp
ZiAoa2V5LT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7CiAgICAgICAgICAgIGludDY0
X3QgbiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGtleS0+bnVtYmVyKCkpOwogICAgICAgICAgICBp
ZiAobiA+IG1heE51bWVyaWNLZXkpCiAgICAgICAgICAgICAgICBtYXhOdW1lcmljS2V5ID0gbjsK
ICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1heE51bWVyaWNLZXkgKyAxOwp9Cgpib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBSZWZQdHI8
T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiBmb3VuZFJlY29yZEhhbmRsZSkKewogICAgY29uc3Qg
c3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMSwgZW5jb2RlS2V5KGtleSkpOwogICAgc3RkOjpzdHJpbmcgZGF0YTsKCiAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5
LCAmZGF0YSk7CiAgICBpZiAoIXMub2soKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgaW50
NjRfdCB2ZXJzaW9uOwogICAgZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgdmVyc2lvbik7Cgog
ICAgZm91bmRSZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZEhhbmRsZShl
bmNvZGVLZXkoa2V5KSwgdmVyc2lvbikpOwogICAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBj
YWxsYmFjaykKewogICAgLy9wcmludGYoImZvckVhY2hPYmplY3RTdG9yZVJlY29yZFxuIik7Cgog
ICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIDEpOwogICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7IC8vIE5vdCBpbmNsdWRlZC4KCiAgICBPd25QdHI8
bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRp
b25zKCkpKTsKICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNv
bXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgewog
ICAgICAgIGludDY0X3QgYSwgYiwgYzsKICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJl
Zml4KGl0LT5rZXkoKS5Ub1N0cmluZygpLmNfc3RyKCksIGEsIGIsIGMpOwoKICAgICAgICBSZWZQ
dHI8SURCS2V5PiBwcmltYXJ5S2V5OwogICAgICAgIGRlY29kZUtleShwLCBwcmltYXJ5S2V5KTsK
CiAgICAgICAgaW50NjRfdCB2ZXJzaW9uOwogICAgICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVW
YXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCB2ZXJzaW9uKTsKCiAgICAgICAgUmVmUHRyPExldmVs
REJSZWNvcmRIYW5kbGU+IHJoKGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFuZGxlKGVuY29k
ZUtleSgqcHJpbWFyeUtleSksIHZlcnNpb24pKSk7CiAgICAgICAgU3RyaW5nIGlkYlZhbHVlID0g
ZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHEsIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1
ZSgpLnNpemUoKSkpOwoKICAgICAgICAvL3ByaW50ZigiZm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
LCBpZHZWYWx1ZSA9ICVzXG4iLCBpZGJWYWx1ZS5hc2NpaSgpLmRhdGEoKSk7CgogICAgICAgIGNh
bGxiYWNrLmNhbGxiYWNrKCpyaCwgaWRiVmFsdWUpOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9
Cgp2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywg
VmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQp7CiAgICAvL3ByaW50ZigiZ2V0SW5kZXhl
cyBmb3Igb2JqZWN0IHN0b3JlICVkXG4iLCAoaW50KW9iamVjdFN0b3JlSWQpOwoKICAgIHN0ZDo6
c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0
b3JlSWQpOwogICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwg
MCwgMTAwLCBvYmplY3RTdG9yZUlkICsgMSk7CgogICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9y
PiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CiAgICBmb3Ig
KGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmUo
aXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKICAgICAgICBpbnQ2NF90IGEs
IGIsIGM7CiAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CiAgICAgICAg
cCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKCiAgICAgICAgdW5zaWduZWQgY2hhciBkID0g
KnArKzsKICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gMTAwKTsKCiAgICAgICAgaW50NjRf
dCBpbmRleElkOwogICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgaW5kZXhJZCk7CiAgICAgICAg
Ly9wcmludGYoIkZvdW5kIGluZGV4IGlkOiAlZFxuIiwgKGludClpbmRleElkKTsKCiAgICAgICAg
U3RyaW5nIGluZGV4TmFtZSA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsK
ICAgICAgICAvL3ByaW50ZigiTmFtZTogJXNcbiIsIGluZGV4TmFtZS5hc2NpaSgpLmRhdGEoKSk7
CiAgICAgICAgaXQtPk5leHQoKTsKICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50Zigi
aXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9CgogICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAq
aXQtPnZhbHVlKCkuZGF0YSgpOwogICAgICAgIGl0LT5OZXh0KCk7CiAgICAgICAgaWYgKCFpdC0+
VmFsaWQoKSkgeyBwcmludGYoIml0IG5vdCB2YWxpZFxuIik7IHJldHVybjsgfQoKICAgICAgICBT
dHJpbmcga2V5UGF0aCA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsKCiAg
ICAgICAgZm91bmRJZHMuYXBwZW5kKGluZGV4SWQpOwogICAgICAgIGZvdW5kTmFtZXMuYXBwZW5k
KGluZGV4TmFtZSk7CiAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7CiAgICAg
ICAgZm91bmRVbmlxdWVGbGFncy5hcHBlbmQoaW5kZXhVbmlxdWUpOwogICAgfQp9CgpzdGF0aWMg
aW50NjRfdCBnZXROZXdJbmRleElkKGxldmVsZGI6OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCnsKICAgIC8vIExvb2sgaW4gZnJlZS1saXN0LgogICAg
c3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MSwgb2Jq
ZWN0U3RvcmVJZCk7CiAgICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQgKyAxKTsKCiAgICBPd25QdHI8bGV2ZWxkYjo6SXRl
cmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CiAgICBm
b3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBh
cmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKICAgICAgICBpbnQ2NF90
IGEsIGIsIGM7CiAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CiAgICAg
ICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKCiAgICAgICAgdW5zaWduZWQgY2hhciBk
ID0gKnArKzsKICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gMTUxKTsKCiAgICAgICAgaW50
NjRfdCB0cmFzaDsgLy8gb2JqZWN0IHN0b3JlIGlkCiAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCB0cmFzaCk7CgogICAgICAgIGludDY0X3QgaW5kZXhJZDsKICAgICAgICBwID0gZGVjb2RlVmFy
SW50KHAsIGluZGV4SWQpOwoKICAgICAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5EZWxldGUo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CiAgICAgICAgQVNTRVJUKHMub2so
KSk7CgogICAgICAgIC8vcHJpbnRmKCJmb3VuZCBpbmRleCBpZCBpbiBmcmVlLWxpc3Q6ICVkXG4i
LCAoaW50KWluZGV4SWQpOwogICAgICAgIEFTU0VSVChpbmRleElkID49IDMwKTsKICAgICAgICBy
ZXR1cm4gaW5kZXhJZDsKICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5v
IGZyZWUtbGlzdC4KICAgIGludDY0X3QgbWF4SW5kZXhJZDsKICAgIGlmICghZ2V0SW50KGRiLCBt
YWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgJm1heEluZGV4
SWQpKQogICAgICAgIG1heEluZGV4SWQgPSAzMDsgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCBpdCBz
dGFydHMgYXQgMzAhIQoKICAgIGludDY0X3QgaW5kZXhJZCA9IG1heEluZGV4SWQgKyAxOwogICAg
Ym9vbCBvayA9IHB1dEludChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0
U3RvcmVJZCwgNSksIGluZGV4SWQpOwogICAgaWYgKCFvaykgewogICAgICAgIC8vcHJpbnRmKCJz
ZXR0aW5nIG1heCBpbmRleCBpZCBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAg
IH0KCiAgICByZXR1cm4gaW5kZXhJZDsKfQoKYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGlu
dDY0X3QmIGluZGV4SWQpCnsKICAgIC8vcHJpbnRmKCJjcmVhdGVJbmRleCBmb3Igb2JqZWN0IHN0
b3JlICVkXG4iLCAoaW50KW9iamVjdFN0b3JlSWQpOwogICAgaW5kZXhJZCA9IGdldE5ld0luZGV4
SWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CiAgICAvL3ByaW50Zigi
aW5kZXhJZDogJWRcbiIsIChpbnQpaW5kZXhJZCk7CgogICAgYm9vbCBvayA9IHB1dFN0cmluZyht
X2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgMCksIG5hbWUpOwogICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQg
aW5kZXggbmFtZVxuIik7IHJldHVybiBmYWxzZTsgfQoKICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0
KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCAxKSwgaXNVbmlxdWUpOwogICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgaXN1
bmlxdWVcbiIpOyByZXR1cm4gZmFsc2U7IH0KCiAgICBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgp
LCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
MiksIGtleVBhdGgpOwogICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQga2V5IHBh
dGhcbiIpOyByZXR1cm4gZmFsc2U7IH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQp7CiAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KICAgIHJldHVybjsKfQoKYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNv
bnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiByZWNvcmRIYW5kbGUpCnsKICAgIEFTU0VSVChp
bmRleElkID49IDMwKTsKICAgIGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUmIGxldmVsREJSZWNv
cmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERCUmVjb3JkSGFuZGxlJj4ocmVjb3Jk
SGFuZGxlKTsKCiAgICAvL3ByaW50ZigicHV0SW5kZXhEYXRhRm9yUmVjb3JkIChkYjogJWQsIG9z
OiAlZCwgaWR4OiAlZCBrZXk6ICIsIChpbnQpZGF0YWJhc2VJZCwgKGludClvYmplY3RTdG9yZUlk
LCAoaW50KWluZGV4SWQpOyBwcmludFN0cmluZyhlbmNvZGVLZXkoa2V5KSk7IHByaW50ZigiIHJl
Y29yZEhhbmRsZS5wcmltYXJ5S2V5KCk6ICIpOyBwcmludFN0cmluZyhsZXZlbERCUmVjb3JkSGFu
ZGxlLnByaW1hcnlLZXkoKSk7IHByaW50ZigiKVxuIik7CgogICAgY29uc3QgaW50NjRfdCBnbG9i
YWxTZXF1ZW5jZU51bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCk7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBpbmRleERhdGFLZXkg
PSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleShr
ZXkpLCBnbG9iYWxTZXF1ZW5jZU51bWJlcik7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBkYXRhID0g
ZW5jb2RlVmFySW50KGxldmVsREJSZWNvcmRIYW5kbGUudmVyc2lvbigpKSArIGxldmVsREJSZWNv
cmRIYW5kbGUucHJpbWFyeUtleSgpOwoKICAgIHJldHVybiBtX2RiLT5QdXQobGV2ZWxkYjo6V3Jp
dGVPcHRpb25zKCksIGluZGV4RGF0YUtleSwgZGF0YSkub2soKTsKfQoKc3RhdGljIGJvb2wgZmlu
ZEdyZWF0ZXN0S2V5TGVzc1RoYW4obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYg
dGFyZ2V0LCBzdGQ6OnN0cmluZyogZm91bmRLZXkpCnsKICAgIE93blB0cjxsZXZlbGRiOjpJdGVy
YXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKICAgIGl0
LT5TZWVrKHRhcmdldCk7CgogICAgaWYgKCFpdC0+VmFsaWQoKSkgewogICAgICAgIGl0LT5TZWVr
VG9MYXN0KCk7CiAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgfQoKICAgIHdoaWxlIChteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+
a2V5KCksIHRhcmdldCkgPj0gMCkgewogICAgICAgIGl0LT5QcmV2KCk7CiAgICAgICAgaWYgKCFp
dC0+VmFsaWQoKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgICpmb3VuZEtl
eSA9IGl0LT5rZXkoKS5Ub1N0cmluZygpOwogICAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IE9iamVj
dFN0b3JlUmVjb3JkSGFuZGxlJiByZWNvcmRIYW5kbGUpCnsKICAgIC8vIEZJWE1FOiBUaGlzIGlz
bid0IHJlYWxseSBuZWVkZWQsIGJlY2F1c2Ugb2YgdGhlIHZlcnNpb24gc3R1ZmYhCiAgICByZXR1
cm4gdHJ1ZTsKI2lmIDAKCiAgICAvL3ByaW50ZigiZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkIChk
YjogJWQsIG9iamVjdCBzdG9yZTogJWQsIGluZGV4OiAlZClcbiIsIChpbnQpZGF0YWJhc2VJZCwg
KGludClvYmplY3RTdG9yZUlkLCAoaW50KWluZGV4SWQpOwoKICAgIGNvbnN0IExldmVsREJSZWNv
cmRIYW5kbGUmIGxldmVsREJSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERC
UmVjb3JkSGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKICAgIC8vcHJpbnRmKCJwcmltYXJ5a2V5OiAi
KTsgcHJpbnRTdHJpbmcobGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCkpOyBwcmludGYo
IlxuIik7CgogICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOwogICAgc3RkOjpzdHJpbmcgc3RvcEtleTsKICAg
IGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkICsgMSksICZzdG9wS2V5KSkKICAgICAgICByZXR1
cm4gdHJ1ZTsKCiAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJh
dG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKCiAgICAvLyBGSVhNRTogVGhpcyBpcyBjcmF6
eSBpbmVmZmljaWVudCEKICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAm
JiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDw9IDA7
IGl0LT5OZXh0KCkpIHsKICAgICAgICBpZiAoaXQtPnZhbHVlKCkuVG9TdHJpbmcoKSA9PSBsZXZl
bERCUmVjb3JkSGFuZGxlLnByaW1hcnlLZXkoKSkgewogICAgICAgICAgICBsZXZlbGRiOjpTdGF0
dXMgcyA9IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtleSgpKTsK
ICAgICAgICAgICAgLy9wcmludGYoImRlbGV0ZSBrZXk6ICIpOyBwcmludFN0cmluZyhpdC0+a2V5
KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKICAgICAgICAgICAgaWYgKCFzLm9rKCkpCiAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0
cnVlOwojZW5kaWYKfQoKU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFZp
YUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQp7CiAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5
S2V5ID0gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsIGtleSk7CiAgICBpZiAoIXByaW1hcnlLZXkpCiAgICAgICAgcmV0dXJuIFN0cmluZygp
OwoKICAgIHJldHVybiBnZXRPYmplY3RTdG9yZVJlY29yZChkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCAqcHJpbWFyeUtleSk7Cn0KCnN0YXRpYyBib29sIHZlcnNpb25FeGlzdHMobGV2ZWxkYjo6
REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCB2ZXJzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFByaW1hcnlLZXkpCnsKICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIGtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
MiwgZW5jb2RlZFByaW1hcnlLZXkpOwogICAgc3RkOjpzdHJpbmcgZGF0YTsKCiAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwga2V5LCAmZGF0YSk7
CiAgICBpZiAoIXMub2soKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIGRlY29k
ZUludChkYXRhKSA9PSB2ZXJzaW9uOwp9CgpQYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQp7
CiAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVs
ZGI6OlJlYWRPcHRpb25zKCkpKTsKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsZGJLZXkgPSBt
YWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleShrZXkp
KTsKICAgIGl0LT5TZWVrKGxldmVsZGJLZXkpOwoKICAgIGZvciAoOzspIHsKICAgICAgICBpZiAo
IWl0LT5WYWxpZCgpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAobXlDb21wYXJh
dG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCiAgICAgICAg
ICAgIHJldHVybiAwOwoKICAgICAgICBpbnQ2NF90IHZlcnNpb247CiAgICAgICAgY29uc3QgY2hh
ciogcCA9IGRlY29kZVZhckludChpdC0+dmFsdWUoKS5kYXRhKCksIHZlcnNpb24pOwogICAgICAg
IHN0ZDo6c3RyaW5nIGVuY29kZWRQcmltYXJ5S2V5ID0gc3RkOjpzdHJpbmcocCwgaXQtPnZhbHVl
KCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKCiAgICAgICAgaWYgKCF2ZXJzaW9uRXhp
c3RzKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHZlcnNpb24sIGVuY29k
ZWRQcmltYXJ5S2V5KSkgewogICAgICAgICAgICAvLyBEZWxldGUgc3RhbGUgaW5kZXggZGF0YSBl
bnRyeSBhbmQgY29udGludWUuCiAgICAgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0
ZU9wdGlvbnMoKSwgaXQtPmtleSgpKTsKICAgICAgICAgICAgaXQtPk5leHQoKTsKICAgICAgICAg
ICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5
OwogICAgICAgIGRlY29kZUtleShlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpLCBwcmltYXJ5S2V5
KTsKICAgICAgICByZXR1cm4gcHJpbWFyeUtleS5yZWxlYXNlKCk7CiAgICB9Cn0KCmJvb2wgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtl
eSkKewogICAgLy9wcmludGYoImtleUV4aXN0c0luSW5kZXggKGRiOiAlZCwgb3M6ICVkLCBpZHg6
ICVkIGtleTogIiwgKGludClkYXRhYmFzZUlkLCAoaW50KW9iamVjdFN0b3JlSWQsIChpbnQpaW5k
ZXhJZCk7IHByaW50U3RyaW5nKGVuY29kZUtleShrZXkpKTsgcHJpbnRmKCIpXG4iKTsKCiAgICBj
b25zdCBzdGQ6OnN0cmluZyBsZXZlbERCS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoa2V5KSk7CiAgICBPd25QdHI8bGV2ZWxkYjo6SXRl
cmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKCiAg
ICBib29sIGZvdW5kID0gZmFsc2U7CgogICAgaXQtPlNlZWsobGV2ZWxEQktleSk7CiAgICBpZiAo
aXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLlRv
U3RyaW5nKCksIGxldmVsREJLZXkpID09IDApCiAgICAgICAgZm91bmQgPSB0cnVlOwoKICAgIC8v
cHJpbnRmKCJmb3VuZCA9ICVzXG4iLCBmb3VuZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgcmV0
dXJuIGZvdW5kOwp9CgpuYW1lc3BhY2UgewpjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVibGlj
IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yIHsKcHVibGljOgogICAgQ3Vyc29ySW1wbENvbW1vbihs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3Blbiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkK
ICAgICAgICA6IG1fZGIoZGIpCiAgICAgICAgLCBtX2xvd0tleShsb3dLZXkpCiAgICAgICAgLCBt
X2xvd09wZW4obG93T3BlbikKICAgICAgICAsIG1faGlnaEtleShoaWdoS2V5KQogICAgICAgICwg
bV9oaWdoT3BlbihoaWdoT3BlbikKICAgICAgICAsIG1fZm9yd2FyZChmb3J3YXJkKQogICAgewog
ICAgfQogICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9CgogICAgLy8gSURCQmFja2lu
Z1N0b3JlOjpDdXJzb3IKICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElE
QktleSopOwogICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkgeyByZXR1cm4gbV9j
dXJyZW50S2V5OyB9CiAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkg
eyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CiAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpID0gMDsK
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpID0gMDsgLy8gRklYTUU6IElzIHRoaXMg
YWN0dWFsbHkgdXNlZCBieSBhbnlvbmU/CiAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQo
KSA9IDA7CgogICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCkgPSAwOwogICAgYm9vbCBm
aXJzdFNlZWsoKTsKCnByb3RlY3RlZDoKICAgIGxldmVsZGI6OkRCKiBtX2RiOwogICAgT3duUHRy
PGxldmVsZGI6Okl0ZXJhdG9yPiBtX2l0ZXJhdG9yOwogICAgc3RkOjpzdHJpbmcgbV9sb3dLZXk7
CiAgICBib29sIG1fbG93T3BlbjsKICAgIHN0ZDo6c3RyaW5nIG1faGlnaEtleTsKICAgIGJvb2wg
bV9oaWdoT3BlbjsKICAgIGJvb2wgbV9mb3J3YXJkOwogICAgUmVmUHRyPElEQktleT4gbV9jdXJy
ZW50S2V5Owp9OwoKYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpmaXJzdFNlZWsoKQp7CiAgICAvL3By
aW50ZigiZmlyc3RTZWVrLi4uXG4iKTsKICAgIC8vcHJpbnRmKCJsb3c6ICIpOyBwcmludFN0cmlu
ZyhtX2xvd0tleSk7CiAgICAvL2lmIChtX2xvd09wZW4pIHByaW50ZigiIChvcGVuKSIpOwogICAg
Ly9wcmludGYoIiBoaWdoOiAiKTsgcHJpbnRTdHJpbmcobV9oaWdoS2V5KTsKICAgIC8vaWYgKG1f
aGlnaE9wZW4pIHByaW50ZigiIChvcGVuKSIpOwogICAgLy9wcmludGYoIiBmb3J3YXJkID0gJXNc
biIsIG1fZm9yd2FyZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoKCiAgICBtX2l0ZXJhdG9yID0gbV9k
Yi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSk7CgogICAgaWYgKG1fZm9yd2Fy
ZCkKICAgICAgICBtX2l0ZXJhdG9yLT5TZWVrKG1fbG93S2V5KTsKICAgIGVsc2UKICAgICAgICBt
X2l0ZXJhdG9yLT5TZWVrKG1faGlnaEtleSk7CgogICAgZm9yICg7OykgewogICAgICAgIGlmICgh
bV9pdGVyYXRvci0+VmFsaWQoKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAv
L3ByaW50Zigia2V5OiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+a2V5KCkuVG9TdHJpbmco
KSk7IHByaW50ZigiXG4iKTsKCiAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYm
IG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hL
ZXkpID49IDApCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAobV9mb3J3YXJk
ICYmICFtX2hpZ2hPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0
b3ItPmtleSgpLCBtX2hpZ2hLZXkpID4gMCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
ICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUlu
ZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApCiAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIG15Q29t
cGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAw
KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9s
b3dPcGVuKSB7CiAgICAgICAgICAgIC8vIGxvd0tleSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGlu
IHRoZSByYW5nZS4KICAgICAgICAgICAgaWYgKG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgewogICAgICAgICAgICAgICAgbV9p
dGVyYXRvci0+TmV4dCgpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0K
ICAgICAgICB9CiAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbikgewogICAgICAg
ICAgICAvLyBoaWdoS2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCiAgICAg
ICAgICAgIGlmIChteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXko
KSwgbV9oaWdoS2V5KSA+PSAwKSB7CiAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7
CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg
ICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKSB7CiAgICAgICAgICAgIGlmIChtX2ZvcndhcmQpCiAg
ICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7CiAgICAgICAgICAgIGVsc2UKICAgICAg
ICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAg
ICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKYm9vbCBDdXJzb3JJbXBsQ29tbW9u
Ojpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQp7CiAgICB3aGlsZSAodHJ1ZSkg
ewogICAgICAgIGlmIChtX2ZvcndhcmQpCiAgICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsK
ICAgICAgICBlbHNlCiAgICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsKCiAgICAgICAgaWYg
KCFtX2l0ZXJhdG9yLT5WYWxpZCgpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAg
IHN0ZDo6c3RyaW5nIHRyYXNoOwogICAgICAgIGlmIChtX2RiLT5HZXQobGV2ZWxkYjo6UmVhZE9w
dGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCksICZ0cmFzaCkuSXNOb3RGb3VuZCgpKQogICAgICAg
ICAgICAgY29udGludWU7CgogICAgICAgIC8vcHJpbnRmKCJjb250aW51ZS4uLlxuIik7CiAgICAg
ICAgLy9wcmludGYoImxvdzogIik7IHByaW50U3RyaW5nKG1fbG93S2V5KTsKICAgICAgICAvL2lm
IChtX2xvd09wZW4pIHByaW50ZigiIChvcGVuKSIpOwogICAgICAgIC8vcHJpbnRmKCIgaGlnaDog
Iik7IHByaW50U3RyaW5nKG1faGlnaEtleSk7CiAgICAgICAgLy9pZiAobV9oaWdoT3BlbikgcHJp
bnRmKCIgKG9wZW4pIik7CiAgICAgICAgLy9wcmludGYoIiBmb3J3YXJkID0gJXNcbiIsIG1fZm9y
d2FyZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoKICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1faGln
aE9wZW4gJiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1faGlnaEtleSkgPj0gMCkgLy8gaGlnaCBrZXkgbm90IGluY2x1ZGVkIGluIHJhbmdlCiAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVu
ICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hp
Z2hLZXkpID4gMCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICghbV9mb3J3
YXJkICYmIG1fbG93T3BlbiAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJh
dG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQogICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CgogICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkKICAgICAgICAgICAg
Y29udGludWU7CgogICAgICAgIGlmIChrZXkpIHsKICAgICAgICAgICAgaWYgKG1fZm9yd2FyZCkg
ewogICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQogICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgaWYgKGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQogICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBG
SVhNRTogT2JleSB0aGUgdW5pcXVlbmVzcyBjb25zdHJhaW50CgogICAgICAgIGJyZWFrOwogICAg
fQoKICAgIHJldHVybiB0cnVlOwp9CgpjbGFzcyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBwdWJs
aWMgQ3Vyc29ySW1wbENvbW1vbiB7CnB1YmxpYzoKICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3Blbiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkK
ICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwg
aGlnaE9wZW4sIGZvcndhcmQpCiAgICB7CiAgICB9CgogICAgLy8gQ3Vyc29ySW1wbENvbW1vbgog
ICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsgfQogICAg
dmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5k
bGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0
dXJuIDA7IH0KICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IHJldHVybiAwOyB9CiAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsK
CnByaXZhdGU6CiAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cn07Cgpib29sIE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQp7CiAgICAvL3ByaW50ZigibG9hZEN1cnJlbnRS
b3coKVxuIik7CiAgICAvL3ByaW50Zigia2V5OiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+
a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKICAgIC8vcHJpbnRmKCJ2YWx1ZTogIik7
IHByaW50U3RyaW5nKG1faXRlcmF0b3ItPnZhbHVlKCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4i
KTsKCiAgICBpbnQ2NF90IGEsIGIsIGM7CiAgICBjb25zdCBjaGFyKiBwID0gbV9pdGVyYXRvci0+
a2V5KCkuZGF0YSgpOwogICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKICAgIHAgPSBk
ZWNvZGVLZXkocCwgbV9jdXJyZW50S2V5KTsKCiAgICBpbnQ2NF90IHZlcnNpb247CiAgICBjb25z
dCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCB2ZXJz
aW9uKTsKICAgIHN0YXRpY19jYXN0PHZvaWQ+KHZlcnNpb24pOwoKICAgIG1fY3VycmVudFZhbHVl
ID0gZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgp
ICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCkpKTsKCiAgICByZXR1cm4gdHJ1ZTsKfQoKY2xh
c3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewpwdWJsaWM6
CiAgICBJbmRleEtleUN1cnNvckltcGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmlu
ZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29s
IGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCiAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBs
b3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQogICAgewogICAgfQoK
ICAgIC8vIEN1cnNvckltcGxDb21tb24KICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIFN0cmluZygpOyB9CiAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CiAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4g
b2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4g
MDsgfQogICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsgcmV0dXJuIDA7IH0KICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOwoKcHJp
dmF0ZToKICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtleTsKfTsKCmJvb2wgSW5kZXhLZXlD
dXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCnsKICAgIC8vcHJpbnRmKCJJbmRleEtleUN1cnNv
cjo6bG9hZEN1cnJlbnRSb3coKVxuIik7CiAgICAvL3ByaW50Zigia2V5OiAiKTsgcHJpbnRTdHJp
bmcobV9pdGVyYXRvci0+a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKICAgIC8vcHJp
bnRmKCJ2YWx1ZTogIik7IHByaW50U3RyaW5nKG1faXRlcmF0b3ItPnZhbHVlKCkuVG9TdHJpbmco
KSk7IHByaW50ZigiXG4iKTsKCiAgICBpbnQ2NF90IGEsIGIsIGM7CiAgICBjb25zdCBjaGFyKiBw
ID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOwogICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBi
LCBjKTsKICAgIHAgPSBkZWNvZGVLZXkocCwgbV9jdXJyZW50S2V5KTsKCiAgICAvLyBXZSBqdXN0
IGlnbm9yZSB0aGUgc2VxdWVuY2UgbnVtYmVyLi4uCgogICAgaW50NjRfdCB2ZXJzaW9uOwogICAg
Y29uc3QgY2hhciogcSA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwg
dmVyc2lvbik7CiAgICBzdGF0aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsgLy8gRklYTUU6IFdlIHNo
b3VsZCBwcnVuZSBlbnRyaWVzIHdpdGggb2xkIHZlcnNpb24sIGJ1dCBJIHRoaW5rIGtleUV4aXN0
c0luT2JqZWN0U3RvcmUgdGFrZXMgY2FyZSBvZiBpdCBmb3Igbm93Li4uCiAgICBkZWNvZGVLZXko
cSwgbV9wcmltYXJ5S2V5KTsKCiAgICByZXR1cm4gdHJ1ZTsKfQoKY2xhc3MgSW5kZXhDdXJzb3JJ
bXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewpwdWJsaWM6CiAgICBJbmRleEN1cnNvcklt
cGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09w
ZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndh
cmQpCiAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hL
ZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQogICAgewogICAgfQoKICAgIC8vIEN1cnNvckltcGxDb21t
b24KICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV92YWx1ZTsgfQogICAgdmly
dHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtl
eTsgfQogICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVS
ZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgeyBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsgcmV0dXJuIDA7IH0KICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CiAgICBib29sIGxvYWRDdXJyZW50Um93KCk7
Cgpwcml2YXRlOgogICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OwogICAgU3RyaW5nIG1f
dmFsdWU7CiAgICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlMZXZlbERCS2V5Owp9OwoKYm9vbCBJbmRl
eEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKewogICAgLy9wcmludGYoIkluZGV4Q3Vyc29y
Ojpsb2FkQ3VycmVudFJvdygpXG4iKTsKICAgIC8vcHJpbnRmKCJrZXk6ICIpOyBwcmludFN0cmlu
ZyhtX2l0ZXJhdG9yLT5rZXkoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOwogICAgLy9wcmlu
dGYoInZhbHVlOiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+dmFsdWUoKS5Ub1N0cmluZygp
KTsgcHJpbnRmKCJcbiIpOwoKICAgIGludDY0X3QgYSwgYiwgYzsKICAgIGNvbnN0IGNoYXIqIHAg
PSBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCk7CiAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIs
IGMpOwogICAgcCA9IGRlY29kZUtleShwLCBtX2N1cnJlbnRLZXkpOwoKICAgIC8vIEZJWE1FOiBX
ZSBqdXN0IGlnbm9yZSB0aGUgc2VxdWVuY2UgbnVtYmVyLCByaWdodD8KCiAgICBpbnQ2NF90IGlu
ZGV4RGF0YVZlcnNpb247CiAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0
b3ItPnZhbHVlKCkuZGF0YSgpLCBpbmRleERhdGFWZXJzaW9uKTsKICAgIHEgPSBkZWNvZGVLZXko
cSwgbV9wcmltYXJ5S2V5KTsKCiAgICBtX3ByaW1hcnlMZXZlbERCS2V5ID0gbWFrZUtleShhLCBi
LCAxLCBlbmNvZGVLZXkoKm1fcHJpbWFyeUtleSkpOwoKICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsK
ICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCks
IG1fcHJpbWFyeUxldmVsREJLZXksICZyZXN1bHQpOwogICAgaWYgKCFzLm9rKCkpCiAgICAgICAg
cmV0dXJuIGZhbHNlOwoKICAgIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKICAgIGNv
bnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmNfc3RyKCksIG9iamVjdFN0b3JlRGF0
YVZlcnNpb24pOwoKICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9uICE9IGluZGV4RGF0YVZl
cnNpb24pIHsKICAgICAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1f
aXRlcmF0b3ItPmtleSgpKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy9wcmlu
dGYoIkluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3csIHJlc3VsdDogIik7IHByaW50U3Ry
aW5nKHJlc3VsdCk7IHByaW50ZigiXG4iKTsKICAgIG1fdmFsdWUgPSBkZWNvZGVTdHJpbmcoc3Rk
OjpzdHJpbmcodCwgcmVzdWx0LmNfc3RyKCkgKyByZXN1bHQubGVuZ3RoKCkpKTsKICAgIHJldHVy
biB0cnVlOwp9Cgp9CgpzdGF0aWMgYm9vbCBmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhsZXZlbGRi
OjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIHN0ZDo6c3RyaW5nKiBmb3VuZEtl
eSkKewogICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2
ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOwogICAgaXQtPlNlZWsodGFyZ2V0KTsKCiAgICBpZiAoIWl0
LT5WYWxpZCgpKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICB3aGlsZSAoaXQtPlZhbGlkKCkg
JiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID09IDAp
IHsKICAgICAgICAqZm91bmRLZXkgPSBpdC0+a2V5KCkuVG9TdHJpbmcoKTsKICAgICAgICBpdC0+
TmV4dCgpOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgpQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJz
b3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktl
eVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQp7CiAgICBib29s
IGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKICAgIGJvb2wgdXBwZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOwogICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6Ok5FWFQpOwoKICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CiAgICBzdGQ6OnN0cmlu
ZyBzdGFydEtleSwgc3RvcEtleTsKCiAgICBpZiAoIWxvd2VyQm91bmQpIHsKICAgICAgICBzdGFy
dEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CiAgICAgICAgbG93
ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgogICAgfSBlbHNlIHsKICAgICAgICBzdGFy
dEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpy
YW5nZS0+bG93ZXIoKSkpOwogICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsK
ICAgIH0KCiAgICBpZiAoIXVwcGVyQm91bmQpIHsKICAgICAgICBzdG9wS2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsKICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAv
LyBOb3QgaW5jbHVkZWQuCgogICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5
IHRoYXQgZXhpc3RzLgogICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1f
ZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwog
ICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAg
ICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEsIGVuY29k
ZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsKICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJP
cGVuKCk7CiAgICB9CgogICAgUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0g
YWRvcHRSZWYobmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1wbChtX2RiLmdldCgpLCBzdGFydEtleSwg
bG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpKTsKICAgIGlmICghY3Vyc29y
LT5maXJzdFNlZWsoKSkKICAgICAgICByZXR1cm4gMDsKCiAgICByZXR1cm4gY3Vyc29yLnJlbGVh
c2UoKTsKfQoKUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5n
ZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQp7CiAgICBib29sIGxvd2VyQm91bmQg
PSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYm
IHJhbmdlLT51cHBlcigpOwogICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJz
b3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOwoK
ICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CiAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwg
c3RvcEtleTsKCiAgICBpZiAoIWxvd2VyQm91bmQpIHsKICAgICAgICBzdGFydEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNv
dWxkIG1lYW4gcHJvYmxlbXMuCiAgICAgICAgbG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1
ZGVkLgogICAgfSBlbHNlIHsKICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOwogICAg
ICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKICAgIH0KCiAgICBpZiAoIXVwcGVy
Qm91bmQpIHsKICAgICAgICBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBpbmRleElkICsgMSk7CiAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1
ZGVkLgoKICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0
cy4KICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBz
dG9wS2V5LCAmc3RvcEtleSkpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAg
dXBwZXJPcGVuID0gZmFsc2U7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzdG9wS2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXko
KnJhbmdlLT51cHBlcigpKSk7CiAgICAgICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyht
X2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkg
aW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CiAgICB9CgogICAgUmVmUHRy
PEluZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRSZWYobmV3IEluZGV4S2V5Q3Vyc29y
SW1wbChtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4s
IGZvcndhcmQpKTsKICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKICAgICAgICByZXR1cm4g
MDsKCiAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKfQoKUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9u
KQp7CiAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKICAgIGJv
b2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOwogICAgYm9vbCBmb3J3YXJk
ID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlv
biA9PSBJREJDdXJzb3I6Ok5FWFQpOwoKICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CiAg
ICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKCiAgICBpZiAoIWxvd2VyQm91bmQpIHsK
ICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNvdWxkIG1lYW4gcHJvYmxlbXMuCiAgICAgICAgbG93ZXJP
cGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgogICAgfSBlbHNlIHsKICAgICAgICBzdGFydEtl
eSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5
KCpyYW5nZS0+bG93ZXIoKSkpOwogICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4o
KTsKICAgIH0KCiAgICBpZiAoIXVwcGVyQm91bmQpIHsKICAgICAgICBzdG9wS2V5ID0gbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkICsgMSk7CiAgICAgICAgdXBwZXJP
cGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgoKICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8g
V2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RL
ZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpCiAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKICAgICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CiAgICAgICAgfQogICAg
fSBlbHNlIHsKICAgICAgICBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoKnJhbmdlLT51cHBlcigpKSk7CiAgICAgICAgaWYgKCFm
aW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8v
IFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCiAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJP
cGVuKCk7CiAgICB9CgogICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRS
ZWYobmV3IEluZGV4Q3Vyc29ySW1wbChtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBz
dG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpKTsKICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWso
KSkKICAgICAgICByZXR1cm4gMDsKCiAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKfQoKbmFt
ZXNwYWNlIHsKY2xhc3MgRHVtbXlUcmFuc2FjdGlvbiA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uIHsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGJlZ2luKCkge30KICAgIHZp
cnR1YWwgdm9pZCBjb21taXQoKSB7fQogICAgdmlydHVhbCB2b2lkIHJvbGxiYWNrKCkge30KfTsK
fQoKClBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQp7CiAgICByZXR1cm4gYWRvcHRSZWYobmV3
IER1bW15VHJhbnNhY3Rpb24oKSk7IC8vIEZJWE1FOiBJbXBsZW1lbnQgcHJvcGVybHkuCn0KCn0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87386</attachid>
            <date>2011-03-29 12:02:16 -0700</date>
            <delta_ts>2011-03-30 03:24:59 -0700</delta_ts>
            <desc>patch by hans</desc>
            <filename>a</filename>
            <type>text/plain</type>
            <size>62588</size>
            <attacher name="Jeremy Orlow">jorlow</attacher>
            
              <data encoding="base64">LS0tIC9kZXYvbnVsbAkyMDExLTAzLTI5IDExOjUzOjU5LjAwMDAwMDAwMCAtMDcwMAorKysgL1Vz
ZXJzL2pvcmxvdy9EZXNrdG9wL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCTIwMTEtMDMtMjkg
MTE6NTc6MzIuMDAwMDAwMDAwIC0wNzAwCkBAIC0wLDAgKzEsMTc4MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQmFja2luZ1N0b3JlLmgiCisKKyNp
ZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKworI2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKKyNp
bmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgi
CisjaW5jbHVkZSAiSURCS2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgor
I2luY2x1ZGUgPGluY2x1ZGUvY29tcGFyYXRvci5oPgorI2luY2x1ZGUgPGluY2x1ZGUvZGIuaD4K
KyNpbmNsdWRlIDxpbmNsdWRlL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8aW5jbHVkZS9zbGljZS5o
PgorI2luY2x1ZGUgPHN0cmluZz4KKworLy8gRklYTUU6IGRlY29kaW5nIHJvdXRpbmVzIG11Y2gg
YmUgbW9yZSByb2J1c3QuIFdlIGNhbid0IGNyYXNoIHRoZSBicm93c2VyIGlmCisvLyBkYXRhIGlz
bid0IHdoYXQgd2UgZXhwZWN0IQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lEQkxldmVsREJC
YWNraW5nU3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElE
QkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSwgbGV2ZWxkYjo6REIqIGRiKQorICAgIDogbV9p
ZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkKKyAgICAsIG1f
ZGIoZGIpCit7CisgICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5nU3RvcmUoaWRlbnRpZmllciwg
dGhpcyk7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0
b3JlKCkKK3sKKyAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZShtX2lkZW50aWZp
ZXIpOworfQorCitzdGF0aWMgdm9pZCBwcmludFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykK
K3sKKyAgICBwcmludGYoIjB4Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmxlbmd0
aCgpOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gc1tpXTsKKyAgICAgICAgcHJp
bnRmKCIlMDJ4IiwgKGludCljKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNv
ZGVJbnQoaW50NjRfdCBuKQoreworICAgIEFTU0VSVChuID49IDApOworICAgIGlmICgwKSBwcmlu
dFN0cmluZygiIik7IC8vIEZJWE1FOiBEdW1teSB0byBwcmV2ZW50IG1ldGhvZC1ub3QtdXNlZC13
YXJuaW5nLgorICAgIHN0ZDo6c3RyaW5nIHJldDsKKworICAgIGRvIHsKKyAgICAgICAgdW5zaWdu
ZWQgY2hhciBjID0gbjsKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBzdGF0aWNfY2FzdDxjaGFyPihj
KSk7CisgICAgICAgIG4gPj49IDg7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1cm4gcmV0
OworfQorCitzdGF0aWMgaW50NjRfdCBkZWNvZGVJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHMpCit7
CisgICAgaW50NjRfdCByZXQgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgcy5s
ZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNbaV07CisgICAgICAg
IHJldCA9IHJldCA8PCA4IHwgYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0
aWMgc3RkOjpzdHJpbmcgZW5jb2RlVmFySW50KGludDY0X3QgbikKK3sKKyAgICBzdGQ6OnN0cmlu
ZyByZXQ7CisKKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAoMTI4IC0g
MSk7CisgICAgICAgIG4gPj49IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAx
Mjg7CisgICAgICAgIHJldC5hcHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgIH0g
d2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZVZhckludChjb25zdCBjaGFyICpwLCBpbnQ2NF90ICZmb3VuZEludCkKK3sKKyAgICBmb3Vu
ZEludCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGZvdW5kSW50ID0gKGZvdW5kSW50IDw8IDcp
IHwgKCpwICYgKDEyOCAtIDEpKTsKKyAgICB9IHdoaWxlICgqcCsrICYgMTI4KTsKKworICAgIHJl
dHVybiBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3RyaW5nKGNvbnN0IFN0cmlu
ZyYgcykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIFVDaGFyIHUgPSBzW2ldOworICAgICAg
ICB1bnNpZ25lZCBjaGFyIGhpID0gKHUgPj4gOCkgJiAweGZmOworICAgICAgICB1bnNpZ25lZCBj
aGFyIGxvID0gdSAmIDB4ZmY7CisgICAgICAgIHJldC5hcHBlbmQoMSwgaGkpOworICAgICAgICBy
ZXQuYXBwZW5kKDEsIGxvKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMg
U3RyaW5nIGRlY29kZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykKK3sKKyAgICAvL3ByaW50
ZigiZGVjb2RlU3RyaW5nIHMgPSIpOworICAgIC8vcHJpbnRTdHJpbmcocyk7CisgICAgLy9wcmlu
dGYoIlxuIik7CisgICAgU3RyaW5nIHJldDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cy5sZW5ndGgoKTsgaSs9MikgeworICAgICAgICBBU1NFUlQoaSArIDEgPCBzLmxlbmd0aCgpKTsK
KyAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9IHNbaV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
bG8gPSBzW2kgKyAxXTsKKyAgICAgICAgVUNoYXIgdSA9IGhpIDw8IDggfCBsbzsKKyAgICAgICAg
cmV0LmFwcGVuZCh1KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3Rk
OjpzdHJpbmcgZW5jb2RlU3RyaW5nV2l0aExlbihjb25zdCBTdHJpbmcmIHMpCit7CisgICAgc3Rk
OjpzdHJpbmcgcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkpOworICAgIHJldCArPSBlbmNv
ZGVTdHJpbmcocyk7CisgICAgLy9wcmludGYoImVuY29kZVN0cmluZ1dpdGhMZW4gcyA9ICVzXG4i
LCBzLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAvL3ByaW50ZigicmV0ID0gIik7IHByaW50U3RyaW5n
KHJldCk7IHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qg
Y2hhciogZGVjb2RlU3RyaW5nV2l0aExlbihjb25zdCBjaGFyKiBwLCBTdHJpbmcmIGZvdW5kU3Ry
aW5nKQoreworICAgIGludDY0X3QgbGVuOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGVuKTsK
KworICAgIGZvdW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHAsIGxlbiAqIDIp
KTsKKyAgICBwICs9IGxlbiAqIDI7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0
cmluZyBlbmNvZGVEb3VibGUoZG91YmxlIHgpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAg
IGNoYXIgKnAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBzaXplb2YoeCk7IGkrKykKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBwW2ldKTsK
KyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlRG91YmxlKGNv
bnN0IGNoYXIqIHAsIGRvdWJsZSogZCkKK3sKKyAgICBjaGFyICp4ID0gcmVpbnRlcnByZXRfY2Fz
dDxjaGFyKj4oZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoKmQpOyBpKysp
CisgICAgICAgICp4KysgPSAqcCsrOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgc3RkOjpz
dHJpbmcgZW5jb2RlS2V5KGNvbnN0IElEQktleSYga2V5KQoreworICAgIHN0ZDo6c3RyaW5nIHJl
dDsKKworICAgIHN3aXRjaChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJLZXk6Ok51bGxUeXBl
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuICIiOworICAg
IGNhc2UgSURCS2V5OjpTdHJpbmdUeXBlOgorICAgICAgICByZXQuYXBwZW5kKDEsICdceDAnKTsK
KyAgICAgICAgcmV0ICs9IGVuY29kZVN0cmluZ1dpdGhMZW4oa2V5LnN0cmluZygpKTsKKyAgICAg
ICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6CisgICAgICAgIHJldC5h
cHBlbmQoMSwgJ1x4MScpOworICAgICAgICByZXQgKz0gZW5jb2RlRG91YmxlKGtleS5kYXRlKCkp
OworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgorICAg
ICAgICByZXQuYXBwZW5kKDEsICdceDInKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZURvdWJsZShr
ZXkubnVtYmVyKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZUtleShjb25zdCBjaGFyKiBwLCBSZWZQdHI8SURCS2V5PiYgZm91bmRL
ZXkpIHsKKyAgICBjaGFyIHR5cGUgPSAqcCsrOworICAgIFN0cmluZyBzOworICAgIGRvdWJsZSBk
OworCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIC8vIFN0cmluZy4K
KyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgcyk7CisgICAgICAgIGZvdW5kS2V5
ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Ug
MToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCAmZCk7Cisg
ICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKGQpOworICAgICAgICByZXR1cm4g
cDsKKyAgICBjYXNlIDI6CisgICAgICAgIC8vIE51bWJlci4KKyAgICAgICAgcCA9IGRlY29kZURv
dWJsZShwLCAmZCk7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdW1iZXIoZCk7
CisgICAgICAgIHJldHVybiBwOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY291bnRC
eXRlcyhpbnQ2NF90IG4pCit7CisgICAgaW50IGMgPSAxOworICAgIHdoaWxlIChuID4+PSA4KQor
ICAgICAgICBjKys7CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtl
S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQpCit7CisgICAgaW50IGRhdGFiYXNlQnl0ZXMgPSBjb3VudEJ5dGVzKGRhdGFiYXNlSWQp
OworICAgIGludCBvYmplY3RTdG9yZUJ5dGVzID0gY291bnRCeXRlcyhvYmplY3RTdG9yZUlkKTsK
KyAgICBpbnQgaW5kZXhCeXRlcyA9IGNvdW50Qnl0ZXMoaW5kZXhJZCk7CisKKyAgICBBU1NFUlQo
ZGF0YWJhc2VCeXRlcyA8PSA4KTsKKyAgICBBU1NFUlQob2JqZWN0U3RvcmVCeXRlcyA8PSA4KTsK
KyAgICBBU1NFUlQoaW5kZXhCeXRlcyA8PSA0KTsKKworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RC
eXRlID0gKGRhdGFiYXNlQnl0ZXMgLSAxKSA8PCA1IHwgKG9iamVjdFN0b3JlQnl0ZXMgLSAxKSA8
PCAyIHwgKGluZGV4Qnl0ZXMgLSAxKTsKKyAgICBzdGQ6OnN0cmluZyBzKDEsIGZpcnN0Qnl0ZSk7
CisgICAgcyArPSBlbmNvZGVJbnQoZGF0YWJhc2VJZCk7CisgICAgcyArPSBlbmNvZGVJbnQob2Jq
ZWN0U3RvcmVJZCk7CisgICAgcyArPSBlbmNvZGVJbnQoaW5kZXhJZCk7CisKKyAgICByZXR1cm4g
czsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVByZWZpeChjb25zdCBjaGFyKiBwLCBp
bnQ2NF90JiBkYXRhYmFzZUlkLCBpbnQ2NF90JiBvYmplY3RTdG9yZUlkLCBpbnQ2NF90JiBpbmRl
eElkKQoreworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKnArKzsKKworICAgIGludCBk
YXRhYmFzZUJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gNSkgJiAweDcpICsgMTsKKyAgICBpbnQgb2Jq
ZWN0U3RvcmVCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDIpICYgMHg3KSArIDE7CisgICAgaW50IGlu
ZGV4Qnl0ZXMgPSAoZmlyc3RCeXRlICYgMHg3KSArIDE7CisKKyAgICBkYXRhYmFzZUlkID0gZGVj
b2RlSW50KHN0ZDo6c3RyaW5nKHAsIGRhdGFiYXNlQnl0ZXMpKTsKKyAgICBwICs9IGRhdGFiYXNl
Qnl0ZXM7CisgICAgb2JqZWN0U3RvcmVJZCA9IGRlY29kZUludChzdGQ6OnN0cmluZyhwLCBvYmpl
Y3RTdG9yZUJ5dGVzKSk7CisgICAgcCArPSBvYmplY3RTdG9yZUJ5dGVzOworICAgIGluZGV4SWQg
PSBkZWNvZGVJbnQoc3RkOjpzdHJpbmcocCwgaW5kZXhCeXRlcykpOworICAgIHAgKz0gaW5kZXhC
eXRlczsKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBpbnQgbmJyKQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGluZGV4SWQpOworICAgIGNoYXIgYyA9IG5icjsKKyAgICBzLmFwcGVuZCgm
YywgMSk7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgcyArPSBzdHI7CisgICAg
cmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IHN0ZDo6
c3RyaW5nJiBzdHIsIGludDY0X3QgdmVyc2lvbikKK3sKKyAgICBzdGQ6OnN0cmluZyBzID0gbWFr
ZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBzdHIpOworICAgIHMgKz0g
ZW5jb2RlVmFySW50KHZlcnNpb24pOworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RkOjpz
dHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBpbnQgbmJyLCBjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBzdGQ6
OnN0cmluZyBzID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBu
YnIpOworICAgIHMgKz0gZW5jb2RlU3RyaW5nV2l0aExlbihzdHIpOworICAgIHJldHVybiBzOwor
fQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyMSwgaW50NjRfdCBuYnIy
KQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsIG5icjEpOworICAgIHMgKz0gZW5jb2RlVmFySW50KG5icjIpOworICAgIHJl
dHVybiBzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyLCBjb25z
dCBTdHJpbmcmIHN0cjEsIGNvbnN0IFN0cmluZyYgc3RyMikKK3sKKyAgICBzdGQ6OnN0cmluZyBz
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIsIHN0cjEp
OworICAgIHMgKz0gZW5jb2RlU3RyaW5nV2l0aExlbihzdHIyKTsKKyAgICByZXR1cm4gczsKK30K
Kworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgaW50IG5icjEsIGludDY0X3QgbmJyMiwg
aW50NjRfdCBuYnIzKQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG5icjEpOworICAgIHMgKz0gZW5jb2RlVmFySW50KG5i
cjIpOworICAgIHMgKz0gZW5jb2RlVmFySW50KG5icjMpOworICAgIHJldHVybiBzOworfQorCitz
dGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyMSwgaW50NjRfdCBuYnIyLCBpbnQ2
NF90IG5icjMsIGludCBuYnI0KQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG5icjEpOworICAgIHMgKz0gZW5jb2RlVmFy
SW50KG5icjIpOworICAgIHMgKz0gZW5jb2RlVmFySW50KG5icjMpOworICAgIHMgKz0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgY2hhcj4obmJyNCk7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBi
b29sIGdldEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0
X3QqIGZvdW5kSW50KQoreworICAgIC8vcHJpbnRmKCJnZXRJbnQgIik7CisgICAgLy9wcmludFN0
cmluZyhrZXkpOworICAgIC8vcHJpbnRmKCJcbiIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsK
KyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwg
bGV2ZWxkYjo6U2xpY2Uoa2V5KSwgJnJlc3VsdCk7CisKKyAgICBpZiAocy5Jc05vdEZvdW5kKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmICghcy5vaygpKSB7CisgICAgICAg
IC8vcHJpbnRmKCJGYWlsZWQgZ2V0SW50OiAlc1xuIiwgcy5Ub1N0cmluZygpLmNfc3RyKCkpOwor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICAqZm91bmRJbnQgPSBk
ZWNvZGVJbnQocmVzdWx0KTsKKyAgICAvL3ByaW50ZigicmVzdWx0OiAlZFxuIiwgKGludCkqZm91
bmRJbnQpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwdXRJbnQobGV2ZWxk
Yjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQ2NF90IHZhbHVlKQoreworICAg
IC8vcHJpbnRmKCJwdXRJbnQgKCVkKSAiLCAoaW50KXZhbHVlKTsKKyAgICAvL3ByaW50U3RyaW5n
KGtleSk7CisgICAgLy9wcmludGYoIlxuIik7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+
UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBrZXksIGVuY29kZUludCh2YWx1ZSkpOworICAg
IGlmICghcy5vaygpKSB7CisgICAgICAgIC8vcHJpbnRmKCJGYWlsZWQgcHV0SW50OiAlc1xuIiwg
cy5Ub1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBnZXRTdHJpbmcobGV2ZWxkYjo6REIqIGRi
LCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBTdHJpbmcqIGZvdW5kU3RyaW5nKQoreworICAgIC8v
cHJpbnRmKCJnZXRTdHJpbmcgIik7CisgICAgLy9wcmludFN0cmluZyhrZXkpOworICAgIC8vcHJp
bnRmKCJcbiIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBsZXZlbGRiOjpTdGF0dXMg
cyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYjo6U2xpY2Uoa2V5KSwg
JnJlc3VsdCk7CisKKyAgICBpZiAocy5Jc05vdEZvdW5kKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBlbHNlIGlmICghcy5vaygpKSB7CisgICAgICAgIC8vcHJpbnRmKCJmYWxlZCBnZXRT
dHJpbmc6ICVzXG4iLCBzLlRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgIH0KKworICAgICpmb3VuZFN0cmluZyA9IGRlY29kZVN0cmluZyhyZXN1
bHQpOworICAgIC8vcHJpbnRmKCJyZXN1bHQ6ICIpOyBwcmludFN0cmluZyhyZXN1bHQpOyBwcmlu
dGYoIlxuIik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dFN0cmluZyhs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSkKK3sKKyAgICAvL3ByaW50ZigicHV0U3RyaW5nICIpOworICAgIC8vcHJpbnRmKCIodmFsdWU6
ICIpOworICAgIC8vcHJpbnRTdHJpbmcoZW5jb2RlU3RyaW5nKHZhbHVlKSk7CisgICAgLy9wcmlu
dGYoIikga2V5OiAiKTsKKyAgICAvL3ByaW50U3RyaW5nKGtleSk7CisgICAgLy9wcmludGYoIlxu
Iik7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9u
cygpLCBrZXksIGVuY29kZVN0cmluZyh2YWx1ZSkpOworICAgIGlmICghcy5vaygpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CitjbGFz
cyBNeUNvbXBhcmF0b3IgOiBwdWJsaWMgbGV2ZWxkYjo6Q29tcGFyYXRvciB7CisgICAgcHVibGlj
OgorICAgIGludCBDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRi
OjpTbGljZSYgYikgY29uc3QgeworICAgICAgICAvL3ByaW50ZigiQ29tcGFyZVxuIik7CisgICAg
ICAgIC8vcHJpbnRmKCJhOiAiKTsgcHJpbnRTdHJpbmcoYS5Ub1N0cmluZygpKTsgcHJpbnRmKCJc
biIpOworICAgICAgICAvL3ByaW50ZigiYjogIik7IHByaW50U3RyaW5nKGIuVG9TdHJpbmcoKSk7
IHByaW50ZigiXG4iKTsKKyAgICAgICAgaW50IHggPSBSZWFsQ29tcGFyZShhLCBiKTsKKyAgICAg
ICAgLy9wcmludGYoIlJlc3VsdDogJWRcbiIsIHgpOworICAgICAgICByZXR1cm4geDsKKyAgICB9
CisgICAgaW50IFhDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRi
OjpTbGljZSYgYikgY29uc3QgeworICAgICAgICAvL3ByaW50ZigiWENvbXBhcmVcbiIpOworICAg
ICAgICAvL3ByaW50ZigiYTogIik7IHByaW50U3RyaW5nKGEuVG9TdHJpbmcoKSk7IHByaW50Zigi
XG4iKTsKKyAgICAgICAgLy9wcmludGYoImI6ICIpOyBwcmludFN0cmluZyhiLlRvU3RyaW5nKCkp
OyBwcmludGYoIlxuIik7CisgICAgICAgIGludCB4ID0gUmVhbENvbXBhcmUoYSwgYik7CisgICAg
ICAgIC8vcHJpbnRmKCJSZXN1bHQ6ICVkXG4iLCB4KTsKKyAgICAgICAgcmV0dXJuIHg7CisgICAg
fQorICAgIGludCBDb21wYXJlSW5kZXhLZXlzKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25z
dCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QgeworICAgICAgICByZXR1cm4gUmVhbENvbXBhcmUo
YSwgYiwgdHJ1ZSk7CisgICAgfQorICAgIGludCBSZWFsQ29tcGFyZShjb25zdCBsZXZlbGRiOjpT
bGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzID0gZmFsc2Up
IGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBhMSwgYTIsIGEzOworICAgICAgICBpbnQ2NF90IGIx
LCBiMiwgYjM7CisKKyAgICAgICAgY29uc3QgY2hhciogYV9lbmQgPSBhLmRhdGEoKSArIGEuc2l6
ZSgpOworICAgICAgICBjb25zdCBjaGFyKiBiX2VuZCA9IGIuZGF0YSgpICsgYi5zaXplKCk7CisK
KyAgICAgICAgY29uc3QgY2hhciAqcCA9IGEuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyICpx
ID0gYi5kYXRhKCk7CisKKyAgICAgICAgaWYgKCpwICE9ICpxKSByZXR1cm4gKnAgLSAqcTsgLy8g
RklYTUU6IFRoaW5rIHRoaXMgdGhyb3VnaC4KKworICAgICAgICBwID0gZGVjb2RlUHJlZml4KHAs
IGExLCBhMiwgYTMpOworICAgICAgICBxID0gZGVjb2RlUHJlZml4KHEsIGIxLCBiMiwgYjMpOwor
CisgICAgICAgIC8vcHJpbnRmKCJhMSA9ICU4ZCBhMiA9ICU4ZCBhMyA9ICU4ZFxuIiwgKGludClh
MSwgKGludClhMiwgKGludClhMyk7CisgICAgICAgIC8vcHJpbnRmKCJiMSA9ICU4ZCBiMiA9ICU4
ZCBiMyA9ICU4ZFxuIiwgKGludCliMSwgKGludCliMiwgKGludCliMyk7CisKKyAgICAgICAgaWYg
KGExICE9IGIxKSByZXR1cm4gYTEgLSBiMTsKKyAgICAgICAgaWYgKGEyICE9IGIyKSByZXR1cm4g
YTIgLSBiMjsKKyAgICAgICAgaWYgKGEzICE9IGIzKSByZXR1cm4gYTMgLSBiMzsKKworICAgICAg
ICBpZiAoYTEgPT0gMCkgeworICAgICAgICAgICAgLy8gR2xvYmFsIG1ldGEtZGF0YS4gTmV4dCBm
aWVsZCBpcyBhIG51bWJlci4KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYTQgPSAqcCsrOwor
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiNCA9ICpxKys7CisKKyAgICAgICAgICAgIC8vcHJp
bnRmKCJhNCA9ICU4ZFxuIiwgKGludClhNCk7CisgICAgICAgICAgICAvL3ByaW50ZigiYjQgPSAl
OGRcbiIsIChpbnQpYjQpOworCisgICAgICAgICAgICBpZiAoYTQgIT0gYjQpIHJldHVybiBhNCAt
IGI0OworCisgICAgICAgICAgICBpZiAoYTQgPT0gMCB8fCBhNCA9PSAxKSB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGE0ID09IDEwMCkgeworICAg
ICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBEYXRhYmFzZSBpZC4KKyAgICAgICAgICAg
ICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKKyAgICAgICAgICAgICAgICBxID0gZGVjb2Rl
VmFySW50KHEsIGI1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYTUgLSBiNTsKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoYTQgPT0gMjAxKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGE2LCBi
NjsgLy8gT3JpZ2luIG5hbWUuCisgICAgICAgICAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhM
ZW4ocCwgYTYpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHEsIGI2
KTsKKyAgICAgICAgICAgICAgICBpZiAoYTYgIT0gYjYpIHJldHVybiBjb2RlUG9pbnRDb21wYXJl
KGE2LCBiNik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgYTcsIGI3OyAvLyBEYXRhYmFzZSBu
YW1lLgorICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGE3KTsKKyAg
ICAgICAgICAgICAgICBxID0gZGVjb2RlU3RyaW5nV2l0aExlbihxLCBiNyk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUoYTcsIGI3KTsKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgLy9wcmludGYoImE0ID0gJWRcbiIsIChpbnQpYTQpOworICAg
ICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgaWYgKGEyID09IDApIHsgLy8gYTEgIT0gMAorICAgICAgICAgICAgLy8gRGF0YWJh
c2UgbWV0YS1kYXRhLiBOZXh0IGZpZWxkIGlzIGEgbnVtYmVyLgorCisgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyIGE0ID0gKnArKzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjQgPSAqcSsr
OworCisgICAgICAgICAgICBpZiAoYTQgIT0gYjQpIHJldHVybiBhNCAtIGI0OworCisgICAgICAg
ICAgICBpZiAoYTQgPT0gMCB8fCBhNCA9PSAxIHx8IGE0ID09IDIgfHwgYTQgPT0gMykgeworICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChhNCA9PSA1MCkg
eworICAgICAgICAgICAgICAgIC8vIE9iamVjdCBzdG9yZSBtZXRhLWRhdGEuCisKKyAgICAgICAg
ICAgICAgICBpbnQ2NF90IGE1LCBiNTsgLy8gT2JqZWN0IHN0b3JlIGlkLgorICAgICAgICAgICAg
ICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTUpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVW
YXJJbnQocSwgYjUpOworCisgICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KSByZXR1cm4gYTUg
LSBiNTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgYTYsIGI2OyAvLyBrZXkgcGF0aCwgYXV0
byBpbmMsIGV0Yy4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE2KTsKKyAg
ICAgICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI2KTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gYTYgLSBiNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMTAwKSB7CisgICAg
ICAgICAgICAgICAgLy8gSW5kZXggbWV0YS1kYXRhLgorCisgICAgICAgICAgICAgICAgaW50NjRf
dCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2Rl
VmFySW50KHAsIGE1KTsKKyAgICAgICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsK
KyAgICAgICAgICAgICAgICBpZiAoYTUgIT0gYjUpIHJldHVybiBhNSAtIGI1OworCisgICAgICAg
ICAgICAgICAgaW50NjRfdCBhNiwgYjY7IC8vIEluZGV4IGlkLgorICAgICAgICAgICAgICAgIHAg
PSBkZWNvZGVWYXJJbnQocCwgYTYpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQo
cSwgYjYpOworICAgICAgICAgICAgICAgIGlmIChhNiAhPSBiNikgcmV0dXJuIGE2IC0gYjY7CisK
KyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGE3LCBiNzsgLy8gTmFtZSwgdW5pcXVlLCBr
ZXkgcGF0aC4KKyAgICAgICAgICAgICAgICBhNyA9ICpwKys7CisgICAgICAgICAgICAgICAgYjcg
PSAqcSsrOworICAgICAgICAgICAgICAgIHJldHVybiBhNyAtIGI3OworICAgICAgICAgICAgfSBl
bHNlIGlmIChhNCA9PSAxNTApIHsKKyAgICAgICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgaWQg
ZnJlZS1saXN0LgorCisgICAgICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBz
dG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKKyAgICAg
ICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsKKyAgICAgICAgICAgICAgICByZXR1
cm4gYTUgLSBiNTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMTUxKSB7CisgICAgICAg
ICAgICAgICAgLy8gSW5kZXggaWQgZnJlZS1saXN0LgorCisgICAgICAgICAgICAgICAgaW50NjRf
dCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2Rl
VmFySW50KHAsIGE1KTsKKyAgICAgICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsK
KyAgICAgICAgICAgICAgICBpZiAoYTUgIT0gYjUpIHJldHVybiBhNSAtIGI1OworCisgICAgICAg
ICAgICAgICAgaW50NjRfdCBhNiwgYjY7IC8vIEluZGV4IGlkLgorICAgICAgICAgICAgICAgIHAg
PSBkZWNvZGVWYXJJbnQocCwgYTYpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQo
cSwgYjYpOworICAgICAgICAgICAgICAgIHJldHVybiBhNiAtIGI2OworICAgICAgICAgICAgfSBl
bHNlIGlmIChhNCA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgbmFt
ZSAtPiBpZCBtYXBwaW5nLgorCisgICAgICAgICAgICAgICAgU3RyaW5nIGE1LCBiNTsgLy8gT2Jq
ZWN0IHN0b3JlIG5hbWUuCisgICAgICAgICAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4o
cCwgYTUpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHEsIGI1KTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShhNSwgYjUpOworICAgICAg
ICAgICAgfSBlbHNlIGlmIChhNCA9PSAyMDEpIHsKKyAgICAgICAgICAgICAgICAvLyBJbmRleCBu
YW1lIC0+IGluZGV4IGlkIG1hcHBpbmcuCisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGE1LCBi
NTsgLy8gT2JqZWN0IHN0b3JlIGlkLgorICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQo
cCwgYTUpOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYjUpOworICAgICAg
ICAgICAgICAgIGlmIChhNSAhPSBiNSkgcmV0dXJuIGE1IC0gYjU7CisKKyAgICAgICAgICAgICAg
ICBTdHJpbmcgYTYsIGI2OyAvLyBJbmRleCBuYW1lLgorICAgICAgICAgICAgICAgIHAgPSBkZWNv
ZGVTdHJpbmdXaXRoTGVuKHAsIGE2KTsKKyAgICAgICAgICAgICAgICBxID0gZGVjb2RlU3RyaW5n
V2l0aExlbihxLCBiNik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUo
YTYsIGI2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGE0IC0gYjQ7Cisg
ICAgICAgIH0gZWxzZSBpZiAoYTMgPT0gMSB8fCBhMyA9PSAyKSB7IC8vIGExICE9IDAsIGEyICE9
IDAKKyAgICAgICAgICAgIC8vIE9iamVjdCBzdG9yZSBkYXRhIG9yICJleGlzdHMiIGRhdGEuCisK
KyAgICAgICAgICAgIGlmIChwID09IGFfZW5kICYmIHEgPT0gYl9lbmQpIHJldHVybiAwOworICAg
ICAgICAgICAgZWxzZSBpZiAocCA9PSBhX2VuZCkgcmV0dXJuIC0xOworICAgICAgICAgICAgZWxz
ZSBpZiAocSA9PSBiX2VuZCkgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+
IGE0LCBiNDsgLy8gVXNlciBrZXkuCisgICAgICAgICAgICBwID0gZGVjb2RlS2V5KHAsIGE0KTsK
KyAgICAgICAgICAgIHEgPSBkZWNvZGVLZXkocSwgYjQpOworCisgICAgICAgICAgICBpZiAoYTQt
PmlzTGVzc1RoYW4oYjQuZ2V0KCkpKSByZXR1cm4gLTE7CisgICAgICAgICAgICBlbHNlIGlmIChh
NC0+aXNFcXVhbChiNC5nZXQoKSkpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSByZXR1cm4g
MTsKKyAgICAgICAgfSBlbHNlIGlmIChhMyA+PSAzMCkgeworICAgICAgICAgICAgLy8gSW5kZXgg
ZGF0YS4KKworICAgICAgICAgICAgYm9vbCBhSGFzS2V5ID0gKHAgIT0gKGEuZGF0YSgpICsgYS5z
aXplKCkpKTsKKyAgICAgICAgICAgIGJvb2wgYkhhc0tleSA9IChxICE9IChiLmRhdGEoKSArIGIu
c2l6ZSgpKSk7CisKKyAgICAgICAgICAgIGlmICghYUhhc0tleSAmJiBiSGFzS2V5KSByZXR1cm4g
LTE7CisgICAgICAgICAgICBlbHNlIGlmIChhSGFzS2V5ICYmICFiSGFzS2V5KSByZXR1cm4gMTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKCFhSGFzS2V5ICYmICFiSGFzS2V5KSByZXR1cm4gMDsKKwor
ICAgICAgICAgICAgUmVmUHRyPElEQktleT4gYTQsIGI0OworICAgICAgICAgICAgcCA9IGRlY29k
ZUtleShwLCBhNCk7CisgICAgICAgICAgICBxID0gZGVjb2RlS2V5KHEsIGI0KTsKKworICAgICAg
ICAgICAgaWYgKGE0LT5pc0xlc3NUaGFuKGI0LmdldCgpKSkgcmV0dXJuIC0xOworICAgICAgICAg
ICAgZWxzZSBpZiAoIWE0LT5pc0VxdWFsKGI0LmdldCgpKSkgcmV0dXJuIDE7CisKKyAgICAgICAg
ICAgIGlmIChpbmRleEtleXMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIG51bWJl
ci4KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaW50NjRfdCBhNSwgYjU7IC8vICJ2ZXJzaW9uIgorICAgICAgICAgICAgcCA9IGRlY29kZVZh
ckludChwLCBhNSk7CisgICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsKKworICAg
ICAgICAgICAgLy9wcmludGYoImE1ID0gJWQsIGI1ID0gJWRcbiIsIChpbnQpYTUsIChpbnQpYjUp
OworICAgICAgICAgICAgcmV0dXJuIGE1IC0gYjU7CisgICAgICAgIH0KKworICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3Qg
Y2hhciogTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJpZGJfY21wMSI7IH0KKyAgICB2b2lkIEZpbmRT
aG9ydGVzdFNlcGFyYXRvcihzdGQ6OnN0cmluZyosIGNvbnN0IGxldmVsZGI6OlNsaWNlJikgY29u
c3Qge30gLy8gRklYTUU6IElnbm9yZT8KKyAgICB2b2lkIEZpbmRTaG9ydFN1Y2Nlc3NvcihzdGQ6
OnN0cmluZyopIGNvbnN0IHt9IC8vIEZJWE1FOiBJZ25vcmU/Cit9IG15Q29tcGFyYXRvcjsKK30K
Kworc3RhdGljIGJvb2wgc2V0VXBNZXRhZGF0YShsZXZlbGRiOjpEQiogZGIpCit7CisgICAgLy9w
cmludGYoInNldFVwTWV0YWRhdGFcbiIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGFEYXRh
S2V5ID0gbWFrZUtleSgwLCAwLCAwLCAwKTsKKworICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbjsK
KyAgICBpZiAoIWdldEludChkYiwgbWV0YURhdGFLZXksICZzY2hlbWFWZXJzaW9uKSkgeworICAg
ICAgICAvL3ByaW50ZigiZmFpbGVkIHRvIGdldCBzY2hlbWFWZXJzaW9uXG4iKTsKKyAgICAgICAg
c2NoZW1hVmVyc2lvbiA9IDA7CisgICAgICAgIGlmICghcHV0SW50KGRiLCBtZXRhRGF0YUtleSwg
c2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAgICAgIC8vcHJpbnRmKCJmYWlsZWQgdG8gcHV0IHNj
aGVtYVZlcnNpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vcHJpbnRmKCJnb3Qgc2NoZW1hdmVyc2lvbjogJWRcbiIsIChpbnQpc2NoZW1h
VmVyc2lvbik7CisKKyAgICBpZiAoc2NoZW1hVmVyc2lvbiAhPSAwKQorICAgICAgICByZXR1cm4g
ZmFsc2U7IC8vIERvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMgdmVyc2lvbi4KKworICAg
IHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0
IFN0cmluZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmls
ZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSkKK3sKKyAgICBTdHJp
bmcgcGF0aEJhc2UyID0gcGF0aEJhc2U7CisKKyAgICBpZiAocGF0aEJhc2UyLmlzRW1wdHkoKSkg
eworICAgICAgICBwYXRoQmFzZTIgPSAiL3RtcC9pbi1tZW0tbGV2ZWxkYiI7CisgICAgfQorCisg
ICAgaWYgKCFtYWtlQWxsRGlyZWN0b3JpZXMocGF0aEJhc2UyKSkgeworICAgICAgICAvLyBGSVhN
RTogSXMgdGhlcmUgYW55IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRvIHRvIHJlY292
ZXIgYXQgdGhpcyBwb2ludD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3QgZXJyb3Jpbmcg
b3V0LgorICAgICAgICBMT0dfRVJST1IoIlVuYWJsZWQgdG8gY3JlYXRlIExvY2FsU3RvcmFnZSBk
YXRhYmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVy
biAwOworICAgIH0KKyAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChw
YXRoQmFzZTIsIHNlY3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhl
ZGRiLmxldmVsZGIiKTsKKworICAgIGxldmVsZGI6OkRCKiBkYjsKKyAgICBsZXZlbGRiOjpPcHRp
b25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wYXJhdG9yID0gJm15Q29tcGFyYXRvcjsKKyAg
ICBvcHRpb25zLmNyZWF0ZV9pZl9taXNzaW5nID0gdHJ1ZTsKKyAgICAvLyBGSVhNRTogV2UgbmVl
ZCBhIGN1c3RvbSBjb21wYXJhdG9yLiBCeXRlLXdpc2UgY29tcGFyaXNvbiB3b24ndCB3b3JrIDoo
CisgICAgbGV2ZWxkYjo6U3RhdHVzIHN0YXR1cyA9IGxldmVsZGI6OkRCOjpPcGVuKG9wdGlvbnMs
IHBhdGgudXRmOCgpLmRhdGEoKSwgJmRiKTsKKworICAgIGlmICghc3RhdHVzLm9rKCkpIHsKKyAg
ICAgICAgLy8gRklYTUU6IElmIGNvbXBhcmF0b3IgbmFtZSBjaGFuZ2VkLCBibG93IGF3YXkgdGhl
IG9sZCBkYXRhYmFzZSBhbmQgc3RhcnQgYSBuZXcgb25lLgorICAgICAgICAvL3ByaW50ZigiREI6
Ok9wZW4gZmFpbGVkOiAlc1xuIiwgc3RhdHVzLlRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKworICAgIFJlZlB0cjxJREJMZXZlbERCQmFja2luZ1N0b3JlPiBi
YWNraW5nU3RvcmUoYWRvcHRSZWYobmV3IElEQkxldmVsREJCYWNraW5nU3RvcmUoZmlsZUlkZW50
aWZpZXIsIGZhY3RvcnksIGRiKSkpOworCisgICAgaWYgKCFzZXRVcE1ldGFkYXRhKGJhY2tpbmdT
dG9yZS0+bV9kYi5nZXQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGJhY2tp
bmdTdG9yZS5yZWxlYXNlKCk7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0
cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBTdHJpbmcmIGZvdW5k
VmVyc2lvbiwgaW50NjRfdCYgZm91bmRJZCkKK3sKKyAgICBib29sIG9rID0gZ2V0SW50KG1fZGIu
Z2V0KCksIG1ha2VLZXkoMCwgMCwgMCwgMjAxLCBtX2lkZW50aWZpZXIsIG5hbWUpLCAmZm91bmRJ
ZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICAvL3ByaW50ZigiZm91bmQgbm8gbWV0YWRhdGEg
Zm9yIGRhdGFiYXNlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8v
cHJpbnRmKCJleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YTogZm91bmQgZGF0YWJhc2UgaWQ6ICVk
XG4iLCAoaW50KWZvdW5kSWQpOworCisgICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgbWFr
ZUtleShmb3VuZElkLCAwLCAwLCAyKSwgJmZvdW5kVmVyc2lvbik7CisgICAgaWYgKCFvaykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy9wcmludGYoImV4dHJhY3RJREJEYXRhYmFzZU1l
dGFEYXRhOiBmb3VuZCB2ZXJzaW9uOiAlc1xuIiwgZm91bmRWZXJzaW9uLmFzY2lpKCkuZGF0YSgp
KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50NjRfdCBnZXROZXdEYXRhYmFz
ZUlkKGxldmVsZGI6OkRCKiBkYikKK3sKKyAgICAvLyBMb29rIGluIGZyZWUtbGlzdC4KKyAgICBz
dGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoMCwgMCwgMCwgMTAwKTsKKyAgICBzdGQ6OnN0
cmluZyBzdG9wS2V5ID0gbWFrZUtleSgwLCAwLCAwLCAxMDEpOworCisgICAgT3duUHRyPGxldmVs
ZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkp
OworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0
b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAg
ICBpbnQ2NF90IGEsIGIsIGM7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuZGF0
YSgpOworICAgICAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworCisgICAgICAgIHVu
c2lnbmVkIGNoYXIgZCA9ICpwKys7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoZCwgZCA9PSAxMDAp
OworCisgICAgICAgIGludDY0X3QgZGF0YWJhc2VJZDsKKyAgICAgICAgcCA9IGRlY29kZVZhcklu
dChwLCBkYXRhYmFzZUlkKTsKKworICAgICAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5EZWxl
dGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAgIEFTU0VSVChz
Lm9rKCkpOworCisgICAgICAgIC8vcHJpbnRmKCJmb3VuZCBkYXRhYmFzZUlkIGluIGZyZWUtbGlz
dDogJWRcbiIsIChpbnQpZGF0YWJhc2VJZCk7CisgICAgICAgIHJldHVybiBkYXRhYmFzZUlkOwor
ICAgIH0KKworICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0Lgor
ICAgIGludDY0X3QgbWF4RGF0YWJhc2VJZDsKKyAgICBpZiAoIWdldEludChkYiwgbWFrZUtleSgw
LCAwLCAwLCAxKSwgJm1heERhdGFiYXNlSWQpKQorICAgICAgICBtYXhEYXRhYmFzZUlkID0gMDsK
KworICAgIGludDY0X3QgZGF0YWJhc2VJZCA9IG1heERhdGFiYXNlSWQgKyAxOworICAgIGJvb2wg
b2sgPSBwdXRJbnQoZGIsIG1ha2VLZXkoMCwgMCwgMCwgMSksIGRhdGFiYXNlSWQpOworICAgIGlm
ICghb2spIHsKKyAgICAgICAgLy9wcmludGYoInNldHRpbmcgbWF4IGRhdGFiYXNlIGlkIGZhaWxl
ZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YWJh
c2VJZDsKKworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNl
TWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0
X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK3sKKyAgICAvL3ByaW50Zigic2V0SURCRGF0
YWJhc2VNZXRhRGF0YSAodmVyc2lvbjogJXMpXG4iLCB2ZXJzaW9uLmFzY2lpKCkuZGF0YSgpKTsK
KworICAgIGlmIChpbnZhbGlkUm93SWQpIHsKKyAgICAgICAgcm93SWQgPSBnZXROZXdEYXRhYmFz
ZUlkKG1fZGIuZ2V0KCkpOworCisgICAgICAgIGlmICghcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VL
ZXkoMCwgMCwgMCwgMjAxLCBtX2lkZW50aWZpZXIsIG5hbWUpLCByb3dJZCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwg
bWFrZUtleShyb3dJZCwgMCwgMCwgMiksIHZlcnNpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpn
ZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5k
SWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5
UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpCit7CisgICAgLy9w
cmludGYoImdldE9iamVjdFN0b3Jlc1xuIik7CisKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9
IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIDEsIDApOworICAgIHN0ZDo6c3RyaW5nIHN0
b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUxKTsKKworICAgIE93blB0cjxsZXZl
bGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMo
KSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBh
cmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAg
ICAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCku
ZGF0YSgpOworICAgICAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAgICAgICBB
U1NFUlQoYSA9PSBkYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKGIgPT0gMCk7CisgICAgICAg
IEFTU0VSVChjID09IDApOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZCA9ICpwKys7CisgICAg
ICAgIEFTU0VSVF9VTlVTRUQoZCwgZCA9PSA1MCk7CisKKyAgICAgICAgaW50NjRfdCBvYmplY3RT
dG9yZUlkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIG9iamVjdFN0b3JlSWQpOworICAg
ICAgICAvL3ByaW50ZigiRm91bmQgb2JqZWN0U3RvcmVJZDogJWRcbiIsIChpbnQpb2JqZWN0U3Rv
cmVJZCk7CisKKyAgICAgICAgLy9wcmludGYoIml0LT5rZXkoKTogIik7IHByaW50U3RyaW5nKGl0
LT5rZXkoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworCisgICAgICAgIFN0cmluZyBvYmpl
Y3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuVG9TdHJpbmcoKSk7CisgICAg
ICAgIC8vcHJpbnRmKCJOYW1lOiAlc1xuIiwgb2JqZWN0U3RvcmVOYW1lLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgLy9wcmludGYoIml0LT5rZXkoKTogIik7
IHByaW50U3RyaW5nKGl0LT5rZXkoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworICAgICAg
ICBpZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9
CisgICAgICAgIFN0cmluZyBrZXlQYXRoID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLlRvU3Ry
aW5nKCkpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7
IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9CisgICAgICAgIGJvb2wgYXV0b0lu
Y3JlbWVudCA9ICppdC0+dmFsdWUoKS5kYXRhKCk7CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAg
ICAgIGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRmKCJpdCBub3QgdmFsaWRcbiIpOyByZXR1cm47
IH0KKyAgICAgICAgLy8gSXMgZXZpY2F0YWJsZQorICAgICAgICBpdC0+TmV4dCgpOworICAgICAg
ICBpZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9
CisgICAgICAgIC8vIExhc3QgdmVyc2lvbgorICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBp
ZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9Cisg
ICAgICAgIC8vIE1heGltdW0gaW5kZXggaWQgZXZlciBhbGxvY2F0ZWQKKworICAgICAgICBmb3Vu
ZElkcy5hcHBlbmQob2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKG9i
amVjdFN0b3JlTmFtZSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtleVBhdGgpOwor
ICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5hcHBlbmQoYXV0b0luY3JlbWVudCk7Cisg
ICAgfQorfQorCitzdGF0aWMgaW50NjRfdCBnZXROZXdPYmplY3RTdG9yZUlkKGxldmVsZGI6OkRC
KiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkKQoreworICAgIC8vIExvb2sgaW4gZnJlZS1saXN0Lgor
ICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTAp
OworICAgIHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1
MSk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihs
ZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0
LT5WYWxpZCgpICYmIG15Q29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAw
OyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwg
YSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAgQVNT
RVJUX1VOVVNFRChkLCBkID09IDE1MCk7CisKKyAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlk
OworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIG9iamVjdFN0b3JlSWQpOworCisgICAgICAg
IGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwg
aXQtPmtleSgpKTsKKyAgICAgICAgQVNTRVJUKHMub2soKSk7CisKKyAgICAgICAgLy9wcmludGYo
ImZvdW5kIG9iamVjdFN0b3JlSWQgaW4gZnJlZS1saXN0OiAlZFxuIiwgKGludClvYmplY3RTdG9y
ZUlkKTsKKworICAgICAgICByZXR1cm4gb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICAvLyBJ
ZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1heE9i
amVjdFN0b3JlSWQ7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwg
MCwgMyksICZtYXhPYmplY3RTdG9yZUlkKSkKKyAgICAgICAgbWF4T2JqZWN0U3RvcmVJZCA9IDA7
CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQgPSBtYXhPYmplY3RTdG9yZUlkICsgMTsKKyAg
ICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDMpLCBvYmpl
Y3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIC8vcHJpbnRmKCJzZXR0aW5nIG1h
eCBvYmplY3Qgc3RvcmUgaWQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIHJldHVybiBvYmplY3RTdG9yZUlkOworfQorCitib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50
NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQoreworICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCA9IGdldE5ld09iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCk7CisKKyAgICBi
b29sIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwg
NTAsIG9iamVjdFN0b3JlSWQsIDApLCBuYW1lKTsKKyAgICBpZiAoIW9rKSB7IHByaW50ZigiZmFp
bGVkIHRvIHNldCBuYW1lXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBvayA9IHB1dFN0cmlu
ZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlk
LCAxKSwga2V5UGF0aCk7CisgICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgbmFt
ZVxuIik7IHJldHVybiBmYWxzZTsgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWFr
ZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMiksIGF1dG9JbmNyZW1l
bnQpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJmYWlsZWQgdG8gc2V0IGF1dG9JbmNyZW1lbnRc
biIpOyByZXR1cm4gZmFsc2U7IH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDMpLCBmYWxzZSk7CisgICAg
aWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgaXNFdmljYXRhYmxlXG4iKTsgcmV0dXJu
IGZhbHNlOyB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNl
SWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA0KSwgMSk7CisgICAgaWYgKCFvaykgeyBwcmlu
dGYoImZhaWxlZCB0byBzZXQgbGFzdCB2ZXJzaW9uXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAg
ICAvLyBGSVhNRTogTm90IHN1cmUgd2UgZXZlbiBuZWVkIHRvIHNldCB0aGlzPworICAgIG9rID0g
cHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0
b3JlSWQsIDUpLCAzMCk7CisgICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgbWF4
IGluZGV4IGlkXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdl
dCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDIwMCwgbmFtZSksIG9iamVjdFN0b3JlSWQp
OworICAgIGlmICghb2spIHsgcHJpbnRmKCJmYWlsZWQgdG8gc2V0IG9iamVjdCBzdG9yZSBpZFxu
Iik7IHJldHVybiBmYWxzZTsgfQorCisgICAgYXNzaWduZWRPYmplY3RTdG9yZUlkID0gb2JqZWN0
U3RvcmVJZDsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBkZWxldGVSYW5n
ZShsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiZWdpbiwgY29uc3Qgc3RkOjpz
dHJpbmcmIGVuZCkKK3sKKyAgICAvL3ByaW50ZigiZGVsZXRlUmFuZ2UgKGJlZ2luOiAiKTsKKyAg
ICAvL3ByaW50U3RyaW5nKGJlZ2luKTsKKyAgICAvL3ByaW50ZigiLCBlbmQ6ICIpOworICAgIC8v
cHJpbnRTdHJpbmcoZW5kKTsKKyAgICAvL3ByaW50ZigiKVxuIik7CisKKyAgICBPd25QdHI8bGV2
ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygp
KSk7CisgICAgZm9yIChpdC0+U2VlayhiZWdpbik7IGl0LT5WYWxpZCgpICYmIG15Q29tcGFyYXRv
ci5YQ29tcGFyZShpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIC8v
cHJpbnRmKCJkZWxldGVSYW5nZSwga2V5OiAiKTsKKyAgICAgICAgLy9wcmludFN0cmluZyhpdC0+
a2V5KCkuVG9TdHJpbmcoKSk7CisgICAgICAgIC8vcHJpbnRmKCJcbiIpOworICAgICAgICBsZXZl
bGRiOjpTdGF0dXMgcyA9IGRiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5r
ZXkoKSk7CisgICAgICAgIGlmICghcy5vaygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkKQoreworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7CisgICAgZ2V0U3RyaW5nKG1f
ZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDAp
LCAmb2JqZWN0U3RvcmVOYW1lKTsKKworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9w
dGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMCkp
OworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRh
YmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMSkpOworICAgIG1fZGItPkRlbGV0ZShs
ZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2Jq
ZWN0U3RvcmVJZCwgMikpOworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMo
KSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMykpOworICAg
IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNCkpOworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRi
OjpXcml0ZU9wdGlvbnMoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3Rv
cmVJZCwgNSkpOworCisgICAgLy8gSW5zZXJ0IGludG8gZnJlZS1saXN0LgorICAgIHB1dFN0cmlu
ZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MCwgb2JqZWN0U3RvcmVJ
ZCksICIiKTsKKworICAgIC8vIEZJWE1FOiBEZWxldGUgdGhlIG9iamVjdCBzdG9yZSBuYW1lIGZy
b20gdGhlIG1hcHBpbmcgKHdlIG5lZWQgdG8gbG9vayBpdCB1cCkKKyAgICBtX2RiLT5EZWxldGUo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMjAwLCBv
YmplY3RTdG9yZU5hbWUpKTsKKworICAgIC8vIFdlIGNvdWxkIGp1c3QgZG8gb25lIGJpZyBkZWxl
dGVSYW5nZSBmb3IgdGhlIHN0dWZmIGJlbG93Li4uCisKKyAgICAvLyBPYmplY3Qgc3RvcmUgZGF0
YSwgZXhpc3RzIGRhdGEsIGluZGV4IGRhdGEuCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdl
dCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBtYWtlS2V5KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAwKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KKworI2lmIDAKKyAgICAvLyBFeGlzdHMgZGF0YS4KKyAgICBpZiAoIWRl
bGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
MiksIG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMykpKQorICAgICAgICByZXR1
cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisKKyAgICAvLyBJbmRleCBkYXRhLgorICAgIGlm
ICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCAzMCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEsIDApKSkKKyAg
ICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorI2VuZGlmCisKKyAgICAvLyBJ
bmRleCBpZCBmcmVlLWxpc3QKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCBvYmplY3RTdG9yZUlkKSwgbWFrZUtleShkYXRhYmFz
ZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQgKyAxKSkpCisgICAgICAgIHJldHVybjsgLy8g
RklYTUU6IFJlcG9ydCBlcnJvci4KKworICAgIC8vIEluZGV4IG1ldGEtZGF0YQorICAgIGlmICgh
ZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9i
amVjdFN0b3JlSWQpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJ
ZCArIDEpKSkKKyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorCit9CisK
K1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkp
Cit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3RyaW5nIGRh
dGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0
aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBzdGF0aWNfY2FzdDx2
b2lkPih2ZXJzaW9uKTsKKyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuY19z
dHIoKSwgdmVyc2lvbik7CisKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHAs
IGRhdGEuY19zdHIoKSArIGRhdGEubGVuZ3RoKCkpKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNz
IExldmVsREJSZWNvcmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9y
ZVJlY29yZEhhbmRsZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlJlY29yZEhhbmRsZShjb25zdCBz
dGQ6OnN0cmluZyYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtleShw
cmltYXJ5S2V5KSwgbV92ZXJzaW9uKHZlcnNpb24pIHt9CisgICAgc3RkOjpzdHJpbmcgcHJpbWFy
eUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIGludDY0X3QgdmVyc2lv
bigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmlu
ZyBtX3ByaW1hcnlLZXk7IC8vIHRoZSByZXN1bHQgb2YgZW5jb2RlS2V5KElEQktleSkgYmFzaWNh
bGx5LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0
TmV3VmVyc2lvbk51bWJlcihsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGludDY0X3QgbGFzdFZlcnNpb247CisgICAgaWYg
KCFnZXRJbnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQs
IDQpLCAmbGFzdFZlcnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBBU1NF
UlQobGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lv
biArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAw
LCA1MCwgb2JqZWN0U3RvcmVJZCwgNCksIHZlcnNpb24pOworICAgIEFTU0VSVChvayk7CisKKyAg
ICAvKiBGSVhNRTogRGV0ZWN0IG92ZXJmbG93PyBOb3QgbXVjaCB3ZSBjYW4gZG8gYWJvdXQgaXQg
YW55d2F5Li4uPyBBbmQgaXQKKyAgICAgKiBwcm9iYWJseSBpc24ndCBhIGNhdGFzdHJvcGhlIGFu
eXdheS4uLiAqLworCisgICAgcmV0dXJuIHZlcnNpb247Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
LCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiByZWNvcmRIYW5kbGUpCit7CisgICAg
aW50NjRfdCB2ZXJzaW9uID0gZ2V0TmV3VmVyc2lvbk51bWJlcihtX2RiLmdldCgpLCBkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBvYmplY3RTdG9yZWRh
dGFLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEsIGVuY29kZUtleShr
ZXkpKTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+UHV0KGxldmVsZGI6OldyaXRl
T3B0aW9ucygpLCBvYmplY3RTdG9yZWRhdGFLZXksIGVuY29kZVZhckludCh2ZXJzaW9uKSArIGVu
Y29kZVN0cmluZyh2YWx1ZSkpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBleGlzdHNFbnRyeUtleSA9IG1ha2VLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMiwgZW5jb2RlS2V5KGtleSkpOworCisgICAgcyA9IG1f
ZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgZXhpc3RzRW50cnlLZXksIGVuY29kZUlu
dCh2ZXJzaW9uKSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8g
RklYTUU6IElkZWFsbHksIHdlIHdhbnQgdG8gcm9sbCBiYWNrIHRoZSBwdXQgYWJvdmU/CisKKyAg
ICByZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZEhhbmRsZShlbmNvZGVL
ZXkoa2V5KSwgdmVyc2lvbikpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBt
YWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEpOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAwKTsg
Ly8gTm90IGluY2x1ZGVkLgorCisgICAgZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgc3RhcnRLZXks
IHN0b3BLZXkpOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYgcmVjb3JkSGFuZGxlKQoreworICAgIC8vcHJp
bnRmKCJkZWxldGVPYmplY3RTdG9yZVJlY29yZFxuIik7CisKKyAgICBjb25zdCBMZXZlbERCUmVj
b3JkSGFuZGxlJiBsZXZlbERCUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxE
QlJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBsZXZlbERCUmVjb3JkSGFu
ZGxlLnByaW1hcnlLZXkoKSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkRlbGV0
ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5KTsKK30KKworZG91YmxlIElEQkxldmVsREJC
YWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsg
Ly8gTm90IGluY2x1ZGVkLgorCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2Ri
LT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAgICBpbnQgbWF4TnVt
ZXJpY0tleSA9IDA7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyB2ZXJ5IHNhZmUsIGJ1dCB2ZXJ5
IHNsb3cuIEl0J3MgY2FjaGVkIG9uZSBsYXllciB1cCwgYnV0CisgICAgLy8gSSdtIG5vdCBzdXJl
IHRoYXQncyBnb29kIGVub3VnaD8KKyAgICAvLyBBbHNvLCB3ZSBjb3VsZCBwcm9iYWJseSBiZSBz
bWFydGVyIHdpdGggdGhlIGl0ZXJhdG9yIHJhbmdlLi4uCisKKyAgICBmb3IgKGl0LT5TZWVrKHN0
YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBz
dG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworCisg
ICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVQcmVmaXgoaXQtPmtleSgpLlRvU3RyaW5nKCku
Y19zdHIoKSwgYSwgYiwgYyk7CisgICAgICAgIEFTU0VSVChhID09IGRhdGFiYXNlSWQpOworICAg
ICAgICBBU1NFUlQoYiA9PSBvYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKGMgPT0gMSk7
CisKKyAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OworICAgICAgICBkZWNvZGVLZXkocCwga2V5
KTsKKworICAgICAgICBpZiAoa2V5LT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7Cisg
ICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihrZXktPm51bWJlcigp
KTsKKyAgICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAgICAgICAgICAgICBt
YXhOdW1lcmljS2V5ID0gbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhOdW1l
cmljS2V5ICsgMTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJ
bk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmIGtleSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRS
ZWNvcmRIYW5kbGUpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0
ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZl
bGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBkZWNv
ZGVWYXJJbnQoZGF0YS5jX3N0cigpLCB2ZXJzaW9uKTsKKworICAgIGZvdW5kUmVjb3JkSGFuZGxl
ID0gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5jb2RlS2V5KGtleSksIHZlcnNp
b24pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
Ojpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smIGNhbGxiYWNrKQoreworICAg
IC8vcHJpbnRmKCJmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmRcbiIpOworCisgICAgY29uc3Qgc3Rk
OjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEp
OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIDIpOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICBPd25QdHI8bGV2ZWxkYjo6
SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsK
KyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9y
LkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAg
aW50NjRfdCBhLCBiLCBjOworICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJlZml4KGl0
LT5rZXkoKS5Ub1N0cmluZygpLmNfc3RyKCksIGEsIGIsIGMpOworCisgICAgICAgIFJlZlB0cjxJ
REJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRlY29kZUtleShwLCBwcmltYXJ5S2V5KTsKKwor
ICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVW
YXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCB2ZXJzaW9uKTsKKworICAgICAgICBSZWZQdHI8TGV2
ZWxEQlJlY29yZEhhbmRsZT4gcmgoYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5j
b2RlS2V5KCpwcmltYXJ5S2V5KSwgdmVyc2lvbikpKTsKKyAgICAgICAgU3RyaW5nIGlkYlZhbHVl
ID0gZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHEsIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52
YWx1ZSgpLnNpemUoKSkpOworCisgICAgICAgIC8vcHJpbnRmKCJmb3JFYWNoT2JqZWN0U3RvcmVS
ZWNvcmQsIGlkdlZhbHVlID0gJXNcbiIsIGlkYlZhbHVlLmFzY2lpKCkuZGF0YSgpKTsKKworICAg
ICAgICBjYWxsYmFjay5jYWxsYmFjaygqcmgsIGlkYlZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4m
IGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZv
dW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKK3sKKyAgICAvL3By
aW50ZigiZ2V0SW5kZXhlcyBmb3Igb2JqZWN0IHN0b3JlICVkXG4iLCAoaW50KW9iamVjdFN0b3Jl
SWQpOworCisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAs
IDAsIDEwMCwgb2JqZWN0U3RvcmVJZCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkICsgMSk7CisKKyAgICBPd25Q
dHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRP
cHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYg
bXlDb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkp
IHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQt
PmtleSgpLmRhdGEoKTsKKyAgICAgICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKKwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGQgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKGQs
IGQgPT0gMTAwKTsKKworICAgICAgICBpbnQ2NF90IGluZGV4SWQ7CisgICAgICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgaW5kZXhJZCk7CisgICAgICAgIC8vcHJpbnRmKCJGb3VuZCBpbmRleCBpZDog
JWRcbiIsIChpbnQpaW5kZXhJZCk7CisKKyAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlY29k
ZVN0cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsKKyAgICAgICAgLy9wcmludGYoIk5hbWU6
ICVzXG4iLCBpbmRleE5hbWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBpdC0+TmV4dCgpOwor
ICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0
dXJuOyB9CisKKyAgICAgICAgYm9vbCBpbmRleFVuaXF1ZSA9ICppdC0+dmFsdWUoKS5kYXRhKCk7
CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsgcHJpbnRm
KCJpdCBub3QgdmFsaWRcbiIpOyByZXR1cm47IH0KKworICAgICAgICBTdHJpbmcga2V5UGF0aCA9
IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsKKworICAgICAgICBmb3VuZElk
cy5hcHBlbmQoaW5kZXhJZCk7CisgICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKGluZGV4TmFtZSk7
CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtleVBhdGgpOworICAgICAgICBmb3VuZFVu
aXF1ZUZsYWdzLmFwcGVuZChpbmRleFVuaXF1ZSk7CisgICAgfQorfQorCitzdGF0aWMgaW50NjRf
dCBnZXROZXdJbmRleElkKGxldmVsZGI6OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgLy8gTG9vayBpbiBmcmVlLWxpc3QuCisgICAgc3Rk
OjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MSwgb2JqZWN0
U3RvcmVJZCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
MCwgMCwgMTUxLCBvYmplY3RTdG9yZUlkICsgMSk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRl
cmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAg
Zm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIG15Q29tcGFyYXRvci5Db21w
YXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0
X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7Cisg
ICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQg
Y2hhciBkID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBkID09IDE1MSk7CisKKyAg
ICAgICAgaW50NjRfdCB0cmFzaDsgLy8gb2JqZWN0IHN0b3JlIGlkCisgICAgICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgdHJhc2gpOworCisgICAgICAgIGludDY0X3QgaW5kZXhJZDsKKyAgICAgICAg
cCA9IGRlY29kZVZhckludChwLCBpbmRleElkKTsKKworICAgICAgICBsZXZlbGRiOjpTdGF0dXMg
cyA9IGRiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAg
ICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgICAgIC8vcHJpbnRmKCJmb3VuZCBpbmRleCBpZCBp
biBmcmVlLWxpc3Q6ICVkXG4iLCAoaW50KWluZGV4SWQpOworICAgICAgICBBU1NFUlQoaW5kZXhJ
ZCA+PSAzMCk7CisgICAgICAgIHJldHVybiBpbmRleElkOworICAgIH0KKworICAgIC8vIElmIHdl
IGdvdCBoZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0LgorICAgIGludDY0X3QgbWF4SW5kZXhJ
ZDsKKyAgICBpZiAoIWdldEludChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2Jq
ZWN0U3RvcmVJZCwgNSksICZtYXhJbmRleElkKSkKKyAgICAgICAgbWF4SW5kZXhJZCA9IDMwOyAv
LyBJdCdzIGltcG9ydGFudCB0aGF0IGl0IHN0YXJ0cyBhdCAzMCEhCisKKyAgICBpbnQ2NF90IGlu
ZGV4SWQgPSBtYXhJbmRleElkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5
KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgaW5kZXhJZCk7CisgICAg
aWYgKCFvaykgeworICAgICAgICAvL3ByaW50Zigic2V0dGluZyBtYXggaW5kZXggaWQgZmFpbGVk
XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBpbmRleElk
OworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCkKK3sK
KyAgICAvL3ByaW50ZigiY3JlYXRlSW5kZXggZm9yIG9iamVjdCBzdG9yZSAlZFxuIiwgKGludClv
YmplY3RTdG9yZUlkKTsKKyAgICBpbmRleElkID0gZ2V0TmV3SW5kZXhJZChtX2RiLmdldCgpLCBk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKTsKKyAgICAvL3ByaW50ZigiaW5kZXhJZDogJWRcbiIs
IChpbnQpaW5kZXhJZCk7CisKKyAgICBib29sIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIG1h
a2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAwKSwg
bmFtZSk7CisgICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgaW5kZXggbmFtZVxu
Iik7IHJldHVybiBmYWxzZTsgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWFrZUtl
eShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDEpLCBpc1Vu
aXF1ZSk7CisgICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgaXN1bmlxdWVcbiIp
OyByZXR1cm4gZmFsc2U7IH0KKworICAgIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAyKSwga2V5
UGF0aCk7CisgICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQga2V5IHBhdGhcbiIp
OyByZXR1cm4gZmFsc2U7IH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgcmV0dXJuOworfQorCitib29sIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtl
eSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICBB
U1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSYgbGV2
ZWxEQlJlY29yZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUm
PihyZWNvcmRIYW5kbGUpOworCisgICAgLy9wcmludGYoInB1dEluZGV4RGF0YUZvclJlY29yZCAo
ZGI6ICVkLCBvczogJWQsIGlkeDogJWQga2V5OiAiLCAoaW50KWRhdGFiYXNlSWQsIChpbnQpb2Jq
ZWN0U3RvcmVJZCwgKGludClpbmRleElkKTsgcHJpbnRTdHJpbmcoZW5jb2RlS2V5KGtleSkpOyBw
cmludGYoIiByZWNvcmRIYW5kbGUucHJpbWFyeUtleSgpOiAiKTsgcHJpbnRTdHJpbmcobGV2ZWxE
QlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCkpOyBwcmludGYoIilcbiIpOworCisgICAgY29uc3Qg
aW50NjRfdCBnbG9iYWxTZXF1ZW5jZU51bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5n
ZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcg
aW5kZXhEYXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCBlbmNvZGVLZXkoa2V5KSwgZ2xvYmFsU2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0IHN0ZDo6
c3RyaW5nIGRhdGEgPSBlbmNvZGVWYXJJbnQobGV2ZWxEQlJlY29yZEhhbmRsZS52ZXJzaW9uKCkp
ICsgbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCk7CisKKyAgICByZXR1cm4gbV9kYi0+
UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpbmRleERhdGFLZXksIGRhdGEpLm9rKCk7Cit9
CisKK3N0YXRpYyBib29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKGxldmVsZGI6OkRCKiBkYiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQoreworICAg
IE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJl
YWRPcHRpb25zKCkpKTsKKyAgICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFpdC0+VmFs
aWQoKSkgeworICAgICAgICBpdC0+U2Vla1RvTGFzdCgpOworICAgICAgICBpZiAoIWl0LT5WYWxp
ZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChteUNv
bXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkgPj0gMCkgeworICAg
ICAgICBpdC0+UHJldigpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpmb3VuZEtleSA9IGl0LT5rZXkoKS5Ub1N0cmlu
ZygpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRs
ZSYgcmVjb3JkSGFuZGxlKQoreworICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHJlYWxseSBuZWVk
ZWQsIGJlY2F1c2Ugb2YgdGhlIHZlcnNpb24gc3R1ZmYhCisgICAgcmV0dXJuIHRydWU7CisjaWYg
MAorCisgICAgLy9wcmludGYoImRlbGV0ZUluZGV4RGF0YUZvclJlY29yZCAoZGI6ICVkLCBvYmpl
Y3Qgc3RvcmU6ICVkLCBpbmRleDogJWQpXG4iLCAoaW50KWRhdGFiYXNlSWQsIChpbnQpb2JqZWN0
U3RvcmVJZCwgKGludClpbmRleElkKTsKKworICAgIGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUm
IGxldmVsREJSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERCUmVjb3JkSGFu
ZGxlJj4ocmVjb3JkSGFuZGxlKTsKKyAgICAvL3ByaW50ZigicHJpbWFyeWtleTogIik7IHByaW50
U3RyaW5nKGxldmVsREJSZWNvcmRIYW5kbGUucHJpbWFyeUtleSgpKTsgcHJpbnRmKCJcbiIpOwor
CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGluZGV4SWQpOworICAgIHN0ZDo6c3RyaW5nIHN0b3BLZXk7CisgICAgaWYg
KCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQgKyAxKSwgJnN0b3BLZXkpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgY3Jh
enkgaW5lZmZpY2llbnQhCisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgp
ICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPD0g
MDsgaXQtPk5leHQoKSkgeworICAgICAgICBpZiAoaXQtPnZhbHVlKCkuVG9TdHJpbmcoKSA9PSBs
ZXZlbERCUmVjb3JkSGFuZGxlLnByaW1hcnlLZXkoKSkgeworICAgICAgICAgICAgbGV2ZWxkYjo6
U3RhdHVzIHMgPSBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXko
KSk7CisgICAgICAgICAgICAvL3ByaW50ZigiZGVsZXRlIGtleTogIik7IHByaW50U3RyaW5nKGl0
LT5rZXkoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCFzLm9r
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmdldE9iamVjdFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIFJlZlB0
cjxJREJLZXk+IHByaW1hcnlLZXkgPSBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5KTsKKyAgICBpZiAoIXByaW1hcnlLZXkpCisgICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIHJldHVybiBnZXRPYmplY3RTdG9yZVJlY29yZChk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcHJpbWFyeUtleSk7Cit9CisKK3N0YXRpYyBib29s
IHZlcnNpb25FeGlzdHMobGV2ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCB2ZXJzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgZW5j
b2RlZFByaW1hcnlLZXkpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyLCBlbmNvZGVkUHJpbWFyeUtleSk7CisgICAgc3Rk
OjpzdHJpbmcgZGF0YTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkdldChsZXZlbGRi
OjpSZWFkT3B0aW9ucygpLCBrZXksICZkYXRhKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGRlY29kZUludChkYXRhKSA9PSB2ZXJzaW9uOwor
fQorCitQYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFy
eUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIE93blB0cjxsZXZlbGRi
OjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkp
OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsZGJLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleShrZXkpKTsKKyAgICBpdC0+U2Vlayhs
ZXZlbGRiS2V5KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobXlDb21wYXJhdG9yLkNvbXBhcmVJ
bmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4g
MDsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBk
ZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpz
dHJpbmcgZW5jb2RlZFByaW1hcnlLZXkgPSBzdGQ6OnN0cmluZyhwLCBpdC0+dmFsdWUoKS5kYXRh
KCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyht
X2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJp
bWFyeUtleSkpIHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5
IGFuZCBjb250aW51ZS4KKyAgICAgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9w
dGlvbnMoKSwgaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlL
ZXk7CisgICAgICAgIGRlY29kZUtleShlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpLCBwcmltYXJ5
S2V5KTsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KK30KKwor
Ym9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElE
QktleSYga2V5KQoreworICAgIC8vcHJpbnRmKCJrZXlFeGlzdHNJbkluZGV4IChkYjogJWQsIG9z
OiAlZCwgaWR4OiAlZCBrZXk6ICIsIChpbnQpZGF0YWJhc2VJZCwgKGludClvYmplY3RTdG9yZUlk
LCAoaW50KWluZGV4SWQpOyBwcmludFN0cmluZyhlbmNvZGVLZXkoa2V5KSk7IHByaW50ZigiKVxu
Iik7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBsZXZlbERCS2V5ID0gbWFrZUtleShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoa2V5KSk7CisgICAgT3duUHRy
PGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0
aW9ucygpKSk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBpdC0+U2VlayhsZXZl
bERCS2V5KTsKKyAgICBpZiAoaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRl
eEtleXMoaXQtPmtleSgpLlRvU3RyaW5nKCksIGxldmVsREJLZXkpID09IDApCisgICAgICAgIGZv
dW5kID0gdHJ1ZTsKKworICAgIC8vcHJpbnRmKCJmb3VuZCA9ICVzXG4iLCBmb3VuZCA/ICJ0cnVl
IiA6ICJmYWxzZSIpOworICAgIHJldHVybiBmb3VuZDsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNz
IEN1cnNvckltcGxDb21tb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgeworcHVi
bGljOgorICAgIEN1cnNvckltcGxDb21tb24obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0
cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBi
b29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogbV9kYihkYikKKyAgICAgICAg
LCBtX2xvd0tleShsb3dLZXkpCisgICAgICAgICwgbV9sb3dPcGVuKGxvd09wZW4pCisgICAgICAg
ICwgbV9oaWdoS2V5KGhpZ2hLZXkpCisgICAgICAgICwgbV9oaWdoT3BlbihoaWdoT3BlbikKKyAg
ICAgICAgLCBtX2ZvcndhcmQoZm9yd2FyZCkKKyAgICB7CisgICAgfQorICAgIHZpcnR1YWwgfkN1
cnNvckltcGxDb21tb24oKSB7fQorCisgICAgLy8gSURCQmFja2luZ1N0b3JlOjpDdXJzb3IKKyAg
ICB2aXJ0dWFsIGJvb2wgY29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqKTsKKyAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJy
ZW50S2V5OyB9CisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSA9IDA7CisgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVj
dFN0b3JlUmVjb3JkSGFuZGxlKCkgPSAwOyAvLyBGSVhNRTogSXMgdGhpcyBhY3R1YWxseSB1c2Vk
IGJ5IGFueW9uZT8KKyAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSA9IDA7CisKKyAg
ICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKSA9IDA7CisgICAgYm9vbCBmaXJzdFNlZWso
KTsKKworcHJvdGVjdGVkOgorICAgIGxldmVsZGI6OkRCKiBtX2RiOworICAgIE93blB0cjxsZXZl
bGRiOjpJdGVyYXRvcj4gbV9pdGVyYXRvcjsKKyAgICBzdGQ6OnN0cmluZyBtX2xvd0tleTsKKyAg
ICBib29sIG1fbG93T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBtX2hpZ2hLZXk7CisgICAgYm9vbCBt
X2hpZ2hPcGVuOworICAgIGJvb2wgbV9mb3J3YXJkOworICAgIFJlZlB0cjxJREJLZXk+IG1fY3Vy
cmVudEtleTsKK307CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6Zmlyc3RTZWVrKCkKK3sKKyAg
ICAvL3ByaW50ZigiZmlyc3RTZWVrLi4uXG4iKTsKKyAgICAvL3ByaW50ZigibG93OiAiKTsgcHJp
bnRTdHJpbmcobV9sb3dLZXkpOworICAgIC8vaWYgKG1fbG93T3BlbikgcHJpbnRmKCIgKG9wZW4p
Iik7CisgICAgLy9wcmludGYoIiBoaWdoOiAiKTsgcHJpbnRTdHJpbmcobV9oaWdoS2V5KTsKKyAg
ICAvL2lmIChtX2hpZ2hPcGVuKSBwcmludGYoIiAob3BlbikiKTsKKyAgICAvL3ByaW50ZigiIGZv
cndhcmQgPSAlc1xuIiwgbV9mb3J3YXJkID8gInRydWUiIDogImZhbHNlIik7CisKKworICAgIG1f
aXRlcmF0b3IgPSBtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKTsKKwor
ICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgIG1faXRlcmF0b3ItPlNlZWsobV9sb3dLZXkpOwor
ICAgIGVsc2UKKyAgICAgICAgbV9pdGVyYXRvci0+U2VlayhtX2hpZ2hLZXkpOworCisgICAgZm9y
ICg7OykgeworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPlZhbGlkKCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy9wcmludGYoImtleTogIik7IHByaW50U3RyaW5nKG1f
aXRlcmF0b3ItPmtleSgpLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7CisKKyAgICAgICAgaWYg
KG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGlnaE9wZW4gJiYgbXlDb21wYXJh
dG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPiAwKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2xv
d09wZW4gJiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1fbG93S2V5KSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
IW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9sb3dPcGVuKSB7CisgICAgICAgICAg
ICAvLyBsb3dLZXkgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCisgICAgICAg
ICAgICBpZiAobXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1fbG93S2V5KSA8PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIGlmICghbV9mb3J3YXJkICYmIG1faGlnaE9wZW4pIHsKKyAgICAgICAgICAgIC8vIGhpZ2hL
ZXkgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICAgIGlmICht
eUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5
KSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+UHJldigpOworICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYg
KCFsb2FkQ3VycmVudFJvdygpKSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAg
ICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBDdXJzb3JJbXBs
Q29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQoreworICAgIHdoaWxl
ICh0cnVlKSB7CisgICAgICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgICAgICBtX2l0ZXJhdG9y
LT5OZXh0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsK
KworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJhc2g7CisgICAgICAgIGlmIChtX2RiLT5H
ZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCksICZ0cmFzaCkuSXNO
b3RGb3VuZCgpKQorICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vcHJpbnRmKCJj
b250aW51ZS4uLlxuIik7CisgICAgICAgIC8vcHJpbnRmKCJsb3c6ICIpOyBwcmludFN0cmluZyht
X2xvd0tleSk7CisgICAgICAgIC8vaWYgKG1fbG93T3BlbikgcHJpbnRmKCIgKG9wZW4pIik7Cisg
ICAgICAgIC8vcHJpbnRmKCIgaGlnaDogIik7IHByaW50U3RyaW5nKG1faGlnaEtleSk7CisgICAg
ICAgIC8vaWYgKG1faGlnaE9wZW4pIHByaW50ZigiIChvcGVuKSIpOworICAgICAgICAvL3ByaW50
ZigiIGZvcndhcmQgPSAlc1xuIiwgbV9mb3J3YXJkID8gInRydWUiIDogImZhbHNlIik7CisKKyAg
ICAgICAgaWYgKG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIC8vIGhpZ2gga2V5
IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID4gMCkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9sb3dPcGVuICYmIG15Q29t
cGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0g
MCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYg
IW1fbG93T3BlbiAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5r
ZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICBpZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKSB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtl
eS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBP
YmV5IHRoZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQKKworICAgICAgICBicmVhazsKKyAgICB9CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgT2JqZWN0U3RvcmVDdXJzb3JJbXBsIDogcHVi
bGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1w
bChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3Bl
biwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2Fy
ZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hL
ZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBs
Q29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1
ZTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3Jl
UmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1
cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cit9Owor
Citib29sIE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIC8v
cHJpbnRmKCJsb2FkQ3VycmVudFJvdygpXG4iKTsKKyAgICAvL3ByaW50Zigia2V5OiAiKTsgcHJp
bnRTdHJpbmcobV9pdGVyYXRvci0+a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKKyAg
ICAvL3ByaW50ZigidmFsdWU6ICIpOyBwcmludFN0cmluZyhtX2l0ZXJhdG9yLT52YWx1ZSgpLlRv
U3RyaW5nKCkpOyBwcmludGYoIlxuIik7CisKKyAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgY29u
c3QgY2hhciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBwID0gZGVjb2RlUHJl
Zml4KHAsIGEsIGIsIGMpOworICAgIHAgPSBkZWNvZGVLZXkocCwgbV9jdXJyZW50S2V5KTsKKwor
ICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1f
aXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCB2ZXJzaW9uKTsKKyAgICBzdGF0aWNfY2FzdDx2b2lk
Pih2ZXJzaW9uKTsKKworICAgIG1fY3VycmVudFZhbHVlID0gZGVjb2RlU3RyaW5nKHN0ZDo6c3Ry
aW5nKHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5z
aXplKCkpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEtleUN1cnNvcklt
cGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgSW5kZXhLZXlDdXJz
b3JJbXBsKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBs
b3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBm
b3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3Blbiwg
aGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAgIH0KKworICAgIC8vIEN1cnNv
ckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+
IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3Rv
cmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAg
IHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJl
dHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6
CisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworfTsKKworYm9vbCBJbmRleEtleUN1
cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICAvL3ByaW50ZigiSW5kZXhLZXlDdXJz
b3I6OmxvYWRDdXJyZW50Um93KClcbiIpOworICAgIC8vcHJpbnRmKCJrZXk6ICIpOyBwcmludFN0
cmluZyhtX2l0ZXJhdG9yLT5rZXkoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworICAgIC8v
cHJpbnRmKCJ2YWx1ZTogIik7IHByaW50U3RyaW5nKG1faXRlcmF0b3ItPnZhbHVlKCkuVG9TdHJp
bmcoKSk7IHByaW50ZigiXG4iKTsKKworICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICBjb25zdCBj
aGFyKiBwID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIHAgPSBkZWNvZGVQcmVmaXgo
cCwgYSwgYiwgYyk7CisgICAgcCA9IGRlY29kZUtleShwLCBtX2N1cnJlbnRLZXkpOworCisgICAg
Ly8gV2UganVzdCBpZ25vcmUgdGhlIHNlcXVlbmNlIG51bWJlci4uLgorCisgICAgaW50NjRfdCB2
ZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFs
dWUoKS5kYXRhKCksIHZlcnNpb24pOworICAgIHN0YXRpY19jYXN0PHZvaWQ+KHZlcnNpb24pOyAv
LyBGSVhNRTogV2Ugc2hvdWxkIHBydW5lIGVudHJpZXMgd2l0aCBvbGQgdmVyc2lvbiwgYnV0IEkg
dGhpbmsga2V5RXhpc3RzSW5PYmplY3RTdG9yZSB0YWtlcyBjYXJlIG9mIGl0IGZvciBub3cuLi4K
KyAgICBkZWNvZGVLZXkocSwgbV9wcmltYXJ5S2V5KTsKKworICAgIHJldHVybiB0cnVlOworfQor
CitjbGFzcyBJbmRleEN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJs
aWM6CisgICAgSW5kZXhDdXJzb3JJbXBsKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJp
bmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9v
bCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIs
IGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAg
IH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgp
IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmlt
YXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0
dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4g
MDsgfQorICAgIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8
SURCS2V5PiBtX3ByaW1hcnlLZXk7CisgICAgU3RyaW5nIG1fdmFsdWU7CisgICAgc3RkOjpzdHJp
bmcgbV9wcmltYXJ5TGV2ZWxEQktleTsKK307CisKK2Jvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2Fk
Q3VycmVudFJvdygpCit7CisgICAgLy9wcmludGYoIkluZGV4Q3Vyc29yOjpsb2FkQ3VycmVudFJv
dygpXG4iKTsKKyAgICAvL3ByaW50Zigia2V5OiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+
a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKKyAgICAvL3ByaW50ZigidmFsdWU6ICIp
OyBwcmludFN0cmluZyhtX2l0ZXJhdG9yLT52YWx1ZSgpLlRvU3RyaW5nKCkpOyBwcmludGYoIlxu
Iik7CisKKyAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0
b3ItPmtleSgpLmRhdGEoKTsKKyAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAg
IHAgPSBkZWNvZGVLZXkocCwgbV9jdXJyZW50S2V5KTsKKworICAgIC8vIEZJWE1FOiBXZSBqdXN0
IGlnbm9yZSB0aGUgc2VxdWVuY2UgbnVtYmVyLCByaWdodD8KKworICAgIGludDY0X3QgaW5kZXhE
YXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3It
PnZhbHVlKCkuZGF0YSgpLCBpbmRleERhdGFWZXJzaW9uKTsKKyAgICBxID0gZGVjb2RlS2V5KHEs
IG1fcHJpbWFyeUtleSk7CisKKyAgICBtX3ByaW1hcnlMZXZlbERCS2V5ID0gbWFrZUtleShhLCBi
LCAxLCBlbmNvZGVLZXkoKm1fcHJpbWFyeUtleSkpOworCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0
OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25z
KCksIG1fcHJpbWFyeUxldmVsREJLZXksICZyZXN1bHQpOworICAgIGlmICghcy5vaygpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNpb247
CisgICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuY19zdHIoKSwgb2JqZWN0
U3RvcmVEYXRhVmVyc2lvbik7CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBp
bmRleERhdGFWZXJzaW9uKSB7CisgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9w
dGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgLy9wcmludGYoIkluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3csIHJlc3Vs
dDogIik7IHByaW50U3RyaW5nKHJlc3VsdCk7IHByaW50ZigiXG4iKTsKKyAgICBtX3ZhbHVlID0g
ZGVjb2RlU3RyaW5nKHN0ZDo6c3RyaW5nKHQsIHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxlbmd0
aCgpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30KKworc3RhdGljIGJvb2wgZmluZExhc3RJ
bmRleEtleUVxdWFsVG8obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0
LCBzdGQ6OnN0cmluZyogZm91bmRLZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9y
PiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5T
ZWVrKHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICB3aGlsZSAoaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmVJbmRl
eEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID09IDApIHsKKyAgICAgICAgKmZvdW5kS2V5ID0gaXQt
PmtleSgpLlRvU3RyaW5nKCk7CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxl
dmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJD
dXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFu
Z2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFu
Z2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6
Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisg
ICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwg
c3RvcEtleTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1h
a2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9
IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9
IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+
bG93ZXIoKSkpOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAg
fQorCisgICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAv
LyBOb3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBr
ZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFu
KG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNl
IHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
MSwgZW5jb2RlS2V5KCpyYW5nZS0+dXBwZXIoKSkpOworICAgICAgICB1cHBlck9wZW4gPSByYW5n
ZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1w
bD4gY3Vyc29yID0gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1wbChtX2RiLmdldCgp
LCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpKTsKKyAg
ICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0
dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpD
dXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sK
KyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29s
IHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQg
PSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9u
ID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOwor
ICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5k
KSB7CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkKTsgLy8gRklYTUU6IFRoaXMgY291bGQgbWVhbiBwcm9ibGVtcy4KKyAgICAgICAg
bG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAg
IHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBl
bmNvZGVLZXkoKnJhbmdlLT5sb3dlcigpKSk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5s
b3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3Rv
cEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCArIDEpOwor
ICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYg
KCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBp
ZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZh
bHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+dXBw
ZXIoKSkpOworICAgICAgICBpZiAoIWZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1fZGIuZ2V0KCks
IHN0b3BLZXksICZzdG9wS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0
IG9mIG5vbi11bmlxdWUga2V5cy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
dXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxJbmRl
eEtleUN1cnNvckltcGw+IGN1cnNvciA9IGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwo
bV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3
YXJkKSk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3Io
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rp
b24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Cisg
ICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBm
b3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRp
cmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVy
T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93
ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNvdWxkIG1lYW4gcHJvYmxlbXMuCisg
ICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9IGVsc2Ugewor
ICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOworICAgICAgICBsb3dlck9wZW4gPSBy
YW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAg
ICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQg
KyAxKTsKKyAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorCisgICAg
ICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAg
ICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCAm
c3RvcEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9w
ZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBt
YWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleSgqcmFu
Z2UtPnVwcGVyKCkpKTsKKyAgICAgICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2Ri
LmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4g
dGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKyAgICB9CisKKyAgICBSZWZQ
dHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJlZihuZXcgSW5kZXhDdXJzb3JJbXBs
KG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9y
d2FyZCkpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNz
IER1bW15VHJhbnNhY3Rpb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiB7
CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGJlZ2luKCkge30KKyAgICB2aXJ0dWFsIHZvaWQg
Y29tbWl0KCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcm9sbGJhY2soKSB7fQorfTsKK30KKworCitQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24+IElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IER1
bW15VHJhbnNhY3Rpb24oKSk7IC8vIEZJWE1FOiBJbXBsZW1lbnQgcHJvcGVybHkuCit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNF
KQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87495</attachid>
            <date>2011-03-30 03:25:04 -0700</date>
            <delta_ts>2011-03-30 10:31:24 -0700</delta_ts>
            <desc>full patch</desc>
            <filename>bug-57372-20110330112502.patch</filename>
            <type>text/plain</type>
            <size>135164</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBiNWRmYzAyMjg4MjlhMGEzZjgyMWVjZDZjNWQyMzQzOGFhOTA2YzQwLi40
ZjUxMDcwNTYxMjgxYTUzNzRhMjE3NDY3ZThjYzBkMTFhYTI2YmZiIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTI3IEBACisyMDExLTAzLTMwICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEp
CisKKyAgICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3Jl
Lmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaDoKKyAgICAgICAgKFdl
YkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU6On5PYmplY3RT
dG9yZVJlY29yZEhhbmRsZSk6CisgICAgICAgICogc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0
ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6
OmNyZWF0ZU9iamVjdFN0b3JlSW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJh
c2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmVJbnRlcm5hbCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpsb2FkT2JqZWN0U3RvcmVzKToKKyAgICAgICAg
KiBzdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
REJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4pOgorICAgICAgICAqIHN0b3JhZ2UvSURCSW5kZXhC
YWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJbXBsOjpJ
REJJbmRleEJhY2tlbmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZElt
cGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tl
bmRJbXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJ
bXBsOjphZGRpbmdLZXlBbGxvd2VkKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQkluZGV4QmFja2Vu
ZEltcGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZSk6
CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJM
ZXZlbERCQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnByaW50U3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRl
Y29kZVZhckludCk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVTdHJpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dp
dGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nV2l0aExlbik6CisgICAgICAg
IChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91Ymxl
KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNv
ZGVLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y291bnRCeXRlcyk6CisgICAgICAgIChXZWJDb3Jl
OjptYWtlS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZVByZWZpeCk6CisgICAgICAgIChX
ZWJDb3JlOjpnZXRJbnQpOgorICAgICAgICAoV2ViQ29yZTo6cHV0SW50KToKKyAgICAgICAgKFdl
YkNvcmU6OmdldFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpwdXRTdHJpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6c2V0VXBNZXRhZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld0RhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6c2V0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3
T2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjcmVhdGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpkZWxldGVSYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9y
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RT
dG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdWZXJzaW9uTnVtYmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVj
b3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2Jq
ZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVs
ZXRlT2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyk6
CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdJbmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCk6CisgICAgICAgIChX
ZWJDb3JlOjpmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbik6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6dmVyc2lvbkV4aXN0cyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcik6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlv
bik6CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmg6IEFkZGVkLgor
ICAgICAgICAqIHN0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6Omdl
dEludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6
OnB1dEludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZElt
cGw6OmRlbGV0ZUludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGw6OmNsZWFySW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6cG9wdWxhdGVJbmRl
eCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGVJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVh
dGVJbmRleEludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw6OmRlbGV0ZUluZGV4SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbDo6b3BlbkN1cnNvckludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmxvYWRJbmRleGVzKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmdlbkF1dG9JbmNyZW1lbnRLZXkpOgorICAg
ICAgICAqIHN0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5oOgorICAgICAgICAoV2Vi
Q29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmRhdGFiYXNlSWQpOgorICAgICAgICAqIHN0
b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNR
TGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlT2Jq
ZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3Jl
OjpuZXh0QXV0b0luY3JlbWVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgpOgorICAgICAgICAo
V2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZv
clJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9i
amVjdFZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6
Z2V0UHJpbWFyeUtleVZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tp
bmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVC
YWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcik6CisgICAgICAgICog
c3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaDoKKwogMjAxMS0wMy0yOSAgTmlrb2xhcyBa
aW1tZXJtYW5uICA8bnppbW1lcm1hbm5AcmltLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBF
cmljIFNlaWRlbC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNv
cmUuZ3lwIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKaW5kZXggZTY5
MmY1NDJkMzUzZWQ0Y2YwMDE0MzQxOWZiZDViNzVjN2UyNzI1Yi4uMTM4YTJmYTQ2Zjc4Y2U1YTFk
NzM2MTgyZTQ3NzJjYjBlN2YyN2NkYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXAvV2ViQ29yZS5neXAKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29y
ZS5neXAKQEAgLTExNjcsNiArMTE2NywxNCBAQAogICAgICAgICAgICAgXSwKICAgICAgICAgICB9
LAogICAgICAgICB9XSwKKyAgICAgICAgWyciRU5BQkxFX0xFVkVMREI9MSIgaW4gZmVhdHVyZV9k
ZWZpbmVzJywgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChj
aHJvbWl1bV9zcmNfZGlyKS90aGlyZF9wYXJ0eS9sZXZlbGRiL2xldmVsZGIuZ3lwOmxldmVsZGIn
LAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBb
CisgICAgICAgICAgICAnPChjaHJvbWl1bV9zcmNfZGlyKS90aGlyZF9wYXJ0eS9sZXZlbGRiL2xl
dmVsZGIuZ3lwOmxldmVsZGInLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAogICAgICAgXSwK
ICAgICB9LAogICAgIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBi
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA4Zjg5Y2RhMTY3ZjdhNTE3ZjE0M2I2
MWVmOTJmYmM5ODVkMzc0MDc0Li5iMWU3MDg4M2RlNWEzY2EzY2JmYWMzZjljNmM5NGVmMzY4NzAw
OTcyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC01NDM1LDYgKzU0MzUsOCBAQAogICAgICAgICAgICAg
J3N0b3JhZ2UvSURCS2V5UGF0aEJhY2tlbmRJbXBsLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2Uv
SURCS2V5UmFuZ2UuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQktleVJhbmdlLmgnLAor
ICAgICAgICAgICAgJ3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAnLAorICAgICAg
ICAgICAgJ3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oJywKICAgICAgICAgICAgICdz
dG9yYWdlL0lEQk9iamVjdFN0b3JlLmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJPYmpl
Y3RTdG9yZS5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZElt
cGwuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0
b3JlLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9yZS5oCmluZGV4IDI5
NTIzYTJmYjVjOTZiNzE3ZTM0NDY1NjgwMjhjNjhkNjU5MzFlNDAuLjEwZmNmODUxOTZhOTA1NmVh
MmFmYzk3NmEyMDJkYTFlODkxOGM3NjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCQmFja2luZ1N0b3JlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJCYWNr
aW5nU3RvcmUuaApAQCAtNTAsMzAgKzUwLDM1IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wg
c2V0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYg
dmVyc2lvbiwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKSA9IDA7CiAKICAgICB2
aXJ0dWFsIHZvaWQgZ2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGlu
dDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJp
bmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdz
KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYg
bmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKSA9IDA7Ci0gICAgdmly
dHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOwot
ICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgSURCS2V5JikgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBwdXRPYmplY3RTdG9y
ZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmlu
ZyYgdmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkgPSAwOwotICAgIHZp
cnR1YWwgdm9pZCBjbGVhck9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOwot
ICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpID0gMDsKLSAgICB2aXJ0dWFsIGRvdWJs
ZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKLSAg
ICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleSYsIGludDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpID0gMDsK
KyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVt
ZW50LCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHZv
aWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQpID0gMDsKKworICAgIGNsYXNzIE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlIDogcHVibGlj
IFJlZkNvdW50ZWQ8SURCQmFja2luZ1N0b3JlPiB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0
dWFsIH5PYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHt9IAorICAgIH07CisgICAgdmlydHVhbCBT
dHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0T2Jq
ZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmluZyYgdmFsdWUsIFJlZlB0cjxPYmplY3RTdG9yZVJl
Y29yZEhhbmRsZT4mKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJikgPSAwOworICAg
IHZpcnR1YWwgZG91YmxlIG5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0
c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGNvbnN0IElEQktleSYsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIGZvdW5kUmVj
b3JkSGFuZGxlKSA9IDA7CiAKICAgICBjbGFzcyBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrIHsK
ICAgICBwdWJsaWM6Ci0gICAgICAgICB2aXJ0dWFsIGJvb2wgY2FsbGJhY2soaW50NjRfdCBvYmpl
Y3RTdG9yZURhdGFJZCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkgPSAwOworICAgICAgICAgdmlydHVh
bCBib29sIGNhbGxiYWNrKGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSkgPSAwOwogICAgICAgICAgdmlydHVhbCB+T2JqZWN0U3RvcmVSZWNvcmRDYWxs
YmFjaygpIHt9OwogICAgIH07Ci0gICAgdmlydHVhbCBib29sIGZvckVhY2hPYmplY3RTdG9yZVJl
Y29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKSA9
IDA7CisgICAgdmlydHVhbCBib29sIGZvckVhY2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFj
ayYpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBnZXRJbmRleGVzKGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFt
ZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5p
cXVlRmxhZ3MpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlSW5kZXgoaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9v
bCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBkZWxl
dGVJbmRleChpbnQ2NF90IGluZGV4SWQpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgcHV0SW5kZXhE
YXRhRm9yUmVjb3JkKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiwgaW50NjRfdCBvYmpl
Y3RTdG9yZURhdGFJZCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBkZWxldGVJbmRleERhdGFGb3JS
ZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCkgPSAwOwotICAgIHZpcnR1YWwgU3RyaW5n
IGdldE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOwot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2
NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wga2V5RXhp
c3RzSW5JbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpID0gMDsKKyAgICB2aXJ0
dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFt
ZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5p
cXVlRmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlSW5kZXgoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKSA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGNvbnN0IE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlJikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBkZWxldGVJbmRleERhdGFGb3JSZWNv
cmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKSA9IDA7CisgICAgdmlydHVhbCBT
dHJpbmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxJREJLZXk+IGdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBkYXRh
YmFzZWlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURC
S2V5JikgPSAwOwogCiAgICAgY2xhc3MgQ3Vyc29yIDogcHVibGljIFJlZkNvdW50ZWQ8Q3Vyc29y
PiB7CiAgICAgcHVibGljOgpAQCAtODEsMTQgKzg2LDE0IEBAIHB1YmxpYzoKICAgICAgICAgdmly
dHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkgPSAwOwogICAgICAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgPSAwOwogICAgICAgICB2aXJ0dWFsIFN0cmluZyB2
YWx1ZSgpID0gMDsKLSAgICAgICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkg
PSAwOworICAgICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+
IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3Qg
aW5kZXhEYXRhSWQoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgfkN1cnNvcigpIHt9OwogICAgIH07
CiAKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuT2JqZWN0U3RvcmVDdXJzb3Io
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGly
ZWN0aW9uKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5
Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRp
cmVjdGlvbikgPSAwOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1
cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuT2JqZWN0U3Rv
cmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2Uq
LCBJREJDdXJzb3I6OkRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJz
b3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGly
ZWN0aW9uKSA9IDA7CiAKICAgICBjbGFzcyBUcmFuc2FjdGlvbiA6IHB1YmxpYyBSZWZDb3VudGVk
PFRyYW5zYWN0aW9uPiB7CiAgICAgcHVibGljOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJbXBsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCRGF0YWJhc2VCYWNrZW5kSW1wbC5jcHAKaW5kZXggOTRlMzA1YjFiYzAzMjkwYWFjMjcw
NWVlZTA0M2MxOTMxMWM3OWVlMi4uZjE4ZjY4ZmZlZjEzNDlmOGFhYzlmYjMzNjUyOTc3YTY2Yzg3
YjcyMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tl
bmRJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkRhdGFiYXNlQmFja2Vu
ZEltcGwuY3BwCkBAIC05Nyw3ICs5Nyw3IEBAIFBhc3NSZWZQdHI8RE9NU3RyaW5nTGlzdD4gSURC
RGF0YWJhc2VCYWNrZW5kSW1wbDo6b2JqZWN0U3RvcmVOYW1lcygpIGNvbnN0CiAgICAgcmV0dXJu
IG9iamVjdFN0b3JlTmFtZXMucmVsZWFzZSgpOwogfQogCi1QYXNzUmVmUHRyPElEQk9iamVjdFN0
b3JlQmFja2VuZEludGVyZmFjZT4gIElEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0ZU9iamVj
dFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1
dG9JbmNyZW1lbnQsIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSogdHJhbnNhY3Rpb25Q
dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQorUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bnRlcmZhY2U+IElEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQs
IElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSogdHJhbnNhY3Rpb25QdHIsIEV4Y2VwdGlv
bkNvZGUmIGVjKQogewogICAgIEFTU0VSVCh0cmFuc2FjdGlvblB0ci0+bW9kZSgpID09IElEQlRy
YW5zYWN0aW9uOjpWRVJTSU9OX0NIQU5HRSk7CiAKQEAgLTEwNiw3ICsxMDYsNyBAQCBQYXNzUmVm
UHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEludGVyZmFjZT4gIElEQkRhdGFiYXNlQmFja2VuZElt
cGw6OmNyZWF0ZU9iamVjdAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBSZWZQdHI8
SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUgPSBJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsOjpjcmVhdGUobV9iYWNraW5nU3RvcmUuZ2V0KCksIG5hbWUsIGtleVBhdGgsIGF1
dG9JbmNyZW1lbnQpOworICAgIFJlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmpl
Y3RTdG9yZSA9IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9y
ZS5nZXQoKSwgbV9pZCwgbmFtZSwga2V5UGF0aCwgYXV0b0luY3JlbWVudCk7CiAgICAgQVNTRVJU
KG9iamVjdFN0b3JlLT5uYW1lKCkgPT0gbmFtZSk7CiAKICAgICBSZWZQdHI8SURCRGF0YWJhc2VC
YWNrZW5kSW1wbD4gZGF0YWJhc2UgPSB0aGlzOwpAQCAtMTI1LDcgKzEyNSw3IEBAIHZvaWQgSURC
RGF0YWJhc2VCYWNrZW5kSW1wbDo6Y3JlYXRlT2JqZWN0U3RvcmVJbnRlcm5hbChTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwKIHsKICAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQ7CiAKLSAgICBpZiAo
IWRhdGFiYXNlLT5tX2JhY2tpbmdTdG9yZS0+Y3JlYXRlT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUt
Pm5hbWUoKSwgb2JqZWN0U3RvcmUtPmtleVBhdGgoKSwgb2JqZWN0U3RvcmUtPmF1dG9JbmNyZW1l
bnQoKSwgZGF0YWJhc2UtPmlkKCksIG9iamVjdFN0b3JlSWQpKSB7CisgICAgaWYgKCFkYXRhYmFz
ZS0+bV9iYWNraW5nU3RvcmUtPmNyZWF0ZU9iamVjdFN0b3JlKGRhdGFiYXNlLT5pZCgpLCBvYmpl
Y3RTdG9yZS0+bmFtZSgpLCBvYmplY3RTdG9yZS0+a2V5UGF0aCgpLCBvYmplY3RTdG9yZS0+YXV0
b0luY3JlbWVudCgpLCBvYmplY3RTdG9yZUlkKSkgewogICAgICAgICB0cmFuc2FjdGlvbi0+YWJv
cnQoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE1OCw3ICsxNTgsNyBAQCB2b2lkIElE
QkRhdGFiYXNlQmFja2VuZEltcGw6OmRlbGV0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFt
ZSwgSURCVHJhbnNhY3RpbwogCiB2b2lkIElEQkRhdGFiYXNlQmFja2VuZEltcGw6OmRlbGV0ZU9i
amVjdFN0b3JlSW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURC
RGF0YWJhc2VCYWNrZW5kSW1wbD4gZGF0YWJhc2UsIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5k
SW50ZXJmYWNlPiB0cmFuc2FjdGlvbikKIHsKLSAgICBkYXRhYmFzZS0+bV9iYWNraW5nU3RvcmUt
PmRlbGV0ZU9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5pZCgpKTsKKyAgICBkYXRhYmFzZS0+bV9i
YWNraW5nU3RvcmUtPmRlbGV0ZU9iamVjdFN0b3JlKGRhdGFiYXNlLT5pZCgpLCBvYmplY3RTdG9y
ZS0+aWQoKSk7CiAgICAgdHJhbnNhY3Rpb24tPmRpZENvbXBsZXRlVGFza0V2ZW50cygpOwogfQog
CkBAIC0yNTAsNyArMjUwLDcgQEAgdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpsb2FkT2Jq
ZWN0U3RvcmVzKCkKICAgICBBU1NFUlQoYXV0b0luY3JlbWVudEZsYWdzLnNpemUoKSA9PSBpZHMu
c2l6ZSgpKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKQot
ICAgICAgICBtX29iamVjdFN0b3Jlcy5zZXQobmFtZXNbaV0sIElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgaWRzW2ldLCBuYW1lc1tpXSwga2V5
UGF0aHNbaV0sIGF1dG9JbmNyZW1lbnRGbGFnc1tpXSkpOworICAgICAgICBtX29iamVjdFN0b3Jl
cy5zZXQobmFtZXNbaV0sIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZShtX2JhY2tp
bmdTdG9yZS5nZXQoKSwgbV9pZCwgaWRzW2ldLCBuYW1lc1tpXSwga2V5UGF0aHNbaV0sIGF1dG9J
bmNyZW1lbnRGbGFnc1tpXSkpOwogfQogCiB2b2lkIElEQkRhdGFiYXNlQmFja2VuZEltcGw6OnJl
bW92ZU9iamVjdFN0b3JlRnJvbU1hcChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0
cjxJREJEYXRhYmFzZUJhY2tlbmRJbXBsPiBkYXRhYmFzZSwgUGFzc1JlZlB0cjxJREJPYmplY3RT
dG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcAppbmRleCA0NjFlOTMwYmMxNzYwNGI5Mzk1NTFm
ZmRjYmRhNDU4ZjQ3M2NmZTE3Li4yOWQ4MTZhZmEwOWZmYTQyYzZlYzZkNTRkNjU1MDNiNjFhODIx
NzVmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5k
SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZElt
cGwuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiRE9NU3RyaW5nTGlzdC5oIgogI2lu
Y2x1ZGUgIklEQkRhdGFiYXNlQmFja2VuZEltcGwuaCIKICNpbmNsdWRlICJJREJEYXRhYmFzZUV4
Y2VwdGlvbi5oIgorI2luY2x1ZGUgIklEQkxldmVsREJCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRl
ICJJREJTUUxpdGVCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkNvb3Jk
aW5hdG9yLmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKQEAgLTY5LDcgKzcwLDcgQEAg
dm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6OnJlbW92ZUlEQkJhY2tpbmdTdG9yZShjb25zdCBT
dHJpbmcmIHVuaXF1ZUlkZW50aWZpZXIKICAgICBtX2JhY2tpbmdTdG9yZU1hcC5yZW1vdmUodW5p
cXVlSWRlbnRpZmllcik7CiB9CiAKLXZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKGNv
bnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcywgUGFz
c1JlZlB0cjxTZWN1cml0eU9yaWdpbj4gc2VjdXJpdHlPcmlnaW4sIEZyYW1lKiwgY29uc3QgU3Ry
aW5nJiBkYXRhRGlyLCBpbnQ2NF90IG1heGltdW1TaXplLCBCYWNraW5nU3RvcmVUeXBlKQordm9p
ZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3QgU3RyaW5nJiBuYW1lLCBQYXNzUmVm
UHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBQYXNzUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBz
ZWN1cml0eU9yaWdpbiwgRnJhbWUqLCBjb25zdCBTdHJpbmcmIGRhdGFEaXIsIGludDY0X3QgbWF4
aW11bVNpemUsIEJhY2tpbmdTdG9yZVR5cGUgYmFja2luZ1N0b3JlVHlwZSkKIHsKICAgICBTdHJp
bmcgZmlsZUlkZW50aWZpZXIgPSBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7
CiAgICAgU3RyaW5nIHVuaXF1ZUlkZW50aWZpZXIgPSBmaWxlSWRlbnRpZmllciArICJAIiArIG5h
bWU7CkBAIC04Niw3ICs4NywxMiBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihj
b25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogICAgIGlmIChp
dDIgIT0gbV9iYWNraW5nU3RvcmVNYXAuZW5kKCkpCiAgICAgICAgIGJhY2tpbmdTdG9yZSA9IGl0
Mi0+c2Vjb25kOwogICAgIGVsc2UgewotICAgICAgICBiYWNraW5nU3RvcmUgPSBJREJTUUxpdGVC
YWNraW5nU3RvcmU6Om9wZW4oc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1heGltdW1T
aXplLCBmaWxlSWRlbnRpZmllciwgdGhpcyk7CisgICAgICAgIGlmIChiYWNraW5nU3RvcmVUeXBl
ID09IERlZmF1bHRCYWNraW5nU3RvcmUpCisgICAgICAgICAgICBiYWNraW5nU3RvcmUgPSBJREJT
UUxpdGVCYWNraW5nU3RvcmU6Om9wZW4oc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1h
eGltdW1TaXplLCBmaWxlSWRlbnRpZmllciwgdGhpcyk7CisjaWYgRU5BQkxFKExFVkVMREIpCisg
ICAgICAgIGVsc2UgaWYgKGJhY2tpbmdTdG9yZVR5cGUgPT0gTGV2ZWxEQkJhY2tpbmdTdG9yZSkK
KyAgICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4o
c2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1heGltdW1TaXplLCBmaWxlSWRlbnRpZmll
ciwgdGhpcyk7CisjZW5kaWYKICAgICAgICAgaWYgKCFiYWNraW5nU3RvcmUpIHsKICAgICAgICAg
ICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJh
c2VFeGNlcHRpb246OlVOS05PV05fRVJSLCAiSW50ZXJuYWwgZXJyb3IuIikpOwogICAgICAgICAg
ICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJh
Y2tlbmRJbXBsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1w
bC5jcHAKaW5kZXggNjJlNTM2NGJlZjgyMmRiOThjYzBkZTU1NDAwNWVlMzNkMjAxZjVlNC4uMDZm
ODU4ODQzYzI1MjU4N2YzMzZlYzllOTcwOTBlYjJkMjI2MzQ0ZCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuY3BwCkBAIC00MCw4ICs0MCwxMCBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUlEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFj
a2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgaWQsIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5
UGF0aCwgYm9vbCB1bmlxdWUpCitJREJJbmRleEJhY2tlbmRJbXBsOjpJREJJbmRleEJhY2tlbmRJ
bXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNv
bnN0IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwqIG9iamVjdFN0b3JlQmFja2VuZCwgaW50NjRf
dCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tp
bmdTdG9yZSkKKyAgICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICwgbV9vYmplY3RT
dG9yZUJhY2tlbmQob2JqZWN0U3RvcmVCYWNrZW5kKQogICAgICwgbV9pZChpZCkKICAgICAsIG1f
bmFtZShuYW1lKQogICAgICwgbV9zdG9yZU5hbWUoc3RvcmVOYW1lKQpAQCAtNTAsOCArNTIsMTAg
QEAgSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNraW5nU3Rv
cmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdAogewogfQogCi1JREJJbmRleEJhY2tlbmRJbXBsOjpJ
REJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgsIGJvb2wgdW5pcXVlKQorSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1w
bChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25z
dCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKiBvYmplY3RTdG9yZUJhY2tlbmQsIGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0
aCwgYm9vbCB1bmlxdWUpCiAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAg
LCBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICAsIG1fb2JqZWN0U3RvcmVCYWNrZW5kKG9i
amVjdFN0b3JlQmFja2VuZCkKICAgICAsIG1faWQoSW52YWxpZElkKQogICAgICwgbV9uYW1lKG5h
bWUpCiAgICAgLCBtX3N0b3JlTmFtZShzdG9yZU5hbWUpCkBAIC03MiwxMCArNzYsMTAgQEAgdm9p
ZCBJREJJbmRleEJhY2tlbmRJbXBsOjpvcGVuQ3Vyc29ySW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCosIFBhc3NSZWZQdHIKIAogICAgIHN3aXRjaCAoY3Vyc29yVHlwZSkgewogICAgIGNh
c2UgSURCQ3Vyc29yQmFja2VuZEludGVyZmFjZTo6SW5kZXhLZXlDdXJzb3I6Ci0gICAgICAgIGJh
Y2tpbmdTdG9yZUN1cnNvciA9IGluZGV4LT5tX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4S2V5Q3Vy
c29yKGluZGV4LT5pZCgpLCByYW5nZS5nZXQoKSwgZGlyZWN0aW9uKTsKKyAgICAgICAgYmFja2lu
Z1N0b3JlQ3Vyc29yID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhLZXlDdXJzb3Io
aW5kZXgtPm1fZGF0YWJhc2VJZCwgaW5kZXgtPm1fb2JqZWN0U3RvcmVCYWNrZW5kLT5pZCgpLCBp
bmRleC0+aWQoKSwgcmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CiAgICAgICAgIGJyZWFrOwogICAg
IGNhc2UgSURCQ3Vyc29yQmFja2VuZEludGVyZmFjZTo6SW5kZXhDdXJzb3I6Ci0gICAgICAgIGJh
Y2tpbmdTdG9yZUN1cnNvciA9IGluZGV4LT5tX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4Q3Vyc29y
KGluZGV4LT5pZCgpLCByYW5nZS5nZXQoKSwgZGlyZWN0aW9uKTsKKyAgICAgICAgYmFja2luZ1N0
b3JlQ3Vyc29yID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhDdXJzb3IoaW5kZXgt
Pm1fZGF0YWJhc2VJZCwgaW5kZXgtPm1fb2JqZWN0U3RvcmVCYWNrZW5kLT5pZCgpLCBpbmRleC0+
aWQoKSwgcmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2Ug
SURCQ3Vyc29yQmFja2VuZEludGVyZmFjZTo6T2JqZWN0U3RvcmVDdXJzb3I6CiAgICAgY2FzZSBJ
REJDdXJzb3JCYWNrZW5kSW50ZXJmYWNlOjpJbnZhbGlkQ3Vyc29yVHlwZToKQEAgLTEyMCwxNCAr
MTI0LDE0IEBAIHZvaWQgSURCSW5kZXhCYWNrZW5kSW1wbDo6Z2V0SW50ZXJuYWwoU2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCSW5kCiB7CiAgICAgLy8gRklYTUU6IFNwbGl0
IGdldEludGVybmFsIGludG8gdHdvIGZ1bmN0aW9ucywgZ2V0dGluZyByaWQgb2ZmIHxnZXRPYmpl
Y3R8LgogICAgIGlmIChnZXRPYmplY3QpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gaW5kZXgt
Pm1fYmFja2luZ1N0b3JlLT5nZXRPYmplY3RWaWFJbmRleChpbmRleC0+aWQoKSwgKmtleSk7Cisg
ICAgICAgIFN0cmluZyB2YWx1ZSA9IGluZGV4LT5tX2JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0Vmlh
SW5kZXgoaW5kZXgtPm1fZGF0YWJhc2VJZCwgaW5kZXgtPm1fb2JqZWN0U3RvcmVCYWNrZW5kLT5p
ZCgpLCBpbmRleC0+aWQoKSwgKmtleSk7CiAgICAgICAgIGlmICh2YWx1ZS5pc051bGwoKSkgewog
ICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJ
REJEYXRhYmFzZUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUiwgIktleSBkb2VzIG5vdCBleGlzdCBp
biB0aGUgaW5kZXguIikpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAg
IGNhbGxiYWNrcy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlRnJvbVdp
cmUodmFsdWUpKTsKICAgICB9IGVsc2UgewotICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXlSZXN1
bHQgPSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPmdldFByaW1hcnlLZXlWaWFJbmRleChpbmRleC0+
aWQoKSwgKmtleSk7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleVJlc3VsdCA9IGluZGV4LT5t
X2JhY2tpbmdTdG9yZS0+Z2V0UHJpbWFyeUtleVZpYUluZGV4KGluZGV4LT5tX2RhdGFiYXNlSWQs
IGluZGV4LT5tX29iamVjdFN0b3JlQmFja2VuZC0+aWQoKSwgaW5kZXgtPmlkKCksICprZXkpOwog
ICAgICAgICBpZiAoIWtleVJlc3VsdCkgewogICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9y
KElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6Tk9UX0ZPVU5E
X0VSUiwgIktleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5kZXguIikpOwogICAgICAgICAgICAg
cmV0dXJuOwpAQCAtMTU5LDcgKzE2Myw3IEBAIGJvb2wgSURCSW5kZXhCYWNrZW5kSW1wbDo6YWRk
aW5nS2V5QWxsb3dlZChJREJLZXkqIGtleSkKICAgICBpZiAoIW1fdW5pcXVlKQogICAgICAgICBy
ZXR1cm4gdHJ1ZTsKIAotICAgIHJldHVybiAhbV9iYWNraW5nU3RvcmUtPmtleUV4aXN0c0luSW5k
ZXgobV9pZCwgKmtleSk7CisgICAgcmV0dXJuICFtX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5J
bmRleChtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmVCYWNrZW5kLT5pZCgpLCBtX2lkLCAqa2V5
KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkluZGV4QmFja2VuZEltcGwuaAppbmRleCBlMmEwNmI4ZTA1NjQ5Mzk2OGFjNmM2MjM4NjU2
ZjZhNWNlZjZkNjBkLi42ZWZmYmRkMDI2MjdmZTEwZDQwMjZmMGFmMjkzZmIzMjlmZWFhNjc3IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuaApAQCAtNDAs
MTMgKzQwLDEzIEBAIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CiAKIGNsYXNzIElEQklu
ZGV4QmFja2VuZEltcGwgOiBwdWJsaWMgSURCSW5kZXhCYWNrZW5kSW50ZXJmYWNlIHsKIHB1Ymxp
YzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBjcmVhdGUoSURC
QmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1
bmlxdWUpCisgICAgc3RhdGljIFBhc3NSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gY3JlYXRl
KElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0
IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwqIG9iamVjdFN0b3JlQmFja2VuZCwgaW50NjRfdCBp
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3Ry
aW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgSURCSW5kZXhCYWNrZW5kSW1wbChiYWNraW5nU3RvcmUsIGlkLCBuYW1lLCBzdG9yZU5h
bWUsIGtleVBhdGgsIHVuaXF1ZSkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQklu
ZGV4QmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUJhY2tl
bmQsIGlkLCBuYW1lLCBzdG9yZU5hbWUsIGtleVBhdGgsIHVuaXF1ZSkpOwogICAgIH0KLSAgICBz
dGF0aWMgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0
b3JlKiBiYWNraW5nU3RvcmUsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9y
ZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpCisgICAgc3RhdGljIFBh
c3NSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwqIG9iamVjdFN0b3JlQmFja2VuZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKICAgICB7
Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCSW5kZXhCYWNrZW5kSW1wbChiYWNraW5n
U3RvcmUsIG5hbWUsIHN0b3JlTmFtZSwga2V5UGF0aCwgdW5pcXVlKSk7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZihuZXcgSURCSW5kZXhCYWNrZW5kSW1wbChiYWNraW5nU3RvcmUsIGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlQmFja2VuZCwgbmFtZSwgc3RvcmVOYW1lLCBrZXlQYXRoLCB1bmlxdWUp
KTsKICAgICB9CiAgICAgdmlydHVhbCB+SURCSW5kZXhCYWNrZW5kSW1wbCgpOwogCkBAIC03Miw4
ICs3Miw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgZ2V0S2V5KFBhc3NSZWZQdHI8SURC
S2V5PiwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+LCBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRl
cmZhY2UqLCBFeGNlcHRpb25Db2RlJik7CiAKIHByaXZhdGU6Ci0gICAgSURCSW5kZXhCYWNrZW5k
SW1wbChJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVl
KTsKLSAgICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwg
Ym9vbCB1bmlxdWUpOworICAgIElEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwg
aW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKiwgaW50
NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29u
c3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSk7CisgICAgSURCSW5kZXhCYWNrZW5kSW1w
bChJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVO
YW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKTsKIAogICAgIHN0YXRpYyB2
b2lkIG9wZW5DdXJzb3JJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0
cjxJREJJbmRleEJhY2tlbmRJbXBsPiwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4sIHVuc2lnbmVk
IHNob3J0IGRpcmVjdGlvbiwgSURCQ3Vyc29yQmFja2VuZEludGVyZmFjZTo6Q3Vyc29yVHlwZSwg
UGFzc1JlZlB0cjxJREJDYWxsYmFja3M+LCBQYXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2Vu
ZEludGVyZmFjZT4pOwogICAgIHN0YXRpYyB2b2lkIGdldEludGVybmFsKFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+LCBQYXNzUmVmUHRyPElE
QktleT4sIGJvb2wgZ2V0T2JqZWN0LCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4pOwpAQCAtODIs
NiArODIsOCBAQCBwcml2YXRlOgogCiAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNr
aW5nU3RvcmU7CiAKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKKyAgICBjb25zdCBJREJPYmpl
Y3RTdG9yZUJhY2tlbmRJbXBsKiBtX29iamVjdFN0b3JlQmFja2VuZDsKICAgICBpbnQ2NF90IG1f
aWQ7CiAgICAgU3RyaW5nIG1fbmFtZTsKICAgICBTdHJpbmcgbV9zdG9yZU5hbWU7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIGIv
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5jNDI2NjI1MTAyNmQwMzhiYzM3NzllYzZlOWE0YTZlZDdhMTg5MmVlCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNw
cApAQCAtMCwwICsxLDE3ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNp
bmNsdWRlICJBc3NlcnRpb25zLmgiCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUg
IklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgorI2luY2x1ZGUgIklEQktleVJhbmdlLmgiCisjaW5j
bHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlIDxsZXZlbGRiL2NvbXBhcmF0b3IuaD4K
KyNpbmNsdWRlIDxsZXZlbGRiL2RiLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9pdGVyYXRvci5oPgor
I2luY2x1ZGUgPGxldmVsZGIvc2xpY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIEZJWE1F
OiBkZWNvZGluZyByb3V0aW5lcyBtdWNoIGJlIG1vcmUgcm9idXN0LiBXZSBjYW4ndCBjcmFzaCB0
aGUgYnJvd3NlciBpZgorLy8gZGF0YSBpc24ndCB3aGF0IHdlIGV4cGVjdCEKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlKFN0cmluZyBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnksIGxl
dmVsZGI6OkRCKiBkYikKKyAgICA6IG1faWRlbnRpZmllcihpZGVudGlmaWVyKQorICAgICwgbV9m
YWN0b3J5KGZhY3RvcnkpCisgICAgLCBtX2RiKGRiKQoreworICAgIG1fZmFjdG9yeS0+YWRkSURC
QmFja2luZ1N0b3JlKGlkZW50aWZpZXIsIHRoaXMpOworfQorCitJREJMZXZlbERCQmFja2luZ1N0
b3JlOjp+SURCTGV2ZWxEQkJhY2tpbmdTdG9yZSgpCit7CisgICAgbV9mYWN0b3J5LT5yZW1vdmVJ
REJCYWNraW5nU3RvcmUobV9pZGVudGlmaWVyKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRTdHJp
bmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpCit7CisgICAgcHJpbnRmKCIweCIpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGNo
YXIgYyA9IHNbaV07CisgICAgICAgIHByaW50ZigiJTAyeCIsIChpbnQpYyk7CisgICAgfQorfQor
CitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlSW50KGludDY0X3QgbikKK3sKKyAgICBBU1NFUlQo
biA+PSAwKTsKKyAgICBpZiAoMCkgcHJpbnRTdHJpbmcoIiIpOyAvLyBGSVhNRTogRHVtbXkgdG8g
cHJldmVudCBtZXRob2Qtbm90LXVzZWQtd2FybmluZy4KKyAgICBzdGQ6OnN0cmluZyByZXQ7CisK
KyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG47CisgICAgICAgIHJldC5hcHBl
bmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgICAgICBuID4+PSA4OworICAgIH0gd2hp
bGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludDY0X3QgZGVjb2RlSW50
KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQoreworICAgIGludDY0X3QgcmV0ID0gMDsKKworICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpICA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGMgPSBzW2ldOworICAgICAgICByZXQgPSByZXQgPDwgOCB8IGM7CisgICAgfQorCisg
ICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZVZhckludChpbnQ2
NF90IG4pCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OworCisgICAgZG8geworICAgICAgICB1bnNp
Z25lZCBjaGFyIGMgPSBuICYgKDEyOCAtIDEpOworICAgICAgICBuID4+PSA3OworICAgICAgICBp
ZiAobikKKyAgICAgICAgICAgIGMgfD0gMTI4OworICAgICAgICByZXQuYXBwZW5kKDEsIHN0YXRp
Y19jYXN0PGNoYXI+KGMpKTsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVybiByZXQ7Cit9
CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciAqcCwgaW50NjRf
dCAmZm91bmRJbnQpCit7CisgICAgZm91bmRJbnQgPSAwOworCisgICAgZG8geworICAgICAgICBm
b3VuZEludCA9IChmb3VuZEludCA8PCA3KSB8ICgqcCAmICgxMjggLSAxKSk7CisgICAgfSB3aGls
ZSAoKnArKyAmIDEyOCk7CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5n
IGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmIHMpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0Owor
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAg
ICBVQ2hhciB1ID0gc1tpXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9ICh1ID4+IDgpICYg
MHhmZjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9IHUgJiAweGZmOworICAgICAgICByZXQu
YXBwZW5kKDEsIGhpKTsKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBsbyk7CisgICAgfQorCisgICAg
cmV0dXJuIHJldDsKK30KKworc3RhdGljIFN0cmluZyBkZWNvZGVTdHJpbmcoY29uc3Qgc3RkOjpz
dHJpbmcmIHMpCit7CisgICAgLy9wcmludGYoImRlY29kZVN0cmluZyBzID0iKTsKKyAgICAvL3By
aW50U3RyaW5nKHMpOworICAgIC8vcHJpbnRmKCJcbiIpOworICAgIFN0cmluZyByZXQ7CisKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrPTIpIHsKKyAgICAgICAgQVNT
RVJUKGkgKyAxIDwgcy5sZW5ndGgoKSk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSBzW2ld
OworICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gc1tpICsgMV07CisgICAgICAgIFVDaGFyIHUg
PSBoaSA8PCA4IHwgbG87CisgICAgICAgIHJldC5hcHBlbmQodSk7CisgICAgfQorCisgICAgcmV0
dXJuIHJldDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZVN0cmluZ1dpdGhMZW4oY29u
c3QgU3RyaW5nJiBzKQoreworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGVuY29kZVZhckludChzLmxl
bmd0aCgpKTsKKyAgICByZXQgKz0gZW5jb2RlU3RyaW5nKHMpOworICAgIC8vcHJpbnRmKCJlbmNv
ZGVTdHJpbmdXaXRoTGVuIHMgPSAlc1xuIiwgcy5hc2NpaSgpLmRhdGEoKSk7CisgICAgLy9wcmlu
dGYoInJldCA9ICIpOyBwcmludFN0cmluZyhyZXQpOyBwcmludGYoIlxuIik7CisgICAgcmV0dXJu
IHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW4oY29uc3Qg
Y2hhciogcCwgU3RyaW5nJiBmb3VuZFN0cmluZykKK3sKKyAgICBpbnQ2NF90IGxlbjsKKyAgICBw
ID0gZGVjb2RlVmFySW50KHAsIGxlbik7CisKKyAgICBmb3VuZFN0cmluZyA9IGRlY29kZVN0cmlu
ZyhzdGQ6OnN0cmluZyhwLCBsZW4gKiAyKSk7CisgICAgcCArPSBsZW4gKiAyOworICAgIHJldHVy
biBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlRG91YmxlKGRvdWJsZSB4KQorewor
ICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICBjaGFyICpwID0gcmVpbnRlcnByZXRfY2FzdDxjaGFy
Kj4oJngpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHgpOyBpKyspCisgICAg
ICAgIHJldC5hcHBlbmQoMSwgcFtpXSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBkb3VibGUqIGQpCit7CisgICAg
Y2hhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGQpOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgc2l6ZW9mKCpkKTsgaSsrKQorICAgICAgICAqeCsrID0gKnArKzsKKyAgICByZXR1
cm4gcDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZUtleShjb25zdCBJREJLZXkmIGtl
eSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisKKyAgICBzd2l0Y2goa2V5LnR5cGUoKSkgewor
ICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiAiIjsKKyAgICBjYXNlIElEQktleTo6U3RyaW5nVHlwZToKKyAgICAg
ICAgcmV0LmFwcGVuZCgxLCAnXHgwJyk7CisgICAgICAgIHJldCArPSBlbmNvZGVTdHJpbmdXaXRo
TGVuKGtleS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJLZXk6
OkRhdGVUeXBlOgorICAgICAgICByZXQuYXBwZW5kKDEsICdceDEnKTsKKyAgICAgICAgcmV0ICs9
IGVuY29kZURvdWJsZShrZXkuZGF0ZSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNl
IElEQktleTo6TnVtYmVyVHlwZToKKyAgICAgICAgcmV0LmFwcGVuZCgxLCAnXHgyJyk7CisgICAg
ICAgIHJldCArPSBlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKTsKKyAgICAgICAgcmV0dXJuIHJl
dDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVLZXkoY29uc3QgY2hhciog
cCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KSB7CisgICAgY2hhciB0eXBlID0gKnArKzsKKyAg
ICBTdHJpbmcgczsKKyAgICBkb3VibGUgZDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2Fz
ZSAwOgorICAgICAgICAvLyBTdHJpbmcuCisgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVu
KHAsIHMpOworICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOworICAg
ICAgICByZXR1cm4gcDsKKyAgICBjYXNlIDE6CisgICAgICAgIC8vIERhdGUuCisgICAgICAgIHAg
PSBkZWNvZGVEb3VibGUocCwgJmQpOworICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRl
RGF0ZShkKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAyOgorICAgICAgICAvLyBOdW1i
ZXIuCisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgJmQpOworICAgICAgICBmb3VuZEtleSA9
IElEQktleTo6Y3JlYXRlTnVtYmVyKGQpOworICAgICAgICByZXR1cm4gcDsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorfQorCitzdGF0aWMgaW50IGNvdW50Qnl0ZXMoaW50NjRfdCBuKQoreworICAgIGludCBjID0g
MTsKKyAgICB3aGlsZSAobiA+Pj0gOCkKKyAgICAgICAgYysrOworICAgIHJldHVybiBjOworfQor
CitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQoreworICAgIGludCBkYXRhYmFzZUJ5dGVz
ID0gY291bnRCeXRlcyhkYXRhYmFzZUlkKTsKKyAgICBpbnQgb2JqZWN0U3RvcmVCeXRlcyA9IGNv
dW50Qnl0ZXMob2JqZWN0U3RvcmVJZCk7CisgICAgaW50IGluZGV4Qnl0ZXMgPSBjb3VudEJ5dGVz
KGluZGV4SWQpOworCisgICAgQVNTRVJUKGRhdGFiYXNlQnl0ZXMgPD0gOCk7CisgICAgQVNTRVJU
KG9iamVjdFN0b3JlQnl0ZXMgPD0gOCk7CisgICAgQVNTRVJUKGluZGV4Qnl0ZXMgPD0gNCk7CisK
KyAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9IChkYXRhYmFzZUJ5dGVzIC0gMSkgPDwgNSB8
IChvYmplY3RTdG9yZUJ5dGVzIC0gMSkgPDwgMiB8IChpbmRleEJ5dGVzIC0gMSk7CisgICAgc3Rk
OjpzdHJpbmcgcygxLCBmaXJzdEJ5dGUpOworICAgIHMgKz0gZW5jb2RlSW50KGRhdGFiYXNlSWQp
OworICAgIHMgKz0gZW5jb2RlSW50KG9iamVjdFN0b3JlSWQpOworICAgIHMgKz0gZW5jb2RlSW50
KGluZGV4SWQpOworCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNv
ZGVQcmVmaXgoY29uc3QgY2hhciogcCwgaW50NjRfdCYgZGF0YWJhc2VJZCwgaW50NjRfdCYgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCYgaW5kZXhJZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGZpcnN0
Qnl0ZSA9ICpwKys7CisKKyAgICBpbnQgZGF0YWJhc2VCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDUp
ICYgMHg3KSArIDE7CisgICAgaW50IG9iamVjdFN0b3JlQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiAy
KSAmIDB4NykgKyAxOworICAgIGludCBpbmRleEJ5dGVzID0gKGZpcnN0Qnl0ZSAmIDB4NykgKyAx
OworCisgICAgZGF0YWJhc2VJZCA9IGRlY29kZUludChzdGQ6OnN0cmluZyhwLCBkYXRhYmFzZUJ5
dGVzKSk7CisgICAgcCArPSBkYXRhYmFzZUJ5dGVzOworICAgIG9iamVjdFN0b3JlSWQgPSBkZWNv
ZGVJbnQoc3RkOjpzdHJpbmcocCwgb2JqZWN0U3RvcmVCeXRlcykpOworICAgIHAgKz0gb2JqZWN0
U3RvcmVCeXRlczsKKyAgICBpbmRleElkID0gZGVjb2RlSW50KHN0ZDo6c3RyaW5nKHAsIGluZGV4
Qnl0ZXMpKTsKKyAgICBwICs9IGluZGV4Qnl0ZXM7CisKKyAgICByZXR1cm4gcDsKK30KKworc3Rh
dGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgaW50IG5icikKK3sKKyAgICBzdGQ6OnN0cmluZyBz
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBjaGFy
IGMgPSBuYnI7CisgICAgcy5hcHBlbmQoJmMsIDEpOworICAgIHJldHVybiBzOworfQorCitzdGF0
aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQoreworICAg
IHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpOworICAgIHMgKz0gc3RyOworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RkOjpzdHJp
bmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBpbnQ2NF90IHZlcnNpb24pCit7
CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgc3RyKTsKKyAgICBzICs9IGVuY29kZVZhckludCh2ZXJzaW9uKTsKKyAgICByZXR1
cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgaW50IG5iciwgY29uc3Qg
U3RyaW5nJiBzdHIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyKTsKKyAgICBzICs9IGVuY29kZVN0cmluZ1dpdGhM
ZW4oc3RyKTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXko
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgaW50IG5icjEsIGludDY0X3QgbmJyMikKK3sKKyAgICBzdGQ6OnN0cmluZyBzID0gbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIxKTsKKyAgICBzICs9IGVu
Y29kZVZhckludChuYnIyKTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5n
IG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgaW50IG5iciwgY29uc3QgU3RyaW5nJiBzdHIxLCBjb25zdCBTdHJpbmcmIHN0
cjIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwgbmJyLCBzdHIxKTsKKyAgICBzICs9IGVuY29kZVN0cmluZ1dpdGhMZW4o
c3RyMik7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGludCBuYnIxLCBpbnQ2NF90IG5icjIsIGludDY0X3QgbmJyMykKK3sKKyAgICBzdGQ6OnN0cmlu
ZyBzID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIxKTsK
KyAgICBzICs9IGVuY29kZVZhckludChuYnIyKTsKKyAgICBzICs9IGVuY29kZVZhckludChuYnIz
KTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgaW50
IG5icjEsIGludDY0X3QgbmJyMiwgaW50NjRfdCBuYnIzLCBpbnQgbmJyNCkKK3sKKyAgICBzdGQ6
OnN0cmluZyBzID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBu
YnIxKTsKKyAgICBzICs9IGVuY29kZVZhckludChuYnIyKTsKKyAgICBzICs9IGVuY29kZVZhcklu
dChuYnIzKTsKKyAgICBzICs9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KG5icjQpOworICAg
IHJldHVybiBzOworfQorCitzdGF0aWMgYm9vbCBnZXRJbnQobGV2ZWxkYjo6REIqIGRiLCBjb25z
dCBzdGQ6OnN0cmluZyYga2V5LCBpbnQ2NF90KiBmb3VuZEludCkKK3sKKyAgICAvL3ByaW50Zigi
Z2V0SW50ICIpOworICAgIC8vcHJpbnRTdHJpbmcoa2V5KTsKKyAgICAvL3ByaW50ZigiXG4iKTsK
KyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0
KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxldmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOwor
CisgICAgaWYgKHMuSXNOb3RGb3VuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxz
ZSBpZiAoIXMub2soKSkgeworICAgICAgICAvL3ByaW50ZigiRmFpbGVkIGdldEludDogJXNcbiIs
IHMuVG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgfQorCisgICAgKmZvdW5kSW50ID0gZGVjb2RlSW50KHJlc3VsdCk7CisgICAgLy9wcmludGYo
InJlc3VsdDogJWRcbiIsIChpbnQpKmZvdW5kSW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
c3RhdGljIGJvb2wgcHV0SW50KGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtl
eSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICAvL3ByaW50ZigicHV0SW50ICglZCkgIiwgKGludCl2
YWx1ZSk7CisgICAgLy9wcmludFN0cmluZyhrZXkpOworICAgIC8vcHJpbnRmKCJcbiIpOworICAg
IGxldmVsZGI6OlN0YXR1cyBzID0gZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5
LCBlbmNvZGVJbnQodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkgeworICAgICAgICAvL3ByaW50
ZigiRmFpbGVkIHB1dEludDogJXNcbiIsIHMuVG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wg
Z2V0U3RyaW5nKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgU3RyaW5n
KiBmb3VuZFN0cmluZykKK3sKKyAgICAvL3ByaW50ZigiZ2V0U3RyaW5nICIpOworICAgIC8vcHJp
bnRTdHJpbmcoa2V5KTsKKyAgICAvL3ByaW50ZigiXG4iKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1
bHQ7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25z
KCksIGxldmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOworCisgICAgaWYgKHMuSXNOb3RGb3Vu
ZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAoIXMub2soKSkgeworICAg
ICAgICAvL3ByaW50ZigiZmFsZWQgZ2V0U3RyaW5nOiAlc1xuIiwgcy5Ub1N0cmluZygpLmNfc3Ry
KCkpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICAqZm91bmRT
dHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0KTsKKyAgICAvL3ByaW50ZigicmVzdWx0OiAiKTsg
cHJpbnRTdHJpbmcocmVzdWx0KTsgcHJpbnRmKCJcbiIpOworICAgIHJldHVybiB0cnVlOworfQor
CitzdGF0aWMgYm9vbCBwdXRTdHJpbmcobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmlu
ZyBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgLy9wcmludGYoInB1dFN0cmluZyAi
KTsKKyAgICAvL3ByaW50ZigiKHZhbHVlOiAiKTsKKyAgICAvL3ByaW50U3RyaW5nKGVuY29kZVN0
cmluZyh2YWx1ZSkpOworICAgIC8vcHJpbnRmKCIpIGtleTogIik7CisgICAgLy9wcmludFN0cmlu
ZyhrZXkpOworICAgIC8vcHJpbnRmKCJcbiIpOworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGIt
PlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5LCBlbmNvZGVTdHJpbmcodmFsdWUpKTsK
KyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVl
OworfQorCituYW1lc3BhY2UgeworY2xhc3MgTXlDb21wYXJhdG9yIDogcHVibGljIGxldmVsZGI6
OkNvbXBhcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICBpbnQgQ29tcGFyZShjb25zdCBsZXZlbGRi
OjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0IHsKKyAgICAgICAgLy9w
cmludGYoIkNvbXBhcmVcbiIpOworICAgICAgICAvL3ByaW50ZigiYTogIik7IHByaW50U3RyaW5n
KGEuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4iKTsKKyAgICAgICAgLy9wcmludGYoImI6ICIpOyBw
cmludFN0cmluZyhiLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7CisgICAgICAgIGludCB4ID0g
UmVhbENvbXBhcmUoYSwgYik7CisgICAgICAgIC8vcHJpbnRmKCJSZXN1bHQ6ICVkXG4iLCB4KTsK
KyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGludCBYQ29tcGFyZShjb25zdCBsZXZlbGRi
OjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0IHsKKyAgICAgICAgLy9w
cmludGYoIlhDb21wYXJlXG4iKTsKKyAgICAgICAgLy9wcmludGYoImE6ICIpOyBwcmludFN0cmlu
ZyhhLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7CisgICAgICAgIC8vcHJpbnRmKCJiOiAiKTsg
cHJpbnRTdHJpbmcoYi5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworICAgICAgICBpbnQgeCA9
IFJlYWxDb21wYXJlKGEsIGIpOworICAgICAgICAvL3ByaW50ZigiUmVzdWx0OiAlZFxuIiwgeCk7
CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICBpbnQgQ29tcGFyZUluZGV4S2V5cyhjb25z
dCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0IHsKKyAg
ICAgICAgcmV0dXJuIFJlYWxDb21wYXJlKGEsIGIsIHRydWUpOworICAgIH0KKyAgICBpbnQgUmVh
bENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNvbnN0IGxldmVsZGI6OlNsaWNlJiBi
LCBib29sIGluZGV4S2V5cyA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIGludDY0X3QgYTEsIGEy
LCBhMzsKKyAgICAgICAgaW50NjRfdCBiMSwgYjIsIGIzOworCisgICAgICAgIGNvbnN0IGNoYXIq
IGFfZW5kID0gYS5kYXRhKCkgKyBhLnNpemUoKTsKKyAgICAgICAgY29uc3QgY2hhciogYl9lbmQg
PSBiLmRhdGEoKSArIGIuc2l6ZSgpOworCisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhLmRhdGEo
KTsKKyAgICAgICAgY29uc3QgY2hhciAqcSA9IGIuZGF0YSgpOworCisgICAgICAgIGlmICgqcCAh
PSAqcSkgcmV0dXJuICpwIC0gKnE7IC8vIEZJWE1FOiBUaGluayB0aGlzIHRocm91Z2guCisKKyAg
ICAgICAgcCA9IGRlY29kZVByZWZpeChwLCBhMSwgYTIsIGEzKTsKKyAgICAgICAgcSA9IGRlY29k
ZVByZWZpeChxLCBiMSwgYjIsIGIzKTsKKworICAgICAgICAvL3ByaW50ZigiYTEgPSAlOGQgYTIg
PSAlOGQgYTMgPSAlOGRcbiIsIChpbnQpYTEsIChpbnQpYTIsIChpbnQpYTMpOworICAgICAgICAv
L3ByaW50ZigiYjEgPSAlOGQgYjIgPSAlOGQgYjMgPSAlOGRcbiIsIChpbnQpYjEsIChpbnQpYjIs
IChpbnQpYjMpOworCisgICAgICAgIGlmIChhMSAhPSBiMSkgcmV0dXJuIGExIC0gYjE7CisgICAg
ICAgIGlmIChhMiAhPSBiMikgcmV0dXJuIGEyIC0gYjI7CisgICAgICAgIGlmIChhMyAhPSBiMykg
cmV0dXJuIGEzIC0gYjM7CisKKyAgICAgICAgaWYgKGExID09IDApIHsKKyAgICAgICAgICAgIC8v
IEdsb2JhbCBtZXRhLWRhdGEuIE5leHQgZmllbGQgaXMgYSBudW1iZXIuCisgICAgICAgICAgICB1
bnNpZ25lZCBjaGFyIGE0ID0gKnArKzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjQgPSAq
cSsrOworCisgICAgICAgICAgICAvL3ByaW50ZigiYTQgPSAlOGRcbiIsIChpbnQpYTQpOworICAg
ICAgICAgICAgLy9wcmludGYoImI0ID0gJThkXG4iLCAoaW50KWI0KTsKKworICAgICAgICAgICAg
aWYgKGE0ICE9IGI0KSByZXR1cm4gYTQgLSBiNDsKKworICAgICAgICAgICAgaWYgKGE0ID09IDAg
fHwgYTQgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBl
bHNlIGlmIChhNCA9PSAxMDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGE1LCBiNTsgLy8g
RGF0YWJhc2UgaWQuCisgICAgICAgICAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBhNSk7Cisg
ICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiNSk7CisgICAgICAgICAgICAgICAg
cmV0dXJuIGE1IC0gYjU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGE0ID09IDIwMSkgeworICAg
ICAgICAgICAgICAgIFN0cmluZyBhNiwgYjY7IC8vIE9yaWdpbiBuYW1lLgorICAgICAgICAgICAg
ICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGE2KTsKKyAgICAgICAgICAgICAgICBxID0g
ZGVjb2RlU3RyaW5nV2l0aExlbihxLCBiNik7CisgICAgICAgICAgICAgICAgaWYgKGE2ICE9IGI2
KSByZXR1cm4gY29kZVBvaW50Q29tcGFyZShhNiwgYjYpOworCisgICAgICAgICAgICAgICAgU3Ry
aW5nIGE3LCBiNzsgLy8gRGF0YWJhc2UgbmFtZS4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2Rl
U3RyaW5nV2l0aExlbihwLCBhNyk7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVN0cmluZ1dp
dGhMZW4ocSwgYjcpOworICAgICAgICAgICAgICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKGE3
LCBiNyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJh
NCA9ICVkXG4iLCAoaW50KWE0KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhMiA9PSAwKSB7IC8vIGExICE9
IDAKKyAgICAgICAgICAgIC8vIERhdGFiYXNlIG1ldGEtZGF0YS4gTmV4dCBmaWVsZCBpcyBhIG51
bWJlci4KKworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhNCA9ICpwKys7CisgICAgICAgICAg
ICB1bnNpZ25lZCBjaGFyIGI0ID0gKnErKzsKKworICAgICAgICAgICAgaWYgKGE0ICE9IGI0KSBy
ZXR1cm4gYTQgLSBiNDsKKworICAgICAgICAgICAgaWYgKGE0ID09IDAgfHwgYTQgPT0gMSB8fCBh
NCA9PSAyIHx8IGE0ID09IDMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoYTQgPT0gNTApIHsKKyAgICAgICAgICAgICAgICAvLyBPYmplY3Qgc3Rv
cmUgbWV0YS1kYXRhLgorCisgICAgICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVj
dCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKKyAg
ICAgICAgICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI1KTsKKworICAgICAgICAgICAgICAg
IGlmIChhNSAhPSBiNSkgcmV0dXJuIGE1IC0gYjU7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90
IGE2LCBiNjsgLy8ga2V5IHBhdGgsIGF1dG8gaW5jLCBldGMuCisgICAgICAgICAgICAgICAgcCA9
IGRlY29kZVZhckludChwLCBhNik7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChx
LCBiNik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGE2IC0gYjY7CisgICAgICAgICAgICB9IGVs
c2UgaWYgKGE0ID09IDEwMCkgeworICAgICAgICAgICAgICAgIC8vIEluZGV4IG1ldGEtZGF0YS4K
KworICAgICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBPYmplY3Qgc3RvcmUgaWQuCisg
ICAgICAgICAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBhNSk7CisgICAgICAgICAgICAgICAg
cSA9IGRlY29kZVZhckludChxLCBiNSk7CisgICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KSBy
ZXR1cm4gYTUgLSBiNTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgYTYsIGI2OyAvLyBJbmRl
eCBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE2KTsKKyAgICAgICAg
ICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI2KTsKKyAgICAgICAgICAgICAgICBpZiAoYTYg
IT0gYjYpIHJldHVybiBhNiAtIGI2OworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBh
NywgYjc7IC8vIE5hbWUsIHVuaXF1ZSwga2V5IHBhdGguCisgICAgICAgICAgICAgICAgYTcgPSAq
cCsrOworICAgICAgICAgICAgICAgIGI3ID0gKnErKzsKKyAgICAgICAgICAgICAgICByZXR1cm4g
YTcgLSBiNzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMTUwKSB7CisgICAgICAgICAg
ICAgICAgLy8gT2JqZWN0IHN0b3JlIGlkIGZyZWUtbGlzdC4KKworICAgICAgICAgICAgICAgIGlu
dDY0X3QgYTUsIGI1OyAvLyBPYmplY3Qgc3RvcmUgaWQuCisgICAgICAgICAgICAgICAgcCA9IGRl
Y29kZVZhckludChwLCBhNSk7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBi
NSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGE1IC0gYjU7CisgICAgICAgICAgICB9IGVsc2Ug
aWYgKGE0ID09IDE1MSkgeworICAgICAgICAgICAgICAgIC8vIEluZGV4IGlkIGZyZWUtbGlzdC4K
KworICAgICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBPYmplY3Qgc3RvcmUgaWQuCisg
ICAgICAgICAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBhNSk7CisgICAgICAgICAgICAgICAg
cSA9IGRlY29kZVZhckludChxLCBiNSk7CisgICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KSBy
ZXR1cm4gYTUgLSBiNTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgYTYsIGI2OyAvLyBJbmRl
eCBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE2KTsKKyAgICAgICAg
ICAgICAgICBxID0gZGVjb2RlVmFySW50KHEsIGI2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
YTYgLSBiNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMjAwKSB7CisgICAgICAgICAg
ICAgICAgLy8gT2JqZWN0IHN0b3JlIG5hbWUgLT4gaWQgbWFwcGluZy4KKworICAgICAgICAgICAg
ICAgIFN0cmluZyBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBuYW1lLgorICAgICAgICAgICAgICAg
IHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGE1KTsKKyAgICAgICAgICAgICAgICBxID0gZGVj
b2RlU3RyaW5nV2l0aExlbihxLCBiNSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVQb2lu
dENvbXBhcmUoYTUsIGI1KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYTQgPT0gMjAxKSB7Cisg
ICAgICAgICAgICAgICAgLy8gSW5kZXggbmFtZSAtPiBpbmRleCBpZCBtYXBwaW5nLgorCisgICAg
ICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAg
ICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGE1KTsKKyAgICAgICAgICAgICAgICBxID0gZGVj
b2RlVmFySW50KHEsIGI1KTsKKyAgICAgICAgICAgICAgICBpZiAoYTUgIT0gYjUpIHJldHVybiBh
NSAtIGI1OworCisgICAgICAgICAgICAgICAgU3RyaW5nIGE2LCBiNjsgLy8gSW5kZXggbmFtZS4K
KyAgICAgICAgICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBhNik7CisgICAgICAg
ICAgICAgICAgcSA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocSwgYjYpOworICAgICAgICAgICAgICAg
IHJldHVybiBjb2RlUG9pbnRDb21wYXJlKGE2LCBiNik7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHJldHVybiBhNCAtIGI0OworICAgICAgICB9IGVsc2UgaWYgKGEzID09IDEgfHwgYTMg
PT0gMikgeyAvLyBhMSAhPSAwLCBhMiAhPSAwCisgICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUg
ZGF0YSBvciAiZXhpc3RzIiBkYXRhLgorCisgICAgICAgICAgICBpZiAocCA9PSBhX2VuZCAmJiBx
ID09IGJfZW5kKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHAgPT0gYV9lbmQpIHJl
dHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHEgPT0gYl9lbmQpIHJldHVybiAxOworCisg
ICAgICAgICAgICBSZWZQdHI8SURCS2V5PiBhNCwgYjQ7IC8vIFVzZXIga2V5LgorICAgICAgICAg
ICAgcCA9IGRlY29kZUtleShwLCBhNCk7CisgICAgICAgICAgICBxID0gZGVjb2RlS2V5KHEsIGI0
KTsKKworICAgICAgICAgICAgaWYgKGE0LT5pc0xlc3NUaGFuKGI0LmdldCgpKSkgcmV0dXJuIC0x
OworICAgICAgICAgICAgZWxzZSBpZiAoYTQtPmlzRXF1YWwoYjQuZ2V0KCkpKSByZXR1cm4gMDsK
KyAgICAgICAgICAgIGVsc2UgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoYTMgPj0gMzAp
IHsKKyAgICAgICAgICAgIC8vIEluZGV4IGRhdGEuCisKKyAgICAgICAgICAgIGJvb2wgYUhhc0tl
eSA9IChwICE9IChhLmRhdGEoKSArIGEuc2l6ZSgpKSk7CisgICAgICAgICAgICBib29sIGJIYXNL
ZXkgPSAocSAhPSAoYi5kYXRhKCkgKyBiLnNpemUoKSkpOworCisgICAgICAgICAgICBpZiAoIWFI
YXNLZXkgJiYgYkhhc0tleSkgcmV0dXJuIC0xOworICAgICAgICAgICAgZWxzZSBpZiAoYUhhc0tl
eSAmJiAhYkhhc0tleSkgcmV0dXJuIDE7CisgICAgICAgICAgICBlbHNlIGlmICghYUhhc0tleSAm
JiAhYkhhc0tleSkgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+IGE0LCBi
NDsKKyAgICAgICAgICAgIHAgPSBkZWNvZGVLZXkocCwgYTQpOworICAgICAgICAgICAgcSA9IGRl
Y29kZUtleShxLCBiNCk7CisKKyAgICAgICAgICAgIGlmIChhNC0+aXNMZXNzVGhhbihiNC5nZXQo
KSkpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFhNC0+aXNFcXVhbChiNC5nZXQo
KSkpIHJldHVybiAxOworCisgICAgICAgICAgICBpZiAoaW5kZXhLZXlzKSB7CisgICAgICAgICAg
ICAgICAgLy8gSWdub3JlIHRoZSBudW1iZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyAidmVyc2lvbiIK
KyAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYTUpOworICAgICAgICAgICAgcSA9IGRl
Y29kZVZhckludChxLCBiNSk7CisKKyAgICAgICAgICAgIC8vcHJpbnRmKCJhNSA9ICVkLCBiNSA9
ICVkXG4iLCAoaW50KWE1LCAoaW50KWI1KTsKKyAgICAgICAgICAgIHJldHVybiBhNSAtIGI1Owor
ICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVy
biAwOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCB7IHJldHVybiAiaWRi
X2NtcDEiOyB9CisgICAgdm9pZCBGaW5kU2hvcnRlc3RTZXBhcmF0b3Ioc3RkOjpzdHJpbmcqLCBj
b25zdCBsZXZlbGRiOjpTbGljZSYpIGNvbnN0IHt9IC8vIEZJWE1FOiBJZ25vcmU/CisgICAgdm9p
ZCBGaW5kU2hvcnRTdWNjZXNzb3Ioc3RkOjpzdHJpbmcqKSBjb25zdCB7fSAvLyBGSVhNRTogSWdu
b3JlPworfSBteUNvbXBhcmF0b3I7Cit9CisKK3N0YXRpYyBib29sIHNldFVwTWV0YWRhdGEobGV2
ZWxkYjo6REIqIGRiKQoreworICAgIC8vcHJpbnRmKCJzZXRVcE1ldGFkYXRhXG4iKTsKKyAgICBj
b25zdCBzdGQ6OnN0cmluZyBtZXRhRGF0YUtleSA9IG1ha2VLZXkoMCwgMCwgMCwgMCk7CisKKyAg
ICBpbnQ2NF90IHNjaGVtYVZlcnNpb247CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ldGFEYXRhS2V5
LCAmc2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAgLy9wcmludGYoImZhaWxlZCB0byBnZXQgc2No
ZW1hVmVyc2lvblxuIik7CisgICAgICAgIHNjaGVtYVZlcnNpb24gPSAwOworICAgICAgICBpZiAo
IXB1dEludChkYiwgbWV0YURhdGFLZXksIHNjaGVtYVZlcnNpb24pKSB7CisgICAgICAgICAgICAv
L3ByaW50ZigiZmFpbGVkIHRvIHB1dCBzY2hlbWFWZXJzaW9uIik7CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3ByaW50ZigiZ290IHNjaGVtYXZl
cnNpb246ICVkXG4iLCAoaW50KXNjaGVtYVZlcnNpb24pOworCisgICAgaWYgKHNjaGVtYVZlcnNp
b24gIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBEb24ndCBrbm93IHdoYXQgdG8gZG8g
d2l0aCB0aGlzIHZlcnNpb24uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmln
aW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1heGlt
dW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZElt
cGwqIGZhY3RvcnkpCit7CisgICAgU3RyaW5nIHBhdGhCYXNlMiA9IHBhdGhCYXNlOworCisgICAg
aWYgKHBhdGhCYXNlMi5pc0VtcHR5KCkpIHsKKyAgICAgICAgcGF0aEJhc2UyID0gIi90bXAvaW4t
bWVtLWxldmVsZGIiOworICAgIH0KKworICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhC
YXNlMikpIHsKKyAgICAgICAgLy8gRklYTUU6IElzIHRoZXJlIGFueSBvdGhlciB0aGluZyB3ZSBj
b3VsZCBwb3NzaWJseSBkbyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQ/IElmIHNvLCBkbyBpdCBy
YXRoZXIgdGhhbiBqdXN0IGVycm9yaW5nIG91dC4KKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGVk
IHRvIGNyZWF0ZSBMb2NhbFN0b3JhZ2UgZGF0YWJhc2UgcGF0aCAlcyIsIHBhdGhCYXNlLnV0Zjgo
KS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgU3RyaW5nIHBhdGggPSBw
YXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UyLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAgICBsZXZlbGRiOjpE
QiogZGI7CisgICAgbGV2ZWxkYjo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcGFy
YXRvciA9ICZteUNvbXBhcmF0b3I7CisgICAgb3B0aW9ucy5jcmVhdGVfaWZfbWlzc2luZyA9IHRy
dWU7CisgICAgLy8gRklYTUU6IFdlIG5lZWQgYSBjdXN0b20gY29tcGFyYXRvci4gQnl0ZS13aXNl
IGNvbXBhcmlzb24gd29uJ3Qgd29yayA6KAorICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBs
ZXZlbGRiOjpEQjo6T3BlbihvcHRpb25zLCBwYXRoLnV0ZjgoKS5kYXRhKCksICZkYik7CisKKyAg
ICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAgICAgIC8vIEZJWE1FOiBJZiBjb21wYXJhdG9yIG5h
bWUgY2hhbmdlZCwgYmxvdyBhd2F5IHRoZSBvbGQgZGF0YWJhc2UgYW5kIHN0YXJ0IGEgbmV3IG9u
ZS4KKyAgICAgICAgLy9wcmludGYoIkRCOjpPcGVuIGZhaWxlZDogJXNcbiIsIHN0YXR1cy5Ub1N0
cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBSZWZQdHI8
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJREJMZXZl
bERCQmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5LCBkYikpKTsKKworICAgIGlm
ICghc2V0VXBNZXRhZGF0YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0KCkpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIHJldHVybiBiYWNraW5nU3RvcmUucmVsZWFzZSgpOworfQorCitib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0
cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpCit7Cisg
ICAgYm9vbCBvayA9IGdldEludChtX2RiLmdldCgpLCBtYWtlS2V5KDAsIDAsIDAsIDIwMSwgbV9p
ZGVudGlmaWVyLCBuYW1lKSwgJmZvdW5kSWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgLy9w
cmludGYoImZvdW5kIG5vIG1ldGFkYXRhIGZvciBkYXRhYmFzZVxuIik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICAvL3ByaW50ZigiZXh0cmFjdElEQkRhdGFiYXNlTWV0YURh
dGE6IGZvdW5kIGRhdGFiYXNlIGlkOiAlZFxuIiwgKGludClmb3VuZElkKTsKKworICAgIG9rID0g
Z2V0U3RyaW5nKG1fZGIuZ2V0KCksIG1ha2VLZXkoZm91bmRJZCwgMCwgMCwgMiksICZmb3VuZFZl
cnNpb24pOworICAgIGlmICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vcHJp
bnRmKCJleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YTogZm91bmQgdmVyc2lvbjogJXNcbiIsIGZv
dW5kVmVyc2lvbi5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3Rh
dGljIGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChsZXZlbGRiOjpEQiogZGIpCit7CisgICAgLy8g
TG9vayBpbiBmcmVlLWxpc3QuCisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KDAs
IDAsIDAsIDEwMCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoMCwgMCwgMCwg
MTAxKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9y
KGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsg
aXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8
IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBjb25z
dCBjaGFyKiBwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgcCA9IGRlY29kZVByZWZpeChw
LCBhLCBiLCBjKTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIGQgPSAqcCsrOworICAgICAgICBB
U1NFUlRfVU5VU0VEKGQsIGQgPT0gMTAwKTsKKworICAgICAgICBpbnQ2NF90IGRhdGFiYXNlSWQ7
CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgZGF0YWJhc2VJZCk7CisKKyAgICAgICAgbGV2
ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+
a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICAvL3ByaW50ZigiZm91
bmQgZGF0YWJhc2VJZCBpbiBmcmVlLWxpc3Q6ICVkXG4iLCAoaW50KWRhdGFiYXNlSWQpOworICAg
ICAgICByZXR1cm4gZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwg
dGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQ7CisgICAg
aWYgKCFnZXRJbnQoZGIsIG1ha2VLZXkoMCwgMCwgMCwgMSksICZtYXhEYXRhYmFzZUlkKSkKKyAg
ICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhE
YXRhYmFzZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KDAsIDAsIDAs
IDEpLCBkYXRhYmFzZUlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIC8vcHJpbnRmKCJzZXR0
aW5nIG1heCBkYXRhYmFzZSBpZCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgcmV0dXJuIGRhdGFiYXNlSWQ7CisKK30KKworYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29u
c3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpCit7
CisgICAgLy9wcmludGYoInNldElEQkRhdGFiYXNlTWV0YURhdGEgKHZlcnNpb246ICVzKVxuIiwg
dmVyc2lvbi5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICBpZiAoaW52YWxpZFJvd0lkKSB7CisgICAg
ICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJhc2VJZChtX2RiLmdldCgpKTsKKworICAgICAgICBpZiAo
IXB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KDAsIDAsIDAsIDIwMSwgbV9pZGVudGlmaWVyLCBu
YW1lKSwgcm93SWQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlm
ICghcHV0U3RyaW5nKG1fZGIuZ2V0KCksIG1ha2VLZXkocm93SWQsIDAsIDAsIDIpLCB2ZXJzaW9u
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJ
ZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMs
IFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0lu
Y3JlbWVudEZsYWdzKQoreworICAgIC8vcHJpbnRmKCJnZXRPYmplY3RTdG9yZXNcbiIpOworCisg
ICAgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCAx
LCAwKTsKKyAgICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAw
LCA1MSk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJh
dG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5
KTsgaXQtPlZhbGlkKCkgJiYgbXlDb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5
KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBj
b25zdCBjaGFyICpwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgcCA9IGRlY29kZVByZWZp
eChwLCBhLCBiLCBjKTsKKyAgICAgICAgQVNTRVJUKGEgPT0gZGF0YWJhc2VJZCk7CisgICAgICAg
IEFTU0VSVChiID09IDApOworICAgICAgICBBU1NFUlQoYyA9PSAwKTsKKworICAgICAgICB1bnNp
Z25lZCBjaGFyIGQgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gNTApOwor
CisgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKKyAgICAgICAgcCA9IGRlY29kZVZhcklu
dChwLCBvYmplY3RTdG9yZUlkKTsKKyAgICAgICAgLy9wcmludGYoIkZvdW5kIG9iamVjdFN0b3Jl
SWQ6ICVkXG4iLCAoaW50KW9iamVjdFN0b3JlSWQpOworCisgICAgICAgIC8vcHJpbnRmKCJpdC0+
a2V5KCk6ICIpOyBwcmludFN0cmluZyhpdC0+a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4i
KTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52
YWx1ZSgpLlRvU3RyaW5nKCkpOworICAgICAgICAvL3ByaW50ZigiTmFtZTogJXNcbiIsIG9iamVj
dFN0b3JlTmFtZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAg
IC8vcHJpbnRmKCJpdC0+a2V5KCk6ICIpOyBwcmludFN0cmluZyhpdC0+a2V5KCkuVG9TdHJpbmco
KSk7IHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmludGYoIml0
IG5vdCB2YWxpZFxuIik7IHJldHVybjsgfQorICAgICAgICBTdHJpbmcga2V5UGF0aCA9IGRlY29k
ZVN0cmluZyhpdC0+dmFsdWUoKS5Ub1N0cmluZygpKTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAg
ICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmludGYoIml0IG5vdCB2YWxpZFxuIik7IHJldHVy
bjsgfQorICAgICAgICBib29sIGF1dG9JbmNyZW1lbnQgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOwor
ICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50Zigi
aXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9CisgICAgICAgIC8vIElzIGV2aWNhdGFibGUKKyAg
ICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmludGYoIml0
IG5vdCB2YWxpZFxuIik7IHJldHVybjsgfQorICAgICAgICAvLyBMYXN0IHZlcnNpb24KKyAgICAg
ICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmludGYoIml0IG5v
dCB2YWxpZFxuIik7IHJldHVybjsgfQorICAgICAgICAvLyBNYXhpbXVtIGluZGV4IGlkIGV2ZXIg
YWxsb2NhdGVkCisKKyAgICAgICAgZm91bmRJZHMuYXBwZW5kKG9iamVjdFN0b3JlSWQpOworICAg
ICAgICBmb3VuZE5hbWVzLmFwcGVuZChvYmplY3RTdG9yZU5hbWUpOworICAgICAgICBmb3VuZEtl
eVBhdGhzLmFwcGVuZChrZXlQYXRoKTsKKyAgICAgICAgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3Mu
YXBwZW5kKGF1dG9JbmNyZW1lbnQpOworICAgIH0KK30KKworc3RhdGljIGludDY0X3QgZ2V0TmV3
T2JqZWN0U3RvcmVJZChsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKK3sKKyAg
ICAvLyBMb29rIGluIGZyZWUtbGlzdC4KKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUwKTsKKyAgICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFr
ZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTEpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJh
dG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZv
ciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0b3IuQ29tcGFy
ZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBpbnQ2NF90
IGEsIGIsIGM7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAg
ICAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworCisgICAgICAgIHVuc2lnbmVkIGNo
YXIgZCA9ICpwKys7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoZCwgZCA9PSAxNTApOworCisgICAg
ICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBv
YmplY3RTdG9yZUlkKTsKKworICAgICAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5EZWxldGUo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAgIEFTU0VSVChzLm9r
KCkpOworCisgICAgICAgIC8vcHJpbnRmKCJmb3VuZCBvYmplY3RTdG9yZUlkIGluIGZyZWUtbGlz
dDogJWRcbiIsIChpbnQpb2JqZWN0U3RvcmVJZCk7CisKKyAgICAgICAgcmV0dXJuIG9iamVjdFN0
b3JlSWQ7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZXJlIHdhcyBubyBmcmVl
LWxpc3QuCisgICAgaW50NjRfdCBtYXhPYmplY3RTdG9yZUlkOworICAgIGlmICghZ2V0SW50KGRi
LCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDMpLCAmbWF4T2JqZWN0U3RvcmVJZCkpCisgICAg
ICAgIG1heE9iamVjdFN0b3JlSWQgPSAwOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0g
bWF4T2JqZWN0U3RvcmVJZCArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbWFrZUtleShk
YXRhYmFzZUlkLCAwLCAwLCAzKSwgb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykgeworICAg
ICAgICAvL3ByaW50Zigic2V0dGluZyBtYXggb2JqZWN0IHN0b3JlIGlkIGZhaWxlZFxuIik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gb2JqZWN0U3RvcmVJZDsK
K30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2
NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
LCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKK3sK
KyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQgPSBnZXROZXdPYmplY3RTdG9yZUlkKG1fZGIuZ2V0
KCksIGRhdGFiYXNlSWQpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBt
YWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgbmFtZSk7Cisg
ICAgaWYgKCFvaykgeyBwcmludGYoImZhaWxlZCB0byBzZXQgbmFtZVxuIik7IHJldHVybiBmYWxz
ZTsgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMSksIGtleVBhdGgpOworICAgIGlmICghb2spIHsg
cHJpbnRmKCJmYWlsZWQgdG8gc2V0IG5hbWVcbiIpOyByZXR1cm4gZmFsc2U7IH0KKworICAgIG9r
ID0gcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVj
dFN0b3JlSWQsIDIpLCBhdXRvSW5jcmVtZW50KTsKKyAgICBpZiAoIW9rKSB7IHByaW50ZigiZmFp
bGVkIHRvIHNldCBhdXRvSW5jcmVtZW50XG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBvayA9
IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RT
dG9yZUlkLCAzKSwgZmFsc2UpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJmYWlsZWQgdG8gc2V0
IGlzRXZpY2F0YWJsZVxuIik7IHJldHVybiBmYWxzZTsgfQorCisgICAgb2sgPSBwdXRJbnQobV9k
Yi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNCks
IDEpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJmYWlsZWQgdG8gc2V0IGxhc3QgdmVyc2lvblxu
Iik7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8gRklYTUU6IE5vdCBzdXJlIHdlIGV2ZW4gbmVl
ZCB0byBzZXQgdGhpcz8KKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFi
YXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgMzApOworICAgIGlmICghb2spIHsg
cHJpbnRmKCJmYWlsZWQgdG8gc2V0IG1heCBpbmRleCBpZFxuIik7IHJldHVybiBmYWxzZTsgfQor
CisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAy
MDAsIG5hbWUpLCBvYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKSB7IHByaW50ZigiZmFpbGVk
IHRvIHNldCBvYmplY3Qgc3RvcmUgaWRcbiIpOyByZXR1cm4gZmFsc2U7IH0KKworICAgIGFzc2ln
bmVkT2JqZWN0U3RvcmVJZCA9IG9iamVjdFN0b3JlSWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kworc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0
cmluZyYgYmVnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmQpCit7CisgICAgLy9wcmludGYoImRl
bGV0ZVJhbmdlIChiZWdpbjogIik7CisgICAgLy9wcmludFN0cmluZyhiZWdpbik7CisgICAgLy9w
cmludGYoIiwgZW5kOiAiKTsKKyAgICAvL3ByaW50U3RyaW5nKGVuZCk7CisgICAgLy9wcmludGYo
IilcbiIpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoYmVnaW4pOyBp
dC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0b3IuWENvbXBhcmUoaXQtPmtleSgpLCBlbmQpIDwgMDsg
aXQtPk5leHQoKSkgeworICAgICAgICAvL3ByaW50ZigiZGVsZXRlUmFuZ2UsIGtleTogIik7Cisg
ICAgICAgIC8vcHJpbnRTdHJpbmcoaXQtPmtleSgpLlRvU3RyaW5nKCkpOworICAgICAgICAvL3By
aW50ZigiXG4iKTsKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVs
ZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBpZiAoIXMub2soKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBTdHJpbmcgb2JqZWN0U3Rv
cmVOYW1lOworICAgIGdldFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAs
IDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgJm9iamVjdFN0b3JlTmFtZSk7CisKKyAgICBtX2Ri
LT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwg
MCwgNTAsIG9iamVjdFN0b3JlSWQsIDApKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3Jp
dGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQs
IDEpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDIpKTsKKyAgICBtX2RiLT5EZWxl
dGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAs
IG9iamVjdFN0b3JlSWQsIDMpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRp
b25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpKTsK
KyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJh
c2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDUpKTsKKworICAgIC8vIEluc2VydCBpbnRv
IGZyZWUtbGlzdC4KKyAgICBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCAxNTAsIG9iamVjdFN0b3JlSWQpLCAiIik7CisKKyAgICAvLyBGSVhNRTogRGVsZXRl
IHRoZSBvYmplY3Qgc3RvcmUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nICh3ZSBuZWVkIHRvIGxvb2sg
aXQgdXApCisgICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBtYWtlS2V5
KGRhdGFiYXNlSWQsIDAsIDAsIDIwMCwgb2JqZWN0U3RvcmVOYW1lKSk7CisKKyAgICAvLyBXZSBj
b3VsZCBqdXN0IGRvIG9uZSBiaWcgZGVsZXRlUmFuZ2UgZm9yIHRoZSBzdHVmZiBiZWxvdy4uLgor
CisgICAgLy8gT2JqZWN0IHN0b3JlIGRhdGEsIGV4aXN0cyBkYXRhLCBpbmRleCBkYXRhLgorICAg
IGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAwKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkpKQor
ICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisKKyNpZiAwCisgICAgLy8g
RXhpc3RzIGRhdGEuCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIDMpKSkKKyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorCisg
ICAgLy8gSW5kZXggZGF0YS4KKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMzApLCBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQgKyAxLCAwKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBl
cnJvci4KKyNlbmRpZgorCisgICAgLy8gSW5kZXggaWQgZnJlZS1saXN0CisgICAgaWYgKCFkZWxl
dGVSYW5nZShtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MSwgb2JqZWN0
U3RvcmVJZCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCBvYmplY3RTdG9yZUlkICsg
MSkpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisKKyAgICAvLyBJ
bmRleCBtZXRhLWRhdGEKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQgKyAxKSkpCisgICAgICAgIHJldHVybjsgLy8gRklY
TUU6IFJlcG9ydCBlcnJvci4KKworfQorCitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Z2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVs
ZGJLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEsIGVuY29kZUtleShr
ZXkpKTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBt
X2RiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYktleSwgJmRhdGEpOworICAg
IGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBpbnQ2NF90IHZl
cnNpb247CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7CisgICAgY29uc3QgY2hhciog
cCA9IGRlY29kZVZhckludChkYXRhLmNfc3RyKCksIHZlcnNpb24pOworCisgICAgcmV0dXJuIGRl
Y29kZVN0cmluZyhzdGQ6OnN0cmluZyhwLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKSk7
Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBMZXZlbERCUmVjb3JkSGFuZGxlIDogcHVibGljIElE
QkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUgeworcHVibGljOgorICAgIExl
dmVsREJSZWNvcmRIYW5kbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHByaW1hcnlLZXksIGludDY0X3Qg
dmVyc2lvbikgOiBtX3ByaW1hcnlLZXkocHJpbWFyeUtleSksIG1fdmVyc2lvbih2ZXJzaW9uKSB7
fQorICAgIHN0ZDo6c3RyaW5nIHByaW1hcnlLZXkoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlL
ZXk7IH0KKyAgICBpbnQ2NF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtX3ZlcnNpb247IH0K
K3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbV9wcmltYXJ5S2V5OyAvLyB0aGUgcmVzdWx0IG9m
IGVuY29kZUtleShJREJLZXkpIGJhc2ljYWxseS4KKyAgICBpbnQ2NF90IG1fdmVyc2lvbjsKK307
Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld1ZlcnNpb25OdW1iZXIobGV2ZWxkYjo6REIqIGRi
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBpbnQ2
NF90IGxhc3RWZXJzaW9uOworICAgIGlmICghZ2V0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQs
IDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA0KSwgJmxhc3RWZXJzaW9uKSkKKyAgICAgICAgbGFz
dFZlcnNpb24gPSAwOworCisgICAgQVNTRVJUKGxhc3RWZXJzaW9uID49IDApOworCisgICAgaW50
NjRfdCB2ZXJzaW9uID0gbGFzdFZlcnNpb24gKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIs
IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpLCB2ZXJzaW9u
KTsKKyAgICBBU1NFUlQob2spOworCisgICAgLyogRklYTUU6IERldGVjdCBvdmVyZmxvdz8gTm90
IG11Y2ggd2UgY2FuIGRvIGFib3V0IGl0IGFueXdheS4uLj8gQW5kIGl0CisgICAgICogcHJvYmFi
bHkgaXNuJ3QgYSBjYXRhc3Ryb3BoZSBhbnl3YXkuLi4gKi8KKworICAgIHJldHVybiB2ZXJzaW9u
OworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxl
PiYgcmVjb3JkSGFuZGxlKQoreworICAgIGludDY0X3QgdmVyc2lvbiA9IGdldE5ld1ZlcnNpb25O
dW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVkYXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAxLCBlbmNvZGVLZXkoa2V5KSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IG1fZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgb2JqZWN0U3RvcmVkYXRhS2V5LCBl
bmNvZGVWYXJJbnQodmVyc2lvbikgKyBlbmNvZGVTdHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMu
b2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhp
c3RzRW50cnlLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIsIGVuY29k
ZUtleShrZXkpKTsKKworICAgIHMgPSBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCks
IGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJbnQodmVyc2lvbikpOworICAgIGlmICghcy5vaygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZJWE1FOiBJZGVhbGx5LCB3ZSB3YW50IHRvIHJvbGwg
YmFjayB0aGUgcHV0IGFib3ZlPworCisgICAgcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IExl
dmVsREJSZWNvcmRIYW5kbGUoZW5jb2RlS2V5KGtleSksIHZlcnNpb24pKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3Jl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0
IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkICsgMSwgMCk7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgIGRlbGV0ZVJh
bmdlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBzdG9wS2V5KTsKK30KKwordm9pZCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJl
Y29yZEhhbmRsZSkKK3sKKyAgICAvL3ByaW50ZigiZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmRcbiIp
OworCisgICAgY29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSYgbGV2ZWxEQlJlY29yZEhhbmRsZSA9
IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOwor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgMSwgbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCkpOworCisgICAgbGV2ZWxk
Yjo6U3RhdHVzIHMgPSBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSk7
Cit9CisKK2RvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51
bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBj
b25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgIE93blB0cjxs
ZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlv
bnMoKSkpOworCisgICAgaW50IG1heE51bWVyaWNLZXkgPSAwOworCisgICAgLy8gRklYTUU6IFRo
aXMgaXMgdmVyeSBzYWZlLCBidXQgdmVyeSBzbG93LiBJdCdzIGNhY2hlZCBvbmUgbGF5ZXIgdXAs
IGJ1dAorICAgIC8vIEknbSBub3Qgc3VyZSB0aGF0J3MgZ29vZCBlbm91Z2g/CisgICAgLy8gQWxz
bywgd2UgY291bGQgcHJvYmFibHkgYmUgc21hcnRlciB3aXRoIHRoZSBpdGVyYXRvciByYW5nZS4u
LgorCisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIG15Q29tcGFy
YXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAg
ICAgIGludDY0X3QgYSwgYiwgYzsKKworICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJl
Zml4KGl0LT5rZXkoKS5Ub1N0cmluZygpLmNfc3RyKCksIGEsIGIsIGMpOworICAgICAgICBBU1NF
UlQoYSA9PSBkYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKGIgPT0gb2JqZWN0U3RvcmVJZCk7
CisgICAgICAgIEFTU0VSVChjID09IDEpOworCisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsK
KyAgICAgICAgZGVjb2RlS2V5KHAsIGtleSk7CisKKyAgICAgICAgaWYgKGtleS0+dHlwZSgpID09
IElEQktleTo6TnVtYmVyVHlwZSkgeworICAgICAgICAgICAgaW50NjRfdCBuID0gc3RhdGljX2Nh
c3Q8aW50NjRfdD4oa2V5LT5udW1iZXIoKSk7CisgICAgICAgICAgICBpZiAobiA+IG1heE51bWVy
aWNLZXkpCisgICAgICAgICAgICAgICAgbWF4TnVtZXJpY0tleSA9IG47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gbWF4TnVtZXJpY0tleSArIDE7Cit9CisKK2Jvb2wgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIFJlZlB0cjxPYmplY3RT
dG9yZVJlY29yZEhhbmRsZT4mIGZvdW5kUmVjb3JkSGFuZGxlKQoreworICAgIGNvbnN0IHN0ZDo6
c3RyaW5nIGxldmVsZGJLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEs
IGVuY29kZUtleShrZXkpKTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6
U3RhdHVzIHMgPSBtX2RiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYktleSwg
JmRhdGEpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
bnQ2NF90IHZlcnNpb247CisgICAgZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgdmVyc2lvbik7
CisKKyAgICBmb3VuZFJlY29yZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFu
ZGxlKGVuY29kZUtleShrZXkpLCB2ZXJzaW9uKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENh
bGxiYWNrJiBjYWxsYmFjaykKK3sKKyAgICAvL3ByaW50ZigiZm9yRWFjaE9iamVjdFN0b3JlUmVj
b3JkXG4iKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsgLy8gTm90IGluY2x1ZGVk
LgorCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihs
ZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0
LT5WYWxpZCgpICYmIG15Q29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAw
OyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGRlY29kZVByZWZpeChpdC0+a2V5KCkuVG9TdHJpbmcoKS5jX3N0cigpLCBhLCBi
LCBjKTsKKworICAgICAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OworICAgICAgICBkZWNv
ZGVLZXkocCwgcHJpbWFyeUtleSk7CisKKyAgICAgICAgaW50NjRfdCB2ZXJzaW9uOworICAgICAg
ICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KGl0LT52YWx1ZSgpLmRhdGEoKSwgdmVyc2lv
bik7CisKKyAgICAgICAgUmVmUHRyPExldmVsREJSZWNvcmRIYW5kbGU+IHJoKGFkb3B0UmVmKG5l
dyBMZXZlbERCUmVjb3JkSGFuZGxlKGVuY29kZUtleSgqcHJpbWFyeUtleSksIHZlcnNpb24pKSk7
CisgICAgICAgIFN0cmluZyBpZGJWYWx1ZSA9IGRlY29kZVN0cmluZyhzdGQ6OnN0cmluZyhxLCBp
dC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpKTsKKworICAgICAgICAvL3By
aW50ZigiZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkLCBpZHZWYWx1ZSA9ICVzXG4iLCBpZGJWYWx1
ZS5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICAgICAgY2FsbGJhY2suY2FsbGJhY2soKnJoLCBpZGJW
YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5k
TmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5k
VW5pcXVlRmxhZ3MpCit7CisgICAgLy9wcmludGYoImdldEluZGV4ZXMgZm9yIG9iamVjdCBzdG9y
ZSAlZFxuIiwgKGludClvYmplY3RTdG9yZUlkKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQpOworICAgIHN0
ZDo6c3RyaW5nIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0
U3RvcmVJZCArIDEpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5O
ZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2Vlayhz
dGFydEtleSk7IGl0LT5WYWxpZCgpICYmIG15Q29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwg
c3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAg
ICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNv
ZGVQcmVmaXgocCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBkID0gKnArKzsK
KyAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBkID09IDEwMCk7CisKKyAgICAgICAgaW50NjRfdCBp
bmRleElkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGluZGV4SWQpOworICAgICAgICAv
L3ByaW50ZigiRm91bmQgaW5kZXggaWQ6ICVkXG4iLCAoaW50KWluZGV4SWQpOworCisgICAgICAg
IFN0cmluZyBpbmRleE5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuVG9TdHJpbmcoKSk7
CisgICAgICAgIC8vcHJpbnRmKCJOYW1lOiAlc1xuIiwgaW5kZXhOYW1lLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeyBwcmlu
dGYoIml0IG5vdCB2YWxpZFxuIik7IHJldHVybjsgfQorCisgICAgICAgIGJvb2wgaW5kZXhVbmlx
dWUgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBp
ZiAoIWl0LT5WYWxpZCgpKSB7IHByaW50ZigiaXQgbm90IHZhbGlkXG4iKTsgcmV0dXJuOyB9CisK
KyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuVG9TdHJp
bmcoKSk7CisKKyAgICAgICAgZm91bmRJZHMuYXBwZW5kKGluZGV4SWQpOworICAgICAgICBmb3Vu
ZE5hbWVzLmFwcGVuZChpbmRleE5hbWUpOworICAgICAgICBmb3VuZEtleVBhdGhzLmFwcGVuZChr
ZXlQYXRoKTsKKyAgICAgICAgZm91bmRVbmlxdWVGbGFncy5hcHBlbmQoaW5kZXhVbmlxdWUpOwor
ICAgIH0KK30KKworc3RhdGljIGludDY0X3QgZ2V0TmV3SW5kZXhJZChsZXZlbGRiOjpEQiogZGIs
IGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIC8vIExv
b2sgaW4gZnJlZS1saXN0LgorICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRh
YmFzZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQpOworICAgIHN0ZDo6c3RyaW5nIHN0b3BL
ZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MSwgb2JqZWN0U3RvcmVJZCArIDEpOwor
CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxk
Yjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFs
aWQoKSAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQt
Pk5leHQoKSkgeworICAgICAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgICAgIGNvbnN0IGNoYXIq
IHAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAgICAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIs
IGMpOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZCA9ICpwKys7CisgICAgICAgIEFTU0VSVF9V
TlVTRUQoZCwgZCA9PSAxNTEpOworCisgICAgICAgIGludDY0X3QgdHJhc2g7IC8vIG9iamVjdCBz
dG9yZSBpZAorICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIHRyYXNoKTsKKworICAgICAgICBp
bnQ2NF90IGluZGV4SWQ7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgaW5kZXhJZCk7CisK
KyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICAv
L3ByaW50ZigiZm91bmQgaW5kZXggaWQgaW4gZnJlZS1saXN0OiAlZFxuIiwgKGludClpbmRleElk
KTsKKyAgICAgICAgQVNTRVJUKGluZGV4SWQgPj0gMzApOworICAgICAgICByZXR1cm4gaW5kZXhJ
ZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlz
dC4KKyAgICBpbnQ2NF90IG1heEluZGV4SWQ7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDUpLCAmbWF4SW5kZXhJZCkpCisg
ICAgICAgIG1heEluZGV4SWQgPSAzMDsgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCBpdCBzdGFydHMg
YXQgMzAhIQorCisgICAgaW50NjRfdCBpbmRleElkID0gbWF4SW5kZXhJZCArIDE7CisgICAgYm9v
bCBvayA9IHB1dEludChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3Rv
cmVJZCwgNSksIGluZGV4SWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgLy9wcmludGYoInNl
dHRpbmcgbWF4IGluZGV4IGlkIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gaW5kZXhJZDsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlx
dWUsIGludDY0X3QmIGluZGV4SWQpCit7CisgICAgLy9wcmludGYoImNyZWF0ZUluZGV4IGZvciBv
YmplY3Qgc3RvcmUgJWRcbiIsIChpbnQpb2JqZWN0U3RvcmVJZCk7CisgICAgaW5kZXhJZCA9IGdl
dE5ld0luZGV4SWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAg
Ly9wcmludGYoImluZGV4SWQ6ICVkXG4iLCAoaW50KWluZGV4SWQpOworCisgICAgYm9vbCBvayA9
IHB1dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCksIG5hbWUpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJm
YWlsZWQgdG8gc2V0IGluZGV4IG5hbWVcbiIpOyByZXR1cm4gZmFsc2U7IH0KKworICAgIG9rID0g
cHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RT
dG9yZUlkLCBpbmRleElkLCAxKSwgaXNVbmlxdWUpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJm
YWlsZWQgdG8gc2V0IGlzdW5pcXVlXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBvayA9IHB1
dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwgMiksIGtleVBhdGgpOworICAgIGlmICghb2spIHsgcHJpbnRmKCJm
YWlsZWQgdG8gc2V0IGtleSBwYXRoXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQor
eworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIHJl
dHVybjsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxl
JiByZWNvcmRIYW5kbGUpCit7CisgICAgQVNTRVJUKGluZGV4SWQgPj0gMzApOworICAgIGNvbnN0
IExldmVsREJSZWNvcmRIYW5kbGUmIGxldmVsREJSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxj
b25zdCBMZXZlbERCUmVjb3JkSGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKKworICAgIC8vcHJpbnRm
KCJwdXRJbmRleERhdGFGb3JSZWNvcmQgKGRiOiAlZCwgb3M6ICVkLCBpZHg6ICVkIGtleTogIiwg
KGludClkYXRhYmFzZUlkLCAoaW50KW9iamVjdFN0b3JlSWQsIChpbnQpaW5kZXhJZCk7IHByaW50
U3RyaW5nKGVuY29kZUtleShrZXkpKTsgcHJpbnRmKCIgcmVjb3JkSGFuZGxlLnByaW1hcnlLZXko
KTogIik7IHByaW50U3RyaW5nKGxldmVsREJSZWNvcmRIYW5kbGUucHJpbWFyeUtleSgpKTsgcHJp
bnRmKCIpXG4iKTsKKworICAgIGNvbnN0IGludDY0X3QgZ2xvYmFsU2VxdWVuY2VOdW1iZXIgPSBn
ZXROZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQp
OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGluZGV4RGF0YUtleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KGtleSksIGdsb2JhbFNlcXVlbmNl
TnVtYmVyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkYXRhID0gZW5jb2RlVmFySW50KGxldmVs
REJSZWNvcmRIYW5kbGUudmVyc2lvbigpKSArIGxldmVsREJSZWNvcmRIYW5kbGUucHJpbWFyeUtl
eSgpOworCisgICAgcmV0dXJuIG1fZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaW5k
ZXhEYXRhS2V5LCBkYXRhKS5vaygpOworfQorCitzdGF0aWMgYm9vbCBmaW5kR3JlYXRlc3RLZXlM
ZXNzVGhhbihsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIHN0ZDo6
c3RyaW5nKiBmb3VuZEtleSkKK3sKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRi
LT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgaXQtPlNlZWsodGFy
Z2V0KTsKKworICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgaXQtPlNlZWtUb0xhc3Qo
KTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICB3aGlsZSAobXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtl
eSgpLCB0YXJnZXQpID49IDApIHsKKyAgICAgICAgaXQtPlByZXYoKTsKKyAgICAgICAgaWYgKCFp
dC0+VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqZm91
bmRLZXkgPSBpdC0+a2V5KCkuVG9TdHJpbmcoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICAvLyBGSVhN
RTogVGhpcyBpc24ndCByZWFsbHkgbmVlZGVkLCBiZWNhdXNlIG9mIHRoZSB2ZXJzaW9uIHN0dWZm
IQorICAgIHJldHVybiB0cnVlOworI2lmIDAKKworICAgIC8vcHJpbnRmKCJkZWxldGVJbmRleERh
dGFGb3JSZWNvcmQgKGRiOiAlZCwgb2JqZWN0IHN0b3JlOiAlZCwgaW5kZXg6ICVkKVxuIiwgKGlu
dClkYXRhYmFzZUlkLCAoaW50KW9iamVjdFN0b3JlSWQsIChpbnQpaW5kZXhJZCk7CisKKyAgICBj
b25zdCBMZXZlbERCUmVjb3JkSGFuZGxlJiBsZXZlbERCUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nh
c3Q8Y29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisgICAgLy9wcmlu
dGYoInByaW1hcnlrZXk6ICIpOyBwcmludFN0cmluZyhsZXZlbERCUmVjb3JkSGFuZGxlLnByaW1h
cnlLZXkoKSk7IHByaW50ZigiXG4iKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5
ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBzdGQ6
OnN0cmluZyBzdG9wS2V5OworICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obV9kYi5n
ZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkICsgMSksICZz
dG9wS2V5KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRl
cmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKwor
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIGNyYXp5IGluZWZmaWNpZW50IQorICAgIGZvciAoaXQtPlNl
ZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5
cyhpdC0+a2V5KCksIHN0b3BLZXkpIDw9IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaWYgKGl0
LT52YWx1ZSgpLlRvU3RyaW5nKCkgPT0gbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCkp
IHsKKyAgICAgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+RGVsZXRlKGxldmVsZGI6
OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICAgICAgLy9wcmludGYoImRlbGV0
ZSBrZXk6ICIpOyBwcmludFN0cmluZyhpdC0+a2V5KCkuVG9TdHJpbmcoKSk7IHByaW50ZigiXG4i
KTsKKyAgICAgICAgICAgIGlmICghcy5vaygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKK1N0
cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmIGtleSkKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5ID0gZ2V0UHJpbWFy
eUtleVZpYUluZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSk7Cisg
ICAgaWYgKCFwcmltYXJ5S2V5KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICByZXR1
cm4gZ2V0T2JqZWN0U3RvcmVSZWNvcmQoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnByaW1h
cnlLZXkpOworfQorCitzdGF0aWMgYm9vbCB2ZXJzaW9uRXhpc3RzKGxldmVsZGI6OkRCKiBkYiwg
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgdmVyc2lv
biwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRQcmltYXJ5S2V5KQoreworICAgIGNvbnN0IHN0
ZDo6c3RyaW5nIGtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMiwgZW5j
b2RlZFByaW1hcnlLZXkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpT
dGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwga2V5LCAmZGF0YSk7Cisg
ICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBkZWNv
ZGVJbnQoZGF0YSkgPT0gdmVyc2lvbjsKK30KKworUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtl
eSkKK3sKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9y
KGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBsZXZlbGRi
S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVL
ZXkoa2V5KSk7CisgICAgaXQtPlNlZWsobGV2ZWxkYktleSk7CisKKyAgICBmb3IgKDs7KSB7Cisg
ICAgICAgIGlmICghaXQtPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
aWYgKG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgbGV2ZWxkYktleSkg
PiAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaW50NjRfdCB2ZXJzaW9uOwor
ICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGl0LT52YWx1ZSgpLmRhdGEoKSwg
dmVyc2lvbik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRQcmltYXJ5S2V5ID0gc3RkOjpz
dHJpbmcocCwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKworICAg
ICAgICBpZiAoIXZlcnNpb25FeGlzdHMobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgdmVyc2lvbiwgZW5jb2RlZFByaW1hcnlLZXkpKSB7CisgICAgICAgICAgICAvLyBEZWxl
dGUgc3RhbGUgaW5kZXggZGF0YSBlbnRyeSBhbmQgY29udGludWUuCisgICAgICAgICAgICBtX2Ri
LT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAgICAg
ICBpdC0+TmV4dCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAg
ICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OworICAgICAgICBkZWNvZGVLZXkoZW5jb2RlZFBy
aW1hcnlLZXkuY19zdHIoKSwgcHJpbWFyeUtleSk7CisgICAgICAgIHJldHVybiBwcmltYXJ5S2V5
LnJlbGVhc2UoKTsKKyAgICB9Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5
RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKK3sKKyAgICAvL3ByaW50Zigia2V5
RXhpc3RzSW5JbmRleCAoZGI6ICVkLCBvczogJWQsIGlkeDogJWQga2V5OiAiLCAoaW50KWRhdGFi
YXNlSWQsIChpbnQpb2JqZWN0U3RvcmVJZCwgKGludClpbmRleElkKTsgcHJpbnRTdHJpbmcoZW5j
b2RlS2V5KGtleSkpOyBwcmludGYoIilcbiIpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2
ZWxEQktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5j
b2RlS2V5KGtleSkpOworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3
SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworCisgICAgYm9vbCBmb3VuZCA9IGZh
bHNlOworCisgICAgaXQtPlNlZWsobGV2ZWxEQktleSk7CisgICAgaWYgKGl0LT5WYWxpZCgpICYm
IG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKS5Ub1N0cmluZygpLCBsZXZl
bERCS2V5KSA9PSAwKQorICAgICAgICBmb3VuZCA9IHRydWU7CisKKyAgICAvL3ByaW50ZigiZm91
bmQgPSAlc1xuIiwgZm91bmQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gZm91bmQ7
Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVibGljIElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yIHsKK3B1YmxpYzoKKyAgICBDdXJzb3JJbXBsQ29tbW9uKGxldmVs
ZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25z
dCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAg
ICAgICA6IG1fZGIoZGIpCisgICAgICAgICwgbV9sb3dLZXkobG93S2V5KQorICAgICAgICAsIG1f
bG93T3Blbihsb3dPcGVuKQorICAgICAgICAsIG1faGlnaEtleShoaWdoS2V5KQorICAgICAgICAs
IG1faGlnaE9wZW4oaGlnaE9wZW4pCisgICAgICAgICwgbV9mb3J3YXJkKGZvcndhcmQpCisgICAg
eworICAgIH0KKyAgICB2aXJ0dWFsIH5DdXJzb3JJbXBsQ29tbW9uKCkge30KKworICAgIC8vIElE
QkJhY2tpbmdTdG9yZTo6Q3Vyc29yCisgICAgdmlydHVhbCBib29sIGNvbnRpbnVlRnVuY3Rpb24o
Y29uc3QgSURCS2V5Kik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkgeyBy
ZXR1cm4gbV9jdXJyZW50S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJp
bWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIHZh
bHVlKCkgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVj
dFN0b3JlUmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpID0gMDsgLy8gRklY
TUU6IElzIHRoaXMgYWN0dWFsbHkgdXNlZCBieSBhbnlvbmU/CisgICAgdmlydHVhbCBpbnQ2NF90
IGluZGV4RGF0YUlkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCkg
PSAwOworICAgIGJvb2wgZmlyc3RTZWVrKCk7CisKK3Byb3RlY3RlZDoKKyAgICBsZXZlbGRiOjpE
QiogbV9kYjsKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IG1faXRlcmF0b3I7CisgICAg
c3RkOjpzdHJpbmcgbV9sb3dLZXk7CisgICAgYm9vbCBtX2xvd09wZW47CisgICAgc3RkOjpzdHJp
bmcgbV9oaWdoS2V5OworICAgIGJvb2wgbV9oaWdoT3BlbjsKKyAgICBib29sIG1fZm9yd2FyZDsK
KyAgICBSZWZQdHI8SURCS2V5PiBtX2N1cnJlbnRLZXk7Cit9OworCitib29sIEN1cnNvckltcGxD
b21tb246OmZpcnN0U2VlaygpCit7CisgICAgLy9wcmludGYoImZpcnN0U2Vlay4uLlxuIik7Cisg
ICAgLy9wcmludGYoImxvdzogIik7IHByaW50U3RyaW5nKG1fbG93S2V5KTsKKyAgICAvL2lmICht
X2xvd09wZW4pIHByaW50ZigiIChvcGVuKSIpOworICAgIC8vcHJpbnRmKCIgaGlnaDogIik7IHBy
aW50U3RyaW5nKG1faGlnaEtleSk7CisgICAgLy9pZiAobV9oaWdoT3BlbikgcHJpbnRmKCIgKG9w
ZW4pIik7CisgICAgLy9wcmludGYoIiBmb3J3YXJkID0gJXNcbiIsIG1fZm9yd2FyZCA/ICJ0cnVl
IiA6ICJmYWxzZSIpOworCisKKyAgICBtX2l0ZXJhdG9yID0gbV9kYi0+TmV3SXRlcmF0b3IobGV2
ZWxkYjo6UmVhZE9wdGlvbnMoKSk7CisKKyAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICBtX2l0
ZXJhdG9yLT5TZWVrKG1fbG93S2V5KTsKKyAgICBlbHNlCisgICAgICAgIG1faXRlcmF0b3ItPlNl
ZWsobV9oaWdoS2V5KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9y
LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vcHJpbnRm
KCJrZXk6ICIpOyBwcmludFN0cmluZyhtX2l0ZXJhdG9yLT5rZXkoKS5Ub1N0cmluZygpKTsgcHJp
bnRmKCJcbiIpOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbiAmJiBteUNv
bXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+
PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJkICYm
ICFtX2hpZ2hPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3It
PmtleSgpLCBtX2hpZ2hLZXkpID4gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9sb3dPcGVuICYmIG15Q29tcGFyYXRvci5Db21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgIW1fbG93T3BlbiAmJiBteUNv
bXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwg
MCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAobV9mb3J3YXJkICYm
IG1fbG93T3BlbikgeworICAgICAgICAgICAgLy8gbG93S2V5IHNob3VsZCBub3QgYmUgaW5jbHVk
ZWQgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKG15Q29tcGFyYXRvci5Db21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgeworICAgICAgICAgICAg
ICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVu
KSB7CisgICAgICAgICAgICAvLyBoaWdoS2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhl
IHJhbmdlCisgICAgICAgICAgICBpZiAobXlDb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9p
dGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPj0gMCkgeworICAgICAgICAgICAgICAgIG1faXRl
cmF0b3ItPlByZXYoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkgeworICAgICAgICAg
ICAgaWYgKG1fZm9yd2FyZCkKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+UHJldigpOworICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9Cit9CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6Y29udGludWVGdW5jdGlvbihjb25zdCBJ
REJLZXkqIGtleSkKK3sKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAobV9mb3J3YXJk
KQorICAgICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5WYWxp
ZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHRy
YXNoOworICAgICAgICBpZiAobV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1faXRl
cmF0b3ItPmtleSgpLCAmdHJhc2gpLklzTm90Rm91bmQoKSkKKyAgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAvL3ByaW50ZigiY29udGludWUuLi5cbiIpOworICAgICAgICAvL3ByaW50
ZigibG93OiAiKTsgcHJpbnRTdHJpbmcobV9sb3dLZXkpOworICAgICAgICAvL2lmIChtX2xvd09w
ZW4pIHByaW50ZigiIChvcGVuKSIpOworICAgICAgICAvL3ByaW50ZigiIGhpZ2g6ICIpOyBwcmlu
dFN0cmluZyhtX2hpZ2hLZXkpOworICAgICAgICAvL2lmIChtX2hpZ2hPcGVuKSBwcmludGYoIiAo
b3BlbikiKTsKKyAgICAgICAgLy9wcmludGYoIiBmb3J3YXJkID0gJXNcbiIsIG1fZm9yd2FyZCA/
ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9oaWdoT3Bl
biAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9o
aWdoS2V5KSA+PSAwKSAvLyBoaWdoIGtleSBub3QgaW5jbHVkZWQgaW4gcmFuZ2UKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiAhbV9oaWdoT3BlbiAm
JiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdo
S2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3
YXJkICYmIG1fbG93T3BlbiAmJiBteUNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJh
dG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGlmICghbV9mb3J3YXJkICYmICFtX2xvd09wZW4gJiYgbXlDb21wYXJhdG9yLkNvbXBh
cmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8IDApCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKG1f
Zm9yd2FyZCkgeworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVzc1RoYW4o
a2V5KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5LmdldCgp
KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICAvLyBGSVhNRTogT2JleSB0aGUgdW5pcXVlbmVzcyBjb25zdHJhaW50CisK
KyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIE9i
amVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoK
KyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0
cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBi
b29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihk
YiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkKKyAgICB7Cisg
ICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVl
KCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwg
aW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9
CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgU3Ry
aW5nIG1fY3VycmVudFZhbHVlOworfTsKKworYm9vbCBPYmplY3RTdG9yZUN1cnNvckltcGw6Omxv
YWRDdXJyZW50Um93KCkKK3sKKyAgICAvL3ByaW50ZigibG9hZEN1cnJlbnRSb3coKVxuIik7Cisg
ICAgLy9wcmludGYoImtleTogIik7IHByaW50U3RyaW5nKG1faXRlcmF0b3ItPmtleSgpLlRvU3Ry
aW5nKCkpOyBwcmludGYoIlxuIik7CisgICAgLy9wcmludGYoInZhbHVlOiAiKTsgcHJpbnRTdHJp
bmcobV9pdGVyYXRvci0+dmFsdWUoKS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworCisgICAg
aW50NjRfdCBhLCBiLCBjOworICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5k
YXRhKCk7CisgICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKKyAgICBwID0gZGVjb2Rl
S2V5KHAsIG1fY3VycmVudEtleSk7CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgY29uc3Qg
Y2hhciogcSA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwgdmVyc2lv
bik7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7CisKKyAgICBtX2N1cnJlbnRWYWx1
ZSA9IGRlY29kZVN0cmluZyhzdGQ6OnN0cmluZyhxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEo
KSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewor
cHVibGljOgorICAgIEluZGV4S2V5Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0
ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hL
ZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29t
bW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAg
IHsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcg
dmFsdWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5
S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3Rv
cmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgeyBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgYm9vbCBsb2Fk
Q3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtl
eTsKK307CisKK2Jvb2wgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7Cisg
ICAgLy9wcmludGYoIkluZGV4S2V5Q3Vyc29yOjpsb2FkQ3VycmVudFJvdygpXG4iKTsKKyAgICAv
L3ByaW50Zigia2V5OiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+a2V5KCkuVG9TdHJpbmco
KSk7IHByaW50ZigiXG4iKTsKKyAgICAvL3ByaW50ZigidmFsdWU6ICIpOyBwcmludFN0cmluZyht
X2l0ZXJhdG9yLT52YWx1ZSgpLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7CisKKyAgICBpbnQ2
NF90IGEsIGIsIGM7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmRhdGEo
KTsKKyAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAgIHAgPSBkZWNvZGVLZXko
cCwgbV9jdXJyZW50S2V5KTsKKworICAgIC8vIFdlIGp1c3QgaWdub3JlIHRoZSBzZXF1ZW5jZSBu
dW1iZXIuLi4KKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVj
b2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCB2ZXJzaW9uKTsKKyAgICBzdGF0
aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsgLy8gRklYTUU6IFdlIHNob3VsZCBwcnVuZSBlbnRyaWVz
IHdpdGggb2xkIHZlcnNpb24sIGJ1dCBJIHRoaW5rIGtleUV4aXN0c0luT2JqZWN0U3RvcmUgdGFr
ZXMgY2FyZSBvZiBpdCBmb3Igbm93Li4uCisgICAgZGVjb2RlS2V5KHEsIG1fcHJpbWFyeUtleSk7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5kZXhDdXJzb3JJbXBsIDogcHVibGlj
IEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIEluZGV4Q3Vyc29ySW1wbChsZXZlbGRi
OjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qg
c3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAg
ICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hP
cGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisg
ICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtleTsg
fQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29sIGxvYWRDdXJyZW50Um93KCk7
CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworICAgIFN0cmlu
ZyBtX3ZhbHVlOworICAgIHN0ZDo6c3RyaW5nIG1fcHJpbWFyeUxldmVsREJLZXk7Cit9OworCiti
b29sIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIC8vcHJpbnRmKCJJ
bmRleEN1cnNvcjo6bG9hZEN1cnJlbnRSb3coKVxuIik7CisgICAgLy9wcmludGYoImtleTogIik7
IHByaW50U3RyaW5nKG1faXRlcmF0b3ItPmtleSgpLlRvU3RyaW5nKCkpOyBwcmludGYoIlxuIik7
CisgICAgLy9wcmludGYoInZhbHVlOiAiKTsgcHJpbnRTdHJpbmcobV9pdGVyYXRvci0+dmFsdWUo
KS5Ub1N0cmluZygpKTsgcHJpbnRmKCJcbiIpOworCisgICAgaW50NjRfdCBhLCBiLCBjOworICAg
IGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCk7CisgICAgcCA9IGRlY29k
ZVByZWZpeChwLCBhLCBiLCBjKTsKKyAgICBwID0gZGVjb2RlS2V5KHAsIG1fY3VycmVudEtleSk7
CisKKyAgICAvLyBGSVhNRTogV2UganVzdCBpZ25vcmUgdGhlIHNlcXVlbmNlIG51bWJlciwgcmln
aHQ/CisKKyAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgY29uc3QgY2hhciogcSA9
IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwgaW5kZXhEYXRhVmVyc2lv
bik7CisgICAgcSA9IGRlY29kZUtleShxLCBtX3ByaW1hcnlLZXkpOworCisgICAgbV9wcmltYXJ5
TGV2ZWxEQktleSA9IG1ha2VLZXkoYSwgYiwgMSwgZW5jb2RlS2V5KCptX3ByaW1hcnlLZXkpKTsK
KworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGIt
PkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBtX3ByaW1hcnlMZXZlbERCS2V5LCAmcmVzdWx0
KTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRf
dCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJ
bnQocmVzdWx0LmNfc3RyKCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOworCisgICAgaWYgKG9i
amVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgeworICAgICAgICBtX2Ri
LT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1faXRlcmF0b3ItPmtleSgpKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vcHJpbnRmKCJJbmRleEN1cnNvcklt
cGw6OmxvYWRDdXJyZW50Um93LCByZXN1bHQ6ICIpOyBwcmludFN0cmluZyhyZXN1bHQpOyBwcmlu
dGYoIlxuIik7CisgICAgbV92YWx1ZSA9IGRlY29kZVN0cmluZyhzdGQ6OnN0cmluZyh0LCByZXN1
bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSkpOworICAgIHJldHVybiB0cnVlOworfQorCit9
CisKK3N0YXRpYyBib29sIGZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKGxldmVsZGI6OkRCKiBkYiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQoreworICAg
IE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJl
YWRPcHRpb25zKCkpKTsKKyAgICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFpdC0+VmFs
aWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKGl0LT5WYWxpZCgpICYm
IG15Q29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSA9PSAwKSB7
CisgICAgICAgICpmb3VuZEtleSA9IGl0LT5rZXkoKS5Ub1N0cmluZygpOworICAgICAgICBpdC0+
TmV4dCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3Rv
cmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorewor
ICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wg
dXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9
IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24g
PT0gSURCQ3Vyc29yOjpORVhUKTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47Cisg
ICAgc3RkOjpzdHJpbmcgc3RhcnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91bmQp
IHsKKyAgICAgICAgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IDApOworICAgICAgICBsb3dlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisgICAgfSBl
bHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDEsIGVuY29kZUtleSgqcmFuZ2UtPmxvd2VyKCkpKTsKKyAgICAgICAgbG93ZXJPcGVuID0g
cmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3VuZCkgeworICAg
ICAgICBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsKKyAg
ICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorCisgICAgICAgIGlmICgh
Zm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYg
KCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxz
ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEsIGVuY29kZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsK
KyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJl
ZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGN1cnNvciA9IGFkb3B0UmVmKG5ldyBPYmplY3RT
dG9yZUN1cnNvckltcGwobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwg
dXBwZXJPcGVuLCBmb3J3YXJkKSk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNz
UmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpv
cGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6
OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYg
cmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVw
cGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRf
Tk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9v
bCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtl
eTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNvdWxk
IG1lYW4gcHJvYmxlbXMuCisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRl
ZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOworICAg
ICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1
cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQgKyAxKTsKKyAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90
IGluY2x1ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRo
YXQgZXhpc3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2Ri
LmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIGVuY29kZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsKKyAgICAgICAgaWYgKCFmaW5kTGFzdElu
ZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8vIFNlZWsgdG8g
dGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsK
KyAgICB9CisKKyAgICBSZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJl
ZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4s
IHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCkpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNl
ZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsK
K30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURC
Q3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJh
bmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJh
bmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29y
OjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUKTsKKwor
ICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXks
IHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgc3RhcnRLZXkgPSBt
YWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOyAvLyBGSVhNRTogVGhp
cyBjb3VsZCBtZWFuIHByb2JsZW1zLgorICAgICAgICBsb3dlck9wZW4gPSB0cnVlOyAvLyBOb3Qg
aW5jbHVkZWQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleSgqcmFuZ2UtPmxvd2VyKCkp
KTsKKyAgICAgICAgbG93ZXJPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAg
IGlmICghdXBwZXJCb3VuZCkgeworICAgICAgICBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkICsgMSk7CisgICAgICAgIHVwcGVyT3BlbiA9IHRydWU7
IC8vIE5vdCBpbmNsdWRlZC4KKworICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8gV2UgbmVlZCBh
IGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1Ro
YW4obV9kYi5nZXQoKSwgc3RvcEtleSwgJnN0b3BLZXkpKQorICAgICAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVs
c2UgeworICAgICAgICBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkLCBlbmNvZGVLZXkoKnJhbmdlLT51cHBlcigpKSk7CisgICAgICAgIGlmICghZmlu
ZExhc3RJbmRleEtleUVxdWFsVG8obV9kYi5nZXQoKSwgc3RvcEtleSwgJnN0b3BLZXkpKSAvLyBT
ZWVrIHRvIHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJP
cGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRv
cHRSZWYobmV3IEluZGV4Q3Vyc29ySW1wbChtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVu
LCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RT
ZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7
Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBEdW1teVRyYW5zYWN0aW9uIDogcHVibGljIElEQkJh
Y2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24geworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBiZWdp
bigpIHt9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpIHt9CisgICAgdmlydHVhbCB2b2lkIHJv
bGxiYWNrKCkge30KK307Cit9CisKKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5z
YWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlvbigpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBEdW1teVRyYW5zYWN0aW9uKCkpOyAvLyBGSVhNRTogSW1w
bGVtZW50IHByb3Blcmx5LgorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBFTkFCTEUoTEVWRUxEQikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERC
QmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWY4MTRmYWMzMmUzYjZmZWNlZDM0NDQ1NjhhMzA2
NzBmY2RjZTI4NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIElE
QkxldmVsREJCYWNraW5nU3RvcmVfaAorI2RlZmluZSBJREJMZXZlbERCQmFja2luZ1N0b3JlX2gK
KworI2lmIEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAiSURCQmFja2luZ1N0b3JlLmgiCisj
aW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgbGV2ZWxkYiB7CitjbGFzcyBEQjsK
K30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJREJMZXZlbERCQmFja2luZ1N0b3Jl
IDogcHVibGljIElEQkJhY2tpbmdTdG9yZSB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlPiBvcGVuKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBw
YXRoQmFzZSwgaW50NjRfdCBtYXhpbXVtU2l6ZSwgY29uc3QgU3RyaW5nJiBmaWxlSWRlbnRpZmll
ciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKik7CisgICAgdmlydHVhbCB+SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZSgpOworCisgICAgdmlydHVhbCBib29sIGV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRh
KGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5k
SWQpOworICAgIHZpcnR1YWwgYm9vbCBzZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZh
bGlkUm93SWQpOworCisgICAgdmlydHVhbCB2b2lkIGdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRh
dGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3Vu
ZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3Vu
ZEF1dG9JbmNyZW1lbnRGbGFncyk7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZU9iamVjdFN0b3Jl
KGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtl
eVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlk
KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVjdFN0
b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0
IFN0cmluZyYgdmFsdWUsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mKTsKKyAgICB2
aXJ0dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RT
dG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZpcnR1YWwgZG91YmxlIG5leHRBdXRvSW5jcmVtZW50
TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2
aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgUmVmUHRyPE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiYgZm91bmRSZWNvcmRIYW5kbGUpOworCisgICAgdmlydHVhbCBib29sIGZvckVh
Y2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpOworCisgICAgdmlydHVhbCB2b2lkIGdl
dEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3Rv
cjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKTsK
KyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
LCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVs
ZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCk7CisgICAgdmlydHVhbCBib29sIHB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZpcnR1
YWwgYm9vbCBkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5
VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0lu
SW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29y
PiBvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8Q3Vyc29yPiBvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJz
b3I6OkRpcmVjdGlvbik7CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNy
ZWF0ZVRyYW5zYWN0aW9uKCk7CisKK3ByaXZhdGU6CisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiwgbGV2ZWxkYjo6REIq
KTsKKworICAgIFN0cmluZyBtX2lkZW50aWZpZXI7CisgICAgUmVmUHRyPElEQkZhY3RvcnlCYWNr
ZW5kSW1wbD4gbV9mYWN0b3J5OworICAgIE93blB0cjxsZXZlbGRiOjpEQj4gbV9kYjsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworCisjZW5kaWYKKworI2VuZGlmIC8vIElEQkxldmVs
REJCYWNraW5nU3RvcmVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKaW5kZXggMDQzM2VkNzU3OGEyY2RjYjZjNDg2Yzk1Zjgx
MjIxYzZkZjI5ZGNiOS4uODFjZDZjNmQyMDM5YWYyYTZkMGE4MjI1NDU0YjFlZTY2ZDBjMDZkZiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwuY3BwCkBAIC01MCw4ICs1MCw5IEBAIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6On5J
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKCkKIHsKIH0KIAotSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdT
dG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgsIGJvb2wgYXV0b0luY3JlbWVudCkKK0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9i
amVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKICAgICA6IG1fYmFja2luZ1N0b3JlKGJh
Y2tpbmdTdG9yZSkKKyAgICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQogICAgICwgbV9pZChp
ZCkKICAgICAsIG1fbmFtZShuYW1lKQogICAgICwgbV9rZXlQYXRoKGtleVBhdGgpCkBAIC02MSw4
ICs2Miw5IEBAIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvCiAgICAgbG9hZEluZGV4ZXMoKTsKIH0K
IAotSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJ
REJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBT
dHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKK0lEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5n
U3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKICAgICA6IG1fYmFja2luZ1N0b3JlKGJh
Y2tpbmdTdG9yZSkKKyAgICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQogICAgICwgbV9pZChJ
bnZhbGlkSWQpCiAgICAgLCBtX25hbWUobmFtZSkKICAgICAsIG1fa2V5UGF0aChrZXlQYXRoKQpA
QCAtOTAsNyArOTIsNyBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmdldChQYXNz
UmVmUHRyPElEQktleT4gcHJwS2V5LCBQYXNzUmVmUHRyPElEQkNhbAogCiB2b2lkIElEQk9iamVj
dFN0b3JlQmFja2VuZEltcGw6OmdldEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVm
UHRyPElEQktleT4ga2V5LCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewot
ICAgIFN0cmluZyB3aXJlRGF0YSA9IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+Z2V0T2Jq
ZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPmlkKCksICprZXkpOworICAgIFN0cmluZyB3aXJl
RGF0YSA9IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVSZWNvcmQo
b2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksICprZXkpOwogICAg
IGlmICh3aXJlRGF0YS5pc051bGwoKSkgewogICAgICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhT
ZXJpYWxpemVkU2NyaXB0VmFsdWU6OnVuZGVmaW5lZFZhbHVlKCkpOwogICAgICAgICByZXR1cm47
CkBAIC0yMjcsOCArMjI5LDggQEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpwdXRJ
bnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjwKICAgICAgICAgaW5k
ZXhLZXlzLmFwcGVuZChrZXkucmVsZWFzZSgpKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IGRhdGFS
b3dJZCA9IEludmFsaWRJZDsKLSAgICBib29sIGlzRXhpc3RpbmdWYWx1ZSA9IG9iamVjdFN0b3Jl
LT5tX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5PYmplY3RTdG9yZShvYmplY3RTdG9yZS0+aWQo
KSwgKmtleSwgZGF0YVJvd0lkKTsKKyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RT
dG9yZVJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOworICAgIGJvb2wgaXNFeGlzdGluZ1ZhbHVl
ID0gb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbk9iamVjdFN0b3JlKG9i
amVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCByZWNvcmRI
YW5kbGUpOwogCiAgICAgaWYgKHB1dE1vZGUgPT0gQWRkT25seSAmJiBpc0V4aXN0aW5nVmFsdWUp
IHsKICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJ
REJEYXRhYmFzZUV4Y2VwdGlvbjo6Q09OU1RSQUlOVF9FUlIsICJLZXkgYWxyZWFkeSBleGlzdHMg
aW4gdGhlIG9iamVjdCBzdG9yZS4iKSk7CkBAIC0yMzcsMTQgKzIzOSw3IEBAIHZvaWQgSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbDo6cHV0SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCos
IFBhc3NSZWZQdHI8CiAKICAgICAvLyBCZWZvcmUgdGhpcyBwb2ludCwgZG9uJ3QgZG8gYW55IG11
dGF0aW9uLiAgQWZ0ZXIgdGhpcyBwb2ludCwgcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGluIGNh
c2Ugb2YgZXJyb3IuCiAKLSAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0
T2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPmlkKCksICprZXksIHZhbHVlLT50b1dpcmVT
dHJpbmcoKSwgZGF0YVJvd0lkLCBkYXRhUm93SWQgPT0gSW52YWxpZElkKSkgewotICAgICAgICAv
LyBGSVhNRTogVGhlIEluZGV4ZWQgRGF0YWJhc2Ugc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZl
IGFuIGVycm9yIGNvZGUgZGVkaWNhdGVkIHRvIEkvTyBlcnJvcnMuCi0gICAgICAgIGNhbGxiYWNr
cy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246
OlVOS05PV05fRVJSLCAiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlLiIpKTsK
LSAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXhEYXRhRm9y
UmVjb3JkKGRhdGFSb3dJZCkpIHsKKyAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9y
ZS0+cHV0T2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmUtPmlkKCksICprZXksIHZhbHVlLT50b1dpcmVTdHJpbmcoKSwgcmVjb3JkSGFuZGxlKSkg
ewogICAgICAgICAvLyBGSVhNRTogVGhlIEluZGV4ZWQgRGF0YWJhc2Ugc3BlY2lmaWNhdGlvbiBk
b2VzIG5vdCBoYXZlIGFuIGVycm9yIGNvZGUgZGVkaWNhdGVkIHRvIEkvTyBlcnJvcnMuCiAgICAg
ICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJh
c2VFeGNlcHRpb246OlVOS05PV05fRVJSLCAiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBz
dG9yYWdlLiIpKTsKICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7CkBAIC0yNTUsNyArMjUw
LDE1IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cHV0SW50ZXJuYWwoU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8CiAgICAgZm9yIChJbmRleE1hcDo6aXRlcmF0
b3IgaXQgPSBvYmplY3RTdG9yZS0+bV9pbmRleGVzLmJlZ2luKCk7IGl0ICE9IG9iamVjdFN0b3Jl
LT5tX2luZGV4ZXMuZW5kKCk7ICsraXQsICsraSkgewogICAgICAgICBpZiAoIWl0LT5zZWNvbmQt
Pmhhc1ZhbGlkSWQoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUaGUgaW5kZXggb2JqZWN0
IGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgeWV0
LgotICAgICAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0SW5kZXhEYXRh
Rm9yUmVjb3JkKGl0LT5zZWNvbmQtPmlkKCksICppbmRleEtleXNbaV0sIGRhdGFSb3dJZCkpIHsK
KworICAgICAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXhE
YXRhRm9yUmVjb3JkKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgp
LCBpdC0+c2Vjb25kLT5pZCgpLCAqcmVjb3JkSGFuZGxlKSkgeworICAgICAgICAgICAgLy8gRklY
TUU6IFRoZSBJbmRleGVkIERhdGFiYXNlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBl
cnJvciBjb2RlIGRlZGljYXRlZCB0byBJL08gZXJyb3JzLgorICAgICAgICAgICAgY2FsbGJhY2tz
LT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6
VU5LTk9XTl9FUlIsICJFcnJvciB3cml0aW5nIGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2UuIikpOwor
ICAgICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0
SW5kZXhEYXRhRm9yUmVjb3JkKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
LT5pZCgpLCBpdC0+c2Vjb25kLT5pZCgpLCAqaW5kZXhLZXlzW2ldLCAqcmVjb3JkSGFuZGxlKSkg
ewogICAgICAgICAgICAgLy8gRklYTUU6IFRoZSBJbmRleGVkIERhdGFiYXNlIHNwZWNpZmljYXRp
b24gZG9lcyBub3QgaGF2ZSBhbiBlcnJvciBjb2RlIGRlZGljYXRlZCB0byBJL08gZXJyb3JzLgog
ICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJ
REJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9XTl9FUlIsICJFcnJvciB3cml0aW5nIGRhdGEgdG8g
c3RhYmxlIHN0b3JhZ2UuIikpOwogICAgICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7CkBA
IC0yODMsMTMgKzI4NiwyMiBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmRlbGV0
ZUZ1bmN0aW9uKFBhc3NSZWZQdHI8SURCS2V5PiBwcnBLZXksIFBhc3NSZQogCiB2b2lkIElEQk9i
amVjdFN0b3JlQmFja2VuZEltcGw6OmRlbGV0ZUludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQ
YXNzUmVmUHRyPElEQktleT4ga2V5LCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tz
KQogewotICAgIGludDY0X3QgaWQ7Ci0gICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3Rv
cmUtPmtleUV4aXN0c0luT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPmlkKCksICprZXksIGlkKSkg
eworICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiBy
ZWNvcmRIYW5kbGU7CisgICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmtleUV4
aXN0c0luT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUt
PmlkKCksICprZXksIHJlY29yZEhhbmRsZSkpIHsKICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9y
KElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6Tk9UX0ZPVU5E
X0VSUiwgIktleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb2JqZWN0IHN0b3JlLiIpKTsKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIAotICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVs
ZXRlT2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPmlkKCksIGlkKTsKKyAgICBmb3IgKElu
ZGV4TWFwOjppdGVyYXRvciBpdCA9IG9iamVjdFN0b3JlLT5tX2luZGV4ZXMuYmVnaW4oKTsgaXQg
IT0gb2JqZWN0U3RvcmUtPm1faW5kZXhlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoIWl0
LT5zZWNvbmQtPmhhc1ZhbGlkSWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUaGUgaW5k
ZXggb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0
YWJhc2UgeWV0LgorCisgICAgICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5k
ZWxldGVJbmRleERhdGFGb3JSZWNvcmQob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmUtPmlkKCksIGl0LT5zZWNvbmQtPmlkKCksICpyZWNvcmRIYW5kbGUpKSB7CisgICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9iamVj
dFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3Rv
cmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksICpyZWNvcmRIYW5kbGUpOwogICAg
IGNhbGxiYWNrcy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6bnVsbFZhbHVlKCkp
OwogfQogCkBAIC0zMDksMjYgKzMyMSwyOCBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZElt
cGw6OmNsZWFyKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBwcnBDYWxsYmFja3MsIElEQgogCiB2
b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNsZWFySW50ZXJuYWwoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0
U3RvcmUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgb2JqZWN0
U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5jbGVhck9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5pZCgp
KTsKKyAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmNsZWFyT2JqZWN0U3RvcmUob2Jq
ZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCkpOwogICAgIGNhbGxiYWNr
cy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6dW5kZWZpbmVkVmFsdWUoKSk7CiB9
CiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBQb3B1bGF0ZUluZGV4Q2FsbGJhY2sgOiBwdWJsaWMgSURC
QmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrIHsKIHB1YmxpYzoKLSAgICBQ
b3B1bGF0ZUluZGV4Q2FsbGJhY2soSURCQmFja2luZ1N0b3JlJiBiYWNraW5nU3RvcmUsIGNvbnN0
IFN0cmluZyYgaW5kZXhLZXlQYXRoLCBpbnQ2NF90IGluZGV4SWQpCisgICAgUG9wdWxhdGVJbmRl
eENhbGxiYWNrKElEQkJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlLCBjb25zdCBTdHJpbmcmIGlu
ZGV4S2V5UGF0aCwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCkKICAgICAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCiAg
ICAgICAgICwgbV9pbmRleEtleVBhdGgoaW5kZXhLZXlQYXRoKQorICAgICAgICAsIG1fZGF0YWJh
c2VJZChkYXRhYmFzZUlkKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlk
KQogICAgICAgICAsIG1faW5kZXhJZChpbmRleElkKQogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0
dWFsIGJvb2wgY2FsbGJhY2soaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCwgY29uc3QgU3RyaW5n
JiB2YWx1ZSkKKyAgICB2aXJ0dWFsIGJvb2wgY2FsbGJhY2soY29uc3QgSURCQmFja2luZ1N0b3Jl
OjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYgcmVjb3JkSGFuZGxlLCBjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgIHsKICAgICAgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gb2JqZWN0
VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKHZhbHVlKTsKICAg
ICAgICAgUmVmUHRyPElEQktleT4gaW5kZXhLZXkgPSBmZXRjaEtleUZyb21LZXlQYXRoKG9iamVj
dFZhbHVlLmdldCgpLCBtX2luZGV4S2V5UGF0aCk7CiAKLSAgICAgICAgaWYgKCFtX2JhY2tpbmdT
dG9yZS5wdXRJbmRleERhdGFGb3JSZWNvcmQobV9pbmRleElkLCAqaW5kZXhLZXksIG9iamVjdFN0
b3JlRGF0YUlkKSkKKyAgICAgICAgaWYgKCFtX2JhY2tpbmdTdG9yZS5wdXRJbmRleERhdGFGb3JS
ZWNvcmQobV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsIG1faW5kZXhJZCwgKmluZGV4S2V5
LCByZWNvcmRIYW5kbGUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHJl
dHVybiB0cnVlOwpAQCAtMzM3LDE0ICszNTEsMTYgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBJ
REJCYWNraW5nU3RvcmUmIG1fYmFja2luZ1N0b3JlOwogICAgIGNvbnN0IFN0cmluZyYgbV9pbmRl
eEtleVBhdGg7CisgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVj
dFN0b3JlSWQ7CiAgICAgaW50NjRfdCBtX2luZGV4SWQ7CiB9OwogfQogCi1zdGF0aWMgYm9vbCBw
b3B1bGF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgpCitz
dGF0aWMgYm9vbCBwb3B1bGF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlLCBp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBjb25zdCBTdHJpbmcmIGluZGV4S2V5UGF0aCkKIHsKLSAgICBQb3B1bGF0ZUluZGV4Q2FsbGJh
Y2sgY2FsbGJhY2soYmFja2luZ1N0b3JlLCBpbmRleEtleVBhdGgsIGluZGV4SWQpOwotICAgIGlm
ICghYmFja2luZ1N0b3JlLmZvckVhY2hPYmplY3RTdG9yZVJlY29yZChvYmplY3RTdG9yZUlkLCBj
YWxsYmFjaykpCisgICAgUG9wdWxhdGVJbmRleENhbGxiYWNrIGNhbGxiYWNrKGJhY2tpbmdTdG9y
ZSwgaW5kZXhLZXlQYXRoLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAg
ICBpZiAoIWJhY2tpbmdTdG9yZS5mb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgY2FsbGJhY2spKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0
dXJuIHRydWU7CiB9CkBAIC0zNjAsNyArMzc2LDcgQEAgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tl
bmRJbnRlcmZhY2U+IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZUluZGV4KGNvbnMK
ICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgUmVmUHRyPElEQkluZGV4QmFja2VuZElt
cGw+IGluZGV4ID0gSURCSW5kZXhCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdl
dCgpLCBuYW1lLCBtX25hbWUsIGtleVBhdGgsIHVuaXF1ZSk7CisgICAgUmVmUHRyPElEQkluZGV4
QmFja2VuZEltcGw+IGluZGV4ID0gSURCSW5kZXhCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2lu
Z1N0b3JlLmdldCgpLCBtX2RhdGFiYXNlSWQsIHRoaXMsIG5hbWUsIG1fbmFtZSwga2V5UGF0aCwg
dW5pcXVlKTsKICAgICBBU1NFUlQoaW5kZXgtPm5hbWUoKSA9PSBuYW1lKTsKIAogICAgIFJlZlB0
cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSA9IHRoaXM7CkBAIC0zNzgs
MTQgKzM5NCwxNCBAQCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEludGVyZmFjZT4gSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlSW5kZXgoY29ucwogdm9pZCBJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsOjpjcmVhdGVJbmRleEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNz
UmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGluZGV4LCBQYXNzUmVmUHRyPElEQlRyYW5zYWN0
aW9uQmFja2VuZEludGVyZmFjZT4gdHJhbnNhY3Rpb24pCiB7CiAgICAgaW50NjRfdCBpZDsKLSAg
ICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+Y3JlYXRlSW5kZXgob2JqZWN0U3Rv
cmUtPm1faWQsIGluZGV4LT5uYW1lKCksIGluZGV4LT5rZXlQYXRoKCksIGluZGV4LT51bmlxdWUo
KSwgaWQpKSB7CisgICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmNyZWF0ZUlu
ZGV4KG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCBpbmRleC0+
bmFtZSgpLCBpbmRleC0+a2V5UGF0aCgpLCBpbmRleC0+dW5pcXVlKCksIGlkKSkgewogICAgICAg
ICB0cmFuc2FjdGlvbi0+YWJvcnQoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlu
ZGV4LT5zZXRJZChpZCk7CiAKLSAgICBpZiAoIXBvcHVsYXRlSW5kZXgoKm9iamVjdFN0b3JlLT5t
X2JhY2tpbmdTdG9yZSwgb2JqZWN0U3RvcmUtPm1faWQsIGlkLCBpbmRleC0+a2V5UGF0aCgpKSkg
eworICAgIGlmICghcG9wdWxhdGVJbmRleCgqb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLCBv
YmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+bV9pZCwgaWQsIGluZGV4LT5r
ZXlQYXRoKCkpKSB7CiAgICAgICAgIHRyYW5zYWN0aW9uLT5hYm9ydCgpOwogICAgICAgICByZXR1
cm47CiAgICAgfQpAQCAtNDI4LDcgKzQ0NCw3IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6ZGVsZXRlSW5kZXgoY29uc3QgU3RyaW5nJiBuYW1lLCBJREJUcmFuc2FjdGlvbkJhCiAK
IHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6ZGVsZXRlSW5kZXhJbnRlcm5hbChTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
PiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBpbmRleCwgUGFz
c1JlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2U+IHRyYW5zYWN0aW9uKQogewot
ICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXgoaW5kZXgtPmlkKCkp
OworICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXgob2JqZWN0U3Rv
cmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksIGluZGV4LT5pZCgpKTsKICAgICB0
cmFuc2FjdGlvbi0+ZGlkQ29tcGxldGVUYXNrRXZlbnRzKCk7CiB9CiAKQEAgLTQ0Niw3ICs0NjIs
NyBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6Om9wZW5DdXJzb3JJbnRlcm5hbChT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzcwogewogICAgIElEQkN1cnNvcjo6RGlyZWN0aW9u
IGRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PElEQkN1cnNvcjo6RGlyZWN0aW9uPih0bXBEaXJlY3Rp
b24pOwogCi0gICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBiYWNraW5nU3RvcmVD
dXJzb3IgPSBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPm9wZW5PYmplY3RTdG9yZUN1cnNv
cihvYmplY3RTdG9yZS0+aWQoKSwgcmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CisgICAgUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBiYWNraW5nU3RvcmVDdXJzb3IgPSBvYmplY3RTdG9y
ZS0+bV9iYWNraW5nU3RvcmUtPm9wZW5PYmplY3RTdG9yZUN1cnNvcihvYmplY3RTdG9yZS0+bV9k
YXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgcmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CiAg
ICAgaWYgKCFiYWNraW5nU3RvcmVDdXJzb3IpIHsKICAgICAgICAgY2FsbGJhY2tzLT5vblN1Y2Nl
c3MoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpudWxsVmFsdWUoKSk7CiAgICAgICAgIHJldHVybjsK
QEAgLTQ2MiwxNCArNDc4LDE0IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6bG9h
ZEluZGV4ZXMoKQogICAgIFZlY3RvcjxTdHJpbmc+IG5hbWVzOwogICAgIFZlY3RvcjxTdHJpbmc+
IGtleVBhdGhzOwogICAgIFZlY3Rvcjxib29sPiB1bmlxdWVGbGFnczsKLSAgICBtX2JhY2tpbmdT
dG9yZS0+Z2V0SW5kZXhlcyhtX2lkLCBpZHMsIG5hbWVzLCBrZXlQYXRocywgdW5pcXVlRmxhZ3Mp
OworICAgIG1fYmFja2luZ1N0b3JlLT5nZXRJbmRleGVzKG1fZGF0YWJhc2VJZCwgbV9pZCwgaWRz
LCBuYW1lcywga2V5UGF0aHMsIHVuaXF1ZUZsYWdzKTsKIAogICAgIEFTU0VSVChuYW1lcy5zaXpl
KCkgPT0gaWRzLnNpemUoKSk7CiAgICAgQVNTRVJUKGtleVBhdGhzLnNpemUoKSA9PSBpZHMuc2l6
ZSgpKTsKICAgICBBU1NFUlQodW5pcXVlRmxhZ3Muc2l6ZSgpID09IGlkcy5zaXplKCkpOwogCiAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpZHMuc2l6ZSgpOyBpKyspCi0gICAgICAgIG1faW5k
ZXhlcy5zZXQobmFtZXNbaV0sIElEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdT
dG9yZS5nZXQoKSwgaWRzW2ldLCBuYW1lc1tpXSwgbV9uYW1lLCBrZXlQYXRoc1tpXSwgdW5pcXVl
RmxhZ3NbaV0pKTsKKyAgICAgICAgbV9pbmRleGVzLnNldChuYW1lc1tpXSwgSURCSW5kZXhCYWNr
ZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBtX2RhdGFiYXNlSWQsIHRoaXMs
IGlkc1tpXSwgbmFtZXNbaV0sIG1fbmFtZSwga2V5UGF0aHNbaV0sIHVuaXF1ZUZsYWdzW2ldKSk7
CiB9CiAKIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cmVtb3ZlSW5kZXhGcm9tTWFw
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGluZGV4
KQpAQCAtNDkwLDcgKzUwNiw3IEBAIFBhc3NSZWZQdHI8SURCS2V5PiBJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsOjpnZW5BdXRvSW5jcmVtZW50S2V5KCkKICAgICBpZiAobV9hdXRvSW5jcmVtZW50
TnVtYmVyID4gMCkKICAgICAgICAgcmV0dXJuIElEQktleTo6Y3JlYXRlTnVtYmVyKG1fYXV0b0lu
Y3JlbWVudE51bWJlcisrKTsKIAotICAgIG1fYXV0b0luY3JlbWVudE51bWJlciA9IHN0YXRpY19j
YXN0PGludD4obV9iYWNraW5nU3RvcmUtPm5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGlkKCkpKTsK
KyAgICBtX2F1dG9JbmNyZW1lbnROdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fYmFja2luZ1N0
b3JlLT5uZXh0QXV0b0luY3JlbWVudE51bWJlcihtX2RhdGFiYXNlSWQsIGlkKCkpKTsKICAgICBy
ZXR1cm4gSURCS2V5OjpjcmVhdGVOdW1iZXIobV9hdXRvSW5jcmVtZW50TnVtYmVyKyspOwogfQog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5oCmluZGV4IDQ0NzlkMWUwZDc0YmYwNjgwOTI0N2Q4ZjJkNWZjYjZiNjc3NmI2ZTAuLmVjZTNm
ZTRmNTg2N2M5OWI1ODRjNzZkOWQ0NTI2MWE1N2U3YzJlYzUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5oCkBAIC00MiwxMyArNDIs
MTMgQEAgY2xhc3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKIAogY2xhc3MgSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbCA6IHB1YmxpYyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbnRlcmZhY2Ugewog
cHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+
IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBjcmVhdGUo
SURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbChiYWNraW5nU3RvcmUsIGlkLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5j
cmVtZW50KSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbChiYWNraW5nU3RvcmUsIGRhdGFiYXNlSWQsIGlkLCBuYW1lLCBrZXlQYXRoLCBhdXRv
SW5jcmVtZW50KSk7CiAgICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBjcmVhdGUo
SURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkK
ICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbChiYWNraW5nU3RvcmUsIG5hbWUsIGtleVBhdGgsIGF1dG9JbmNyZW1lbnQpKTsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKGJhY2tpbmdT
dG9yZSwgZGF0YWJhc2VJZCwgbmFtZSwga2V5UGF0aCwgYXV0b0luY3JlbWVudCkpOwogICAgIH0K
ICAgICB2aXJ0dWFsIH5JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKCk7CiAKQEAgLTU5LDYgKzU5
LDcgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gbV9pZDsKICAgICB9CiAgICAgdm9pZCBzZXRJ
ZChpbnQ2NF90IGlkKSB7IG1faWQgPSBpZDsgfQorICAgIGludDY0X3QgZGF0YWJhc2VJZCgpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VJZDsgfQogCiAgICAgdmlydHVhbCBTdHJpbmcgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQogICAgIHZpcnR1YWwgU3RyaW5nIGtleVBhdGgoKSBj
b25zdCB7IHJldHVybiBtX2tleVBhdGg7IH0KQEAgLTc3LDggKzc4LDggQEAgcHVibGljOgogICAg
IHZpcnR1YWwgdm9pZCBvcGVuQ3Vyc29yKFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IHJhbmdlLCB1
bnNpZ25lZCBzaG9ydCBkaXJlY3Rpb24sIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiwgSURCVHJh
bnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiwgRXhjZXB0aW9uQ29kZSYpOwogCiBwcml2YXRlOgot
ICAgIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwgaW50NjRfdCBp
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0lu
Y3JlbWVudCk7Ci0gICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUq
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5j
cmVtZW50KTsKKyAgICBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSos
IGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCk7CisgICAgSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQp
OwogCiAgICAgdm9pZCBsb2FkSW5kZXhlcygpOwogICAgIFBhc3NSZWZQdHI8SURCS2V5PiBnZW5B
dXRvSW5jcmVtZW50S2V5KCk7CkBAIC05OSw2ICsxMDAsNyBAQCBwcml2YXRlOgogCiAgICAgUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3RvcmU7CiAKKyAgICBpbnQ2NF90IG1fZGF0
YWJhc2VJZDsKICAgICBpbnQ2NF90IG1faWQ7CiAgICAgU3RyaW5nIG1fbmFtZTsKICAgICBTdHJp
bmcgbV9rZXlQYXRoOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxp
dGVCYWNraW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNr
aW5nU3RvcmUuY3BwCmluZGV4IGU0M2I3YTM2MDY5NTFlM2QyY2E2NTMwZTQ2YzFmOWEyZGYyZjUx
Y2QuLjIzNTRkMjBjMWU3YTkyODgxMjZlNTkxNDQzNjMxMjkxODMzY2VkYmIgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcAorKysgYi9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTI2Myw3
ICsyNjMsNyBAQCB2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGlu
dDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JgogICAgIH0KIH0KIAotYm9vbCBJREJT
UUxpdGVCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwg
Y29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQorYm9vbCBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50
NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVy
eShtX2RiLCAiSU5TRVJUIElOVE8gT2JqZWN0U3RvcmVzIChuYW1lLCBrZXlQYXRoLCBkb0F1dG9J
bmNyZW1lbnQsIGRhdGFiYXNlSWQpIFZBTFVFUyAoPywgPywgPywgPykiKTsKICAgICBpZiAocXVl
cnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQpAQCAtMjkxLDcgKzI5MSw3IEBAIHN0YXRpYyB2
b2lkIGRvRGVsZXRlKFNRTGl0ZURhdGFiYXNlJiBkYiwgY29uc3QgY2hhciogc3FsLCBpbnQ2NF90
IGlkKQogICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBo
YW5kbGluZy4KIH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0
b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpk
ZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCkKIHsKICAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVzIFdIRVJF
IGlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwogICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJP
TSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iLCBvYmplY3RTdG9yZUlk
KTsKQEAgLTM3Myw3ICszNzMsNyBAQCBzdGF0aWMgU3RyaW5nIHVwcGVyQ3Vyc29yV2hlcmVGcmFn
bWVudChjb25zdCBJREJLZXkmIGtleSwgU3RyaW5nIGNvbXBhcmlzb25PcGVyYQogICAgIHJldHVy
biAiIjsKIH0KIAotU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKK1N0cmluZyBJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKICAgICBT
UUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBrZXlTdHJpbmcsIGtleURhdGUsIGtl
eU51bWJlciwgdmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9
ID8gQU5EICIgKyB3aGVyZVN5bnRheEZvcktleShrZXkpKTsKICAgICBib29sIG9rID0gcXVlcnku
cHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwpAQCAtNDIyLDU4ICs0MjIsNjMgQEAgc3RhdGljIHZv
aWQgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMoU1FMaXRlU3RhdGVtZW50JiBxdWVyeSwgaW50IGJh
c2VDb2x1bW4sIGNvbnMKICAgICB9CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpw
dXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYg
a2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93
SWQpCituYW1lc3BhY2UgeworY2xhc3MgU1FMaXRlUmVjb3JkSGFuZGxlIDogcHVibGljIElEQkJh
Y2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUgeworcHVibGljOgorICAgIFNRTGl0
ZVJlY29yZEhhbmRsZShpbnQ2NF90IGlkKSA6IG1faWQoaWQpIHt9CisgICAgaW50NjRfdCBpZCgp
IGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX2lkOworfTsK
K30KKworYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtl
eSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYg
cmVjb3JkSGFuZGxlKQogewotICAgIFN0cmluZyBzcWwgPSAhaW52YWxpZFJvd0lkID8gIlVQREFU
RSBPYmplY3RTdG9yZURhdGEgU0VUIGtleVN0cmluZyA9ID8sIGtleURhdGUgPSA/LCBrZXlOdW1i
ZXIgPSA/LCB2YWx1ZSA9ID8gV0hFUkUgaWQgPSA/IgotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDogIklOU0VSVCBJTlRPIE9iamVjdFN0b3JlRGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRl
LCBrZXlOdW1iZXIsIHZhbHVlLCBvYmplY3RTdG9yZUlkKSBWQUxVRVMgKD8sID8sID8sID8sID8p
IjsKKyAgICBTUUxpdGVSZWNvcmRIYW5kbGUqIHNxbGl0ZVJlY29yZEhhbmRsZSA9IHN0YXRpY19j
YXN0PFNRTGl0ZVJlY29yZEhhbmRsZSo+KHJlY29yZEhhbmRsZS5nZXQoKSk7CisKKyAgICBTdHJp
bmcgc3FsID0gc3FsaXRlUmVjb3JkSGFuZGxlID8gIlVQREFURSBPYmplY3RTdG9yZURhdGEgU0VU
IGtleVN0cmluZyA9ID8sIGtleURhdGUgPSA/LCBrZXlOdW1iZXIgPSA/LCB2YWx1ZSA9ID8gV0hF
UkUgaWQgPSA/IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSU5TRVJU
IElOVE8gT2JqZWN0U3RvcmVEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgdmFs
dWUsIG9iamVjdFN0b3JlSWQpIFZBTFVFUyAoPywgPywgPywgPywgPykiOwogICAgIFNRTGl0ZVN0
YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FM
UmVzdWx0T2spCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGJpbmRLZXlUb1F1ZXJ5V2l0
aE51bGxzKHF1ZXJ5LCAxLCBrZXkpOwogICAgIHF1ZXJ5LmJpbmRCbG9iKDQsIHZhbHVlKTsKLSAg
ICBpZiAoIWludmFsaWRSb3dJZCkKLSAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIHJvd0lkKTsK
KyAgICBpZiAoc3FsaXRlUmVjb3JkSGFuZGxlKQorICAgICAgICBxdWVyeS5iaW5kSW50NjQoNSwg
c3FsaXRlUmVjb3JkSGFuZGxlLT5pZCgpKTsKICAgICBlbHNlCiAgICAgICAgIHF1ZXJ5LmJpbmRJ
bnQ2NCg1LCBvYmplY3RTdG9yZUlkKTsKIAogICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVz
dWx0RG9uZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKGludmFsaWRSb3dJZCkK
LSAgICAgICAgcm93SWQgPSBtX2RiLmxhc3RJbnNlcnRSb3dJRCgpOworICAgIGlmICghc3FsaXRl
UmVjb3JkSGFuZGxlKQorICAgICAgICByZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgU1FMaXRl
UmVjb3JkSGFuZGxlKG1fZGIubGFzdEluc2VydFJvd0lEKCkpKTsKIAogICAgIHJldHVybiB0cnVl
OwogfQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZShpbnQ2
NF90IG9iamVjdFN0b3JlSWQpCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y2xlYXJPYmpl
Y3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKICAg
ICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3Jl
RGF0YUlkIElOIChTRUxFQ1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3Rv
cmVJZCA9ID8pIiwgb2JqZWN0U3RvcmVJZCk7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBG
Uk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3Jl
SWQpOwogfQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCkKK3ZvaWQgSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJl
Y29yZEhhbmRsZSkKIHsKKyAgICBjb25zdCBTUUxpdGVSZWNvcmRIYW5kbGUmIHNxbGl0ZVJlY29y
ZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IFNRTGl0ZVJlY29yZEhhbmRsZSY+KHJlY29yZEhh
bmRsZSk7CisKICAgICBTUUxpdGVTdGF0ZW1lbnQgb3NRdWVyeShtX2RiLCAiREVMRVRFIEZST00g
T2JqZWN0U3RvcmVEYXRhIFdIRVJFIGlkID0gPyIpOwogICAgIGJvb2wgb2sgPSBvc1F1ZXJ5LnBy
ZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJ
WE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/CiAKLSAgICBvc1F1ZXJ5LmJpbmRJbnQ2NCgxLCBv
YmplY3RTdG9yZURhdGFJZCk7CisgICAgb3NRdWVyeS5iaW5kSW50NjQoMSwgc3FsaXRlUmVjb3Jk
SGFuZGxlLmlkKCkpOwogCiAgICAgb2sgPSBvc1F1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25l
OwogICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBpbmRl
eFF1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRh
SWQgPSA/Iik7Ci0gICAgb2sgPSBpbmRleFF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsK
LSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxp
bmc/Ci0KLSAgICBpbmRleFF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7Ci0K
LSAgICBvayA9IGluZGV4UXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7Ci0gICAgQVNTRVJU
X1VOVVNFRChvaywgb2spOwogfQogCi1kb3VibGUgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpuZXh0
QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpCitkb3VibGUgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnko
bV9kYiwgIlNFTEVDVCBtYXgoa2V5TnVtYmVyKSArIDEgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hF
UkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EIGtleVN0cmluZyBJUyBOVUxMIEFORCBrZXlEYXRlIElT
IE5VTEwiKTsKICAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwpA
QCAtNDg3LDcgKzQ5Miw3IEBAIGRvdWJsZSBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om5leHRBdXRv
SW5jcmVtZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKICAgICByZXR1cm4gcXVlcnku
Z2V0Q29sdW1uRG91YmxlKDApOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5
RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYg
a2V5LCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKQorYm9vbCBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBSZWZQdHI8T2JqZWN0U3RvcmVS
ZWNvcmRIYW5kbGU+JiBmb3VuZFJlY29yZEhhbmRsZSkKIHsKICAgICBTdHJpbmcgc3FsID0gU3Ry
aW5nKCJTRUxFQ1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9
ID8gQU5EICIpICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KTsKICAgICBTUUxpdGVTdGF0ZW1lbnQg
cXVlcnkobV9kYiwgc3FsKTsKQEAgLTUwMCwxMSArNTA1LDExIEBAIGJvb2wgSURCU1FMaXRlQmFj
a2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QKICAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgZm91bmRPYmplY3RTdG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVt
bkludDY0KDApOworICAgIGZvdW5kUmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IFNRTGl0ZVJl
Y29yZEhhbmRsZShxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKSkpOwogICAgIHJldHVybiB0cnVlOwog
fQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYgY2FsbGJh
Y2spCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJl
Y29yZENhbGxiYWNrJiBjYWxsYmFjaykKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9k
YiwgIlNFTEVDVCBpZCwgdmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3Rv
cmVJZCA9ID8iKTsKICAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQpAQCAt
NTE1LDE0ICs1MjAsMTUgQEAgYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmpl
Y3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamUKICAgICB3aGlsZSAocXVl
cnkuc3RlcCgpID09IFNRTFJlc3VsdFJvdykgewogICAgICAgICBpbnQ2NF90IG9iamVjdFN0b3Jl
RGF0YUlkID0gcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9
IHF1ZXJ5LmdldENvbHVtbkJsb2JBc1N0cmluZygxKTsKLSAgICAgICAgaWYgKCFjYWxsYmFjay5j
YWxsYmFjayhvYmplY3RTdG9yZURhdGFJZCwgdmFsdWUpKQorICAgICAgICBSZWZQdHI8U1FMaXRl
UmVjb3JkSGFuZGxlPiByZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgU1FMaXRlUmVjb3JkSGFu
ZGxlKG9iamVjdFN0b3JlRGF0YUlkKSk7CisgICAgICAgIGlmICghY2FsbGJhY2suY2FsbGJhY2so
KnJlY29yZEhhbmRsZSwgdmFsdWUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
IAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0
SW5kZXhlcyhpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMs
IFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRo
cywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQordm9pZCBJREJTUUxpdGVCYWNraW5n
U3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVz
LCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1
ZUZsYWdzKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIGlkLCBu
YW1lLCBrZXlQYXRoLCBpc1VuaXF1ZSBGUk9NIEluZGV4ZXMgV0hFUkUgb2JqZWN0U3RvcmVJZCA9
ID8iKTsKICAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwpAQCAt
NTQzLDcgKzU0OSw3IEBAIHZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmCiAgICAgfQogfQogCi1ib29s
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1
ZSwgaW50NjRfdCYgaW5kZXhJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJ
bmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3Qm
IGluZGV4SWQpCiB7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQgSU5U
TyBJbmRleGVzIChvYmplY3RTdG9yZUlkLCBuYW1lLCBrZXlQYXRoLCBpc1VuaXF1ZSkgVkFMVUVT
ICg/LCA/LCA/LCA/KSIpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
CkBAIC01NjEsMzYgKzU2Nyw0MSBAQCBib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRl
SW5kZXgoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbQogICAgIHJldHVy
biB0cnVlOwogfQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoaW50
NjRfdCBpbmRleElkKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQp
CiB7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4ZXMgV0hFUkUgaWQgPSA/
IiwgaW5kZXhJZCk7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBX
SEVSRSBpbmRleElkID0gPyIsIGluZGV4SWQpOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
JiBrZXksIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBP
YmplY3RTdG9yZVJlY29yZEhhbmRsZSYgcmVjb3JkSGFuZGxlKQogeworICAgIGNvbnN0IFNRTGl0
ZVJlY29yZEhhbmRsZSYgc3FsaXRlUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU1FM
aXRlUmVjb3JkSGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKKwogICAgIFNRTGl0ZVN0YXRlbWVudCBx
dWVyeShtX2RiLCAiSU5TRVJUIElOVE8gSW5kZXhEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtl
eU51bWJlciwgaW5kZXhJZCwgb2JqZWN0U3RvcmVEYXRhSWQpIFZBTFVFUyAoPywgPywgPywgPywg
PykiKTsKICAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICBiaW5kS2V5VG9RdWVyeVdpdGhOdWxscyhxdWVyeSwgMSwga2V5
KTsKICAgICBxdWVyeS5iaW5kSW50NjQoNCwgaW5kZXhJZCk7Ci0gICAgcXVlcnkuYmluZEludDY0
KDUsIG9iamVjdFN0b3JlRGF0YUlkKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoNSwgc3FsaXRlUmVj
b3JkSGFuZGxlLmlkKCkpOwogCiAgICAgcmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHRE
b25lOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9y
UmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlJiByZWNvcmRIYW5kbGUpCiB7Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIs
ICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7Cisg
ICAgY29uc3QgU1FMaXRlUmVjb3JkSGFuZGxlJiBzcWxpdGVSZWNvcmRIYW5kbGUgPSBzdGF0aWNf
Y2FzdDxjb25zdCBTUUxpdGVSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOworCisgICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2Jq
ZWN0U3RvcmVEYXRhSWQgPSA/IEFORCBpbmRleElkID0gPyIpOwogICAgIGlmIChxdWVyeS5wcmVw
YXJlKCkgIT0gU1FMUmVzdWx0T2spCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHF1ZXJ5
LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7CisgICAgcXVlcnkuYmluZEludDY0KDEs
IHNxbGl0ZVJlY29yZEhhbmRsZS5pZCgpKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoMiwgaW5kZXhJ
ZCk7CiAgICAgcmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwogfQogCi1TdHJp
bmcgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IElEQktleSYga2V5KQorU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7CiAgICAgU3RyaW5nIHNxbCA9
IFN0cmluZygiU0VMRUNUICIpCiAgICAgICAgICAgICAgICAgICsgIk9iamVjdFN0b3JlRGF0YS52
YWx1ZSAiCkBAIC02MjksNyArNjQwLDcgQEAgc3RhdGljIFBhc3NSZWZQdHI8SURCS2V5PiBrZXlG
cm9tUXVlcnkoU1FMaXRlU3RhdGVtZW50JiBxdWVyeSwgaW50IGJhc2VDb2x1bW4pCiAgICAgcmV0
dXJuIElEQktleTo6Y3JlYXRlTnVsbCgpOwogfQogCi1QYXNzUmVmUHRyPElEQktleT4gSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmIGtleSkKK1Bhc3NSZWZQdHI8SURCS2V5PiBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKICAgICBT
dHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgIikKICAgICAgICAgICAgICAgICAgKyAiT2JqZWN0
U3RvcmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtleURhdGUsIE9iamVjdFN0b3Jl
RGF0YS5rZXlOdW1iZXIgIgpAQCAtNjUxLDcgKzY2Miw3IEBAIFBhc3NSZWZQdHI8SURCS2V5PiBJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGluZGV4
SWQsCiAgICAgcmV0dXJuIGZvdW5kS2V5LnJlbGVhc2UoKTsKIH0KIAotYm9vbCBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmIGtleSkKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IElEQktleSYga2V5KQogewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBp
ZCBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRleElkID0gPyBBTkQgIikgKyB3aGVyZVN5bnRheEZv
cktleShrZXkpOwogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwpAQCAtNjgy
LDcgKzY5Myw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXko
KSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5
PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CiAgICAgdmlydHVhbCBTdHJp
bmcgdmFsdWUoKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkg
PSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3Jl
UmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpID0gMDsKICAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJl
bnRSb3coKSA9IDA7CkBAIC03NDEsNyArNzUyLDcgQEAgcHVibGljOgogCiAgICAgLy8gQ3Vyc29y
SW1wbENvbW1vbi4KICAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fY3VycmVu
dFZhbHVlOyB9Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyByZXR1
cm4gbV9jdXJyZW50SWQ7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IHJl
dHVybiBhZG9wdFJlZihuZXcgU1FMaXRlUmVjb3JkSGFuZGxlKG1fY3VycmVudElkKSk7IH0KICAg
ICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBy
ZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpOwogICAgIHZpcnR1
YWwgYm9vbCBjdXJyZW50Um93RXhpc3RzKCk7CkBAIC03NzksNyArNzkwLDcgQEAgcHVibGljOgog
ICAgIC8vIEN1cnNvckltcGxDb21tb24KICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBw
cmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50UHJpbWFyeUtleTsgfQogICAgIHZpcnR1YWwg
U3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIFN0cmluZygpOyB9
Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgaW50NjRfdCBp
bmRleERhdGFJZCgpIHsgcmV0dXJuIG1fY3VycmVudElkOyB9CiAgICAgdmlydHVhbCB2b2lkIGxv
YWRDdXJyZW50Um93KCk7CiAgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKQEAg
LTgxNyw3ICs4MjgsNyBAQCBwdWJsaWM6CiAgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgogICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRQ
cmltYXJ5S2V5OyB9CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJl
bnRWYWx1ZTsgfQotICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElE
QkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQogICAgIHZpcnR1
YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpOwogICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhp
c3RzKCk7CkBAIC04NDksNyArODYwLDcgQEAgYm9vbCBJbmRleEN1cnNvckltcGw6OmN1cnJlbnRS
b3dFeGlzdHMoKQogCiB9IC8vIG5hbWVzcGFjZQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5n
ZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQogewogICAgIGJvb2wgbG93ZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOwogICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdl
ICYmIHJhbmdlLT51cHBlcigpOwpAQCAtODg2LDcgKzg5Nyw3IEBAIFBhc3NSZWZQdHI8SURCQmFj
a2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3Jl
Q3Vyc29yCiAgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7CiB9CiAKLVBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5
Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJz
b3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICAg
ICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgSW5kZXhEYXRhLmlkLCBJbmRleERhdGEua2V5
U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgIikKICAgICAg
ICAgICAgICAgICAgKyAoIk9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3JlRGF0
YS5rZXlEYXRlLCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIpCkBAIC05MjYsNyArOTM3LDcg
QEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCU1FMaXRlQmFja2luZ1N0
b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW4KICAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsK
IH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5n
ZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK1Bhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vy
c29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGly
ZWN0aW9uKQogewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBJbmRleERhdGEuaWQs
IEluZGV4RGF0YS5rZXlTdHJpbmcsIEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEua2V5TnVt
YmVyLCAiKQogICAgICAgICAgICAgICAgICArICgiT2JqZWN0U3RvcmVEYXRhLnZhbHVlLCBPYmpl
Y3RTdG9yZURhdGEua2V5U3RyaW5nLCBPYmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2JqZWN0U3Rv
cmVEYXRhLmtleU51bWJlciAiKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJTUUxpdGVCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRl
QmFja2luZ1N0b3JlLmgKaW5kZXggZmUwYzZjMTc1MTZkZTllNDBmYTk3ODdiMWNlNWYwZTYzMjBi
NTliNy4uMDY1NDg5NTdhZGNlNjViZWZkMDk3NTY2NjMxOTU1MDBmMTNhZWViMCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCkBAIC00MSwyOSAr
NDEsMjkgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzZXRJREJEYXRhYmFzZU1ldGFEYXRh
KGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJ
ZCwgYm9vbCBpbnZhbGlkUm93SWQpOwogCiAgICAgdmlydHVhbCB2b2lkIGdldE9iamVjdFN0b3Jl
cyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxT
dHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9y
PGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncyk7Ci0gICAgdmlydHVhbCBib29sIGNyZWF0
ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBi
b29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNzaWduZWRP
YmplY3RTdG9yZUlkKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRf
dCBvYmplY3RTdG9yZUlkKTsKLSAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29y
ZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpOwotICAgIHZpcnR1YWwgYm9v
bCBwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktl
eSYsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJ
ZCk7Ci0gICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9y
ZUlkKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICB2aXJ0dWFsIGRv
dWJsZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAg
IHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5JiwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpOwotCi0gICAgdmlydHVhbCB2b2lkIGdl
dEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRz
LCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0
aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncyk7Ci0gICAgdmlydHVhbCBib29sIGNy
ZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpOwotICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGluZGV4SWQpOwotICAgIHZpcnR1YWwg
Ym9vbCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkm
LCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5k
ZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIHZpcnR1YWwg
U3RyaW5nIGdldE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7
Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7Ci0gICAgdmlydHVhbCBib29sIGtleUV4aXN0
c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKLQotICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwotICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwotICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAgIHZpcnR1YWwgYm9v
bCBjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QmIGFz
c2lnbmVkT2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3Jl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFs
IFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIHB1dE9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGU+Jik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgdm9pZCBkZWxl
dGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIGRvdWJs
ZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIFJl
ZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIGZvdW5kUmVjb3JkSGFuZGxlKTsKKworICAg
IHZpcnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKTsKKwor
ICAgIHZpcnR1YWwgdm9pZCBnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYg
Zm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYg
Zm91bmRVbmlxdWVGbGFncyk7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4KGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCk7Cisg
ICAgdmlydHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOworICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRl
eERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUmKTsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7CisgICAgdmlydHVhbCBTdHJpbmcgZ2V0T2Jq
ZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElE
QktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworICAgIHZpcnR1
YWwgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworCisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNv
cjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhL
ZXlDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7Cisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElE
QktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwogCiAgICAgdmlydHVhbCBQYXNzUmVm
UHRyPFRyYW5zYWN0aW9uPiBjcmVhdGVUcmFuc2FjdGlvbigpOwogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCmluZGV4IGFmYTRkNjFlOWIyOWU5MWRhN2RkY2E3ZmU1YTAzM2Y0YjFlYWMzOTguLmNh
YTViMjE2ZGVmZTAyYzVlNjBiYjc5NDhkYjMxYmM2ZDVlOWFmNzIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTEtMDMtMzAgIEhhbnMgV2VubmJvcmcgIDxo
YW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBMZXZlbERCIGJhY2tlbmQgZm9yIEluZGV4ZWREQgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTczNzIKKworICAgICAgICAqIGZlYXR1
cmVzLmd5cGk6CisgICAgICAgICogcHVibGljL1dlYklEQkZhY3RvcnkuaDoKKyAgICAgICAgKFdl
YktpdDo6V2ViSURCRmFjdG9yeTo6b3Blbik6CisKIDIwMTEtMDMtMjkgIFNoZXJpZmYgQm90ICA8
d2Via2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxp
bmcgb3V0IHI4MjI5My4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVy
ZXMuZ3lwaSBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQppbmRleCA3MzU0
ZWI4ZThjMTk5YzQ4ODZkY2IyN2JhZDA1MGI4OTRkMDVmYTM0Li4wMDYxNWI0MzdhOGQ3YmQwMzEy
MTlmMjM0ZDhmZDk5ZWU0M2I0NDg0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L2ZlYXR1cmVzLmd5cGkKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBp
CkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICdFTkFCTEVfSU5QVVRfU1BFRUNIPTEnLAogICAg
ICAgICAnRU5BQkxFX0pBVkFTQ1JJUFRfREVCVUdHRVI9MScsCiAgICAgICAgICdFTkFCTEVfSlND
X01VTFRJUExFX1RIUkVBRFM9MCcsCisgICAgICAgICdFTkFCTEVfTEVWRUxEQj0wJywKICAgICAg
ICAgJ0VOQUJMRV9MSU5LX1BSRUZFVENIPTEnLAogICAgICAgICAnRU5BQkxFX01BVEhNTD0wJywK
ICAgICAgICAgJ0VOQUJMRV9NRURJQV9TVEFUSVNUSUNTPTEnLApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCRmFjdG9yeS5oIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9wdWJsaWMvV2ViSURCRmFjdG9yeS5oCmluZGV4IDI5NDE0ZTgwNWRhYWM3ZjM3NTlj
ZmFhN2M4M2NiZTVmOTMyMGNhMDAuLjcxYjI5NDE4M2YxMzU5ZWM3NTc2OTcxYjVjMjU2NWZhNGM3
MzRjZjUgMTAwNzU1Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQkZh
Y3RvcnkuaAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJGYWN0b3J5
LmgKQEAgLTU3LDExICs1Nyw3IEBAIHB1YmxpYzoKICAgICB9OwogCiAgICAgLy8gVGhlIFdlYktp
dCBpbXBsZW1lbnRhdGlvbiBvZiBvcGVuIGlnbm9yZXMgdGhlIFdlYkZyYW1lKiBwYXJhbWV0ZXIu
Ci0gICAgLy8gRklYTUU6IEFzc2VydCBub3QgcmVhY2hlZCB3aGVuIENocm9taXVtIHNpZGUgaXMg
dXBkYXRlZC4KLSAgICB2aXJ0dWFsIHZvaWQgb3Blbihjb25zdCBXZWJTdHJpbmcmIG5hbWUsIFdl
YklEQkNhbGxiYWNrcyogY2FsbGJhY2tzLCBjb25zdCBXZWJTZWN1cml0eU9yaWdpbiYgb3JpZ2lu
LCBXZWJGcmFtZSogZnJhbWUsIGNvbnN0IFdlYlN0cmluZyYgZGF0YURpciwgdW5zaWduZWQgbG9u
ZyBsb25nIG1heGltdW1TaXplLCBCYWNraW5nU3RvcmVUeXBlKSB7IG9wZW4obmFtZSwgY2FsbGJh
Y2tzLCBvcmlnaW4sIGZyYW1lLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSk7IH0KLQotICAgIC8vIEZJ
WE1FOiBSZW1vdmUgdGhpcyB3aGVuIENocm9taXVtIHNpZGUgaXMgdXBkYXRlZC4KLSAgICB2aXJ0
dWFsIHZvaWQgb3Blbihjb25zdCBXZWJTdHJpbmcmIG5hbWUsIFdlYklEQkNhbGxiYWNrcyogY2Fs
bGJhY2tzLCBjb25zdCBXZWJTZWN1cml0eU9yaWdpbiYgb3JpZ2luLCBXZWJGcmFtZSogZnJhbWUs
IGNvbnN0IFdlYlN0cmluZyYgZGF0YURpciwgdW5zaWduZWQgbG9uZyBsb25nIG1heGltdW1TaXpl
KSB7IG9wZW4obmFtZSwgY2FsbGJhY2tzLCBvcmlnaW4sIGZyYW1lLCBkYXRhRGlyLCBtYXhpbXVt
U2l6ZSwgRGVmYXVsdEJhY2tpbmdTdG9yZSk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgb3Blbihjb25z
dCBXZWJTdHJpbmcmIG5hbWUsIFdlYklEQkNhbGxiYWNrcyosIGNvbnN0IFdlYlNlY3VyaXR5T3Jp
Z2luJiwgV2ViRnJhbWUqLCBjb25zdCBXZWJTdHJpbmcmIGRhdGFEaXIsIHVuc2lnbmVkIGxvbmcg
bG9uZyBtYXhpbXVtU2l6ZSwgQmFja2luZ1N0b3JlVHlwZSkgeyBXRUJLSVRfQVNTRVJUX05PVF9S
RUFDSEVEKCk7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBkZWxldGVEYXRhYmFzZShjb25zdCBXZWJT
dHJpbmcmIG5hbWUsIFdlYklEQkNhbGxiYWNrcyosIGNvbnN0IFdlYlNlY3VyaXR5T3JpZ2luJiwg
V2ViRnJhbWUqLCBjb25zdCBXZWJTdHJpbmcmIGRhdGFEaXIpIHsgV0VCS0lUX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyB9CiB9Owo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87566</attachid>
            <date>2011-03-30 10:31:29 -0700</date>
            <delta_ts>2011-03-31 10:38:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110330183127.patch</filename>
            <type>text/plain</type>
            <size>133110</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBiNWRmYzAyMjg4MjlhMGEzZjgyMWVjZDZjNWQyMzQzOGFhOTA2YzQwLi5j
NjI3NjcwNTRlMDJkYTYzOGJlYzBlZmM0OWZkYmRhYTdiOGRkNzczIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTI4IEBACisyMDExLTAzLTMwICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEp
CisKKyAgICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3Jl
Lmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaDoKKyAgICAgICAgKFdl
YkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU6On5PYmplY3RT
dG9yZVJlY29yZEhhbmRsZSk6CisgICAgICAgICogc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0
ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6
OmNyZWF0ZU9iamVjdFN0b3JlSW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJh
c2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmVJbnRlcm5hbCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpsb2FkT2JqZWN0U3RvcmVzKToKKyAgICAgICAg
KiBzdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
REJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4pOgorICAgICAgICAqIHN0b3JhZ2UvSURCSW5kZXhC
YWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJbXBsOjpJ
REJJbmRleEJhY2tlbmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZElt
cGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tl
bmRJbXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJ
bXBsOjphZGRpbmdLZXlBbGxvd2VkKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQkluZGV4QmFja2Vu
ZEltcGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZSk6
CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJM
ZXZlbERCQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnByaW50U3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRl
Y29kZVZhckludCk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVTdHJpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dp
dGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nV2l0aExlbik6CisgICAgICAg
IChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91Ymxl
KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNv
ZGVLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y291bnROb25aZXJvQnl0ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6bWFrZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVQcmVmaXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0SW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEludCk6CisgICAg
ICAgIChXZWJDb3JlOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToK
KyAgICAgICAgKFdlYkNvcmU6OnNldFVwTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpnZXROZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6
OmdldE5ld09iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVsZXRlUmFu
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2Jq
ZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJl
cik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RT
dG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
bGVhck9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3Jl
UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldElu
ZGV4ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQpOgorICAg
ICAgICAoV2ViQ29yZTo6ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4pOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFZpYUluZGV4
KToKKyAgICAgICAgKFdlYkNvcmU6OnZlcnNpb25FeGlzdHMpOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6ZmluZExhc3RJbmRleEtleUVxdWFsVG8pOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcik6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJz
b3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJh
bnNhY3Rpb24pOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsOjpwdXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsOjpkZWxldGVJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RT
dG9yZUJhY2tlbmRJbXBsOjpjbGVhckludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OnBvcHVs
YXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6
Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bDo6Y3JlYXRlSW5kZXhJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsOjpkZWxldGVJbmRleEludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpsb2FkSW5kZXhlcyk6CisgICAgICAg
IChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpnZW5BdXRvSW5jcmVtZW50S2V5
KToKKyAgICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpkYXRhYmFzZUlkKToKKyAgICAg
ICAgKiBzdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FM
aXRlQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3Rv
cmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmpl
Y3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6
Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAgKFdl
YkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9y
UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2Jq
ZWN0VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpn
ZXRQcmltYXJ5S2V5VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2lu
Z1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKToKKyAgICAgICAgKiBz
dG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oOgorCiAyMDExLTAzLTI5ICBOaWtvbGFzIFpp
bW1lcm1hbm4gIDxuemltbWVybWFubkByaW0uY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVy
aWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29y
ZS5neXAgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAppbmRleCBlNjky
ZjU0MmQzNTNlZDRjZjAwMTQzNDE5ZmJkNWI3NWM3ZTI3MjViLi4xMzhhMmZhNDZmNzhjZTVhMWQ3
MzYxODJlNDc3MmNiMGU3ZjI3Y2RjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lmd5cC9XZWJDb3JlLmd5cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3Jl
Lmd5cApAQCAtMTE2Nyw2ICsxMTY3LDE0IEBACiAgICAgICAgICAgICBdLAogICAgICAgICAgIH0s
CiAgICAgICAgIH1dLAorICAgICAgICBbJyJFTkFCTEVfTEVWRUxEQj0xIiBpbiBmZWF0dXJlX2Rl
ZmluZXMnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KGNo
cm9taXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2xldmVsZGIvbGV2ZWxkYi5neXA6bGV2ZWxkYics
CisgICAgICAgICAgXSwKKyAgICAgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsK
KyAgICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2xldmVsZGIvbGV2
ZWxkYi5neXA6bGV2ZWxkYicsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCiAgICAgICBdLAog
ICAgIH0sCiAgICAgewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDhmODljZGExNjdmN2E1MTdmMTQzYjYx
ZWY5MmZiYzk4NWQzNzQwNzQuLmIxZTcwODgzZGU1YTNjYTNjYmZhYzNmOWM2Yzk0ZWYzNjg3MDA5
NzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTU0MzUsNiArNTQzNSw4IEBACiAgICAgICAgICAgICAn
c3RvcmFnZS9JREJLZXlQYXRoQmFja2VuZEltcGwuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9J
REJLZXlSYW5nZS5jcHAnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuaCcsCisg
ICAgICAgICAgICAnc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCcsCisgICAgICAg
ICAgICAnc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmgnLAogICAgICAgICAgICAgJ3N0
b3JhZ2UvSURCT2JqZWN0U3RvcmUuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQk9iamVj
dFN0b3JlLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJCYWNraW5nU3Rv
cmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmgKaW5kZXggMjk1
MjNhMmZiNWM5NmI3MTdlMzQ0NjU2ODAyOGM2OGQ2NTkzMWU0MC4uMTBmY2Y4NTE5NmE5MDU2ZWEy
YWZjOTc2YTIwMmRhMWU4OTE4Yzc2OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFn
ZS9JREJCYWNraW5nU3RvcmUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tp
bmdTdG9yZS5oCkBAIC01MCwzMCArNTAsMzUgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBz
ZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2
ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpID0gMDsKIAogICAgIHZp
cnR1YWwgdm9pZCBnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50
NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3Mp
ID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBu
YW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpID0gMDsKLSAgICB2aXJ0
dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7Ci0g
ICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIHB1dE9iamVjdFN0b3Jl
UmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5n
JiB2YWx1ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKSA9IDA7Ci0gICAgdmly
dHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7Ci0g
ICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCkgPSAwOwotICAgIHZpcnR1YWwgZG91Ymxl
IG5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOwotICAg
IHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5JiwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCkgPSAwOwor
ICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNv
bnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1l
bnQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgdm9p
ZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkgPSAwOworCisgICAgY2xhc3MgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUgOiBwdWJsaWMg
UmVmQ291bnRlZDxJREJCYWNraW5nU3RvcmU+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1
YWwgfk9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkge30gCisgICAgfTsKKyAgICB2aXJ0dWFsIFN0
cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBwdXRPYmpl
Y3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwg
dm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKSA9IDA7CisgICAg
dmlydHVhbCBkb3VibGUgbmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3Rz
SW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRSZWNv
cmRIYW5kbGUpID0gMDsKIAogICAgIGNsYXNzIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2sgewog
ICAgIHB1YmxpYzoKLSAgICAgICAgIHZpcnR1YWwgYm9vbCBjYWxsYmFjayhpbnQ2NF90IG9iamVj
dFN0b3JlRGF0YUlkLCBjb25zdCBTdHJpbmcmIHZhbHVlKSA9IDA7CisgICAgICAgICB2aXJ0dWFs
IGJvb2wgY2FsbGJhY2soY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmLCBjb25zdCBTdHJp
bmcmIHZhbHVlKSA9IDA7CiAgICAgICAgICB2aXJ0dWFsIH5PYmplY3RTdG9yZVJlY29yZENhbGxi
YWNrKCkge307CiAgICAgfTsKLSAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpID0g
MDsKKyAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNr
JikgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1l
cywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlx
dWVGbGFncykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29s
IGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0
ZUluZGV4KGludDY0X3QgaW5kZXhJZCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRleERh
dGFGb3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmLCBpbnQ2NF90IG9iamVj
dFN0b3JlRGF0YUlkKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4RGF0YUZvclJl
Y29yZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7Ci0gICAgdmlydHVhbCBTdHJpbmcg
Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7Ci0g
ICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlz
dHNJbkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAgIHZpcnR1
YWwgdm9pZCBnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1l
cywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlx
dWVGbGFncykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBT
dHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpID0gMDsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGVsZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBwdXRJ
bmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGUmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4RGF0YUZvclJlY29y
ZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpID0gMDsKKyAgICB2aXJ0dWFsIFN0
cmluZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFi
YXNlaWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmKSA9IDA7CiAKICAgICBjbGFzcyBDdXJzb3IgOiBwdWJsaWMgUmVmQ291bnRlZDxDdXJzb3I+
IHsKICAgICBwdWJsaWM6CkBAIC04MSwxNCArODYsMTQgQEAgcHVibGljOgogICAgICAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgU3RyaW5nIHZh
bHVlKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSA9
IDA7CisgICAgICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4g
b2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBp
bmRleERhdGFJZCgpID0gMDsKICAgICAgICAgdmlydHVhbCB+Q3Vyc29yKCkge307CiAgICAgfTsK
IAotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24pID0gMDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlD
dXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGly
ZWN0aW9uKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vy
c29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVj
dGlvbikgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9y
ZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSos
IElEQkN1cnNvcjo6RGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNv
cj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24pID0gMDsKIAogICAgIGNsYXNzIFRyYW5zYWN0aW9uIDogcHVibGljIFJlZkNvdW50ZWQ8
VHJhbnNhY3Rpb24+IHsKICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQkRhdGFiYXNlQmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFn
ZS9JREJEYXRhYmFzZUJhY2tlbmRJbXBsLmNwcAppbmRleCA5NGUzMDViMWJjMDMyOTBhYWMyNzA1
ZWVlMDQzYzE5MzExYzc5ZWUyLi5mMThmNjhmZmVmMTM0OWY4YWFjOWZiMzM2NTI5NzdhNjZjODdi
NzIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkRhdGFiYXNlQmFja2Vu
ZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRGF0YWJhc2VCYWNrZW5k
SW1wbC5jcHAKQEAgLTk3LDcgKzk3LDcgQEAgUGFzc1JlZlB0cjxET01TdHJpbmdMaXN0PiBJREJE
YXRhYmFzZUJhY2tlbmRJbXBsOjpvYmplY3RTdG9yZU5hbWVzKCkgY29uc3QKICAgICByZXR1cm4g
b2JqZWN0U3RvcmVOYW1lcy5yZWxlYXNlKCk7CiB9CiAKLVBhc3NSZWZQdHI8SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW50ZXJmYWNlPiAgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6Y3JlYXRlT2JqZWN0
U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCwgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiB0cmFuc2FjdGlvblB0
ciwgRXhjZXB0aW9uQ29kZSYgZWMpCitQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZElu
dGVyZmFjZT4gSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6Y3JlYXRlT2JqZWN0U3RvcmUoY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwg
SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiB0cmFuc2FjdGlvblB0ciwgRXhjZXB0aW9u
Q29kZSYgZWMpCiB7CiAgICAgQVNTRVJUKHRyYW5zYWN0aW9uUHRyLT5tb2RlKCkgPT0gSURCVHJh
bnNhY3Rpb246OlZFUlNJT05fQ0hBTkdFKTsKIApAQCAtMTA2LDcgKzEwNiw3IEBAIFBhc3NSZWZQ
dHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW50ZXJmYWNlPiAgSURCRGF0YWJhc2VCYWNrZW5kSW1w
bDo6Y3JlYXRlT2JqZWN0CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIFJlZlB0cjxJ
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSA9IElEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbmFtZSwga2V5UGF0aCwgYXV0
b0luY3JlbWVudCk7CisgICAgUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVj
dFN0b3JlID0gSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3Jl
LmdldCgpLCBtX2lkLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5jcmVtZW50KTsKICAgICBBU1NFUlQo
b2JqZWN0U3RvcmUtPm5hbWUoKSA9PSBuYW1lKTsKIAogICAgIFJlZlB0cjxJREJEYXRhYmFzZUJh
Y2tlbmRJbXBsPiBkYXRhYmFzZSA9IHRoaXM7CkBAIC0xMjUsNyArMTI1LDcgQEAgdm9pZCBJREJE
YXRhYmFzZUJhY2tlbmRJbXBsOjpjcmVhdGVPYmplY3RTdG9yZUludGVybmFsKFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqLAogewogICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKIAotICAgIGlmICgh
ZGF0YWJhc2UtPm1fYmFja2luZ1N0b3JlLT5jcmVhdGVPYmplY3RTdG9yZShvYmplY3RTdG9yZS0+
bmFtZSgpLCBvYmplY3RTdG9yZS0+a2V5UGF0aCgpLCBvYmplY3RTdG9yZS0+YXV0b0luY3JlbWVu
dCgpLCBkYXRhYmFzZS0+aWQoKSwgb2JqZWN0U3RvcmVJZCkpIHsKKyAgICBpZiAoIWRhdGFiYXNl
LT5tX2JhY2tpbmdTdG9yZS0+Y3JlYXRlT2JqZWN0U3RvcmUoZGF0YWJhc2UtPmlkKCksIG9iamVj
dFN0b3JlLT5uYW1lKCksIG9iamVjdFN0b3JlLT5rZXlQYXRoKCksIG9iamVjdFN0b3JlLT5hdXRv
SW5jcmVtZW50KCksIG9iamVjdFN0b3JlSWQpKSB7CiAgICAgICAgIHRyYW5zYWN0aW9uLT5hYm9y
dCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU4LDcgKzE1OCw3IEBAIHZvaWQgSURC
RGF0YWJhc2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1l
LCBJREJUcmFuc2FjdGlvCiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2Jq
ZWN0U3RvcmVJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJE
YXRhYmFzZUJhY2tlbmRJbXBsPiBkYXRhYmFzZSwgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRJ
bnRlcmZhY2U+IHRyYW5zYWN0aW9uKQogewotICAgIGRhdGFiYXNlLT5tX2JhY2tpbmdTdG9yZS0+
ZGVsZXRlT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPmlkKCkpOworICAgIGRhdGFiYXNlLT5tX2Jh
Y2tpbmdTdG9yZS0+ZGVsZXRlT2JqZWN0U3RvcmUoZGF0YWJhc2UtPmlkKCksIG9iamVjdFN0b3Jl
LT5pZCgpKTsKICAgICB0cmFuc2FjdGlvbi0+ZGlkQ29tcGxldGVUYXNrRXZlbnRzKCk7CiB9CiAK
QEAgLTI1MCw3ICsyNTAsNyBAQCB2b2lkIElEQkRhdGFiYXNlQmFja2VuZEltcGw6OmxvYWRPYmpl
Y3RTdG9yZXMoKQogICAgIEFTU0VSVChhdXRvSW5jcmVtZW50RmxhZ3Muc2l6ZSgpID09IGlkcy5z
aXplKCkpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpZHMuc2l6ZSgpOyBpKyspCi0g
ICAgICAgIG1fb2JqZWN0U3RvcmVzLnNldChuYW1lc1tpXSwgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBpZHNbaV0sIG5hbWVzW2ldLCBrZXlQ
YXRoc1tpXSwgYXV0b0luY3JlbWVudEZsYWdzW2ldKSk7CisgICAgICAgIG1fb2JqZWN0U3RvcmVz
LnNldChuYW1lc1tpXSwgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2lu
Z1N0b3JlLmdldCgpLCBtX2lkLCBpZHNbaV0sIG5hbWVzW2ldLCBrZXlQYXRoc1tpXSwgYXV0b0lu
Y3JlbWVudEZsYWdzW2ldKSk7CiB9CiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6cmVt
b3ZlT2JqZWN0U3RvcmVGcm9tTWFwKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRy
PElEQkRhdGFiYXNlQmFja2VuZEltcGw+IGRhdGFiYXNlLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFn
ZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwCmluZGV4IDQ2MWU5MzBiYzE3NjA0YjkzOTU1MWZm
ZGNiZGE0NThmNDczY2ZlMTcuLmU2N2JlNDkzNWYzODFkMmVkZGIxN2M5MGUyMDkzZjA0Y2E4ZTYx
YzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJ
bXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1w
bC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJET01TdHJpbmdMaXN0LmgiCiAjaW5j
bHVkZSAiSURCRGF0YWJhc2VCYWNrZW5kSW1wbC5oIgogI2luY2x1ZGUgIklEQkRhdGFiYXNlRXhj
ZXB0aW9uLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUg
IklEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklEQlRyYW5zYWN0aW9uQ29vcmRp
bmF0b3IuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgpAQCAtNjksNyArNzAsNyBAQCB2
b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6cmVtb3ZlSURCQmFja2luZ1N0b3JlKGNvbnN0IFN0
cmluZyYgdW5pcXVlSWRlbnRpZmllcgogICAgIG1fYmFja2luZ1N0b3JlTWFwLnJlbW92ZSh1bmlx
dWVJZGVudGlmaWVyKTsKIH0KIAotdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29u
c3QgU3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBQYXNz
UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBzZWN1cml0eU9yaWdpbiwgRnJhbWUqLCBjb25zdCBTdHJp
bmcmIGRhdGFEaXIsIGludDY0X3QgbWF4aW11bVNpemUsIEJhY2tpbmdTdG9yZVR5cGUpCit2b2lk
IElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQ
dHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IHNl
Y3VyaXR5T3JpZ2luLCBGcmFtZSosIGNvbnN0IFN0cmluZyYgZGF0YURpciwgaW50NjRfdCBtYXhp
bXVtU2l6ZSwgQmFja2luZ1N0b3JlVHlwZSBiYWNraW5nU3RvcmVUeXBlKQogewogICAgIFN0cmlu
ZyBmaWxlSWRlbnRpZmllciA9IHNlY3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKTsK
ICAgICBTdHJpbmcgdW5pcXVlSWRlbnRpZmllciA9IGZpbGVJZGVudGlmaWVyICsgIkAiICsgbmFt
ZTsKQEAgLTgxLDEyICs4MiwxOSBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihj
b25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogCiAgICAgLy8g
RklYTUU6IEV2ZXJ5dGhpbmcgZnJvbSBub3cgb24gc2hvdWxkIGJlIGRvbmUgb24gYW5vdGhlciB0
aHJlYWQuCiAKKyAgICBiYWNraW5nU3RvcmVUeXBlID0gTGV2ZWxEQkJhY2tpbmdTdG9yZTsgLy8g
RklYTUU6IERvbid0IGNvbW1pdCB0aGlzISBJdCBqdXN0IGhlbHBzIG1lIHRlc3QgTGV2ZWxEQiB3
aXRoIER1bXBSZW5kZXJUcmVlLgorCiAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2lu
Z1N0b3JlOwogICAgIElEQkJhY2tpbmdTdG9yZU1hcDo6aXRlcmF0b3IgaXQyID0gbV9iYWNraW5n
U3RvcmVNYXAuZmluZChmaWxlSWRlbnRpZmllcik7CiAgICAgaWYgKGl0MiAhPSBtX2JhY2tpbmdT
dG9yZU1hcC5lbmQoKSkKICAgICAgICAgYmFja2luZ1N0b3JlID0gaXQyLT5zZWNvbmQ7CiAgICAg
ZWxzZSB7Ci0gICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3Bl
bihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVudGlm
aWVyLCB0aGlzKTsKKyAgICAgICAgaWYgKGJhY2tpbmdTdG9yZVR5cGUgPT0gRGVmYXVsdEJhY2tp
bmdTdG9yZSkKKyAgICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6b3BlbihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJ
ZGVudGlmaWVyLCB0aGlzKTsKKyNpZiBFTkFCTEUoTEVWRUxEQikKKyAgICAgICAgZWxzZSBpZiAo
YmFja2luZ1N0b3JlVHlwZSA9PSBMZXZlbERCQmFja2luZ1N0b3JlKQorICAgICAgICAgICAgYmFj
a2luZ1N0b3JlID0gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5n
ZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVudGlmaWVyLCB0aGlzKTsKKyNlbmRp
ZgogICAgICAgICBpZiAoIWJhY2tpbmdTdG9yZSkgewogICAgICAgICAgICAgY2FsbGJhY2tzLT5v
bkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5L
Tk9XTl9FUlIsICJJbnRlcm5hbCBlcnJvci4iKSk7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuY3BwIGIv
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmNwcAppbmRleCA2MmU1
MzY0YmVmODIyZGI5OGNjMGRlNTU0MDA1ZWUzM2QyMDFmNWU0Li4wNmY4NTg4NDNjMjUyNTg3ZjMz
NmVjOWU5NzA5MGViMmQyMjYzNDRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkluZGV4QmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
SW5kZXhCYWNrZW5kSW1wbC5jcHAKQEAgLTQwLDggKzQwLDEwIEBACiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNr
aW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBj
b25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1
ZSkKK0lEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0
b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbCogb2JqZWN0U3RvcmVCYWNrZW5kLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgs
IGJvb2wgdW5pcXVlKQogICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICwg
bV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgLCBtX29iamVjdFN0b3JlQmFja2VuZChvYmpl
Y3RTdG9yZUJhY2tlbmQpCiAgICAgLCBtX2lkKGlkKQogICAgICwgbV9uYW1lKG5hbWUpCiAgICAg
LCBtX3N0b3JlTmFtZShzdG9yZU5hbWUpCkBAIC01MCw4ICs1MiwxMCBAQCBJREJJbmRleEJhY2tl
bmRJbXBsOjpJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3Jl
LCBpbnQ2NF90CiB7CiB9CiAKLUlEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFja2VuZElt
cGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29u
c3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUp
CitJREJJbmRleEJhY2tlbmRJbXBsOjpJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9y
ZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGwqIG9iamVjdFN0b3JlQmFja2VuZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkK
ICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKKyAgICAsIG1fZGF0YWJhc2VJZChk
YXRhYmFzZUlkKQorICAgICwgbV9vYmplY3RTdG9yZUJhY2tlbmQob2JqZWN0U3RvcmVCYWNrZW5k
KQogICAgICwgbV9pZChJbnZhbGlkSWQpCiAgICAgLCBtX25hbWUobmFtZSkKICAgICAsIG1fc3Rv
cmVOYW1lKHN0b3JlTmFtZSkKQEAgLTcyLDEwICs3NiwxMCBAQCB2b2lkIElEQkluZGV4QmFja2Vu
ZEltcGw6Om9wZW5DdXJzb3JJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1Jl
ZlB0cgogCiAgICAgc3dpdGNoIChjdXJzb3JUeXBlKSB7CiAgICAgY2FzZSBJREJDdXJzb3JCYWNr
ZW5kSW50ZXJmYWNlOjpJbmRleEtleUN1cnNvcjoKLSAgICAgICAgYmFja2luZ1N0b3JlQ3Vyc29y
ID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhLZXlDdXJzb3IoaW5kZXgtPmlkKCks
IHJhbmdlLmdldCgpLCBkaXJlY3Rpb24pOworICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBp
bmRleC0+bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEtleUN1cnNvcihpbmRleC0+bV9kYXRhYmFz
ZUlkLCBpbmRleC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCByYW5n
ZS5nZXQoKSwgZGlyZWN0aW9uKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJREJDdXJzb3JC
YWNrZW5kSW50ZXJmYWNlOjpJbmRleEN1cnNvcjoKLSAgICAgICAgYmFja2luZ1N0b3JlQ3Vyc29y
ID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhDdXJzb3IoaW5kZXgtPmlkKCksIHJh
bmdlLmdldCgpLCBkaXJlY3Rpb24pOworICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBpbmRl
eC0+bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEN1cnNvcihpbmRleC0+bV9kYXRhYmFzZUlkLCBp
bmRleC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCByYW5nZS5nZXQo
KSwgZGlyZWN0aW9uKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJREJDdXJzb3JCYWNrZW5k
SW50ZXJmYWNlOjpPYmplY3RTdG9yZUN1cnNvcjoKICAgICBjYXNlIElEQkN1cnNvckJhY2tlbmRJ
bnRlcmZhY2U6OkludmFsaWRDdXJzb3JUeXBlOgpAQCAtMTIwLDE0ICsxMjQsMTQgQEAgdm9pZCBJ
REJJbmRleEJhY2tlbmRJbXBsOjpnZXRJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0Kiwg
UGFzc1JlZlB0cjxJREJJbmQKIHsKICAgICAvLyBGSVhNRTogU3BsaXQgZ2V0SW50ZXJuYWwgaW50
byB0d28gZnVuY3Rpb25zLCBnZXR0aW5nIHJpZCBvZmYgfGdldE9iamVjdHwuCiAgICAgaWYgKGdl
dE9iamVjdCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBpbmRleC0+bV9iYWNraW5nU3RvcmUt
PmdldE9iamVjdFZpYUluZGV4KGluZGV4LT5pZCgpLCAqa2V5KTsKKyAgICAgICAgU3RyaW5nIHZh
bHVlID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5nZXRPYmplY3RWaWFJbmRleChpbmRleC0+bV9k
YXRhYmFzZUlkLCBpbmRleC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgp
LCAqa2V5KTsKICAgICAgICAgaWYgKHZhbHVlLmlzTnVsbCgpKSB7CiAgICAgICAgICAgICBjYWxs
YmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0
aW9uOjpOT1RfRk9VTkRfRVJSLCAiS2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbmRleC4iKSk7
CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2FsbGJhY2tzLT5vblN1
Y2Nlc3MoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZSh2YWx1ZSkpOwogICAg
IH0gZWxzZSB7Ci0gICAgICAgIFJlZlB0cjxJREJLZXk+IGtleVJlc3VsdCA9IGluZGV4LT5tX2Jh
Y2tpbmdTdG9yZS0+Z2V0UHJpbWFyeUtleVZpYUluZGV4KGluZGV4LT5pZCgpLCAqa2V5KTsKKyAg
ICAgICAgUmVmUHRyPElEQktleT4ga2V5UmVzdWx0ID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5n
ZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW5kZXgtPm1fZGF0YWJhc2VJZCwgaW5kZXgtPm1fb2JqZWN0
U3RvcmVCYWNrZW5kLT5pZCgpLCBpbmRleC0+aWQoKSwgKmtleSk7CiAgICAgICAgIGlmICgha2V5
UmVzdWx0KSB7CiAgICAgICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJv
cjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSLCAiS2V5IGRvZXMg
bm90IGV4aXN0IGluIHRoZSBpbmRleC4iKSk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTks
NyArMTYzLDcgQEAgYm9vbCBJREJJbmRleEJhY2tlbmRJbXBsOjphZGRpbmdLZXlBbGxvd2VkKElE
QktleSoga2V5KQogICAgIGlmICghbV91bmlxdWUpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0g
ICAgcmV0dXJuICFtX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5JbmRleChtX2lkLCAqa2V5KTsK
KyAgICByZXR1cm4gIW1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbkluZGV4KG1fZGF0YWJhc2VJ
ZCwgbV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIG1faWQsICprZXkpOwogfQogCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQklu
ZGV4QmFja2VuZEltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5k
SW1wbC5oCmluZGV4IGUyYTA2YjhlMDU2NDkzOTY4YWM2YzYyMzg2NTZmNmE1Y2VmNmQ2MGQuLjZl
ZmZiZGQwMjYyN2ZlMTBkNDAyNmYwYWYyOTNmYjMyOWZlYWE2NzcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1wbC5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1wbC5oCkBAIC00MCwxMyArNDAsMTMgQEAgY2xh
c3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKIAogY2xhc3MgSURCSW5kZXhCYWNrZW5kSW1wbCA6
IHB1YmxpYyBJREJJbmRleEJhY2tlbmRJbnRlcmZhY2UgewogcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJh
Y2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3Jl
KiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbCogb2JqZWN0U3RvcmVCYWNrZW5kLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJv
b2wgdW5pcXVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJJbmRleEJh
Y2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgaWQsIG5hbWUsIHN0b3JlTmFtZSwga2V5UGF0aCwgdW5p
cXVlKSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCSW5kZXhCYWNrZW5kSW1wbChi
YWNraW5nU3RvcmUsIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlQmFja2VuZCwgaWQsIG5hbWUsIHN0
b3JlTmFtZSwga2V5UGF0aCwgdW5pcXVlKSk7CiAgICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRy
PElEQkluZGV4QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9y
ZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3Ry
aW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJJbmRl
eEJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0
X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCogb2JqZWN0U3Rv
cmVCYWNrZW5kLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBj
b25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKQogICAgIHsKLSAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBJREJJbmRleEJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgbmFtZSwgc3Rv
cmVOYW1lLCBrZXlQYXRoLCB1bmlxdWUpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJ
REJJbmRleEJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVC
YWNrZW5kLCBuYW1lLCBzdG9yZU5hbWUsIGtleVBhdGgsIHVuaXF1ZSkpOwogICAgIH0KICAgICB2
aXJ0dWFsIH5JREJJbmRleEJhY2tlbmRJbXBsKCk7CiAKQEAgLTcyLDggKzcyLDggQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgdm9pZCBnZXRLZXkoUGFzc1JlZlB0cjxJREJLZXk+LCBQYXNzUmVmUHRy
PElEQkNhbGxiYWNrcz4sIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSosIEV4Y2VwdGlv
bkNvZGUmKTsKIAogcHJpdmF0ZToKLSAgICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdT
dG9yZSosIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9y
ZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpOwotICAgIElEQkluZGV4
QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBT
dHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSk7Cisg
ICAgSURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGNvbnN0IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwqLCBpbnQ2NF90IGlkLCBjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgsIGJvb2wgdW5pcXVlKTsKKyAgICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9y
ZSosIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCos
IGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmlu
ZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpOwogCiAgICAgc3RhdGljIHZvaWQgb3BlbkN1cnNvcklu
dGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2Vu
ZEltcGw+LCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiwgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9u
LCBJREJDdXJzb3JCYWNrZW5kSW50ZXJmYWNlOjpDdXJzb3JUeXBlLCBQYXNzUmVmUHRyPElEQkNh
bGxiYWNrcz4sIFBhc3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlPik7CiAg
ICAgc3RhdGljIHZvaWQgZ2V0SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NS
ZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4sIFBhc3NSZWZQdHI8SURCS2V5PiwgYm9vbCBnZXRP
YmplY3QsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPik7CkBAIC04Miw2ICs4Miw4IEBAIHByaXZh
dGU6CiAKICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKIAorICAg
IGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGNvbnN0IElEQk9iamVjdFN0b3JlQmFja2VuZElt
cGwqIG1fb2JqZWN0U3RvcmVCYWNrZW5kOwogICAgIGludDY0X3QgbV9pZDsKICAgICBTdHJpbmcg
bV9uYW1lOwogICAgIFN0cmluZyBtX3N0b3JlTmFtZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwYTNjZWIzM2Ux
YzE2YjUyMDA4NDI3NmJlZGFlNzg2NzVkY2U1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMTc2
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoK
KyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQmFj
a2luZ1N0b3JlLmgiCisKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworI2luY2x1ZGUgIkFzc2VydGlv
bnMuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tl
bmRJbXBsLmgiCisjaW5jbHVkZSAiSURCS2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9y
aWdpbi5oIgorI2luY2x1ZGUgPGxldmVsZGIvY29tcGFyYXRvci5oPgorI2luY2x1ZGUgPGxldmVs
ZGIvZGIuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxk
Yi9zbGljZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworLy8gRklYTUU6IGRlY29kaW5nIHJvdXRp
bmVzIG11Y2ggYmUgbW9yZSByb2J1c3QuIFdlIGNhbid0IGNyYXNoIHRoZSBicm93c2VyIGlmCisv
LyBkYXRhIGlzbid0IHdoYXQgd2UgZXhwZWN0IQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lE
QkxldmVsREJCYWNraW5nU3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50
aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSwgbGV2ZWxkYjo6REIqIGRiKQor
ICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkK
KyAgICAsIG1fZGIoZGIpCit7CisgICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5nU3RvcmUoaWRl
bnRpZmllciwgdGhpcyk7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERC
QmFja2luZ1N0b3JlKCkKK3sKKyAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZSht
X2lkZW50aWZpZXIpOworfQorCisjaWYgMCAvLyBGSVhNRTogUmVtb3ZlIGJlZm9yZSBsYW5kaW5n
Lgorc3RhdGljIHZvaWQgcHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpCit7CisgICAg
cHJpbnRmKCIweCIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytp
KSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNbaV07CisgICAgICAgIHByaW50ZigiJTAy
eCIsIChpbnQpYyk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNv
ZGVJbnQoaW50NjRfdCBuKQoreworICAgIEFTU0VSVChuID49IDApOworICAgIHN0ZDo6c3RyaW5n
IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKworICAgIGRvIHsKKyAgICAg
ICAgdW5zaWduZWQgY2hhciBjID0gbjsKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBzdGF0aWNfY2Fz
dDxjaGFyPihjKSk7CisgICAgICAgIG4gPj49IDg7CisgICAgfSB3aGlsZSAobik7CisKKyAgICBy
ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50NjRfdCBkZWNvZGVJbnQoY29uc3Qgc3RkOjpzdHJp
bmcmIHMpCit7CisgICAgaW50NjRfdCByZXQgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgIDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNbaV07
CisgICAgICAgIHJldCA9IChyZXQgPDwgOCkgfCBjOworICAgIH0KKworICAgIHJldHVybiByZXQ7
Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVWYXJJbnQoaW50NjRfdCBuKQoreworICAg
IHN0ZDo6c3RyaW5nIHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKworICAg
IGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbiAmIDB4N2Y7CisgICAgICAgIG4gPj49
IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAxMjg7CisgICAgICAgIHJldC5h
cHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgIH0gd2hpbGUgKG4pOworCisgICAg
cmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBj
aGFyICpwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCogZm91bmRJbnQpCit7CisgICAgQVNT
RVJUKGxpbWl0ID49IHApOworICAgICpmb3VuZEludCA9IDA7CisKKyAgICBkbyB7CisgICAgICAg
IGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgKmZvdW5k
SW50ID0gKCpmb3VuZEludCA8PCA3KSB8ICgqcCAmIDB4N2YpOworICAgIH0gd2hpbGUgKCpwKysg
JiAxMjgpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3Ry
aW5nKGNvbnN0IFN0cmluZyYgcykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7IC8vIEZJWE1FOiBT
aXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcy5s
ZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFVDaGFyIHUgPSBzW2ldOworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGhpID0gdSA+PiA4OworICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gdTsKKyAgICAg
ICAgcmV0LmFwcGVuZCgxLCBoaSk7CisgICAgICAgIHJldC5hcHBlbmQoMSwgbG8pOworICAgIH0K
KworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBTdHJpbmcgZGVjb2RlU3RyaW5nKGNvbnN0
IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGVuZCkKK3sKKyAgICBBU1NFUlQoZW5kID49IHApOworICAg
IEFTU0VSVCghKChlbmQgLSBwKSAlIDIpKTsKKworICAgIHNpemVfdCBsZW4gPSAoZW5kIC0gcCkg
LyAyOworICAgIFZlY3RvcjxVQ2hhcj4gdmVjdG9yKGxlbik7CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSAqcCsrOwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gKnArKzsKKworICAgICAgICB2ZWN0b3JbaV0gPSAo
aGkgPDwgOCkgfCBsbzsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nOjphZG9wdCh2ZWN0b3Ip
OworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3RyaW5nV2l0aExlbihjb25zdCBTdHJp
bmcmIHMpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkp
OworICAgIHJldCArPSBlbmNvZGVTdHJpbmcocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW4oY29uc3QgY2hhciogcCwgY29uc3Qg
Y2hhciogbGltaXQsIFN0cmluZyogZm91bmRTdHJpbmcpCit7CisgICAgQVNTRVJUKGxpbWl0ID49
IHApOworICAgIGludDY0X3QgbGVuOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsICZs
ZW4pOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHAgKyBsZW4gKiAy
ID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgKmZvdW5kU3RyaW5nID0gZGVjb2Rl
U3RyaW5nKHAsIHAgKyBsZW4gKiAyKTsKKyAgICBwICs9IGxlbiAqIDI7CisgICAgcmV0dXJuIHA7
Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVEb3VibGUoZG91YmxlIHgpCit7CisgICAg
c3RkOjpzdHJpbmcgcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorICAgIGNo
YXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBzaXplb2YoeCk7ICsraSkKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBwW2ldKTsKKyAg
ICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlRG91YmxlKGNvbnN0
IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBkb3VibGUqIGQpCit7CisgICAgaWYgKHAgKyBz
aXplb2YoKmQpID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2hhciogeCA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6
ZW9mKCpkKTsgKytpKQorICAgICAgICAqeCsrID0gKnArKzsKKyAgICByZXR1cm4gcDsKK30KKwor
c3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZUtleShjb25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBz
dGQ6OnN0cmluZyByZXQ7CisKKyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBjYXNlIElE
QktleTo6TnVsbFR5cGU6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBy
ZXR1cm4gIiI7CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHJldC5hcHBl
bmQoMSwgJ1x4MCcpOworICAgICAgICByZXQgKz0gZW5jb2RlU3RyaW5nV2l0aExlbihrZXkuc3Ry
aW5nKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpEYXRlVHlwZToK
KyAgICAgICAgcmV0LmFwcGVuZCgxLCAnXHgxJyk7CisgICAgICAgIHJldCArPSBlbmNvZGVEb3Vi
bGUoa2V5LmRhdGUoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJLZXk6Ok51
bWJlclR5cGU6CisgICAgICAgIHJldC5hcHBlbmQoMSwgJ1x4MicpOworICAgICAgICByZXQgKz0g
ZW5jb2RlRG91YmxlKGtleS5udW1iZXIoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQor
fQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNo
YXIqIGxpbWl0LCBSZWZQdHI8SURCS2V5PiogZm91bmRLZXkpCit7CisgICAgQVNTRVJUKGxpbWl0
ID49IHApOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVu
c2lnbmVkIGNoYXIgdHlwZSA9ICpwKys7CisgICAgU3RyaW5nIHM7CisgICAgZG91YmxlIGQ7CisK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIC8vIFN0cmluZy4KKyAg
ICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsICZzKTsKKyAgICAgICAgKmZv
dW5kS2V5ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOworICAg
IGNhc2UgMToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCBs
aW1pdCwgJmQpOworICAgICAgICAqZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7Cisg
ICAgICAgIHJldHVybiBwOworICAgIGNhc2UgMjoKKyAgICAgICAgLy8gTnVtYmVyLgorICAgICAg
ICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7CisgICAgICAgICpmb3VuZEtleSA9IElE
QktleTo6Y3JlYXRlTnVtYmVyKGQpOworICAgICAgICByZXR1cm4gcDsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
fQorCitzdGF0aWMgaW50IGNvdW50Tm9uWmVyb0J5dGVzKGludDY0X3QgbikKK3sKKyAgICBpbnQg
YyA9IDE7CisgICAgd2hpbGUgKG4gPj49IDgpCisgICAgICAgIGMrKzsKKyAgICByZXR1cm4gYzsK
K30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBpbnQgZGF0YWJhc2VC
eXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKGRhdGFiYXNlSWQpOworICAgIGludCBvYmplY3RTdG9y
ZUJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMob2JqZWN0U3RvcmVJZCk7CisgICAgaW50IGluZGV4
Qnl0ZXMgPSBjb3VudE5vblplcm9CeXRlcyhpbmRleElkKTsKKworICAgIEFTU0VSVChkYXRhYmFz
ZUJ5dGVzIDw9IDgpOworICAgIEFTU0VSVChvYmplY3RTdG9yZUJ5dGVzIDw9IDgpOworICAgIEFT
U0VSVChpbmRleEJ5dGVzIDw9IDQpOworCisgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAo
ZGF0YWJhc2VCeXRlcyAtIDEpIDw8IDUgfCAob2JqZWN0U3RvcmVCeXRlcyAtIDEpIDw8IDIgfCAo
aW5kZXhCeXRlcyAtIDEpOworICAgIHN0ZDo6c3RyaW5nIHMoMSwgZmlyc3RCeXRlKTsgLy8gRklY
TUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKyAgICBzICs9IGVuY29kZUludChkYXRhYmFzZUlk
KTsKKyAgICBzICs9IGVuY29kZUludChvYmplY3RTdG9yZUlkKTsKKyAgICBzICs9IGVuY29kZUlu
dChpbmRleElkKTsKKworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVj
b2RlUHJlZml4KGNvbnN0IGNoYXIqIHAsIGludDY0X3QmIGRhdGFiYXNlSWQsIGludDY0X3QmIG9i
amVjdFN0b3JlSWQsIGludDY0X3QmIGluZGV4SWQpIC8vIFhYWDogTGltaXQuCit7CisgICAgdW5z
aWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqcCsrOworCisgICAgaW50IGRhdGFiYXNlQnl0ZXMgPSAo
KGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgIGludCBvYmplY3RTdG9yZUJ5dGVzID0g
KChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsKKyAgICBpbnQgaW5kZXhCeXRlcyA9IChmaXJz
dEJ5dGUgJiAweDMpICsgMTsKKworICAgIGRhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3RkOjpzdHJp
bmcocCwgZGF0YWJhc2VCeXRlcykpOworICAgIHAgKz0gZGF0YWJhc2VCeXRlczsKKyAgICBvYmpl
Y3RTdG9yZUlkID0gZGVjb2RlSW50KHN0ZDo6c3RyaW5nKHAsIG9iamVjdFN0b3JlQnl0ZXMpKTsK
KyAgICBwICs9IG9iamVjdFN0b3JlQnl0ZXM7CisgICAgaW5kZXhJZCA9IGRlY29kZUludChzdGQ6
OnN0cmluZyhwLCBpbmRleEJ5dGVzKSk7CisgICAgcCArPSBpbmRleEJ5dGVzOworCisgICAgcmV0
dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBudW1iZXIpCit7
CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCk7CisgICAgY2hhciBjID0gbnVtYmVyOworICAgIHMuYXBwZW5kKCZjLCAxKTsKKyAg
ICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qgc3Rk
OjpzdHJpbmcmIHN0cikKK3sKKyAgICBzdGQ6OnN0cmluZyBzID0gbWFrZUtleShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBzICs9IHN0cjsKKyAgICByZXR1cm4gczsK
K30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0
ciwgaW50NjRfdCB2ZXJzaW9uKQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIHN0cik7CisgICAgcyArPSBlbmNvZGVWYXJJ
bnQodmVyc2lvbik7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtl
S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGludCBudW1iZXIsIGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIHN0ZDo6c3RyaW5n
IHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG51bWJlcik7
CisgICAgcyArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cik7CisgICAgcmV0dXJuIHM7Cit9CisK
K3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBuYnIxLCBpbnQ2NF90IG5icjIpCit7
CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMik7CisgICAgcmV0dXJu
IHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBudW1iZXIsIGNvbnN0
IFN0cmluZyYgc3RyMSwgY29uc3QgU3RyaW5nJiBzdHIyKQoreworICAgIHN0ZDo6c3RyaW5nIHMg
PSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG51bWJlciwgc3Ry
MSk7CisgICAgcyArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cjIpOworICAgIHJldHVybiBzOwor
fQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyMSwgaW50NjRfdCBuYnIy
LCBpbnQ2NF90IG5icjMpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVWYXJJbnQo
bmJyMik7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMyk7CisgICAgcmV0dXJuIHM7Cit9CisK
K3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBuYnIxLCBpbnQ2NF90IG5icjIsIGlu
dDY0X3QgbmJyMywgaW50IG5icjQpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVW
YXJJbnQobmJyMik7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMyk7CisgICAgcyArPSBzdGF0
aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihuYnI0KTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGlj
IGJvb2wgZ2V0SW50KGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50
NjRfdCogZm91bmRJbnQpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGxldmVsZGI6
OlN0YXR1cyBzID0gZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiOjpTbGlj
ZShrZXkpLCAmcmVzdWx0KTsKKworICAgIGlmIChzLklzTm90Rm91bmQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgKmZvdW5kSW50ID0gZGVjb2Rl
SW50KHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dEludChs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpCit7
CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygp
LCBrZXksIGVuY29kZUludCh2YWx1ZSkpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGdldFN0cmluZyhs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIFN0cmluZyogZm91bmRTdHJp
bmcpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0g
ZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiOjpTbGljZShrZXkpLCAmcmVz
dWx0KTsKKworICAgIGlmIChzLklzTm90Rm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgKmZvdW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHJl
c3VsdC5jX3N0cigpLCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dFN0cmluZyhsZXZlbGRiOjpEQiogZGIsIGNv
bnN0IHN0ZDo6c3RyaW5nIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IGRiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSwgZW5jb2Rl
U3RyaW5nKHZhbHVlKSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIENvbXBhcmF0b3IgOiBw
dWJsaWMgbGV2ZWxkYjo6Q29tcGFyYXRvciB7CisgICAgcHVibGljOgorICAgIGludCBDb21wYXJl
KGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QK
KyAgICB7CisgICAgICAgIGludCB4ID0gUmVhbENvbXBhcmUoYSwgYik7CisgICAgICAgIHJldHVy
biB4OworICAgIH0KKyAgICBpbnQgWENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNv
bnN0IGxldmVsZGI6OlNsaWNlJiBiKSBjb25zdAorICAgIHsKKyAgICAgICAgaW50IHggPSBSZWFs
Q29tcGFyZShhLCBiKTsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGludCBDb21wYXJl
SW5kZXhLZXlzKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYg
YikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBSZWFsQ29tcGFyZShhLCBiLCB0cnVlKTsK
KyAgICB9CisgICAgaW50IFJlYWxDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25z
dCBsZXZlbGRiOjpTbGljZSYgYiwgYm9vbCBpbmRleEtleXMgPSBmYWxzZSkgY29uc3QKKyAgICB7
CisgICAgICAgIGludDY0X3QgYTEsIGEyLCBhMzsKKyAgICAgICAgaW50NjRfdCBiMSwgYjIsIGIz
OworCisgICAgICAgIGNvbnN0IGNoYXIqIGFFbmQgPSBhLmRhdGEoKSArIGEuc2l6ZSgpOworICAg
ICAgICBjb25zdCBjaGFyKiBiRW5kID0gYi5kYXRhKCkgKyBiLnNpemUoKTsKKworICAgICAgICBj
b25zdCBjaGFyICpwID0gYS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnEgPSBiLmRhdGEo
KTsKKworICAgICAgICBpZiAoKnAgIT0gKnEpCisgICAgICAgICAgICByZXR1cm4gKnAgLSAqcTsg
Ly8gRklYTUU6IFRoaW5rIHRoaXMgdGhyb3VnaC4KKworICAgICAgICBwID0gZGVjb2RlUHJlZml4
KHAsIGExLCBhMiwgYTMpOworICAgICAgICBxID0gZGVjb2RlUHJlZml4KHEsIGIxLCBiMiwgYjMp
OworCisgICAgICAgIGlmIChhMSAhPSBiMSkKKyAgICAgICAgICAgIHJldHVybiBhMSAtIGIxOwor
ICAgICAgICBpZiAoYTIgIT0gYjIpCisgICAgICAgICAgICByZXR1cm4gYTIgLSBiMjsKKyAgICAg
ICAgaWYgKGEzICE9IGIzKQorICAgICAgICAgICAgcmV0dXJuIGEzIC0gYjM7CisKKyAgICAgICAg
aWYgKCFhMSkgeworICAgICAgICAgICAgLy8gR2xvYmFsIG1ldGEtZGF0YS4gTmV4dCBmaWVsZCBp
cyBhIG51bWJlci4KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYTQgPSAqcCsrOworICAgICAg
ICAgICAgdW5zaWduZWQgY2hhciBiNCA9ICpxKys7CisKKyAgICAgICAgICAgIGlmIChhNCAhPSBi
NCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYTQgLSBiNDsKKworICAgICAgICAgICAgaWYgKCFh
NCB8fCBhNCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYg
KGE0ID09IDEwMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyBEYXRhYmFz
ZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGFFbmQsICZhNSk7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJ
bnQocSwgYkVuZCwgJmI1KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocSk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGE1IC0gYjU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYTQg
PT0gMjAxKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGE2LCBiNjsgLy8gT3JpZ2luIG5hbWUu
CisgICAgICAgICAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgYUVuZCwgJmE2KTsK
KyAgICAgICAgICAgICAgICBBU1NFUlQocCk7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVN0
cmluZ1dpdGhMZW4ocSwgYkVuZCwgJmI2KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocSk7Cisg
ICAgICAgICAgICAgICAgaWYgKGE2ICE9IGI2KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
Y29kZVBvaW50Q29tcGFyZShhNiwgYjYpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGE3LCBi
NzsgLy8gRGF0YWJhc2UgbmFtZS4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0
aExlbihwLCBhRW5kLCAmYTcpOworICAgICAgICAgICAgICAgIEFTU0VSVChwKTsKKyAgICAgICAg
ICAgICAgICBxID0gZGVjb2RlU3RyaW5nV2l0aExlbihxLCBiRW5kLCAmYjcpOworICAgICAgICAg
ICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFy
ZShhNywgYjcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgfSBlbHNlIGlmICghYTIpIHsgLy8gYTEgIT0gMAorICAgICAgICAgICAg
Ly8gRGF0YWJhc2UgbWV0YS1kYXRhLiBOZXh0IGZpZWxkIGlzIGEgbnVtYmVyLgorCisgICAgICAg
ICAgICB1bnNpZ25lZCBjaGFyIGE0ID0gKnArKzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIg
YjQgPSAqcSsrOworCisgICAgICAgICAgICBpZiAoYTQgIT0gYjQpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGE0IC0gYjQ7CisKKyAgICAgICAgICAgIGlmICghYTQgfHwgYTQgPT0gMSB8fCBhNCA9
PSAyIHx8IGE0ID09IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBp
ZiAoYTQgPT0gNTApIHsKKyAgICAgICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgbWV0YS1kYXRh
LgorCisgICAgICAgICAgICAgICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4K
KyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGFFbmQsICZhNSk7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQocSwg
YkVuZCwgJmI1KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocSk7CisKKyAgICAgICAgICAgICAg
ICBpZiAoYTUgIT0gYjUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhNSAtIGI1OworCisg
ICAgICAgICAgICAgICAgaW50NjRfdCBhNiwgYjY7IC8vIGtleSBwYXRoLCBhdXRvIGluYywgZXRj
LgorICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgYUVuZCwgJmE2KTsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQocCk7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChx
LCBiRW5kLCAmYjYpOworICAgICAgICAgICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gYTYgLSBiNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhNCA9PSAx
MDApIHsKKyAgICAgICAgICAgICAgICAvLyBJbmRleCBtZXRhLWRhdGEuCisKKyAgICAgICAgICAg
ICAgICBpbnQ2NF90IGE1LCBiNTsgLy8gT2JqZWN0IHN0b3JlIGlkLgorICAgICAgICAgICAgICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgYUVuZCwgJmE1KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cCk7CisgICAgICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiRW5kLCAmYjUpOworICAg
ICAgICAgICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgICAgICAgICBpZiAoYTUgIT0gYjUpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBhNSAtIGI1OworCisgICAgICAgICAgICAgICAgaW50
NjRfdCBhNiwgYjY7IC8vIEluZGV4IGlkLgorICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVWYXJJ
bnQocCwgYUVuZCwgJmE2KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocCk7CisgICAgICAgICAg
ICAgICAgcSA9IGRlY29kZVZhckludChxLCBiRW5kLCAmYjYpOworICAgICAgICAgICAgICAgIEFT
U0VSVChxKTsKKyAgICAgICAgICAgICAgICBpZiAoYTYgIT0gYjYpCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBhNiAtIGI2OworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhNywg
Yjc7IC8vIE5hbWUsIHVuaXF1ZSwga2V5IHBhdGguCisgICAgICAgICAgICAgICAgYTcgPSAqcCsr
OworICAgICAgICAgICAgICAgIGI3ID0gKnErKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gYTcg
LSBiNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhNCA9PSAxNTApIHsKKyAgICAg
ICAgICAgICAgICAvLyBPYmplY3Qgc3RvcmUgaWQgZnJlZS1saXN0LgorCisgICAgICAgICAgICAg
ICAgaW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBw
ID0gZGVjb2RlVmFySW50KHAsIGFFbmQsICZhNSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHAp
OworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYkVuZCwgJmI1KTsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQocSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGE1IC0gYjU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYTQgPT0gMTUxKSB7CisgICAgICAgICAgICAg
ICAgLy8gSW5kZXggaWQgZnJlZS1saXN0LgorCisgICAgICAgICAgICAgICAgaW50NjRfdCBhNSwg
YjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGFFbmQsICZhNSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAg
ICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYkVuZCwgJmI1KTsKKyAgICAgICAgICAgICAgICBBU1NF
UlQocSk7CisgICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gYTUgLSBiNTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgYTYsIGI2OyAvLyBJ
bmRleCBpZC4KKyAgICAgICAgICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGFFbmQsICZhNik7
CisgICAgICAgICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVW
YXJJbnQocSwgYkVuZCwgJmI2KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGE2IC0gYjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
YTQgPT0gMjAwKSB7CisgICAgICAgICAgICAgICAgLy8gT2JqZWN0IHN0b3JlIG5hbWUgLT4gaWQg
bWFwcGluZy4KKworICAgICAgICAgICAgICAgIFN0cmluZyBhNSwgYjU7IC8vIE9iamVjdCBzdG9y
ZSBuYW1lLgorICAgICAgICAgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGFFbmQs
ICZhNSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAgICAgIHEgPSBk
ZWNvZGVTdHJpbmdXaXRoTGVuKHEsIGJFbmQsICZiNSk7CisgICAgICAgICAgICAgICAgQVNTRVJU
KHEpOworICAgICAgICAgICAgICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKGE1LCBiNSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYTQgPT0gMjAxKSB7CisgICAgICAgICAgICAg
ICAgLy8gSW5kZXggbmFtZSAtPiBpbmRleCBpZCBtYXBwaW5nLgorCisgICAgICAgICAgICAgICAg
aW50NjRfdCBhNSwgYjU7IC8vIE9iamVjdCBzdG9yZSBpZC4KKyAgICAgICAgICAgICAgICBwID0g
ZGVjb2RlVmFySW50KHAsIGFFbmQsICZhNSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHApOwor
ICAgICAgICAgICAgICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgYkVuZCwgJmI1KTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQocSk7CisgICAgICAgICAgICAgICAgaWYgKGE1ICE9IGI1KQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gYTUgLSBiNTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBh
NiwgYjY7IC8vIEluZGV4IG5hbWUuCisgICAgICAgICAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dp
dGhMZW4ocCwgYUVuZCwgJmE2KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocCk7CisgICAgICAg
ICAgICAgICAgcSA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocSwgYkVuZCwgJmI2KTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQocSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBh
cmUoYTYsIGI2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGE0IC0gYjQ7
CisgICAgICAgIH0gZWxzZSBpZiAoYTMgPT0gMSB8fCBhMyA9PSAyKSB7IC8vIGExICE9IDAsIGEy
ICE9IDAKKyAgICAgICAgICAgIC8vIE9iamVjdCBzdG9yZSBkYXRhIG9yICJleGlzdHMiIGRhdGEu
CisKKyAgICAgICAgICAgIGlmIChwID09IGFFbmQgJiYgcSA9PSBiRW5kKQorICAgICAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHAgPT0gYUVuZCkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAocSA9PSBiRW5kKQorICAgICAgICAgICAgICAg
IHJldHVybiAxOworCisgICAgICAgICAgICBSZWZQdHI8SURCS2V5PiBhNCwgYjQ7IC8vIFVzZXIg
a2V5LgorICAgICAgICAgICAgcCA9IGRlY29kZUtleShwLCBhRW5kLCAmYTQpOworICAgICAgICAg
ICAgQVNTRVJUKHApOworICAgICAgICAgICAgcSA9IGRlY29kZUtleShxLCBiRW5kLCAmYjQpOwor
ICAgICAgICAgICAgQVNTRVJUKHEpOworCisgICAgICAgICAgICBpZiAoYTQtPmlzTGVzc1RoYW4o
YjQuZ2V0KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChh
NC0+aXNFcXVhbChiNC5nZXQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
ICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhMyA+PSAzMCkgeworICAgICAgICAg
ICAgLy8gSW5kZXggZGF0YS4KKworICAgICAgICAgICAgYm9vbCBhSGFzS2V5ID0gKHAgIT0gYUVu
ZCk7CisgICAgICAgICAgICBib29sIGJIYXNLZXkgPSAocSAhPSBiRW5kKTsKKworICAgICAgICAg
ICAgaWYgKCFhSGFzS2V5ICYmIGJIYXNLZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwor
ICAgICAgICAgICAgaWYgKGFIYXNLZXkgJiYgIWJIYXNLZXkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIDE7CisgICAgICAgICAgICBpZiAoIWFIYXNLZXkgJiYgIWJIYXNLZXkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+IGE0LCBiNDsKKyAg
ICAgICAgICAgIHAgPSBkZWNvZGVLZXkocCwgYUVuZCwgJmE0KTsKKyAgICAgICAgICAgIEFTU0VS
VChwKTsKKyAgICAgICAgICAgIHEgPSBkZWNvZGVLZXkocSwgYkVuZCwgJmI0KTsKKyAgICAgICAg
ICAgIEFTU0VSVChxKTsKKworICAgICAgICAgICAgaWYgKGE0LT5pc0xlc3NUaGFuKGI0LmdldCgp
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoIWE0LT5pc0Vx
dWFsKGI0LmdldCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAg
aWYgKGluZGV4S2V5cykgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgbnVtYmVyLgor
ICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBi
b29sIGFIYXNTZXF1ZW5jZU51bWJlciA9IChwICE9IGFFbmQpOworICAgICAgICAgICAgYm9vbCBi
SGFzU2VxdWVuY2VOdW1iZXIgPSAocSAhPSBiRW5kKTsKKworICAgICAgICAgICAgaWYgKCFhSGFz
U2VxdWVuY2VOdW1iZXIgJiYgYkhhc1NlcXVlbmNlTnVtYmVyKQorICAgICAgICAgICAgICAgIHJl
dHVybiAtMTsKKyAgICAgICAgICAgIGlmIChhSGFzU2VxdWVuY2VOdW1iZXIgJiYgIWJIYXNTZXF1
ZW5jZU51bWJlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmICgh
YUhhc1NlcXVlbmNlTnVtYmVyICYmICFiSGFzU2VxdWVuY2VOdW1iZXIpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGludDY0X3QgYTUsIGI1OyAvLyAic2VxdWVuY2Ug
bnVtYmVyIgorICAgICAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBhRW5kLCAmYTUpOworICAg
ICAgICAgICAgQVNTRVJUKHApOworICAgICAgICAgICAgcSA9IGRlY29kZVZhckludChxLCBiRW5k
LCAmYjUpOworICAgICAgICAgICAgQVNTRVJUKHEpOworCisgICAgICAgICAgICByZXR1cm4gYTUg
LSBiNTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3QgeyByZXR1
cm4gImlkYl9jbXAxIjsgfQorICAgIHZvaWQgRmluZFNob3J0ZXN0U2VwYXJhdG9yKHN0ZDo6c3Ry
aW5nKiwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50
IGV2ZW50dWFsbHkuCisgICAgdm9pZCBGaW5kU2hvcnRTdWNjZXNzb3Ioc3RkOjpzdHJpbmcqKSBj
b25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCit9IGNvbXBhcmF0b3I7Cit9
CisKK3N0YXRpYyBib29sIHNldFVwTWV0YWRhdGEobGV2ZWxkYjo6REIqIGRiKQoreworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIG1ldGFEYXRhS2V5ID0gbWFrZUtleSgwLCAwLCAwLCAwKTsKKworICAg
IGludDY0X3Qgc2NoZW1hVmVyc2lvbjsKKyAgICBpZiAoIWdldEludChkYiwgbWV0YURhdGFLZXks
ICZzY2hlbWFWZXJzaW9uKSkgeworICAgICAgICBzY2hlbWFWZXJzaW9uID0gMDsKKyAgICAgICAg
aWYgKCFwdXRJbnQoZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc2NoZW1hVmVyc2lvbikKKyAgICAgICAg
cmV0dXJuIGZhbHNlOyAvLyBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZlcnNpb24u
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElE
QkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2lu
LCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJp
bmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCit7Cisg
ICAgU3RyaW5nIHBhdGhCYXNlMiA9IHBhdGhCYXNlOworCisgICAgaWYgKHBhdGhCYXNlMi5pc0Vt
cHR5KCkpCisgICAgICAgIHBhdGhCYXNlMiA9ICIvdG1wL2luLW1lbS1sZXZlbGRiIjsgLy8gRklY
TUU6IERvbid0IGxhbmQgdGhpcyEgT25seSBmb3IgdGVzdGluZy4KKworICAgIGlmICghbWFrZUFs
bERpcmVjdG9yaWVzKHBhdGhCYXNlMikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8g
Y3JlYXRlIEluZGV4ZWREQiBkYXRhYmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEo
KSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVz
ZSBhIHNpbmdsZSBMZXZlbCBEQiBmb3IgYWxsIG9yaWdpbnMuCisgICAgU3RyaW5nIHBhdGggPSBw
YXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UyLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAgICBsZXZlbGRiOjpE
QiogZGI7CisgICAgbGV2ZWxkYjo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcGFy
YXRvciA9ICZjb21wYXJhdG9yOworICAgIG9wdGlvbnMuY3JlYXRlX2lmX21pc3NpbmcgPSB0cnVl
OworICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBsZXZlbGRiOjpEQjo6T3BlbihvcHRpb25z
LCBwYXRoLnV0ZjgoKS5kYXRhKCksICZkYik7CisKKyAgICBpZiAoIXN0YXR1cy5vaygpKSB7Cisg
ICAgICAgIC8vIEZJWE1FOiBJZiBjb21wYXJhdG9yIG5hbWUgY2hhbmdlZCwgYmxvdyBhd2F5IHRo
ZSBvbGQgZGF0YWJhc2UgYW5kIHN0YXJ0IGEgbmV3IG9uZS4KKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgUmVmUHRyPElEQkxldmVsREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZShh
ZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShmaWxlSWRlbnRpZmllciwgZmFjdG9y
eSwgZGIpKSk7CisKKyAgICBpZiAoIXNldFVwTWV0YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdl
dCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlLnJlbGVh
c2UoKTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJh
c2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2
NF90JiBmb3VuZElkKQoreworICAgIGJvb2wgb2sgPSBnZXRJbnQobV9kYi5nZXQoKSwgbWFrZUtl
eSgwLCAwLCAwLCAyMDEsIG1faWRlbnRpZmllciwgbmFtZSksICZmb3VuZElkKTsKKyAgICBpZiAo
IW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBvayA9IGdldFN0cmluZyhtX2RiLmdl
dCgpLCBtYWtlS2V5KGZvdW5kSWQsIDAsIDAsIDIpLCAmZm91bmRWZXJzaW9uKTsKKyAgICBpZiAo
IW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3Rh
dGljIGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChsZXZlbGRiOjpEQiogZGIpCit7CisgICAgLy8g
TG9vayBpbiBmcmVlLWxpc3QuCisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KDAs
IDAsIDAsIDEwMCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoMCwgMCwgMCwg
MTAxKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9y
KGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsg
aXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAw
OyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwg
YSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAgQVNT
RVJUX1VOVVNFRChkLCBkID09IDEwMCk7CisKKyAgICAgICAgaW50NjRfdCBkYXRhYmFzZUlkOwor
ICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCku
c2l6ZSgpLCAmZGF0YWJhc2VJZCk7CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+
RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NF
UlQocy5vaygpKTsKKworICAgICAgICByZXR1cm4gZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICAv
LyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1h
eERhdGFiYXNlSWQ7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ha2VLZXkoMCwgMCwgMCwgMSksICZt
YXhEYXRhYmFzZUlkKSkKKyAgICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBpbnQ2NF90
IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFzZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRi
LCBtYWtlS2V5KDAsIDAsIDAsIDEpLCBkYXRhYmFzZUlkKTsKKyAgICBpZiAoIW9rKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGF0YWJhc2VJZDsKKworfQorCitib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFs
aWRSb3dJZCkKK3sKKyAgICBpZiAoaW52YWxpZFJvd0lkKSB7CisgICAgICAgIHJvd0lkID0gZ2V0
TmV3RGF0YWJhc2VJZChtX2RiLmdldCgpKTsKKworICAgICAgICBpZiAoIXB1dEludChtX2RiLmdl
dCgpLCBtYWtlS2V5KDAsIDAsIDAsIDIwMSwgbV9pZGVudGlmaWVyLCBuYW1lKSwgcm93SWQpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghcHV0U3RyaW5nKG1f
ZGIuZ2V0KCksIG1ha2VLZXkocm93SWQsIDAsIDAsIDIpLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0
X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+
JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKQor
eworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1
MCwgMSwgMCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
MCwgMCwgNTEpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJ
dGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFy
dEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BL
ZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgICAg
IGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAgICAgICBwID0gZGVjb2RlUHJl
Zml4KHAsIGEsIGIsIGMpOworICAgICAgICBBU1NFUlQoYSA9PSBkYXRhYmFzZUlkKTsKKyAgICAg
ICAgQVNTRVJUKCFiKTsKKyAgICAgICAgQVNTRVJUKCFjKTsKKworICAgICAgICB1bnNpZ25lZCBj
aGFyIGQgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gNTApOworCisgICAg
ICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBp
dC0+a2V5KCkuZGF0YSgpICsgaXQtPmtleSgpLnNpemUoKSwgJm9iamVjdFN0b3JlSWQpOworCisg
ICAgICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCku
ZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworICAgICAg
ICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0
YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworICAgICAgICBp
dC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0df
RVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgYm9vbCBhdXRvSW5jcmVtZW50ID0gKml0LT52YWx1ZSgpLmRhdGEoKTsKKyAgICAg
ICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAg
TE9HX0VSUk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgICAgIC8vIElzIGV2aWNhdGFibGUKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAg
ICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFs
aWRcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIExhc3Qg
dmVyc2lvbgorICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7
CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gTWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9j
YXRlZAorCisgICAgICAgIGZvdW5kSWRzLmFwcGVuZChvYmplY3RTdG9yZUlkKTsKKyAgICAgICAg
Zm91bmROYW1lcy5hcHBlbmQob2JqZWN0U3RvcmVOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRo
cy5hcHBlbmQoa2V5UGF0aCk7CisgICAgICAgIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmFwcGVu
ZChhdXRvSW5jcmVtZW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld09iamVj
dFN0b3JlSWQobGV2ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAgLy8g
TG9vayBpbiBmcmVlLWxpc3QuCisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIDAsIDAsIDE1MCwgMCk7CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCAwLCAwKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJ
dGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAg
ICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21w
YXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0
X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7Cisg
ICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQg
Y2hhciBkID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBkID09IDE1MCk7CisKKyAg
ICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAs
IGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpLCAmb2JqZWN0U3RvcmVJZCk7CisK
KyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICBy
ZXR1cm4gb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhl
cmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQ7CisgICAg
aWYgKCFnZXRJbnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMyksICZtYXhPYmplY3RT
dG9yZUlkKSkKKyAgICAgICAgbWF4T2JqZWN0U3RvcmVJZCA9IDA7CisKKyAgICBpbnQ2NF90IG9i
amVjdFN0b3JlSWQgPSBtYXhPYmplY3RTdG9yZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50
KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDMpLCBvYmplY3RTdG9yZUlkKTsKKyAgICBp
ZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gb2JqZWN0U3RvcmVJ
ZDsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQ
YXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkK
K3sKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQgPSBnZXROZXdPYmplY3RTdG9yZUlkKG1fZGIu
Z2V0KCksIGRhdGFiYXNlSWQpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgp
LCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgbmFtZSk7
CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgbmFtZSIp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9k
Yi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMSks
IGtleVBhdGgpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8g
c2V0IGtleSBwYXRoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9
IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RT
dG9yZUlkLCAyKSwgYXV0b0luY3JlbWVudCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0df
RVJST1IoImZhaWxlZCB0byBzZXQgYXV0byBpbmNyZW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJh
c2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDMpLCBmYWxzZSk7CisgICAgaWYgKCFvaykg
eworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgZXZpY3RhYmxlIik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtl
S2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA0KSwgMSk7CisgICAgaWYg
KCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgbGFzdCB2ZXJzaW9uIG51
bWJlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRklYTUU6IE5v
dCBzdXJlIHdlIGV2ZW4gbmVlZCB0byBzZXQgdGhpcz8KKyAgICBvayA9IHB1dEludChtX2RiLmdl
dCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgMzAp
OworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG1heCBp
bmRleCBpZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJ
bnQobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAyMDAsIG5hbWUpLCBvYmpl
Y3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRv
IHNldCBvYmplY3Qgc3RvcmUgaWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCA9IG9iamVjdFN0b3JlSWQ7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UobGV2ZWxkYjo6REIqIGRiLCBjb25z
dCBzdGQ6OnN0cmluZyYgYmVnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmQpCit7CisgICAgLy8g
RklYTUU6IFVzZSBzb21lIHNvcnQgb2YgYnVsayBkZWxldGUgb3BlcmF0aW9uIGZpcnN0PworCisg
ICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6
UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoYmVnaW4pOyBpdC0+VmFsaWQoKSAm
JiBjb21wYXJhdG9yLlhDb21wYXJlKGl0LT5rZXkoKSwgZW5kKSA8IDA7IGl0LT5OZXh0KCkpIHsK
KyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBpZiAoIXMub2soKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOworICAg
IGdldFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmpl
Y3RTdG9yZUlkLCAwKSwgJm9iamVjdFN0b3JlTmFtZSk7CisKKyAgICBtX2RiLT5EZWxldGUobGV2
ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVj
dFN0b3JlSWQsIDApKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCks
IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDEpKTsKKyAgICBt
X2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwg
MCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDIpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6
V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3Jl
SWQsIDMpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VL
ZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpKTsKKyAgICBtX2RiLT5E
ZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwg
NTAsIG9iamVjdFN0b3JlSWQsIDUpKTsKKworICAgIC8vIEluc2VydCBpbnRvIGZyZWUtbGlzdC4K
KyAgICBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTAs
IG9iamVjdFN0b3JlSWQpLCAiIik7CisKKyAgICAvLyBGSVhNRTogRGVsZXRlIHRoZSBvYmplY3Qg
c3RvcmUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nICh3ZSBuZWVkIHRvIGxvb2sgaXQgdXApCisgICAg
bV9kYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBtYWtlS2V5KGRhdGFiYXNlSWQs
IDAsIDAsIDIwMCwgb2JqZWN0U3RvcmVOYW1lKSk7CisKKyAgICAvLyBXZSBjb3VsZCBqdXN0IGRv
IG9uZSBiaWcgZGVsZXRlUmFuZ2UgZm9yIHRoZSBzdHVmZiBiZWxvdy4uLgorCisgICAgLy8gT2Jq
ZWN0IHN0b3JlIGRhdGEsIGV4aXN0cyBkYXRhLCBpbmRleCBkYXRhLgorICAgIGlmICghZGVsZXRl
UmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwg
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkpKQorICAgICAgICByZXR1
cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisKKyAgICAvLyBJbmRleCBpZCBmcmVlLWxpc3QK
KyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwg
MCwgMTUxLCBvYmplY3RTdG9yZUlkKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTEsIG9i
amVjdFN0b3JlSWQgKyAxKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJv
ci4KKworICAgIC8vIEluZGV4IG1ldGEtZGF0YQorICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5n
ZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQsIDAsIDAp
LCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJZCArIDEsIDAsIDAp
KSkKKyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorCit9CisKK1N0cmlu
ZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7Cisg
ICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisK
KyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygp
LCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBzdGF0aWNfY2FzdDx2b2lkPih2
ZXJzaW9uKTsKKyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwg
ZGF0YS5jX3N0cigpICsgZGF0YS5sZW5ndGgoKSwgJnZlcnNpb24pOworCisgICAgcmV0dXJuIGRl
Y29kZVN0cmluZyhwLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKTsKK30KKworbmFtZXNw
YWNlIHsKK2NsYXNzIExldmVsREJSZWNvcmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3Jl
OjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlJlY29yZEhh
bmRsZShjb25zdCBzdGQ6OnN0cmluZyYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1f
cHJpbWFyeUtleShwcmltYXJ5S2V5KSwgbV92ZXJzaW9uKHZlcnNpb24pIHt9CisgICAgc3RkOjpz
dHJpbmcgcHJpbWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIGlu
dDY0X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorcHJpdmF0ZToKKyAg
ICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlLZXk7IC8vIHRoZSByZXN1bHQgb2YgZW5jb2RlS2V5KElE
QktleSkgYmFzaWNhbGx5LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGlj
IGludDY0X3QgZ2V0TmV3VmVyc2lvbk51bWJlcihsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGludDY0X3QgbGFzdFZlcnNp
b247CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9i
amVjdFN0b3JlSWQsIDQpLCAmbGFzdFZlcnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7
CisKKyAgICBBU1NFUlQobGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24g
PSBsYXN0VmVyc2lvbiArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbWFrZUtleShkYXRh
YmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNCksIHZlcnNpb24pOworICAgIEFTU0VS
VChvayk7CisKKyAgICAvLyBGSVhNRTogRGV0ZWN0IG92ZXJmbG93PyBOb3QgbXVjaCB3ZSBjYW4g
ZG8gYWJvdXQgaXQgYW55d2F5Li4uPyBBbmQgaXQgcHJvYmFibHkgaXNuJ3QgYSBjYXRhc3Ryb3Bo
ZSBhbnl3YXkuLi4KKworICAgIHJldHVybiB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgcmVjb3JkSGFuZGxlKQoreworICAg
IGludDY0X3QgdmVyc2lvbiA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVk
YXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBlbmNvZGVLZXko
a2V5KSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPlB1dChsZXZlbGRiOjpXcml0
ZU9wdGlvbnMoKSwgb2JqZWN0U3RvcmVkYXRhS2V5LCBlbmNvZGVWYXJJbnQodmVyc2lvbikgKyBl
bmNvZGVTdHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhpc3RzRW50cnlLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIsIGVuY29kZUtleShrZXkpKTsKKworICAgIHMgPSBt
X2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJ
bnQodmVyc2lvbikpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8v
IEZJWE1FOiBJZGVhbGx5LCB3ZSB3YW50IHRvIHJvbGwgYmFjayB0aGUgcHV0IGFib3ZlPworCisg
ICAgcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5jb2Rl
S2V5KGtleSksIHZlcnNpb24pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0g
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0
cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCk7
IC8vIE5vdCBpbmNsdWRlZC4KKworICAgIGRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5
LCBzdG9wS2V5KTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmpl
Y3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICBjb25z
dCBMZXZlbERCUmVjb3JkSGFuZGxlJiBsZXZlbERCUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8
Y29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisgICAgY29uc3Qgc3Rk
OjpzdHJpbmcga2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBsZXZl
bERCUmVjb3JkSGFuZGxlLnByaW1hcnlLZXkoKSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5KTsKK30KKworZG91Ymxl
IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAg
ICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAyKTsgLy8gTm90IGluY2x1ZGVkLgorCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJh
dG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAg
ICBpbnQgbWF4TnVtZXJpY0tleSA9IDA7CisKKyAgICAvLyBGSVhNRTogQmUgc21hcnRlcjogc2Vl
ayB0byBzb21ldGhpbmcgYWZ0ZXIgdGhlIG9iamVjdCBzdG9yZSBkYXRhLCB0aGVuIHJldmVyc2Uu
CisKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRv
ci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAg
IGludDY0X3QgYSwgYiwgYzsKKworICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJlZml4
KGl0LT5rZXkoKS5kYXRhKCksIGEsIGIsIGMpOworICAgICAgICBBU1NFUlQoYSA9PSBkYXRhYmFz
ZUlkKTsKKyAgICAgICAgQVNTRVJUKGIgPT0gb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VS
VChjID09IDEpOworCisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2Rl
S2V5KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpLCAma2V5KTsKKworICAg
ICAgICBpZiAoa2V5LT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7CisgICAgICAgICAg
ICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihrZXktPm51bWJlcigpKTsKKyAgICAg
ICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAgICAgICAgICAgICBtYXhOdW1lcmlj
S2V5ID0gbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhOdW1lcmljS2V5ICsg
MTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0
b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJL
ZXkmIGtleSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRSZWNvcmRIYW5k
bGUpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3RyaW5n
IGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFk
T3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBkZWNvZGVWYXJJbnQo
ZGF0YS5jX3N0cigpLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpLCAmdmVyc2lvbik7CisK
KyAgICBmb3VuZFJlY29yZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFuZGxl
KGVuY29kZUtleShrZXkpLCB2ZXJzaW9uKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxi
YWNrJiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcg
c3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7IC8vIE5vdCBp
bmNsdWRlZC4KKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRl
cmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRL
ZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5
KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBj
b25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpOwor
ICAgICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJlZml4KGl0LT5rZXkoKS5kYXRhKCksIGEs
IGIsIGMpOworCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRl
Y29kZUtleShwLCBsaW1pdCwgJnByaW1hcnlLZXkpOworCisgICAgICAgIGludDY0X3QgdmVyc2lv
bjsKKyAgICAgICAgY29uc3QgY2hhciogcSA9IGRlY29kZVZhckludChpdC0+dmFsdWUoKS5kYXRh
KCksIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSwgJnZlcnNpb24pOwor
CisgICAgICAgIFJlZlB0cjxMZXZlbERCUmVjb3JkSGFuZGxlPiByaChhZG9wdFJlZihuZXcgTGV2
ZWxEQlJlY29yZEhhbmRsZShlbmNvZGVLZXkoKnByaW1hcnlLZXkpLCB2ZXJzaW9uKSkpOworICAg
ICAgICBTdHJpbmcgaWRiVmFsdWUgPSBkZWNvZGVTdHJpbmcocSwgaXQtPnZhbHVlKCkuZGF0YSgp
ICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKworICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygqcmgs
IGlkYlZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYg
Zm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYg
Zm91bmRVbmlxdWVGbGFncykKK3sKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkLCAwLCAwKTsKKyAgICBzdGQ6OnN0
cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3Jl
SWQgKyAxLCAwLCAwKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+
TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWso
c3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBz
dG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgcCA9IGRlY29k
ZVByZWZpeChwLCBhLCBiLCBjKTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIGQgPSAqcCsrOwor
ICAgICAgICBBU1NFUlRfVU5VU0VEKGQsIGQgPT0gMTAwKTsKKworICAgICAgICBpbnQ2NF90IGlu
ZGV4SWQ7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgaXQtPmtleSgpLmRhdGEoKSArIGl0
LT5rZXkoKS5zaXplKCksICZpbmRleElkKTsKKworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0g
ZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQt
PnZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+
VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWQiKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAq
aXQtPnZhbHVlKCkuZGF0YSgpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0
LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZCIpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBk
ZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+
dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElkKTsKKyAg
ICAgICAgZm91bmROYW1lcy5hcHBlbmQoaW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRo
cy5hcHBlbmQoa2V5UGF0aCk7CisgICAgICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKGluZGV4
VW5pcXVlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld0luZGV4SWQobGV2ZWxk
Yjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sK
KyAgICAvLyBMb29rIGluIGZyZWUtbGlzdC4KKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1h
a2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCBvYmplY3RTdG9yZUlkKTsKKyAgICBzdGQ6OnN0
cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3Jl
SWQgKyAxKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJh
dG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5
KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkg
PCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29u
c3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgo
cCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAg
QVNTRVJUX1VOVVNFRChkLCBkID09IDE1MSk7CisKKyAgICAgICAgaW50NjRfdCB0cmFzaDsgLy8g
b2JqZWN0IHN0b3JlIGlkCisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgaXQtPmtleSgpLmRh
dGEoKSArIGl0LT5rZXkoKS5zaXplKCksICZ0cmFzaCk7CisKKyAgICAgICAgaW50NjRfdCBpbmRl
eElkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+
a2V5KCkuc2l6ZSgpLCAmaW5kZXhJZCk7CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBk
Yi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBB
U1NFUlQocy5vaygpKTsKKworICAgICAgICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAgICAg
IHJldHVybiBpbmRleElkOworICAgIH0KKworICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVyZSB3
YXMgbm8gZnJlZS1saXN0LgorICAgIGludDY0X3QgbWF4SW5kZXhJZDsKKyAgICBpZiAoIWdldElu
dChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNSksICZt
YXhJbmRleElkKSkKKyAgICAgICAgbWF4SW5kZXhJZCA9IDMwOyAvLyBJdCdzIGltcG9ydGFudCB0
aGF0IGl0IHN0YXJ0cyBhdCAzMCEhCisKKyAgICBpbnQ2NF90IGluZGV4SWQgPSBtYXhJbmRleElk
ICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAs
IDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgaW5kZXhJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGluZGV4SWQ7Cit9CisKK2Jvb2wgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBi
b29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKQoreworICAgIGluZGV4SWQgPSBnZXROZXdJ
bmRleElkKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOworCisgICAgYm9v
bCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEw
MCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGluZGV4IG5hbWUiKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAxKSwgaXNVbmlx
dWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGlz
X3VuaXF1ZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRT
dHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIDIpLCBrZXlQYXRoKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExP
R19FUlJPUigiZmFpbGVkIHRvIHNldCBrZXkgcGF0aCIpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklY
TUU6IEltcGxlbWVudC4gSXNuJ3QgdGhpcyB1c2VkPyBPciBkbyB3ZSBub3QgdGVzdCBmb3IgaXQ/
CisgICAgcmV0dXJuOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4
RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7Cisg
ICAgY29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSYgbGV2ZWxEQlJlY29yZEhhbmRsZSA9IHN0YXRp
Y19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOworCisgICAg
Y29uc3QgaW50NjRfdCBnbG9iYWxTZXF1ZW5jZU51bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIo
bV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpz
dHJpbmcgaW5kZXhEYXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCBlbmNvZGVLZXkoa2V5KSwgZ2xvYmFsU2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0
IHN0ZDo6c3RyaW5nIGRhdGEgPSBlbmNvZGVWYXJJbnQobGV2ZWxEQlJlY29yZEhhbmRsZS52ZXJz
aW9uKCkpICsgbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCk7CisKKyAgICByZXR1cm4g
bV9kYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpbmRleERhdGFLZXksIGRhdGEpLm9r
KCk7Cit9CisKK3N0YXRpYyBib29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKGxldmVsZGI6OkRC
KiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQor
eworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVs
ZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFp
dC0+VmFsaWQoKSkgeworICAgICAgICBpdC0+U2Vla1RvTGFzdCgpOworICAgICAgICBpZiAoIWl0
LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxl
IChjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID49IDApIHsK
KyAgICAgICAgaXQtPlByZXYoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqZm91bmRLZXkgPSBpdC0+a2V5KCkuVG9T
dHJpbmcoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQg
c2luY2Ugd2UgaW52YWxpZGF0ZSBpbmRleCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVj
aGFuaXNtLgorICAgIHJldHVybiB0cnVlOworfQorCitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgUmVm
UHRyPElEQktleT4gcHJpbWFyeUtleSA9IGdldFByaW1hcnlLZXlWaWFJbmRleChkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOworICAgIGlmICghcHJpbWFyeUtleSkKKyAg
ICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJuIGdldE9iamVjdFN0b3JlUmVjb3Jk
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpwcmltYXJ5S2V5KTsKK30KKworc3RhdGljIGJv
b2wgdmVyc2lvbkV4aXN0cyhsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBl
bmNvZGVkUHJpbWFyeUtleSkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBtYWtlS2V5
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIsIGVuY29kZWRQcmltYXJ5S2V5KTsKKyAgICBz
dGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVs
ZGI6OlJlYWRPcHRpb25zKCksIGtleSwgJmRhdGEpOworICAgIGlmICghcy5vaygpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGVjb2RlSW50KGRhdGEpID09IHZlcnNpb247
Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmlt
YXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgT3duUHRyPGxldmVs
ZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygp
KSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KGtleSkpOworICAgIGl0LT5TZWVr
KGxldmVsZGJLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0LT5WYWxpZCgp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjb21wYXJhdG9yLkNvbXBhcmVJ
bmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4g
MDsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBk
ZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+
dmFsdWUoKS5zaXplKCksICZ2ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZFBy
aW1hcnlLZXkgPSBzdGQ6OnN0cmluZyhwLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUo
KS5zaXplKCkpOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyhtX2RiLmdldCgpLCBkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJpbWFyeUtleSkpIHsKKyAg
ICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBjb250aW51ZS4K
KyAgICAgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtl
eSgpKTsKKyAgICAgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRl
Y29kZUtleShlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpLCBlbmNvZGVkUHJpbWFyeUtleS5jX3N0
cigpICsgZW5jb2RlZFByaW1hcnlLZXkubGVuZ3RoKCksICZwcmltYXJ5S2V5KTsKKyAgICAgICAg
cmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KK30KKworYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQorewor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsREJLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleShrZXkpKTsKKyAgICBPd25QdHI8bGV2ZWxk
Yjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkp
KTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIGl0LT5TZWVrKGxldmVsREJLZXkp
OworICAgIGlmIChpdC0+VmFsaWQoKSAmJiAhY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0
LT5rZXkoKS5Ub1N0cmluZygpLCBsZXZlbERCS2V5KSkKKyAgICAgICAgZm91bmQgPSB0cnVlOwor
CisgICAgcmV0dXJuIGZvdW5kOworfQorCituYW1lc3BhY2UgeworY2xhc3MgQ3Vyc29ySW1wbENv
bW1vbiA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7CitwdWJsaWM6CisgICAgQ3Vy
c29ySW1wbENvbW1vbihsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXks
IGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4s
IGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBtX2RiKGRiKQorICAgICAgICAsIG1fbG93S2V5KGxv
d0tleSkKKyAgICAgICAgLCBtX2xvd09wZW4obG93T3BlbikKKyAgICAgICAgLCBtX2hpZ2hLZXko
aGlnaEtleSkKKyAgICAgICAgLCBtX2hpZ2hPcGVuKGhpZ2hPcGVuKQorICAgICAgICAsIG1fZm9y
d2FyZChmb3J3YXJkKQorICAgIHsKKyAgICB9CisgICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1v
bigpIHt9CisKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNvcgorICAgIHZpcnR1YWwgYm9v
bCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxJREJLZXk+IGtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAg
ICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUoKSA9IDA7IC8vIEZJWE1FOiBJcyB0aGlzIGFjdHVhbGx5IHVzZWQgYnkgYW55b25lPwor
ICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9v
bCBsb2FkQ3VycmVudFJvdygpID0gMDsKKyAgICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0
ZWQ6CisgICAgbGV2ZWxkYjo6REIqIG1fZGI7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9y
PiBtX2l0ZXJhdG9yOworICAgIHN0ZDo6c3RyaW5nIG1fbG93S2V5OworICAgIGJvb2wgbV9sb3dP
cGVuOworICAgIHN0ZDo6c3RyaW5nIG1faGlnaEtleTsKKyAgICBib29sIG1faGlnaE9wZW47Cisg
ICAgYm9vbCBtX2ZvcndhcmQ7CisgICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50S2V5OworfTsK
KworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpmaXJzdFNlZWsoKQoreworICAgIG1faXRlcmF0b3Ig
PSBtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKTsKKworICAgIGlmICht
X2ZvcndhcmQpCisgICAgICAgIG1faXRlcmF0b3ItPlNlZWsobV9sb3dLZXkpOworICAgIGVsc2UK
KyAgICAgICAgbV9pdGVyYXRvci0+U2VlayhtX2hpZ2hLZXkpOworCisgICAgZm9yICg7Oykgewor
ICAgICAgICBpZiAoIW1faXRlcmF0b3ItPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3Iu
Q29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hP
cGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9o
aWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9m
b3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVy
YXRvci0+a2V5KCksIG1fbG93S2V5KSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFy
ZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1fbG93T3Blbikgewor
ICAgICAgICAgICAgLy8gbG93S2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJhbmdl
LgorICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5O
ZXh0KCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbikgeworICAgICAgICAgICAg
Ly8gaGlnaEtleSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAgICAg
ICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9o
aWdoS2V5KSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+UHJldigpOworICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKQor
ICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBDdXJz
b3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQoreworICAg
IC8vIEZJWE1FOiBUaGlzIHNoYXJlcyBhIGxvdCBvZiBjb2RlIHdpdGggZmlyc3RTZWVrLgorCisg
ICAgZm9yICg7OykgeworICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAgICAgbV9pdGVy
YXRvci0+TmV4dCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2
KCk7CisKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYXNoOworICAgICAgICBpZiAobV9k
Yi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1faXRlcmF0b3ItPmtleSgpLCAmdHJhc2gp
LklzTm90Rm91bmQoKSkKKyAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobV9m
b3J3YXJkICYmIG1faGlnaE9wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRl
cmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIC8vIGhpZ2gga2V5IG5vdCBpbmNsdWRlZCBp
biByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJk
ICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRl
eEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8PSAwKSAvLyBsb3cga2V5IG5vdCBp
bmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
IW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgaWYgKGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IC8vIEZJWE1FOiBPYmV5IHRoZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgKGFuZCB0ZXN0IGZvciBp
dCEpCisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Ns
YXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1
YmxpYzoKKyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBz
dGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdo
S2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENv
bW1vbihkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkKKyAg
ICB7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5n
IHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVS
ZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZp
cnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVy
biAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6Cisg
ICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOworfTsKKworYm9vbCBPYmplY3RTdG9yZUN1cnNvcklt
cGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgY29uc3Qg
Y2hhciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBwID0gZGVjb2RlUHJlZml4
KHAsIGEsIGIsIGMpOworICAgIHAgPSBkZWNvZGVLZXkocCwgbV9pdGVyYXRvci0+a2V5KCkuZGF0
YSgpICsgbV9pdGVyYXRvci0+a2V5KCkuc2l6ZSgpLCAmbV9jdXJyZW50S2V5KTsKKworICAgIGlu
dDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0
b3ItPnZhbHVlKCkuZGF0YSgpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0
b3ItPnZhbHVlKCkuc2l6ZSgpLCAmdmVyc2lvbik7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVy
c2lvbik7CisKKyAgICBtX2N1cnJlbnRWYWx1ZSA9IGRlY29kZVN0cmluZyhxLCBtX2l0ZXJhdG9y
LT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpKTsKKworICAgIHJl
dHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEtleUN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29y
SW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgSW5kZXhLZXlDdXJzb3JJbXBsKGxldmVsZGI6OkRC
KiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6
OnN0cmluZyYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6
IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4s
IGZvcndhcmQpCisgICAgeworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2
aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJp
bmcoKTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJl
dHVybiBtX3ByaW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBp
bmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmly
dHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktl
eT4gbV9wcmltYXJ5S2V5OworfTsKKworYm9vbCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRDdXJy
ZW50Um93KCkKK3sKKyAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgY29uc3QgY2hhciogcCA9IG1f
aXRlcmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMp
OworICAgIHAgPSBkZWNvZGVLZXkocCwgbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpICsgbV9pdGVy
YXRvci0+a2V5KCkuc2l6ZSgpLCAmbV9jdXJyZW50S2V5KTsKKworICAgIC8vIFdlIGp1c3QgaWdu
b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIuLi4KKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBj
b25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCBt
X2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpLCAm
dmVyc2lvbik7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7IC8vIEZJWE1FOiBXZSBz
aG91bGQgcHJ1bmUgZW50cmllcyB3aXRoIG9sZCB2ZXJzaW9uLCBidXQgSSB0aGluayBrZXlFeGlz
dHNJbk9iamVjdFN0b3JlIHRha2VzIGNhcmUgb2YgaXQgZm9yIG5vdyg/PykKKyAgICBkZWNvZGVL
ZXkocSwgbV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNp
emUoKSwgJm1fcHJpbWFyeUtleSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5k
ZXhDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIElu
ZGV4Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXks
IGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4s
IGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxv
d09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAv
LyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBt
X3ZhbHVlOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsg
cmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgp
IHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90
IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBi
b29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9w
cmltYXJ5S2V5OworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIHN0ZDo6c3RyaW5nIG1fcHJpbWFy
eUxldmVsREJLZXk7Cit9OworCitib29sIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3co
KQoreworICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICBjb25zdCBjaGFyKiBwID0gbV9pdGVyYXRv
ci0+a2V5KCkuZGF0YSgpOworICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisgICAg
cCA9IGRlY29kZUtleShwLCBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT5r
ZXkoKS5zaXplKCksICZtX2N1cnJlbnRLZXkpOworCisgICAgLy8gRklYTUU6IFdlIGp1c3QgaWdu
b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIsIHJpZ2h0PworCisgICAgaW50NjRfdCBpbmRleERhdGFW
ZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFs
dWUoKS5kYXRhKCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFs
dWUoKS5zaXplKCksICZpbmRleERhdGFWZXJzaW9uKTsKKyAgICBxID0gZGVjb2RlS2V5KHEsIG1f
aXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCksICZt
X3ByaW1hcnlLZXkpOworCisgICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IG1ha2VLZXkoYSwgYiwg
MSwgZW5jb2RlS2V5KCptX3ByaW1hcnlLZXkpKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsK
KyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygp
LCBtX3ByaW1hcnlMZXZlbERCS2V5LCAmcmVzdWx0KTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOwor
ICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5j
X3N0cigpICsgcmVzdWx0Lmxlbmd0aCgpLCAmb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisKKyAg
ICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAg
ICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5
KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29k
ZVN0cmluZyh0LCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK30KKworc3RhdGljIGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8obGV2
ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyogZm91
bmRLZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVrKHRhcmdldCk7CisKKyAg
ICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAo
aXQtPlZhbGlkKCkgJiYgIWNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRh
cmdldCkpIHsKKyAgICAgICAgKmZvdW5kS2V5ID0gaXQtPmtleSgpLlRvU3RyaW5nKCk7CisgICAg
ICAgIGl0LT5OZXh0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5P
YmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rp
b24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Cisg
ICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBm
b3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRp
cmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVy
T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93
ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4K
KyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOworICAgICAgICBsb3dl
ck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5k
KSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IDIpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAg
ICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAg
ICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksICZz
dG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3Bl
biA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IG1h
a2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+dXBw
ZXIoKSkpOworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQor
CisgICAgUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRSZWYobmV3
IE9iamVjdFN0b3JlQ3Vyc29ySW1wbChtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBz
dG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVr
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9
CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5n
U3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElE
QkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSBy
YW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiBy
YW5nZS0+dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNv
cjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisK
KyAgICBib29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5
LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIHN0YXJ0S2V5ID0g
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsgLy8gRklYTUU6IFRo
aXMgY291bGQgbWVhbiBwcm9ibGVtcy4KKyAgICAgICAgbG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90
IGluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoKnJhbmdlLT5sb3dlcigp
KSk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAg
ICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCArIDEpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVl
OyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQg
YSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NU
aGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+dXBwZXIoKSkpOworICAgICAgICBpZiAoIWZp
bmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkgLy8g
U2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlxdWUga2V5cy4KKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVy
T3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9
IGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxv
d2VyT3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3YXJkKSk7CisgICAgaWYgKCFjdXJzb3It
PmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVs
ZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJh
bmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJv
dW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFu
Z2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJ
REJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5F
WFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBz
dGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFy
dEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJ
WE1FOiBUaGlzIGNvdWxkIG1lYW4gcHJvYmxlbXMuCisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7
IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+
bG93ZXIoKSkpOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAg
fQorCisgICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQgKyAxKTsKKyAgICAgICAgdXBwZXJPcGVu
ID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBX
ZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RL
ZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQor
ICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsKKyAgICAgICAg
aWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtl
eSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtl
eXMuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdl
LT51cHBlck9wZW4oKTsKKyAgICB9CisKKyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJz
b3IgPSBhZG9wdFJlZihuZXcgSW5kZXhDdXJzb3JJbXBsKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBs
b3dlck9wZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCkpOworICAgIGlmICghY3Vyc29y
LT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJl
bGVhc2UoKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIER1bW15VHJhbnNhY3Rpb24gOiBwdWJs
aWMgSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2
b2lkIGJlZ2luKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCkge30KKyAgICB2aXJ0dWFs
IHZvaWQgcm9sbGJhY2soKSB7fQorfTsKK30KKworCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6VHJhbnNhY3Rpb24+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9u
KCkKK3sKKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBpbXBsZW1lbnQgYSB0cmFuc2FjdGlvbiBh
YnN0cmFjdGlvbiB0aGF0IGFsbG93cyBmb3Igcm9sbC1iYWNrcywgYW5kIHdyaXRlIHRlc3RzIGZv
ciBpdC4KKworICAgIHJldHVybiBhZG9wdFJlZihuZXcgRHVtbXlUcmFuc2FjdGlvbigpKTsKK30K
KworLy8gRklYTUU6IGRlbGV0ZURhdGFiYXNlIHNob3VsZCBiZSBwYXJ0IG9mIElEQkJhY2tpbmdT
dG9yZS4KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVM
REIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5n
U3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjlmODE0ZmFjMzJlM2I2ZmVjZWQzNDQ0NTY4YTMwNjcwZmNkY2UyODcKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5n
U3RvcmUuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMg
SVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJREJMZXZlbERCQmFja2lu
Z1N0b3JlX2gKKyNkZWZpbmUgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZV9oCisKKyNpZiBFTkFCTEUo
TEVWRUxEQikKKworI2luY2x1ZGUgIklEQkJhY2tpbmdTdG9yZS5oIgorI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KKworbmFtZXNwYWNlIGxldmVsZGIgeworY2xhc3MgREI7Cit9CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZSA6IHB1YmxpYyBJREJC
YWNraW5nU3RvcmUgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZT4gb3BlbihTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UsIGludDY0
X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlC
YWNrZW5kSW1wbCopOworICAgIHZpcnR1YWwgfklEQkxldmVsREJCYWNraW5nU3RvcmUoKTsKKwor
ICAgIHZpcnR1YWwgYm9vbCBleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcm
IG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKTsKKyAgICB2aXJ0
dWFsIGJvb2wgc2V0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKTsKKwor
ICAgIHZpcnR1YWwgdm9pZCBnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0
b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9y
PFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50
RmxhZ3MpOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1
dG9JbmNyZW1lbnQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVh
bCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jik7Cisg
ICAgdmlydHVhbCBib29sIHB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVl
LCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+Jik7CisgICAgdmlydHVhbCB2b2lkIGNs
ZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQp
OworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5k
bGUmKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCBib29sIGtl
eUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IElEQktleSYsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIGZv
dW5kUmVjb3JkSGFuZGxlKTsKKworICAgIHZpcnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0
b3JlUmVjb3JkQ2FsbGJhY2smKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRJbmRleGVzKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZv
dW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5k
S2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncyk7CisgICAgdmlydHVhbCBi
b29sIGNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1
ZSwgaW50NjRfdCYgaW5kZXhJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOwor
ICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jiwg
Y29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRl
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7Cisg
ICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7Cisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleSYpOworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYpOworCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0
b3JlQ3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJ
REJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Bl
bkluZGV4Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24p
OworCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFRyYW5zYWN0aW9uPiBjcmVhdGVUcmFuc2FjdGlv
bigpOworCitwcml2YXRlOgorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50
aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCosIGxldmVsZGI6OkRCKik7CisKKyAgICBTdHJp
bmcgbV9pZGVudGlmaWVyOworICAgIFJlZlB0cjxJREJGYWN0b3J5QmFja2VuZEltcGw+IG1fZmFj
dG9yeTsKKyAgICBPd25QdHI8bGV2ZWxkYjo6REI+IG1fZGI7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKworI2VuZGlmCisKKyNlbmRpZiAvLyBJREJMZXZlbERCQmFja2luZ1N0b3Jl
X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwuY3BwCmluZGV4IDA0MzNlZDc1NzhhMmNkY2I2YzQ4NmM5NWY4MTIyMWM2ZGYyOWRjYjku
LjE5MWI4NjQ3MjU4ZmYxNTE3YWIzODI3NWM3ZjM1MzRlZjg0YzNkN2QgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcApAQCAt
NTAsOCArNTAsOSBAQCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjp+SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbCgpCiB7CiB9CiAKLUlEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9iamVj
dFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3Qg
aWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9J
bmNyZW1lbnQpCitJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBi
b29sIGF1dG9JbmNyZW1lbnQpCiAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisg
ICAgLCBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKICAgICAsIG1faWQoaWQpCiAgICAgLCBtX25h
bWUobmFtZSkKICAgICAsIG1fa2V5UGF0aChrZXlQYXRoKQpAQCAtNjEsOCArNjIsOSBAQCBJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tp
bmdTdG9yZSogYmFja2luZ1N0bwogICAgIGxvYWRJbmRleGVzKCk7CiB9CiAKLUlEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3Jl
KiBiYWNraW5nU3RvcmUsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
LCBib29sIGF1dG9JbmNyZW1lbnQpCitJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJREJPYmpl
Y3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90
IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBi
b29sIGF1dG9JbmNyZW1lbnQpCiAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisg
ICAgLCBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKICAgICAsIG1faWQoSW52YWxpZElkKQogICAg
ICwgbV9uYW1lKG5hbWUpCiAgICAgLCBtX2tleVBhdGgoa2V5UGF0aCkKQEAgLTkwLDcgKzkyLDcg
QEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpnZXQoUGFzc1JlZlB0cjxJREJLZXk+
IHBycEtleSwgUGFzc1JlZlB0cjxJREJDYWwKIAogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsOjpnZXRJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJLZXk+IGtl
eSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKIHsKLSAgICBTdHJpbmcgd2ly
ZURhdGEgPSBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmdldE9iamVjdFN0b3JlUmVjb3Jk
KG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5KTsKKyAgICBTdHJpbmcgd2lyZURhdGEgPSBvYmplY3RT
dG9yZS0+bV9iYWNraW5nU3RvcmUtPmdldE9iamVjdFN0b3JlUmVjb3JkKG9iamVjdFN0b3JlLT5t
X2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5KTsKICAgICBpZiAod2lyZURhdGEu
aXNOdWxsKCkpIHsKICAgICAgICAgY2FsbGJhY2tzLT5vblN1Y2Nlc3MoU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjp1bmRlZmluZWRWYWx1ZSgpKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMjI3LDggKzIy
OSw4IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cHV0SW50ZXJuYWwoU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8CiAgICAgICAgIGluZGV4S2V5cy5hcHBlbmQo
a2V5LnJlbGVhc2UoKSk7CiAgICAgfQogCi0gICAgaW50NjRfdCBkYXRhUm93SWQgPSBJbnZhbGlk
SWQ7Ci0gICAgYm9vbCBpc0V4aXN0aW5nVmFsdWUgPSBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3Rv
cmUtPmtleUV4aXN0c0luT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPmlkKCksICprZXksIGRhdGFS
b3dJZCk7CisgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5k
bGU+IHJlY29yZEhhbmRsZTsKKyAgICBib29sIGlzRXhpc3RpbmdWYWx1ZSA9IG9iamVjdFN0b3Jl
LT5tX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5PYmplY3RTdG9yZShvYmplY3RTdG9yZS0+bV9k
YXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgKmtleSwgcmVjb3JkSGFuZGxlKTsKIAogICAg
IGlmIChwdXRNb2RlID09IEFkZE9ubHkgJiYgaXNFeGlzdGluZ1ZhbHVlKSB7CiAgICAgICAgIGNh
bGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNl
cHRpb246OkNPTlNUUkFJTlRfRVJSLCAiS2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBvYmplY3Qg
c3RvcmUuIikpOwpAQCAtMjM3LDE0ICsyMzksNyBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw6OnB1dEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPAog
CiAgICAgLy8gQmVmb3JlIHRoaXMgcG9pbnQsIGRvbid0IGRvIGFueSBtdXRhdGlvbi4gIEFmdGVy
IHRoaXMgcG9pbnQsIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIGVycm9yLgog
Ci0gICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPnB1dE9iamVjdFN0b3JlUmVj
b3JkKG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCB2YWx1ZS0+dG9XaXJlU3RyaW5nKCksIGRhdGFS
b3dJZCwgZGF0YVJvd0lkID09IEludmFsaWRJZCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoZSBJ
bmRleGVkIERhdGFiYXNlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBlcnJvciBjb2Rl
IGRlZGljYXRlZCB0byBJL08gZXJyb3JzLgotICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURC
RGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVTktOT1dOX0VSUiwg
IkVycm9yIHdyaXRpbmcgZGF0YSB0byBzdGFibGUgc3RvcmFnZS4iKSk7Ci0gICAgICAgIHRyYW5z
YWN0aW9uLT5hYm9ydCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFvYmpl
Y3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChkYXRhUm93
SWQpKSB7CisgICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPnB1dE9iamVjdFN0
b3JlUmVjb3JkKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCAq
a2V5LCB2YWx1ZS0+dG9XaXJlU3RyaW5nKCksIHJlY29yZEhhbmRsZSkpIHsKICAgICAgICAgLy8g
RklYTUU6IFRoZSBJbmRleGVkIERhdGFiYXNlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBh
biBlcnJvciBjb2RlIGRlZGljYXRlZCB0byBJL08gZXJyb3JzLgogICAgICAgICBjYWxsYmFja3Mt
Pm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpV
TktOT1dOX0VSUiwgIkVycm9yIHdyaXRpbmcgZGF0YSB0byBzdGFibGUgc3RvcmFnZS4iKSk7CiAg
ICAgICAgIHRyYW5zYWN0aW9uLT5hYm9ydCgpOwpAQCAtMjU1LDcgKzI1MCwxNSBAQCB2b2lkIElE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw6OnB1dEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqLCBQYXNzUmVmUHRyPAogICAgIGZvciAoSW5kZXhNYXA6Oml0ZXJhdG9yIGl0ID0gb2JqZWN0
U3RvcmUtPm1faW5kZXhlcy5iZWdpbigpOyBpdCAhPSBvYmplY3RTdG9yZS0+bV9pbmRleGVzLmVu
ZCgpOyArK2l0LCArK2kpIHsKICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNWYWxpZElkKCkp
CiAgICAgICAgICAgICBjb250aW51ZTsgLy8gVGhlIGluZGV4IG9iamVjdCBoYXMgYmVlbiBjcmVh
dGVkLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldC4KLSAgICAgICAgaWYg
KCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPnB1dEluZGV4RGF0YUZvclJlY29yZChpdC0+
c2Vjb25kLT5pZCgpLCAqaW5kZXhLZXlzW2ldLCBkYXRhUm93SWQpKSB7CisKKyAgICAgICAgaWYg
KCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChv
YmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgaXQtPnNlY29uZC0+
aWQoKSwgKnJlY29yZEhhbmRsZSkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGUgSW5kZXhl
ZCBEYXRhYmFzZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXJyb3IgY29kZSBkZWRp
Y2F0ZWQgdG8gSS9PIGVycm9ycy4KKyAgICAgICAgICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJE
YXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVOS05PV05fRVJSLCAi
RXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlLiIpKTsKKyAgICAgICAgICAgIHRy
YW5zYWN0aW9uLT5hYm9ydCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPnB1dEluZGV4RGF0YUZvclJl
Y29yZChvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgaXQtPnNl
Y29uZC0+aWQoKSwgKmluZGV4S2V5c1tpXSwgKnJlY29yZEhhbmRsZSkpIHsKICAgICAgICAgICAg
IC8vIEZJWE1FOiBUaGUgSW5kZXhlZCBEYXRhYmFzZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhh
dmUgYW4gZXJyb3IgY29kZSBkZWRpY2F0ZWQgdG8gSS9PIGVycm9ycy4KICAgICAgICAgICAgIGNh
bGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNl
cHRpb246OlVOS05PV05fRVJSLCAiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdl
LiIpKTsKICAgICAgICAgICAgIHRyYW5zYWN0aW9uLT5hYm9ydCgpOwpAQCAtMjgzLDEzICsyODYs
MjEgQEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpkZWxldGVGdW5jdGlvbihQYXNz
UmVmUHRyPElEQktleT4gcHJwS2V5LCBQYXNzUmUKIAogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsOjpkZWxldGVJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0
cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJL
ZXk+IGtleSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKIHsKLSAgICBpbnQ2
NF90IGlkOwotICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJ
bk9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCBpZCkpIHsKKyAgICBSZWZQdHI8
SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwor
ICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbk9iamVjdFN0
b3JlKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCBy
ZWNvcmRIYW5kbGUpKSB7CiAgICAgICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVy
cm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246Ok5PVF9GT1VORF9FUlIsICJLZXkgZG9l
cyBub3QgZXhpc3QgaW4gdGhlIG9iamVjdCBzdG9yZS4iKSk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZU9iamVjdFN0b3Jl
UmVjb3JkKG9iamVjdFN0b3JlLT5pZCgpLCBpZCk7CisgICAgZm9yIChJbmRleE1hcDo6aXRlcmF0
b3IgaXQgPSBvYmplY3RTdG9yZS0+bV9pbmRleGVzLmJlZ2luKCk7IGl0ICE9IG9iamVjdFN0b3Jl
LT5tX2luZGV4ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNW
YWxpZElkKCkpCisgICAgICAgICAgICBjb250aW51ZTsgLy8gVGhlIGluZGV4IG9iamVjdCBoYXMg
YmVlbiBjcmVhdGVkLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldC4KKwor
ICAgICAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXhEYXRh
Rm9yUmVjb3JkKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCBp
dC0+c2Vjb25kLT5pZCgpLCAqcmVjb3JkSGFuZGxlKSkKKyAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgIH0KKworICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVs
ZXRlT2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmUtPmlkKCksICpyZWNvcmRIYW5kbGUpOwogICAgIGNhbGxiYWNrcy0+b25TdWNjZXNzKFNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZTo6bnVsbFZhbHVlKCkpOwogfQogCkBAIC0zMDksMjYgKzMyMCwyOCBA
QCB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNsZWFyKFBhc3NSZWZQdHI8SURCQ2Fs
bGJhY2tzPiBwcnBDYWxsYmFja3MsIElEQgogCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZElt
cGw6OmNsZWFySW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURC
T2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCQ2FsbGJh
Y2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5jbGVh
ck9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5pZCgpKTsKKyAgICBvYmplY3RTdG9yZS0+bV9iYWNr
aW5nU3RvcmUtPmNsZWFyT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmUtPmlkKCkpOwogICAgIGNhbGxiYWNrcy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTo6dW5kZWZpbmVkVmFsdWUoKSk7CiB9CiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBQb3B1
bGF0ZUluZGV4Q2FsbGJhY2sgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJl
Y29yZENhbGxiYWNrIHsKIHB1YmxpYzoKLSAgICBQb3B1bGF0ZUluZGV4Q2FsbGJhY2soSURCQmFj
a2luZ1N0b3JlJiBiYWNraW5nU3RvcmUsIGNvbnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoLCBpbnQ2
NF90IGluZGV4SWQpCisgICAgUG9wdWxhdGVJbmRleENhbGxiYWNrKElEQkJhY2tpbmdTdG9yZSYg
YmFja2luZ1N0b3JlLCBjb25zdCBTdHJpbmcmIGluZGV4S2V5UGF0aCwgaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKICAgICAgICAgOiBt
X2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCiAgICAgICAgICwgbV9pbmRleEtleVBhdGgoaW5k
ZXhLZXlQYXRoKQorICAgICAgICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICAgICAs
IG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQogICAgICAgICAsIG1faW5kZXhJZChpbmRl
eElkKQogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgY2FsbGJhY2soaW50NjRfdCBv
YmplY3RTdG9yZURhdGFJZCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKKyAgICB2aXJ0dWFsIGJvb2wg
Y2FsbGJhY2soY29uc3QgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYg
cmVjb3JkSGFuZGxlLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgIHsKICAgICAgICAgUmVmUHRy
PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gb2JqZWN0VmFsdWUgPSBTZXJpYWxpemVkU2NyaXB0VmFs
dWU6OmNyZWF0ZUZyb21XaXJlKHZhbHVlKTsKICAgICAgICAgUmVmUHRyPElEQktleT4gaW5kZXhL
ZXkgPSBmZXRjaEtleUZyb21LZXlQYXRoKG9iamVjdFZhbHVlLmdldCgpLCBtX2luZGV4S2V5UGF0
aCk7CiAKLSAgICAgICAgaWYgKCFtX2JhY2tpbmdTdG9yZS5wdXRJbmRleERhdGFGb3JSZWNvcmQo
bV9pbmRleElkLCAqaW5kZXhLZXksIG9iamVjdFN0b3JlRGF0YUlkKSkKKyAgICAgICAgaWYgKCFt
X2JhY2tpbmdTdG9yZS5wdXRJbmRleERhdGFGb3JSZWNvcmQobV9kYXRhYmFzZUlkLCBtX29iamVj
dFN0b3JlSWQsIG1faW5kZXhJZCwgKmluZGV4S2V5LCByZWNvcmRIYW5kbGUpKQogICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzM3LDE0ICszNTAs
MTYgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBJREJCYWNraW5nU3RvcmUmIG1fYmFja2luZ1N0
b3JlOwogICAgIGNvbnN0IFN0cmluZyYgbV9pbmRleEtleVBhdGg7CisgICAgaW50NjRfdCBtX2Rh
dGFiYXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CiAgICAgaW50NjRfdCBtX2lu
ZGV4SWQ7CiB9OwogfQogCi1zdGF0aWMgYm9vbCBwb3B1bGF0ZUluZGV4KElEQkJhY2tpbmdTdG9y
ZSYgYmFja2luZ1N0b3JlLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgpCitzdGF0aWMgYm9vbCBwb3B1bGF0ZUluZGV4KElE
QkJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBTdHJpbmcmIGluZGV4S2V5UGF0
aCkKIHsKLSAgICBQb3B1bGF0ZUluZGV4Q2FsbGJhY2sgY2FsbGJhY2soYmFja2luZ1N0b3JlLCBp
bmRleEtleVBhdGgsIGluZGV4SWQpOwotICAgIGlmICghYmFja2luZ1N0b3JlLmZvckVhY2hPYmpl
Y3RTdG9yZVJlY29yZChvYmplY3RTdG9yZUlkLCBjYWxsYmFjaykpCisgICAgUG9wdWxhdGVJbmRl
eENhbGxiYWNrIGNhbGxiYWNrKGJhY2tpbmdTdG9yZSwgaW5kZXhLZXlQYXRoLCBkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBpZiAoIWJhY2tpbmdTdG9yZS5mb3JFYWNo
T2JqZWN0U3RvcmVSZWNvcmQoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgY2FsbGJhY2spKQog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zNjAsNyArMzc1
LDcgQEAgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbnRlcmZhY2U+IElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGw6OmNyZWF0ZUluZGV4KGNvbnMKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQog
Ci0gICAgUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGluZGV4ID0gSURCSW5kZXhCYWNrZW5k
SW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBuYW1lLCBtX25hbWUsIGtleVBhdGgs
IHVuaXF1ZSk7CisgICAgUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGluZGV4ID0gSURCSW5k
ZXhCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBtX2RhdGFiYXNlSWQs
IHRoaXMsIG5hbWUsIG1fbmFtZSwga2V5UGF0aCwgdW5pcXVlKTsKICAgICBBU1NFUlQoaW5kZXgt
Pm5hbWUoKSA9PSBuYW1lKTsKIAogICAgIFJlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
PiBvYmplY3RTdG9yZSA9IHRoaXM7CkBAIC0zNzgsMTQgKzM5MywxNCBAQCBQYXNzUmVmUHRyPElE
QkluZGV4QmFja2VuZEludGVyZmFjZT4gSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRl
SW5kZXgoY29ucwogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGVJbmRleElu
dGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+
IGluZGV4LCBQYXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZT4gdHJhbnNh
Y3Rpb24pCiB7CiAgICAgaW50NjRfdCBpZDsKLSAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tp
bmdTdG9yZS0+Y3JlYXRlSW5kZXgob2JqZWN0U3RvcmUtPm1faWQsIGluZGV4LT5uYW1lKCksIGlu
ZGV4LT5rZXlQYXRoKCksIGluZGV4LT51bmlxdWUoKSwgaWQpKSB7CisgICAgaWYgKCFvYmplY3RT
dG9yZS0+bV9iYWNraW5nU3RvcmUtPmNyZWF0ZUluZGV4KG9iamVjdFN0b3JlLT5tX2RhdGFiYXNl
SWQsIG9iamVjdFN0b3JlLT5pZCgpLCBpbmRleC0+bmFtZSgpLCBpbmRleC0+a2V5UGF0aCgpLCBp
bmRleC0+dW5pcXVlKCksIGlkKSkgewogICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQoKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGluZGV4LT5zZXRJZChpZCk7CiAKLSAgICBpZiAo
IXBvcHVsYXRlSW5kZXgoKm9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZSwgb2JqZWN0U3RvcmUt
Pm1faWQsIGlkLCBpbmRleC0+a2V5UGF0aCgpKSkgeworICAgIGlmICghcG9wdWxhdGVJbmRleCgq
b2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLCBvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBv
YmplY3RTdG9yZS0+bV9pZCwgaWQsIGluZGV4LT5rZXlQYXRoKCkpKSB7CiAgICAgICAgIHRyYW5z
YWN0aW9uLT5hYm9ydCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDI4LDcgKzQ0Myw3
IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6ZGVsZXRlSW5kZXgoY29uc3QgU3Ry
aW5nJiBuYW1lLCBJREJUcmFuc2FjdGlvbkJhCiAKIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6ZGVsZXRlSW5kZXhJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1Jl
ZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJ
REJJbmRleEJhY2tlbmRJbXBsPiBpbmRleCwgUGFzc1JlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tl
bmRJbnRlcmZhY2U+IHRyYW5zYWN0aW9uKQogewotICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdT
dG9yZS0+ZGVsZXRlSW5kZXgoaW5kZXgtPmlkKCkpOworICAgIG9iamVjdFN0b3JlLT5tX2JhY2tp
bmdTdG9yZS0+ZGVsZXRlSW5kZXgob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmUtPmlkKCksIGluZGV4LT5pZCgpKTsKICAgICB0cmFuc2FjdGlvbi0+ZGlkQ29tcGxldGVUYXNr
RXZlbnRzKCk7CiB9CiAKQEAgLTQ0Niw3ICs0NjEsNyBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGw6Om9wZW5DdXJzb3JJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFz
cwogewogICAgIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PElE
QkN1cnNvcjo6RGlyZWN0aW9uPih0bXBEaXJlY3Rpb24pOwogCi0gICAgUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yPiBiYWNraW5nU3RvcmVDdXJzb3IgPSBvYmplY3RTdG9yZS0+bV9iYWNr
aW5nU3RvcmUtPm9wZW5PYmplY3RTdG9yZUN1cnNvcihvYmplY3RTdG9yZS0+aWQoKSwgcmFuZ2Uu
Z2V0KCksIGRpcmVjdGlvbik7CisgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBi
YWNraW5nU3RvcmVDdXJzb3IgPSBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPm9wZW5PYmpl
Y3RTdG9yZUN1cnNvcihvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQo
KSwgcmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CiAgICAgaWYgKCFiYWNraW5nU3RvcmVDdXJzb3Ip
IHsKICAgICAgICAgY2FsbGJhY2tzLT5vblN1Y2Nlc3MoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpu
dWxsVmFsdWUoKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTQ2MiwxNCArNDc3LDE0IEBAIHZvaWQg
SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6bG9hZEluZGV4ZXMoKQogICAgIFZlY3RvcjxTdHJp
bmc+IG5hbWVzOwogICAgIFZlY3RvcjxTdHJpbmc+IGtleVBhdGhzOwogICAgIFZlY3Rvcjxib29s
PiB1bmlxdWVGbGFnczsKLSAgICBtX2JhY2tpbmdTdG9yZS0+Z2V0SW5kZXhlcyhtX2lkLCBpZHMs
IG5hbWVzLCBrZXlQYXRocywgdW5pcXVlRmxhZ3MpOworICAgIG1fYmFja2luZ1N0b3JlLT5nZXRJ
bmRleGVzKG1fZGF0YWJhc2VJZCwgbV9pZCwgaWRzLCBuYW1lcywga2V5UGF0aHMsIHVuaXF1ZUZs
YWdzKTsKIAogICAgIEFTU0VSVChuYW1lcy5zaXplKCkgPT0gaWRzLnNpemUoKSk7CiAgICAgQVNT
RVJUKGtleVBhdGhzLnNpemUoKSA9PSBpZHMuc2l6ZSgpKTsKICAgICBBU1NFUlQodW5pcXVlRmxh
Z3Muc2l6ZSgpID09IGlkcy5zaXplKCkpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBp
ZHMuc2l6ZSgpOyBpKyspCi0gICAgICAgIG1faW5kZXhlcy5zZXQobmFtZXNbaV0sIElEQkluZGV4
QmFja2VuZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgaWRzW2ldLCBuYW1lc1tp
XSwgbV9uYW1lLCBrZXlQYXRoc1tpXSwgdW5pcXVlRmxhZ3NbaV0pKTsKKyAgICAgICAgbV9pbmRl
eGVzLnNldChuYW1lc1tpXSwgSURCSW5kZXhCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0
b3JlLmdldCgpLCBtX2RhdGFiYXNlSWQsIHRoaXMsIGlkc1tpXSwgbmFtZXNbaV0sIG1fbmFtZSwg
a2V5UGF0aHNbaV0sIHVuaXF1ZUZsYWdzW2ldKSk7CiB9CiAKIHZvaWQgSURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbDo6cmVtb3ZlSW5kZXhGcm9tTWFwKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVm
UHRyPElEQkluZGV4QmFja2VuZEltcGw+IGluZGV4KQpAQCAtNDkwLDcgKzUwNSw3IEBAIFBhc3NS
ZWZQdHI8SURCS2V5PiBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpnZW5BdXRvSW5jcmVtZW50
S2V5KCkKICAgICBpZiAobV9hdXRvSW5jcmVtZW50TnVtYmVyID4gMCkKICAgICAgICAgcmV0dXJu
IElEQktleTo6Y3JlYXRlTnVtYmVyKG1fYXV0b0luY3JlbWVudE51bWJlcisrKTsKIAotICAgIG1f
YXV0b0luY3JlbWVudE51bWJlciA9IHN0YXRpY19jYXN0PGludD4obV9iYWNraW5nU3RvcmUtPm5l
eHRBdXRvSW5jcmVtZW50TnVtYmVyKGlkKCkpKTsKKyAgICBtX2F1dG9JbmNyZW1lbnROdW1iZXIg
PSBzdGF0aWNfY2FzdDxpbnQ+KG1fYmFja2luZ1N0b3JlLT5uZXh0QXV0b0luY3JlbWVudE51bWJl
cihtX2RhdGFiYXNlSWQsIGlkKCkpKTsKICAgICByZXR1cm4gSURCS2V5OjpjcmVhdGVOdW1iZXIo
bV9hdXRvSW5jcmVtZW50TnVtYmVyKyspOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5oCmluZGV4IDQ0NzlkMWUwZDc0YmYwNjgw
OTI0N2Q4ZjJkNWZjYjZiNjc3NmI2ZTAuLmVjZTNmZTRmNTg2N2M5OWI1ODRjNzZkOWQ0NTI2MWE1
N2U3YzJlYzUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbC5oCkBAIC00MiwxMyArNDIsMTMgQEAgY2xhc3MgU2NyaXB0RXhlY3V0aW9u
Q29udGV4dDsKIAogY2xhc3MgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCA6IHB1YmxpYyBJREJP
YmplY3RTdG9yZUJhY2tlbmRJbnRlcmZhY2UgewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVm
UHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJh
Y2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3Rv
cmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBj
b25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKICAgICB7Ci0gICAgICAg
IHJldHVybiBhZG9wdFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChiYWNraW5nU3Rv
cmUsIGlkLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5jcmVtZW50KSk7CisgICAgICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChiYWNraW5nU3RvcmUsIGRhdGFi
YXNlSWQsIGlkLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5jcmVtZW50KSk7CiAgICAgfQotICAgIHN0
YXRpYyBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNr
aW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3Rv
cmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChiYWNraW5nU3RvcmUsIG5hbWUsIGtl
eVBhdGgsIGF1dG9JbmNyZW1lbnQpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgbmFtZSwga2V5
UGF0aCwgYXV0b0luY3JlbWVudCkpOwogICAgIH0KICAgICB2aXJ0dWFsIH5JREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsKCk7CiAKQEAgLTU5LDYgKzU5LDcgQEAgcHVibGljOgogICAgICAgICByZXR1
cm4gbV9pZDsKICAgICB9CiAgICAgdm9pZCBzZXRJZChpbnQ2NF90IGlkKSB7IG1faWQgPSBpZDsg
fQorICAgIGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VJZDsg
fQogCiAgICAgdmlydHVhbCBTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQog
ICAgIHZpcnR1YWwgU3RyaW5nIGtleVBhdGgoKSBjb25zdCB7IHJldHVybiBtX2tleVBhdGg7IH0K
QEAgLTc3LDggKzc4LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBvcGVuQ3Vyc29yKFBh
c3NSZWZQdHI8SURCS2V5UmFuZ2U+IHJhbmdlLCB1bnNpZ25lZCBzaG9ydCBkaXJlY3Rpb24sIFBh
c3NSZWZQdHI8SURCQ2FsbGJhY2tzPiwgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiwg
RXhjZXB0aW9uQ29kZSYpOwogCiBwcml2YXRlOgotICAgIElEQk9iamVjdFN0b3JlQmFja2VuZElt
cGwoSURCQmFja2luZ1N0b3JlKiwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCk7Ci0gICAgSURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50KTsKKyAgICBJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCk7CisgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3Rv
cmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQpOwogCiAgICAgdm9pZCBsb2FkSW5kZXhlcygp
OwogICAgIFBhc3NSZWZQdHI8SURCS2V5PiBnZW5BdXRvSW5jcmVtZW50S2V5KCk7CkBAIC05OSw2
ICsxMDAsNyBAQCBwcml2YXRlOgogCiAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNr
aW5nU3RvcmU7CiAKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKICAgICBpbnQ2NF90IG1faWQ7
CiAgICAgU3RyaW5nIG1fbmFtZTsKICAgICBTdHJpbmcgbV9rZXlQYXRoOwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwIGIvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwCmluZGV4IGU0M2I3YTM2
MDY5NTFlM2QyY2E2NTMwZTQ2YzFmOWEyZGYyZjUxY2QuLjllZjBjMjQwZjMyYzNmZThlOGI4Y2Ex
ZTE1NDFhYzdmODk5YTcxMjMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
U1FMaXRlQmFja2luZ1N0b3JlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNR
TGl0ZUJhY2tpbmdTdG9yZS5jcHAKQEAgLTE3Myw3ICsxNzMsNyBAQCBQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZT4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3JpZ2luKiBz
ZWN1cml0eQogICAgIGlmICghcGF0aEJhc2UuaXNFbXB0eSgpKSB7CiAgICAgICAgIGlmICghbWFr
ZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNlKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IElzIHRo
ZXJlIGFueSBvdGhlciB0aGluZyB3ZSBjb3VsZCBwb3NzaWJseSBkbyB0byByZWNvdmVyIGF0IHRo
aXMgcG9pbnQ/IElmIHNvLCBkbyBpdCByYXRoZXIgdGhhbiBqdXN0IGVycm9yaW5nIG91dC4KLSAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlZCB0byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFi
YXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIExPR19F
UlJPUigiVW5hYmxlIHRvIGNyZWF0ZSBJbmRleGVkIERCIGRhdGFiYXNlIHBhdGggJXMiLCBwYXRo
QmFzZS51dGY4KCkuZGF0YSgpKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAg
ICAgICAgIHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNlY3VyaXR5
T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhlZGRiIik7CkBAIC0yNjMsNyAr
MjYzLDcgQEAgdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2
NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYKICAgICB9CiB9CiAKLWJvb2wgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0
X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnko
bV9kYiwgIklOU0VSVCBJTlRPIE9iamVjdFN0b3JlcyAobmFtZSwga2V5UGF0aCwgZG9BdXRvSW5j
cmVtZW50LCBkYXRhYmFzZUlkKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAgICAgaWYgKHF1ZXJ5
LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKQEAgLTI5MSw3ICsyOTEsNyBAQCBzdGF0aWMgdm9p
ZCBkb0RlbGV0ZShTUUxpdGVEYXRhYmFzZSYgZGIsIGNvbnN0IGNoYXIqIHNxbCwgaW50NjRfdCBp
ZCkKICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFu
ZGxpbmcuCiB9CiAKLXZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9y
ZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVs
ZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQp
CiB7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlcyBXSEVSRSBp
ZCA9ID8iLCBvYmplY3RTdG9yZUlkKTsKICAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00g
T2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7
CkBAIC0zNzMsNyArMzczLDcgQEAgc3RhdGljIFN0cmluZyB1cHBlckN1cnNvcldoZXJlRnJhZ21l
bnQoY29uc3QgSURCS2V5JiBrZXksIFN0cmluZyBjb21wYXJpc29uT3BlcmEKICAgICByZXR1cm4g
IiI7CiB9CiAKLVN0cmluZyBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCitTdHJpbmcgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7CiAgICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1Qga2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlO
dW1iZXIsIHZhbHVlIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/
IEFORCAiICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KSk7CiAgICAgYm9vbCBvayA9IHF1ZXJ5LnBy
ZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKQEAgLTQyMiw1OCArNDIyLDYzIEBAIHN0YXRpYyB2b2lk
IGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKFNRTGl0ZVN0YXRlbWVudCYgcXVlcnksIGludCBiYXNl
Q29sdW1uLCBjb25zCiAgICAgfQogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0
T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtl
eSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lk
KQorbmFtZXNwYWNlIHsKK2NsYXNzIFNRTGl0ZVJlY29yZEhhbmRsZSA6IHB1YmxpYyBJREJCYWNr
aW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlIHsKK3B1YmxpYzoKKyAgICBTUUxpdGVS
ZWNvcmRIYW5kbGUoaW50NjRfdCBpZCkgOiBtX2lkKGlkKSB7fQorICAgIGludDY0X3QgaWQoKSBj
b25zdCB7IHJldHVybiBtX2lkOyB9Citwcml2YXRlOgorICAgIGludDY0X3QgbV9pZDsKK307Cit9
CisKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXks
IGNvbnN0IFN0cmluZyYgdmFsdWUsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIHJl
Y29yZEhhbmRsZSkKIHsKLSAgICBTdHJpbmcgc3FsID0gIWludmFsaWRSb3dJZCA/ICJVUERBVEUg
T2JqZWN0U3RvcmVEYXRhIFNFVCBrZXlTdHJpbmcgPSA/LCBrZXlEYXRlID0gPywga2V5TnVtYmVy
ID0gPywgdmFsdWUgPSA/IFdIRVJFIGlkID0gPyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA6ICJJTlNFUlQgSU5UTyBPYmplY3RTdG9yZURhdGEgKGtleVN0cmluZywga2V5RGF0ZSwg
a2V5TnVtYmVyLCB2YWx1ZSwgb2JqZWN0U3RvcmVJZCkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSI7
CisgICAgU1FMaXRlUmVjb3JkSGFuZGxlKiBzcWxpdGVSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2Fz
dDxTUUxpdGVSZWNvcmRIYW5kbGUqPihyZWNvcmRIYW5kbGUuZ2V0KCkpOworCisgICAgU3RyaW5n
IHNxbCA9IHNxbGl0ZVJlY29yZEhhbmRsZSA/ICJVUERBVEUgT2JqZWN0U3RvcmVEYXRhIFNFVCBr
ZXlTdHJpbmcgPSA/LCBrZXlEYXRlID0gPywga2V5TnVtYmVyID0gPywgdmFsdWUgPSA/IFdIRVJF
IGlkID0gPyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIklOU0VSVCBJ
TlRPIE9iamVjdFN0b3JlRGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1iZXIsIHZhbHVl
LCBvYmplY3RTdG9yZUlkKSBWQUxVRVMgKD8sID8sID8sID8sID8pIjsKICAgICBTUUxpdGVTdGF0
ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKICAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJl
c3VsdE9rKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBiaW5kS2V5VG9RdWVyeVdpdGhO
dWxscyhxdWVyeSwgMSwga2V5KTsKICAgICBxdWVyeS5iaW5kQmxvYig0LCB2YWx1ZSk7Ci0gICAg
aWYgKCFpbnZhbGlkUm93SWQpCi0gICAgICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCByb3dJZCk7Cisg
ICAgaWYgKHNxbGl0ZVJlY29yZEhhbmRsZSkKKyAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIHNx
bGl0ZVJlY29yZEhhbmRsZS0+aWQoKSk7CiAgICAgZWxzZQogICAgICAgICBxdWVyeS5iaW5kSW50
NjQoNSwgb2JqZWN0U3RvcmVJZCk7CiAKICAgICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3Vs
dERvbmUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChpbnZhbGlkUm93SWQpCi0g
ICAgICAgIHJvd0lkID0gbV9kYi5sYXN0SW5zZXJ0Um93SUQoKTsKKyAgICBpZiAoIXNxbGl0ZVJl
Y29yZEhhbmRsZSkKKyAgICAgICAgcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IFNRTGl0ZVJl
Y29yZEhhbmRsZShtX2RiLmxhc3RJbnNlcnRSb3dJRCgpKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsK
IH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRf
dCBvYmplY3RTdG9yZUlkKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0
U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCiB7CiAgICAg
ZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBvYmplY3RTdG9yZURh
dGFJZCBJTiAoU0VMRUNUIGlkIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3Jl
SWQgPSA/KSIsIG9iamVjdFN0b3JlSWQpOwogICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJP
TSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iLCBvYmplY3RTdG9yZUlk
KTsKIH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3QsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCit2b2lkIElEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiByZWNv
cmRIYW5kbGUpCiB7CisgICAgY29uc3QgU1FMaXRlUmVjb3JkSGFuZGxlJiBzcWxpdGVSZWNvcmRI
YW5kbGUgPSBzdGF0aWNfY2FzdDxjb25zdCBTUUxpdGVSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5k
bGUpOworCiAgICAgU1FMaXRlU3RhdGVtZW50IG9zUXVlcnkobV9kYiwgIkRFTEVURSBGUk9NIE9i
amVjdFN0b3JlRGF0YSBXSEVSRSBpZCA9ID8iKTsKICAgICBib29sIG9rID0gb3NRdWVyeS5wcmVw
YXJlKCkgPT0gU1FMUmVzdWx0T2s7CiAgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhN
RTogQmV0dGVyIGVycm9yIGhhbmRsaW5nPwogCi0gICAgb3NRdWVyeS5iaW5kSW50NjQoMSwgb2Jq
ZWN0U3RvcmVEYXRhSWQpOworICAgIG9zUXVlcnkuYmluZEludDY0KDEsIHNxbGl0ZVJlY29yZEhh
bmRsZS5pZCgpKTsKIAogICAgIG9rID0gb3NRdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsK
ICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgaW5kZXhR
dWVyeShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlk
ID0gPyIpOwotICAgIG9rID0gaW5kZXhRdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7Ci0g
ICAgQVNTRVJUX1VOVVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5n
PwotCi0gICAgaW5kZXhRdWVyeS5iaW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOwotCi0g
ICAgb2sgPSBpbmRleFF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwotICAgIEFTU0VSVF9V
TlVTRUQob2ssIG9rKTsKIH0KIAotZG91YmxlIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6bmV4dEF1
dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlkKQorZG91YmxlIElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCiB7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1f
ZGIsICJTRUxFQ1QgbWF4KGtleU51bWJlcikgKyAxIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJF
IG9iamVjdFN0b3JlSWQgPSA/IEFORCBrZXlTdHJpbmcgSVMgTlVMTCBBTkQga2V5RGF0ZSBJUyBO
VUxMIik7CiAgICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKQEAg
LTQ4Nyw3ICs0OTIsNyBAQCBkb3VibGUgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpuZXh0QXV0b0lu
Y3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpCiAgICAgcmV0dXJuIHF1ZXJ5Lmdl
dENvbHVtbkRvdWJsZSgwKTsKIH0KIAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmtleUV4
aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtl
eSwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgUmVmUHRyPE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiYgZm91bmRSZWNvcmRIYW5kbGUpCiB7CiAgICAgU3RyaW5nIHNxbCA9IFN0cmlu
ZygiU0VMRUNUIGlkIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/
IEFORCAiKSArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSk7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1
ZXJ5KG1fZGIsIHNxbCk7CkBAIC01MDAsMTEgKzUwNSwxMSBAQCBib29sIElEQlNRTGl0ZUJhY2tp
bmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNv
bnN0CiAgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHRSb3cpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKIAotICAgIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQgPSBxdWVyeS5nZXRDb2x1bW5J
bnQ2NCgwKTsKKyAgICBmb3VuZFJlY29yZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBTUUxpdGVSZWNv
cmRIYW5kbGUocXVlcnkuZ2V0Q29sdW1uSW50NjQoMCkpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0K
IAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZChp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smIGNhbGxiYWNr
KQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZChp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNv
cmRDYWxsYmFjayYgY2FsbGJhY2spCiB7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIs
ICJTRUxFQ1QgaWQsIHZhbHVlIEZST00gT2JqZWN0U3RvcmVEYXRhIFdIRVJFIG9iamVjdFN0b3Jl
SWQgPSA/Iik7CiAgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKQEAgLTUx
NSwxNCArNTIwLDE1IEBAIGJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0
U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplCiAgICAgd2hpbGUgKHF1ZXJ5
LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKICAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZURh
dGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDApOwogICAgICAgICBTdHJpbmcgdmFsdWUgPSBx
dWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMSk7Ci0gICAgICAgIGlmICghY2FsbGJhY2suY2Fs
bGJhY2sob2JqZWN0U3RvcmVEYXRhSWQsIHZhbHVlKSkKKyAgICAgICAgUmVmUHRyPFNRTGl0ZVJl
Y29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IFNRTGl0ZVJlY29yZEhhbmRs
ZShvYmplY3RTdG9yZURhdGFJZCkpOworICAgICAgICBpZiAoIWNhbGxiYWNrLmNhbGxiYWNrKCpy
ZWNvcmRIYW5kbGUsIHZhbHVlKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldElu
ZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBW
ZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMs
IFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0
b3JlOjpnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVG
bGFncykKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBpZCwgbmFt
ZSwga2V5UGF0aCwgaXNVbmlxdWUgRlJPTSBJbmRleGVzIFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/
Iik7CiAgICAgYm9vbCBvayA9IHF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKQEAgLTU0
Myw3ICs1NDksNyBAQCB2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZgogICAgIH0KIH0KIAotYm9vbCBJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUs
IGludDY0X3QmIGluZGV4SWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5k
ZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBp
bmRleElkKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiSU5TRVJUIElOVE8g
SW5kZXhlcyAob2JqZWN0U3RvcmVJZCwgbmFtZSwga2V5UGF0aCwgaXNVbmlxdWUpIFZBTFVFUyAo
PywgPywgPywgPykiKTsKICAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQpA
QCAtNTYxLDM2ICs1NjcsNDEgQEAgYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNyZWF0ZUlu
ZGV4KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW0KICAgICByZXR1cm4g
dHJ1ZTsKIH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KGludDY0
X3QgaW5kZXhJZCkKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQog
ewogICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleGVzIFdIRVJFIGlkID0gPyIs
IGluZGV4SWQpOwogICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hF
UkUgaW5kZXhJZCA9ID8iLCBpbmRleElkKTsKIH0KIAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYg
a2V5LCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2Jq
ZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKIHsKKyAgICBjb25zdCBTUUxpdGVS
ZWNvcmRIYW5kbGUmIHNxbGl0ZVJlY29yZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IFNRTGl0
ZVJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVl
cnkobV9kYiwgIklOU0VSVCBJTlRPIEluZGV4RGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlO
dW1iZXIsIGluZGV4SWQsIG9iamVjdFN0b3JlRGF0YUlkKSBWQUxVRVMgKD8sID8sID8sID8sID8p
Iik7CiAgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCiAgICAgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMocXVlcnksIDEsIGtleSk7
CiAgICAgcXVlcnkuYmluZEludDY0KDQsIGluZGV4SWQpOwotICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1
LCBvYmplY3RTdG9yZURhdGFJZCk7CisgICAgcXVlcnkuYmluZEludDY0KDUsIHNxbGl0ZVJlY29y
ZEhhbmRsZS5pZCgpKTsKIAogICAgIHJldHVybiBxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9u
ZTsKIH0KIAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZvclJl
Y29yZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhh
bmRsZSYgcmVjb3JkSGFuZGxlKQogewotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAi
REVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlkID0gPyIpOworICAg
IGNvbnN0IFNRTGl0ZVJlY29yZEhhbmRsZSYgc3FsaXRlUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nh
c3Q8Y29uc3QgU1FMaXRlUmVjb3JkSGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKKworICAgIFNRTGl0
ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVj
dFN0b3JlRGF0YUlkID0gPyBBTkQgaW5kZXhJZCA9ID8iKTsKICAgICBpZiAocXVlcnkucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBxdWVyeS5i
aW5kSW50NjQoMSwgb2JqZWN0U3RvcmVEYXRhSWQpOworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgxLCBz
cWxpdGVSZWNvcmRIYW5kbGUuaWQoKSk7CisgICAgcXVlcnkuYmluZEludDY0KDIsIGluZGV4SWQp
OwogICAgIHJldHVybiBxdWVyeS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKIH0KIAotU3RyaW5n
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElk
LCBjb25zdCBJREJLZXkmIGtleSkKK1N0cmluZyBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9i
amVjdFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewogICAgIFN0cmluZyBzcWwgPSBT
dHJpbmcoIlNFTEVDVCAiKQogICAgICAgICAgICAgICAgICArICJPYmplY3RTdG9yZURhdGEudmFs
dWUgIgpAQCAtNjI5LDcgKzY0MCw3IEBAIHN0YXRpYyBQYXNzUmVmUHRyPElEQktleT4ga2V5RnJv
bVF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCYgcXVlcnksIGludCBiYXNlQ29sdW1uKQogICAgIHJldHVy
biBJREJLZXk6OmNyZWF0ZU51bGwoKTsKIH0KIAotUGFzc1JlZlB0cjxJREJLZXk+IElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29u
c3QgSURCS2V5JiBrZXkpCitQYXNzUmVmUHRyPElEQktleT4gSURCU1FMaXRlQmFja2luZ1N0b3Jl
OjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7CiAgICAgU3Ry
aW5nIHNxbCA9IFN0cmluZygiU0VMRUNUICIpCiAgICAgICAgICAgICAgICAgICsgIk9iamVjdFN0
b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3JlRGF0YS5rZXlEYXRlLCBPYmplY3RTdG9yZURh
dGEua2V5TnVtYmVyICIKQEAgLTY1MSw3ICs2NjIsNyBAQCBQYXNzUmVmUHRyPElEQktleT4gSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBpbmRleElk
LAogICAgIHJldHVybiBmb3VuZEtleS5yZWxlYXNlKCk7CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFj
a2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
JiBrZXkpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmIGtleSkKIHsKICAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgaWQg
RlJPTSBJbmRleERhdGEgV0hFUkUgaW5kZXhJZCA9ID8gQU5EICIpICsgd2hlcmVTeW50YXhGb3JL
ZXkoa2V5KTsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgc3FsKTsKQEAgLTY4Miw3
ICs2OTMsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkg
eyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4g
cHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQogICAgIHZpcnR1YWwgU3RyaW5n
IHZhbHVlKCkgPSAwOwotICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpID0g
MDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJl
Y29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSA9IDA7CiAgICAgdmlydHVhbCBp
bnQ2NF90IGluZGV4RGF0YUlkKCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIGxvYWRDdXJyZW50
Um93KCkgPSAwOwpAQCAtNzQxLDcgKzc1Miw3IEBAIHB1YmxpYzoKIAogICAgIC8vIEN1cnNvcklt
cGxDb21tb24uCiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRW
YWx1ZTsgfQotICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgcmV0dXJu
IG1fY3VycmVudElkOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6
T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgeyByZXR1
cm4gYWRvcHRSZWYobmV3IFNRTGl0ZVJlY29yZEhhbmRsZShtX2N1cnJlbnRJZCkpOyB9CiAgICAg
dmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0
dXJuIDA7IH0KICAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKICAgICB2aXJ0dWFs
IGJvb2wgY3VycmVudFJvd0V4aXN0cygpOwpAQCAtNzc5LDcgKzc5MCw3IEBAIHB1YmxpYzoKICAg
ICAvLyBDdXJzb3JJbXBsQ29tbW9uCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJp
bWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVudFByaW1hcnlLZXk7IH0KICAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQot
ICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkgeyBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGludDY0X3QgaW5k
ZXhEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQogICAgIHZpcnR1YWwgdm9pZCBsb2Fk
Q3VycmVudFJvdygpOwogICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhpc3RzKCk7CkBAIC04
MTcsNyArODI4LDcgQEAgcHVibGljOgogICAgIC8vIEN1cnNvckltcGxDb21tb24KICAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50UHJp
bWFyeUtleTsgfQogICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50
VmFsdWU7IH0KLSAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJC
YWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhh
bmRsZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBp
bnQ2NF90IGluZGV4RGF0YUlkKCkgeyByZXR1cm4gbV9jdXJyZW50SWQ7IH0KICAgICB2aXJ0dWFs
IHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKICAgICB2aXJ0dWFsIGJvb2wgY3VycmVudFJvd0V4aXN0
cygpOwpAQCAtODQ5LDcgKzg2MCw3IEBAIGJvb2wgSW5kZXhDdXJzb3JJbXBsOjpjdXJyZW50Um93
RXhpc3RzKCkKIAogfSAvLyBuYW1lc3BhY2UKIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6
OkN1cnNvcj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6
RGlyZWN0aW9uIGRpcmVjdGlvbikKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2Us
IElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICAgICBib29sIGxvd2VyQm91bmQg
PSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKICAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAm
JiByYW5nZS0+dXBwZXIoKTsKQEAgLTg4Niw3ICs4OTcsNyBAQCBQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1
cnNvcgogICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOwogfQogCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1
cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURC
S2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAgICAg
U3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIEluZGV4RGF0YS5pZCwgSW5kZXhEYXRhLmtleVN0
cmluZywgSW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1iZXIsICIpCiAgICAgICAg
ICAgICAgICAgICsgKCJPYmplY3RTdG9yZURhdGEua2V5U3RyaW5nLCBPYmplY3RTdG9yZURhdGEu
a2V5RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtleU51bWJlciAiKQpAQCAtOTI2LDcgKzkzNyw3IEBA
IFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGluCiAgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7CiB9
CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2Uq
IHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCitQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNv
cihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVj
dGlvbikKIHsKICAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgSW5kZXhEYXRhLmlkLCBJ
bmRleERhdGEua2V5U3RyaW5nLCBJbmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJl
ciwgIikKICAgICAgICAgICAgICAgICAgKyAoIk9iamVjdFN0b3JlRGF0YS52YWx1ZSwgT2JqZWN0
U3RvcmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtleURhdGUsIE9iamVjdFN0b3Jl
RGF0YS5rZXlOdW1iZXIgIikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
U1FMaXRlQmFja2luZ1N0b3JlLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJh
Y2tpbmdTdG9yZS5oCmluZGV4IGZlMGM2YzE3NTE2ZGU5ZTQwZmE5Nzg3YjFjZTVmMGU2MzIwYjU5
YjcuLjA2NTQ4OTU3YWRjZTY1YmVmZDA5NzU2NjYzMTk1NTAwZjEzYWVlYjAgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKKysrIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaApAQCAtNDEsMjkgKzQx
LDI5IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgc2V0SURCRGF0YWJhc2VNZXRhRGF0YShj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYgcm93SWQs
IGJvb2wgaW52YWxpZFJvd0lkKTsKIAogICAgIHZpcnR1YWwgdm9pZCBnZXRPYmplY3RTdG9yZXMo
aW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3Ry
aW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxi
b29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpOwotICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVP
YmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9v
bCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QmIGFzc2lnbmVkT2Jq
ZWN0U3RvcmVJZCk7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3Qg
b2JqZWN0U3RvcmVJZCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQo
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmKTsKLSAgICB2aXJ0dWFsIGJvb2wg
cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkm
LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQp
OwotICAgIHZpcnR1YWwgdm9pZCBjbGVhck9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCk7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCk7Ci0gICAgdmlydHVhbCBkb3Vi
bGUgbmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKLSAgICB2
aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGNvbnN0IElEQktleSYsIGludDY0X3QmIGZvdW5kT2JqZWN0U3RvcmVEYXRhSWQpOwotCi0gICAg
dmlydHVhbCBib29sIGZvckVhY2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKTsKLQotICAgIHZpcnR1YWwgdm9pZCBnZXRJ
bmRleGVzKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhz
LCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpOwotICAgIHZpcnR1YWwgYm9vbCBjcmVh
dGVJbmRleChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKTsKLSAgICB2
aXJ0dWFsIHZvaWQgZGVsZXRlSW5kZXgoaW50NjRfdCBpbmRleElkKTsKLSAgICB2aXJ0dWFsIGJv
b2wgcHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jiwg
aW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCk7Ci0gICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4
RGF0YUZvclJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICB2aXJ0dWFsIFN0
cmluZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOwot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2
NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOwotICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJ
bkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7Ci0KLSAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8Q3Vyc29yPiBvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKLSAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBpbmRleElk
LCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKLSAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIGJvb2wg
Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUs
IGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90JiBhc3Np
Z25lZE9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCBT
dHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpOworICAgIHZpcnR1YWwgYm9vbCBwdXRPYmplY3RT
dG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlPiYpOworICAgIHZpcnR1YWwgdm9pZCBjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRl
T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7CisgICAgdmlydHVhbCBkb3VibGUg
bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQpOworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBSZWZQ
dHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiBmb3VuZFJlY29yZEhhbmRsZSk7CisKKyAgICB2
aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJik7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZv
dW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZv
dW5kVW5pcXVlRmxhZ3MpOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpOworICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0SW5kZXhE
YXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFu
ZGxlJik7CisgICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVj
dFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJL
ZXk+IGdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKKyAgICB2aXJ0dWFs
IGJvb2wga2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKKworICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6
OkRpcmVjdGlvbik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5
Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKIAogICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxUcmFuc2FjdGlvbj4gY3JlYXRlVHJhbnNhY3Rpb24oKTsKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwppbmRleCBhZmE0ZDYxZTliMjllOTFkYTdkZGNhN2ZlNWEwMzNmNGIxZWFjMzk4Li5jYWE1
YjIxNmRlZmUwMmM1ZTYwYmI3OTQ4ZGIzMWJjNmQ1ZTlhZjcyIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0No
YW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDExLTAzLTMwICBIYW5zIFdlbm5ib3JnICA8aGFu
c0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgTGV2ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgKiBmZWF0dXJl
cy5neXBpOgorICAgICAgICAqIHB1YmxpYy9XZWJJREJGYWN0b3J5Lmg6CisgICAgICAgIChXZWJL
aXQ6OldlYklEQkZhY3Rvcnk6Om9wZW4pOgorCiAyMDExLTAzLTI5ICBTaGVyaWZmIEJvdCAgPHdl
YmtpdC5yZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5n
IG91dCByODIyOTMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVz
Lmd5cGkgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkKaW5kZXggNzM1NGVi
OGU4YzE5OWM0ODg2ZGNiMjdiYWQwNTBiODk0ZDA1ZmEzNC4uMDA2MTViNDM3YThkN2JkMDMxMjE5
ZjIzNGQ4ZmQ5OWVlNDNiNDQ4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9m
ZWF0dXJlcy5neXBpCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQpA
QCAtNjUsNiArNjUsNyBAQAogICAgICAgICAnRU5BQkxFX0lOUFVUX1NQRUVDSD0xJywKICAgICAg
ICAgJ0VOQUJMRV9KQVZBU0NSSVBUX0RFQlVHR0VSPTEnLAogICAgICAgICAnRU5BQkxFX0pTQ19N
VUxUSVBMRV9USFJFQURTPTAnLAorICAgICAgICAnRU5BQkxFX0xFVkVMREI9MCcsCiAgICAgICAg
ICdFTkFCTEVfTElOS19QUkVGRVRDSD0xJywKICAgICAgICAgJ0VOQUJMRV9NQVRITUw9MCcsCiAg
ICAgICAgICdFTkFCTEVfTUVESUFfU1RBVElTVElDUz0xJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYklEQkZhY3RvcnkuaCBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vcHVibGljL1dlYklEQkZhY3RvcnkuaAppbmRleCAyOTQxNGU4MDVkYWFjN2YzNzU5Y2Zh
YTdjODNjYmU1ZjkzMjBjYTAwLi43MWIyOTQxODNmMTM1OWVjNzU3Njk3MWI1YzI1NjVmYTRjNzM0
Y2Y1IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJGYWN0
b3J5LmgKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCRmFjdG9yeS5o
CkBAIC01NywxMSArNTcsNyBAQCBwdWJsaWM6CiAgICAgfTsKIAogICAgIC8vIFRoZSBXZWJLaXQg
aW1wbGVtZW50YXRpb24gb2Ygb3BlbiBpZ25vcmVzIHRoZSBXZWJGcmFtZSogcGFyYW1ldGVyLgot
ICAgIC8vIEZJWE1FOiBBc3NlcnQgbm90IHJlYWNoZWQgd2hlbiBDaHJvbWl1bSBzaWRlIGlzIHVw
ZGF0ZWQuCi0gICAgdmlydHVhbCB2b2lkIG9wZW4oY29uc3QgV2ViU3RyaW5nJiBuYW1lLCBXZWJJ
REJDYWxsYmFja3MqIGNhbGxiYWNrcywgY29uc3QgV2ViU2VjdXJpdHlPcmlnaW4mIG9yaWdpbiwg
V2ViRnJhbWUqIGZyYW1lLCBjb25zdCBXZWJTdHJpbmcmIGRhdGFEaXIsIHVuc2lnbmVkIGxvbmcg
bG9uZyBtYXhpbXVtU2l6ZSwgQmFja2luZ1N0b3JlVHlwZSkgeyBvcGVuKG5hbWUsIGNhbGxiYWNr
cywgb3JpZ2luLCBmcmFtZSwgZGF0YURpciwgbWF4aW11bVNpemUpOyB9Ci0KLSAgICAvLyBGSVhN
RTogUmVtb3ZlIHRoaXMgd2hlbiBDaHJvbWl1bSBzaWRlIGlzIHVwZGF0ZWQuCi0gICAgdmlydHVh
bCB2b2lkIG9wZW4oY29uc3QgV2ViU3RyaW5nJiBuYW1lLCBXZWJJREJDYWxsYmFja3MqIGNhbGxi
YWNrcywgY29uc3QgV2ViU2VjdXJpdHlPcmlnaW4mIG9yaWdpbiwgV2ViRnJhbWUqIGZyYW1lLCBj
b25zdCBXZWJTdHJpbmcmIGRhdGFEaXIsIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhpbXVtU2l6ZSkg
eyBvcGVuKG5hbWUsIGNhbGxiYWNrcywgb3JpZ2luLCBmcmFtZSwgZGF0YURpciwgbWF4aW11bVNp
emUsIERlZmF1bHRCYWNraW5nU3RvcmUpOyB9CisgICAgdmlydHVhbCB2b2lkIG9wZW4oY29uc3Qg
V2ViU3RyaW5nJiBuYW1lLCBXZWJJREJDYWxsYmFja3MqLCBjb25zdCBXZWJTZWN1cml0eU9yaWdp
biYsIFdlYkZyYW1lKiwgY29uc3QgV2ViU3RyaW5nJiBkYXRhRGlyLCB1bnNpZ25lZCBsb25nIGxv
bmcgbWF4aW11bVNpemUsIEJhY2tpbmdTdG9yZVR5cGUpIHsgV0VCS0lUX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlRGF0YWJhc2UoY29uc3QgV2ViU3Ry
aW5nJiBuYW1lLCBXZWJJREJDYWxsYmFja3MqLCBjb25zdCBXZWJTZWN1cml0eU9yaWdpbiYsIFdl
YkZyYW1lKiwgY29uc3QgV2ViU3RyaW5nJiBkYXRhRGlyKSB7IFdFQktJVF9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsgfQogfTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87761</attachid>
            <date>2011-03-31 10:38:54 -0700</date>
            <delta_ts>2011-04-01 10:15:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110331183852.patch</filename>
            <type>text/plain</type>
            <size>149608</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBjNTRhMmUxNGY3Y2QwMTA3MDA2Y2FjNzk0OGY1ZjQyZTM4MzQ0N2NjLi4y
ZGNhZjczMDU5ZTFmOGQ3NTQ0ZTdkZTNlMDU3ZjI2NTdlNmMzMTEwIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTc5IEBACisyMDExLTAzLTMxICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEp
CisKKyAgICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3Jl
Lmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaDoKKyAgICAgICAgKFdl
YkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU6On5PYmplY3RT
dG9yZVJlY29yZEhhbmRsZSk6CisgICAgICAgICogc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0
ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6
OmNyZWF0ZU9iamVjdFN0b3JlSW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJh
c2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmVJbnRlcm5hbCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpsb2FkT2JqZWN0U3RvcmVzKToKKyAgICAgICAg
KiBzdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
REJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4pOgorICAgICAgICAqIHN0b3JhZ2UvSURCSW5kZXhC
YWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJbXBsOjpJ
REJJbmRleEJhY2tlbmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZElt
cGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tl
bmRJbXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJ
bXBsOjphZGRpbmdLZXlBbGxvd2VkKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQkluZGV4QmFja2Vu
ZEltcGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZSk6
CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJM
ZXZlbERCQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnByaW50U3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRl
Y29kZVZhckludCk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVTdHJpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dp
dGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nV2l0aExlbik6CisgICAgICAg
IChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91Ymxl
KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNv
ZGVLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y291bnROb25aZXJvQnl0ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6bWFrZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVQcmVmaXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0SW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEludCk6CisgICAg
ICAgIChXZWJDb3JlOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJh
c2VGcmVlTGlzdEtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJl
ZUxpc3RLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNl
RnJlZUxpc3RLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFi
YXNlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpE
YXRhYmFzZU5hbWVLZXk6OkRhdGFiYXNlTmFtZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQ
cmVmaXg6OkRhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6RGF0YWJhc2VOYW1lS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpEYXRhYmFzZU5hbWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5KToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURh
dGFLZXk6OkluZGV4TWV0YURhdGFLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJ
bmRleE1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJ
bmRleE1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJ
bmRleE1ldGFEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleSk6CisgICAgICAg
IChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6
OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5
OjpJbmRleEZyZWVMaXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhG
cmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhG
cmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhG
cmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVj
dFN0b3JlTmFtZXNLZXk6Ok9iamVjdFN0b3JlTmFtZXNLZXkpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUpOgorICAgICAgICAoV2Vi
Q29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tleTo6SW5kZXhOYW1lc0tleSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmRlY29kZSk6CisgICAgICAg
IChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmVuY29kZSk6CisgICAgICAgIChX
ZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2Vi
Q29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZURhdGFLZXk6Ok9iamVjdFN0b3JlRGF0YUtleSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZURhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtleTo6RXhp
c3RzRW50cnlLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtl
eTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50cnlLZXk6
OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5Ojpj
b21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjpJbmRl
eERhdGFLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6ZW5jb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5Ojpjb21wYXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6Q29tcGFyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OlhDb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6Q29tcGFyZUluZGV4S2V5cyk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OlJlYWxDb21wYXJlKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6TmFtZSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydGVzdFNlcGFyYXRvcik6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydFN1Y2Nlc3Nvcik6
CisgICAgICAgIChXZWJDb3JlOjpzZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0TmV3RGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3Jlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpnZXROZXdPYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmRlbGV0ZVJh
bmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9i
amVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld1ZlcnNpb25OdW1i
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0
U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y2xlYXJPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9y
ZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJ
bmRleGVzKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld0luZGV4SWQpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OmZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRl
eCk6CisgICAgICAgIChXZWJDb3JlOjp2ZXJzaW9uRXhpc3RzKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OmZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vy
c29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRy
YW5zYWN0aW9uKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaDog
QWRkZWQuCisgICAgICAgICogc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6Z2V0SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbDo6cHV0SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbDo6ZGVsZXRlSW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbDo6Y2xlYXJJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpwb3B1
bGF0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6
OmNyZWF0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZElt
cGw6OmNyZWF0ZUluZGV4SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbDo6ZGVsZXRlSW5kZXhJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpvcGVuQ3Vyc29ySW50ZXJuYWwpOgorICAgICAgICAo
V2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6bG9hZEluZGV4ZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Z2VuQXV0b0luY3JlbWVudEtl
eSk6CisgICAgICAgICogc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmg6CisgICAg
ICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6ZGF0YWJhc2VJZCk6CisgICAg
ICAgICogc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNR
TGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQp
OgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlT2Jq
ZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3Jl
OjpuZXh0QXV0b0luY3JlbWVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgpOgorICAgICAgICAo
V2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZv
clJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldE9i
amVjdFZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6
Z2V0UHJpbWFyeUtleVZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tp
bmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVC
YWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcik6CisgICAgICAgIChXZWJD
b3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcik6CisgICAgICAgICog
c3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaDoKKwogMjAxMS0wMy0zMSAgQmVuamFtaW4g
S2FsbWFuICA8a2FsbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBPamFu
IFZhZmFpLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5n
eXAgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAppbmRleCBlNjkyZjU0
MmQzNTNlZDRjZjAwMTQzNDE5ZmJkNWI3NWM3ZTI3MjViLi4xMzhhMmZhNDZmNzhjZTVhMWQ3MzYx
ODJlNDc3MmNiMGU3ZjI3Y2RjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5
cC9XZWJDb3JlLmd5cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5
cApAQCAtMTE2Nyw2ICsxMTY3LDE0IEBACiAgICAgICAgICAgICBdLAogICAgICAgICAgIH0sCiAg
ICAgICAgIH1dLAorICAgICAgICBbJyJFTkFCTEVfTEVWRUxEQj0xIiBpbiBmZWF0dXJlX2RlZmlu
ZXMnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KGNocm9t
aXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2xldmVsZGIvbGV2ZWxkYi5neXA6bGV2ZWxkYicsCisg
ICAgICAgICAgXSwKKyAgICAgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAg
ICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpL3RoaXJkX3BhcnR5L2xldmVsZGIvbGV2ZWxk
Yi5neXA6bGV2ZWxkYicsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCiAgICAgICBdLAogICAg
IH0sCiAgICAgewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDI5MGI5M2E1M2QzYzI1Zjc1Yjk4ODY2MTlk
MGE0NjUwOGU4MWRmNDIuLjkzYTE5NjRjNWQ4ZTEzZDY3YWEyM2E0OWVmNGJiMDQ5NzE0Y2ZiNDAg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKQEAgLTU0NDYsNiArNTQ0Niw4IEBACiAgICAgICAgICAgICAnc3Rv
cmFnZS9JREJLZXlQYXRoQmFja2VuZEltcGwuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJL
ZXlSYW5nZS5jcHAnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuaCcsCisgICAg
ICAgICAgICAnc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCcsCisgICAgICAgICAg
ICAnc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmgnLAogICAgICAgICAgICAgJ3N0b3Jh
Z2UvSURCT2JqZWN0U3RvcmUuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQk9iamVjdFN0
b3JlLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5j
cHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJCYWNraW5nU3RvcmUu
aCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2luZ1N0b3JlLmgKaW5kZXggMjk1MjNh
MmZiNWM5NmI3MTdlMzQ0NjU2ODAyOGM2OGQ2NTkzMWU0MC4uMTBmY2Y4NTE5NmE5MDU2ZWEyYWZj
OTc2YTIwMmRhMWU4OTE4Yzc2OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJCYWNraW5nU3RvcmUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdT
dG9yZS5oCkBAIC01MCwzMCArNTAsMzUgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzZXRJ
REJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJz
aW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpID0gMDsKIAogICAgIHZpcnR1
YWwgdm9pZCBnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRf
dD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4m
IGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpID0g
MDsKLSAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpID0gMDsKLSAgICB2aXJ0dWFs
IHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7Ci0gICAg
dmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIHB1dE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKSA9IDA7Ci0gICAgdmlydHVh
bCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7Ci0gICAg
dmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCkgPSAwOwotICAgIHZpcnR1YWwgZG91YmxlIG5l
eHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOwotICAgIHZp
cnR1YWwgYm9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCkgPSAwOworICAg
IHZpcnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQs
IGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBk
ZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCkgPSAwOworCisgICAgY2xhc3MgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUgOiBwdWJsaWMgUmVm
Q291bnRlZDxJREJCYWNraW5nU3RvcmU+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwg
fk9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkge30gCisgICAgfTsKKyAgICB2aXJ0dWFsIFN0cmlu
ZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBwdXRPYmplY3RT
dG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlPiYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgdm9p
ZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKSA9IDA7CisgICAgdmly
dHVhbCBkb3VibGUgbmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5P
YmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgSURCS2V5JiwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRSZWNvcmRI
YW5kbGUpID0gMDsKIAogICAgIGNsYXNzIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2sgewogICAg
IHB1YmxpYzoKLSAgICAgICAgIHZpcnR1YWwgYm9vbCBjYWxsYmFjayhpbnQ2NF90IG9iamVjdFN0
b3JlRGF0YUlkLCBjb25zdCBTdHJpbmcmIHZhbHVlKSA9IDA7CisgICAgICAgICB2aXJ0dWFsIGJv
b2wgY2FsbGJhY2soY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmLCBjb25zdCBTdHJpbmcm
IHZhbHVlKSA9IDA7CiAgICAgICAgICB2aXJ0dWFsIH5PYmplY3RTdG9yZVJlY29yZENhbGxiYWNr
KCkge307CiAgICAgfTsKLSAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpID0gMDsK
KyAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJikg
PSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVG
bGFncykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlz
VW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0ZUlu
ZGV4KGludDY0X3QgaW5kZXhJZCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRleERhdGFG
b3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmLCBpbnQ2NF90IG9iamVjdFN0
b3JlRGF0YUlkKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4RGF0YUZvclJlY29y
ZChpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7Ci0gICAgdmlydHVhbCBTdHJpbmcgZ2V0
T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7Ci0gICAg
dmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJ
bkluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JikgPSAwOworICAgIHZpcnR1YWwg
dm9pZCBnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywg
VmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVG
bGFncykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpID0gMDsKKyAgICB2
aXJ0dWFsIHZvaWQgZGVsZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRl
eERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUmKSA9IDA7CisgICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpID0gMDsKKyAgICB2aXJ0dWFsIFN0cmlu
ZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYp
ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFiYXNl
aWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkm
KSA9IDA7CiAKICAgICBjbGFzcyBDdXJzb3IgOiBwdWJsaWMgUmVmQ291bnRlZDxDdXJzb3I+IHsK
ICAgICBwdWJsaWM6CkBAIC04MSwxNCArODYsMTQgQEAgcHVibGljOgogICAgICAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxJREJLZXk+IHByaW1hcnlLZXkoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVl
KCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSA9IDA7
CisgICAgICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2Jq
ZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBpbmRl
eERhdGFJZCgpID0gMDsKICAgICAgICAgdmlydHVhbCB+Q3Vyc29yKCkge307CiAgICAgfTsKIAot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rp
b24pID0gMDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJz
b3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0
aW9uKSA9IDA7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29y
KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlv
bikgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1
cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
S2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElE
QkN1cnNvcjo6RGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4g
b3BlbkluZGV4Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rp
b24pID0gMDsKIAogICAgIGNsYXNzIFRyYW5zYWN0aW9uIDogcHVibGljIFJlZkNvdW50ZWQ8VHJh
bnNhY3Rpb24+IHsKICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkRhdGFiYXNlQmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJEYXRhYmFzZUJhY2tlbmRJbXBsLmNwcAppbmRleCA5NGUzMDViMWJjMDMyOTBhYWMyNzA1ZWVl
MDQzYzE5MzExYzc5ZWUyLi5mMThmNjhmZmVmMTM0OWY4YWFjOWZiMzM2NTI5NzdhNjZjODdiNzIz
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkRhdGFiYXNlQmFja2VuZElt
cGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRGF0YWJhc2VCYWNrZW5kSW1w
bC5jcHAKQEAgLTk3LDcgKzk3LDcgQEAgUGFzc1JlZlB0cjxET01TdHJpbmdMaXN0PiBJREJEYXRh
YmFzZUJhY2tlbmRJbXBsOjpvYmplY3RTdG9yZU5hbWVzKCkgY29uc3QKICAgICByZXR1cm4gb2Jq
ZWN0U3RvcmVOYW1lcy5yZWxlYXNlKCk7CiB9CiAKLVBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW50ZXJmYWNlPiAgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6Y3JlYXRlT2JqZWN0U3Rv
cmUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0lu
Y3JlbWVudCwgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiB0cmFuc2FjdGlvblB0ciwg
RXhjZXB0aW9uQ29kZSYgZWMpCitQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEludGVy
ZmFjZT4gSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6Y3JlYXRlT2JqZWN0U3RvcmUoY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgSURC
VHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiB0cmFuc2FjdGlvblB0ciwgRXhjZXB0aW9uQ29k
ZSYgZWMpCiB7CiAgICAgQVNTRVJUKHRyYW5zYWN0aW9uUHRyLT5tb2RlKCkgPT0gSURCVHJhbnNh
Y3Rpb246OlZFUlNJT05fQ0hBTkdFKTsKIApAQCAtMTA2LDcgKzEwNiw3IEBAIFBhc3NSZWZQdHI8
SURCT2JqZWN0U3RvcmVCYWNrZW5kSW50ZXJmYWNlPiAgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6
Y3JlYXRlT2JqZWN0CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIFJlZlB0cjxJREJP
YmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSA9IElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbmFtZSwga2V5UGF0aCwgYXV0b0lu
Y3JlbWVudCk7CisgICAgUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0
b3JlID0gSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdl
dCgpLCBtX2lkLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5jcmVtZW50KTsKICAgICBBU1NFUlQob2Jq
ZWN0U3RvcmUtPm5hbWUoKSA9PSBuYW1lKTsKIAogICAgIFJlZlB0cjxJREJEYXRhYmFzZUJhY2tl
bmRJbXBsPiBkYXRhYmFzZSA9IHRoaXM7CkBAIC0xMjUsNyArMTI1LDcgQEAgdm9pZCBJREJEYXRh
YmFzZUJhY2tlbmRJbXBsOjpjcmVhdGVPYmplY3RTdG9yZUludGVybmFsKFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQqLAogewogICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZDsKIAotICAgIGlmICghZGF0
YWJhc2UtPm1fYmFja2luZ1N0b3JlLT5jcmVhdGVPYmplY3RTdG9yZShvYmplY3RTdG9yZS0+bmFt
ZSgpLCBvYmplY3RTdG9yZS0+a2V5UGF0aCgpLCBvYmplY3RTdG9yZS0+YXV0b0luY3JlbWVudCgp
LCBkYXRhYmFzZS0+aWQoKSwgb2JqZWN0U3RvcmVJZCkpIHsKKyAgICBpZiAoIWRhdGFiYXNlLT5t
X2JhY2tpbmdTdG9yZS0+Y3JlYXRlT2JqZWN0U3RvcmUoZGF0YWJhc2UtPmlkKCksIG9iamVjdFN0
b3JlLT5uYW1lKCksIG9iamVjdFN0b3JlLT5rZXlQYXRoKCksIG9iamVjdFN0b3JlLT5hdXRvSW5j
cmVtZW50KCksIG9iamVjdFN0b3JlSWQpKSB7CiAgICAgICAgIHRyYW5zYWN0aW9uLT5hYm9ydCgp
OwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU4LDcgKzE1OCw3IEBAIHZvaWQgSURCRGF0
YWJhc2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1lLCBJ
REJUcmFuc2FjdGlvCiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0
U3RvcmVJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJEYXRh
YmFzZUJhY2tlbmRJbXBsPiBkYXRhYmFzZSwgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRl
cmZhY2U+IHRyYW5zYWN0aW9uKQogewotICAgIGRhdGFiYXNlLT5tX2JhY2tpbmdTdG9yZS0+ZGVs
ZXRlT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPmlkKCkpOworICAgIGRhdGFiYXNlLT5tX2JhY2tp
bmdTdG9yZS0+ZGVsZXRlT2JqZWN0U3RvcmUoZGF0YWJhc2UtPmlkKCksIG9iamVjdFN0b3JlLT5p
ZCgpKTsKICAgICB0cmFuc2FjdGlvbi0+ZGlkQ29tcGxldGVUYXNrRXZlbnRzKCk7CiB9CiAKQEAg
LTI1MCw3ICsyNTAsNyBAQCB2b2lkIElEQkRhdGFiYXNlQmFja2VuZEltcGw6OmxvYWRPYmplY3RT
dG9yZXMoKQogICAgIEFTU0VSVChhdXRvSW5jcmVtZW50RmxhZ3Muc2l6ZSgpID09IGlkcy5zaXpl
KCkpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpZHMuc2l6ZSgpOyBpKyspCi0gICAg
ICAgIG1fb2JqZWN0U3RvcmVzLnNldChuYW1lc1tpXSwgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBpZHNbaV0sIG5hbWVzW2ldLCBrZXlQYXRo
c1tpXSwgYXV0b0luY3JlbWVudEZsYWdzW2ldKSk7CisgICAgICAgIG1fb2JqZWN0U3RvcmVzLnNl
dChuYW1lc1tpXSwgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0
b3JlLmdldCgpLCBtX2lkLCBpZHNbaV0sIG5hbWVzW2ldLCBrZXlQYXRoc1tpXSwgYXV0b0luY3Jl
bWVudEZsYWdzW2ldKSk7CiB9CiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6cmVtb3Zl
T2JqZWN0U3RvcmVGcm9tTWFwKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElE
QkRhdGFiYXNlQmFja2VuZEltcGw+IGRhdGFiYXNlLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGw+IG9iamVjdFN0b3JlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJGYWN0b3J5QmFja2VuZEltcGwuY3BwCmluZGV4IDQ2MWU5MzBiYzE3NjA0YjkzOTU1MWZmZGNi
ZGE0NThmNDczY2ZlMTcuLmU2N2JlNDkzNWYzODFkMmVkZGIxN2M5MGUyMDkzZjA0Y2E4ZTYxYzkg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBs
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5j
cHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJET01TdHJpbmdMaXN0LmgiCiAjaW5jbHVk
ZSAiSURCRGF0YWJhc2VCYWNrZW5kSW1wbC5oIgogI2luY2x1ZGUgIklEQkRhdGFiYXNlRXhjZXB0
aW9uLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklE
QlNRTGl0ZUJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklEQlRyYW5zYWN0aW9uQ29vcmRpbmF0
b3IuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgpAQCAtNjksNyArNzAsNyBAQCB2b2lk
IElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6cmVtb3ZlSURCQmFja2luZ1N0b3JlKGNvbnN0IFN0cmlu
ZyYgdW5pcXVlSWRlbnRpZmllcgogICAgIG1fYmFja2luZ1N0b3JlTWFwLnJlbW92ZSh1bmlxdWVJ
ZGVudGlmaWVyKTsKIH0KIAotdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3Qg
U3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBQYXNzUmVm
UHRyPFNlY3VyaXR5T3JpZ2luPiBzZWN1cml0eU9yaWdpbiwgRnJhbWUqLCBjb25zdCBTdHJpbmcm
IGRhdGFEaXIsIGludDY0X3QgbWF4aW11bVNpemUsIEJhY2tpbmdTdG9yZVR5cGUpCit2b2lkIElE
QkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8
SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IHNlY3Vy
aXR5T3JpZ2luLCBGcmFtZSosIGNvbnN0IFN0cmluZyYgZGF0YURpciwgaW50NjRfdCBtYXhpbXVt
U2l6ZSwgQmFja2luZ1N0b3JlVHlwZSBiYWNraW5nU3RvcmVUeXBlKQogewogICAgIFN0cmluZyBm
aWxlSWRlbnRpZmllciA9IHNlY3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKTsKICAg
ICBTdHJpbmcgdW5pcXVlSWRlbnRpZmllciA9IGZpbGVJZGVudGlmaWVyICsgIkAiICsgbmFtZTsK
QEAgLTgxLDEyICs4MiwxOSBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25z
dCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogCiAgICAgLy8gRklY
TUU6IEV2ZXJ5dGhpbmcgZnJvbSBub3cgb24gc2hvdWxkIGJlIGRvbmUgb24gYW5vdGhlciB0aHJl
YWQuCiAKKyAgICBiYWNraW5nU3RvcmVUeXBlID0gTGV2ZWxEQkJhY2tpbmdTdG9yZTsgLy8gRklY
TUU6IERvbid0IGNvbW1pdCB0aGlzISBJdCBqdXN0IGhlbHBzIG1lIHRlc3QgTGV2ZWxEQiB3aXRo
IER1bXBSZW5kZXJUcmVlLgorCiAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0
b3JlOwogICAgIElEQkJhY2tpbmdTdG9yZU1hcDo6aXRlcmF0b3IgaXQyID0gbV9iYWNraW5nU3Rv
cmVNYXAuZmluZChmaWxlSWRlbnRpZmllcik7CiAgICAgaWYgKGl0MiAhPSBtX2JhY2tpbmdTdG9y
ZU1hcC5lbmQoKSkKICAgICAgICAgYmFja2luZ1N0b3JlID0gaXQyLT5zZWNvbmQ7CiAgICAgZWxz
ZSB7Ci0gICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3Blbihz
ZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVudGlmaWVy
LCB0aGlzKTsKKyAgICAgICAgaWYgKGJhY2tpbmdTdG9yZVR5cGUgPT0gRGVmYXVsdEJhY2tpbmdT
dG9yZSkKKyAgICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6
b3BlbihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVu
dGlmaWVyLCB0aGlzKTsKKyNpZiBFTkFCTEUoTEVWRUxEQikKKyAgICAgICAgZWxzZSBpZiAoYmFj
a2luZ1N0b3JlVHlwZSA9PSBMZXZlbERCQmFja2luZ1N0b3JlKQorICAgICAgICAgICAgYmFja2lu
Z1N0b3JlID0gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5nZXQo
KSwgZGF0YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVudGlmaWVyLCB0aGlzKTsKKyNlbmRpZgog
ICAgICAgICBpZiAoIWJhY2tpbmdTdG9yZSkgewogICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVy
cm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9X
Tl9FUlIsICJJbnRlcm5hbCBlcnJvci4iKSk7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuY3BwIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmNwcAppbmRleCA2MmU1MzY0
YmVmODIyZGI5OGNjMGRlNTU0MDA1ZWUzM2QyMDFmNWU0Li4wNmY4NTg4NDNjMjUyNTg3ZjMzNmVj
OWU5NzA5MGViMmQyMjYzNDRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lE
QkluZGV4QmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5k
ZXhCYWNrZW5kSW1wbC5jcHAKQEAgLTQwLDggKzQwLDEwIEBACiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNraW5n
U3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkK
K0lEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3Jl
KiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbCogb2JqZWN0U3RvcmVCYWNrZW5kLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJv
b2wgdW5pcXVlKQogICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICwgbV9k
YXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgLCBtX29iamVjdFN0b3JlQmFja2VuZChvYmplY3RT
dG9yZUJhY2tlbmQpCiAgICAgLCBtX2lkKGlkKQogICAgICwgbV9uYW1lKG5hbWUpCiAgICAgLCBt
X3N0b3JlTmFtZShzdG9yZU5hbWUpCkBAIC01MCw4ICs1MiwxMCBAQCBJREJJbmRleEJhY2tlbmRJ
bXBsOjpJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBp
bnQ2NF90CiB7CiB9CiAKLUlEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFja2VuZEltcGwo
SURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpCitJ
REJJbmRleEJhY2tlbmRJbXBsOjpJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSog
YmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IElEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGwqIG9iamVjdFN0b3JlQmFja2VuZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBT
dHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKICAg
ICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKKyAgICAsIG1fZGF0YWJhc2VJZChkYXRh
YmFzZUlkKQorICAgICwgbV9vYmplY3RTdG9yZUJhY2tlbmQob2JqZWN0U3RvcmVCYWNrZW5kKQog
ICAgICwgbV9pZChJbnZhbGlkSWQpCiAgICAgLCBtX25hbWUobmFtZSkKICAgICAsIG1fc3RvcmVO
YW1lKHN0b3JlTmFtZSkKQEAgLTcyLDEwICs3NiwxMCBAQCB2b2lkIElEQkluZGV4QmFja2VuZElt
cGw6Om9wZW5DdXJzb3JJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0
cgogCiAgICAgc3dpdGNoIChjdXJzb3JUeXBlKSB7CiAgICAgY2FzZSBJREJDdXJzb3JCYWNrZW5k
SW50ZXJmYWNlOjpJbmRleEtleUN1cnNvcjoKLSAgICAgICAgYmFja2luZ1N0b3JlQ3Vyc29yID0g
aW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhLZXlDdXJzb3IoaW5kZXgtPmlkKCksIHJh
bmdlLmdldCgpLCBkaXJlY3Rpb24pOworICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBpbmRl
eC0+bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEtleUN1cnNvcihpbmRleC0+bV9kYXRhYmFzZUlk
LCBpbmRleC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCByYW5nZS5n
ZXQoKSwgZGlyZWN0aW9uKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJREJDdXJzb3JCYWNr
ZW5kSW50ZXJmYWNlOjpJbmRleEN1cnNvcjoKLSAgICAgICAgYmFja2luZ1N0b3JlQ3Vyc29yID0g
aW5kZXgtPm1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhDdXJzb3IoaW5kZXgtPmlkKCksIHJhbmdl
LmdldCgpLCBkaXJlY3Rpb24pOworICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBpbmRleC0+
bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEN1cnNvcihpbmRleC0+bV9kYXRhYmFzZUlkLCBpbmRl
eC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCByYW5nZS5nZXQoKSwg
ZGlyZWN0aW9uKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJREJDdXJzb3JCYWNrZW5kSW50
ZXJmYWNlOjpPYmplY3RTdG9yZUN1cnNvcjoKICAgICBjYXNlIElEQkN1cnNvckJhY2tlbmRJbnRl
cmZhY2U6OkludmFsaWRDdXJzb3JUeXBlOgpAQCAtMTIwLDE0ICsxMjQsMTQgQEAgdm9pZCBJREJJ
bmRleEJhY2tlbmRJbXBsOjpnZXRJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFz
c1JlZlB0cjxJREJJbmQKIHsKICAgICAvLyBGSVhNRTogU3BsaXQgZ2V0SW50ZXJuYWwgaW50byB0
d28gZnVuY3Rpb25zLCBnZXR0aW5nIHJpZCBvZmYgfGdldE9iamVjdHwuCiAgICAgaWYgKGdldE9i
amVjdCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPmdl
dE9iamVjdFZpYUluZGV4KGluZGV4LT5pZCgpLCAqa2V5KTsKKyAgICAgICAgU3RyaW5nIHZhbHVl
ID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5nZXRPYmplY3RWaWFJbmRleChpbmRleC0+bV9kYXRh
YmFzZUlkLCBpbmRleC0+bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCAq
a2V5KTsKICAgICAgICAgaWYgKHZhbHVlLmlzTnVsbCgpKSB7CiAgICAgICAgICAgICBjYWxsYmFj
a3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9u
OjpOT1RfRk9VTkRfRVJSLCAiS2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbmRleC4iKSk7CiAg
ICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2FsbGJhY2tzLT5vblN1Y2Nl
c3MoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2lyZSh2YWx1ZSkpOwogICAgIH0g
ZWxzZSB7Ci0gICAgICAgIFJlZlB0cjxJREJLZXk+IGtleVJlc3VsdCA9IGluZGV4LT5tX2JhY2tp
bmdTdG9yZS0+Z2V0UHJpbWFyeUtleVZpYUluZGV4KGluZGV4LT5pZCgpLCAqa2V5KTsKKyAgICAg
ICAgUmVmUHRyPElEQktleT4ga2V5UmVzdWx0ID0gaW5kZXgtPm1fYmFja2luZ1N0b3JlLT5nZXRQ
cmltYXJ5S2V5VmlhSW5kZXgoaW5kZXgtPm1fZGF0YWJhc2VJZCwgaW5kZXgtPm1fb2JqZWN0U3Rv
cmVCYWNrZW5kLT5pZCgpLCBpbmRleC0+aWQoKSwgKmtleSk7CiAgICAgICAgIGlmICgha2V5UmVz
dWx0KSB7CiAgICAgICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6
Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSLCAiS2V5IGRvZXMgbm90
IGV4aXN0IGluIHRoZSBpbmRleC4iKSk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTksNyAr
MTYzLDcgQEAgYm9vbCBJREJJbmRleEJhY2tlbmRJbXBsOjphZGRpbmdLZXlBbGxvd2VkKElEQktl
eSoga2V5KQogICAgIGlmICghbV91bmlxdWUpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAg
cmV0dXJuICFtX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5JbmRleChtX2lkLCAqa2V5KTsKKyAg
ICByZXR1cm4gIW1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbkluZGV4KG1fZGF0YWJhc2VJZCwg
bV9vYmplY3RTdG9yZUJhY2tlbmQtPmlkKCksIG1faWQsICprZXkpOwogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4
QmFja2VuZEltcGwuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1w
bC5oCmluZGV4IGUyYTA2YjhlMDU2NDkzOTY4YWM2YzYyMzg2NTZmNmE1Y2VmNmQ2MGQuLjZlZmZi
ZGQwMjYyN2ZlMTBkNDAyNmYwYWYyOTNmYjMyOWZlYWE2NzcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1wbC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1wbC5oCkBAIC00MCwxMyArNDAsMTMgQEAgY2xhc3Mg
U2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKIAogY2xhc3MgSURCSW5kZXhCYWNrZW5kSW1wbCA6IHB1
YmxpYyBJREJJbmRleEJhY2tlbmRJbnRlcmZhY2UgewogcHVibGljOgotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tp
bmdTdG9yZSwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0
b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBi
YWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbCogb2JqZWN0U3RvcmVCYWNrZW5kLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wg
dW5pcXVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJJbmRleEJhY2tl
bmRJbXBsKGJhY2tpbmdTdG9yZSwgaWQsIG5hbWUsIHN0b3JlTmFtZSwga2V5UGF0aCwgdW5pcXVl
KSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCSW5kZXhCYWNrZW5kSW1wbChiYWNr
aW5nU3RvcmUsIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlQmFja2VuZCwgaWQsIG5hbWUsIHN0b3Jl
TmFtZSwga2V5UGF0aCwgdW5pcXVlKSk7CiAgICAgfQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPElE
QkluZGV4QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwg
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoLCBib29sIHVuaXF1ZSkKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJJbmRleEJh
Y2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3Qg
ZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCogb2JqZWN0U3RvcmVC
YWNrZW5kLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBJREJJbmRleEJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgbmFtZSwgc3RvcmVO
YW1lLCBrZXlQYXRoLCB1bmlxdWUpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJJ
bmRleEJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVCYWNr
ZW5kLCBuYW1lLCBzdG9yZU5hbWUsIGtleVBhdGgsIHVuaXF1ZSkpOwogICAgIH0KICAgICB2aXJ0
dWFsIH5JREJJbmRleEJhY2tlbmRJbXBsKCk7CiAKQEAgLTcyLDggKzcyLDggQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBnZXRLZXkoUGFzc1JlZlB0cjxJREJLZXk+LCBQYXNzUmVmUHRyPElE
QkNhbGxiYWNrcz4sIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSosIEV4Y2VwdGlvbkNv
ZGUmKTsKIAogcHJpdmF0ZToKLSAgICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9y
ZSosIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5h
bWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpOwotICAgIElEQkluZGV4QmFj
a2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSk7CisgICAg
SURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQs
IGNvbnN0IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwqLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgs
IGJvb2wgdW5pcXVlKTsKKyAgICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSos
IGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCosIGNv
bnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYg
a2V5UGF0aCwgYm9vbCB1bmlxdWUpOwogCiAgICAgc3RhdGljIHZvaWQgb3BlbkN1cnNvckludGVy
bmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZElt
cGw+LCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiwgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9uLCBJ
REJDdXJzb3JCYWNrZW5kSW50ZXJmYWNlOjpDdXJzb3JUeXBlLCBQYXNzUmVmUHRyPElEQkNhbGxi
YWNrcz4sIFBhc3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlPik7CiAgICAg
c3RhdGljIHZvaWQgZ2V0SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8SURCSW5kZXhCYWNrZW5kSW1wbD4sIFBhc3NSZWZQdHI8SURCS2V5PiwgYm9vbCBnZXRPYmpl
Y3QsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPik7CkBAIC04Miw2ICs4Miw4IEBAIHByaXZhdGU6
CiAKICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKIAorICAgIGlu
dDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGNvbnN0IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwq
IG1fb2JqZWN0U3RvcmVCYWNrZW5kOwogICAgIGludDY0X3QgbV9pZDsKICAgICBTdHJpbmcgbV9u
YW1lOwogICAgIFN0cmluZyBtX3N0b3JlTmFtZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBkY2ZiMjBmMjBmMzFl
NDM2NjllZmZhNGQyNWJkNGVjNDE5MzVjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjIyOSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAq
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQmFja2lu
Z1N0b3JlLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKyNpZiBFTkFCTEUoTEVW
RUxEQikKKworI2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgi
CisjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgiCisjaW5jbHVkZSAiSURCS2V5UmFu
Z2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgPGxldmVsZGIvY29t
cGFyYXRvci5oPgorI2luY2x1ZGUgPGxldmVsZGIvZGIuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL2l0
ZXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9zbGljZS5oPgorI2luY2x1ZGUgPHN0cmluZz4K
KworLy8gRklYTUU6IGRlY29kaW5nIHJvdXRpbmVzIG11Y2ggYmUgbW9yZSByb2J1c3QuIFdlIGNh
bid0IGNyYXNoIHRoZSBicm93c2VyIGlmCisvLyBkYXRhIGlzbid0IHdoYXQgd2UgZXhwZWN0IQor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6OklEQkxldmVs
REJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCog
ZmFjdG9yeSwgbGV2ZWxkYjo6REIqIGRiKQorICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIp
CisgICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkKKyAgICAsIG1fZGIoZGIpCit7CisgICAgbV9mYWN0
b3J5LT5hZGRJREJCYWNraW5nU3RvcmUoaWRlbnRpZmllciwgdGhpcyk7Cit9CisKK0lEQkxldmVs
REJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0b3JlKCkKK3sKKyAgICBtX2ZhY3Rv
cnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZShtX2lkZW50aWZpZXIpOworfQorCitzdGF0aWMgdm9p
ZCBwcmludFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykKK3sKKyAgICBwcmludGYoIjB4Iik7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAg
dW5zaWduZWQgY2hhciBjID0gc1tpXTsKKyAgICAgICAgcHJpbnRmKCIlMDJ4IiwgKGludCljKTsK
KyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVJbnQoaW50NjRfdCBuKQorewor
ICAgIGlmICgwKQorICAgICAgICBwcmludFN0cmluZygiIik7IC8vIEZJWE1FOiBSZW1vdmUhCisg
ICAgQVNTRVJUKG4gPj0gMCk7CisgICAgc3RkOjpzdHJpbmcgcmV0OyAvLyBGSVhNRTogU2l6ZSB0
aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZG8geworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBu
OworICAgICAgICByZXQuYXBwZW5kKDEsIHN0YXRpY19jYXN0PGNoYXI+KGMpKTsKKyAgICAgICAg
biA+Pj0gODsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRp
YyBpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kKQor
eworICAgIGludDY0X3QgcmV0ID0gMDsKKworICAgIHdoaWxlIChiZWdpbiAhPSBlbmQpIHsKKyAg
ICAgICAgdW5zaWduZWQgY2hhciBjID0gKmJlZ2luKys7CisgICAgICAgIHJldCA9IChyZXQgPDwg
OCkgfCBjOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGRl
Y29kZUludChjb25zdCBzdGQ6OnN0cmluZyYgcykgLy8gRklYTUU6IFRha2UgYSBwb2ludGVyIHJh
bmdlIGluc3RlYWQuCit7CisgICAgaW50NjRfdCByZXQgPSAwOworCisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgIDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9
IHNbaV07CisgICAgICAgIHJldCA9IChyZXQgPDwgOCkgfCBjOworICAgIH0KKworICAgIHJldHVy
biByZXQ7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVWYXJJbnQoaW50NjRfdCBuKQor
eworICAgIHN0ZDo6c3RyaW5nIHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4K
KworICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbiAmIDB4N2Y7CisgICAgICAg
IG4gPj49IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAxMjg7CisgICAgICAg
IHJldC5hcHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgIH0gd2hpbGUgKG4pOwor
CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChj
b25zdCBjaGFyICpwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCogZm91bmRJbnQpCit7Cisg
ICAgQVNTRVJUKGxpbWl0ID49IHApOworICAgICpmb3VuZEludCA9IDA7CisKKyAgICBkbyB7Cisg
ICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAg
KmZvdW5kSW50ID0gKCpmb3VuZEludCA8PCA3KSB8ICgqcCAmIDB4N2YpOworICAgIH0gd2hpbGUg
KCpwKysgJiAxMjgpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5j
b2RlU3RyaW5nKGNvbnN0IFN0cmluZyYgcykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7IC8vIEZJ
WE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFVDaGFyIHUgPSBzW2ldOworICAgICAgICB1
bnNpZ25lZCBjaGFyIGhpID0gdSA+PiA4OworICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gdTsK
KyAgICAgICAgcmV0LmFwcGVuZCgxLCBoaSk7CisgICAgICAgIHJldC5hcHBlbmQoMSwgbG8pOwor
ICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBTdHJpbmcgZGVjb2RlU3RyaW5n
KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGVuZCkKK3sKKyAgICBBU1NFUlQoZW5kID49IHAp
OworICAgIEFTU0VSVCghKChlbmQgLSBwKSAlIDIpKTsKKworICAgIHNpemVfdCBsZW4gPSAoZW5k
IC0gcCkgLyAyOworICAgIFZlY3RvcjxVQ2hhcj4gdmVjdG9yKGxlbik7CisKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSAq
cCsrOworICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gKnArKzsKKworICAgICAgICB2ZWN0b3Jb
aV0gPSAoaGkgPDwgOCkgfCBsbzsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nOjphZG9wdCh2
ZWN0b3IpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3RyaW5nV2l0aExlbihjb25z
dCBTdHJpbmcmIHMpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZW5jb2RlVmFySW50KHMubGVu
Z3RoKCkpOworICAgIHJldCArPSBlbmNvZGVTdHJpbmcocyk7CisgICAgcmV0dXJuIHJldDsKK30K
Kworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW4oY29uc3QgY2hhciogcCwg
Y29uc3QgY2hhciogbGltaXQsIFN0cmluZyogZm91bmRTdHJpbmcpCit7CisgICAgQVNTRVJUKGxp
bWl0ID49IHApOworICAgIGludDY0X3QgbGVuOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGlt
aXQsICZsZW4pOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHAgKyBs
ZW4gKiAyID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgKmZvdW5kU3RyaW5nID0g
ZGVjb2RlU3RyaW5nKHAsIHAgKyBsZW4gKiAyKTsKKyAgICBwICs9IGxlbiAqIDI7CisgICAgcmV0
dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVEb3VibGUoZG91YmxlIHgpCit7
CisgICAgc3RkOjpzdHJpbmcgcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgor
ICAgIGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBzaXplb2YoeCk7ICsraSkKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBwW2ld
KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlRG91Ymxl
KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBkb3VibGUqIGQpCit7CisgICAgaWYg
KHAgKyBzaXplb2YoKmQpID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2hhciog
eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc2l6ZW9mKCpkKTsgKytpKQorICAgICAgICAqeCsrID0gKnArKzsKKyAgICByZXR1cm4gcDsK
K30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZUtleShjb25zdCBJREJLZXkmIGtleSkKK3sK
KyAgICBzdGQ6OnN0cmluZyByZXQ7CisKKyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBj
YXNlIElEQktleTo6TnVsbFR5cGU6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICByZXR1cm4gIiI7CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHJl
dC5hcHBlbmQoMSwgJ1x4MCcpOworICAgICAgICByZXQgKz0gZW5jb2RlU3RyaW5nV2l0aExlbihr
ZXkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpEYXRl
VHlwZToKKyAgICAgICAgcmV0LmFwcGVuZCgxLCAnXHgxJyk7CisgICAgICAgIHJldCArPSBlbmNv
ZGVEb3VibGUoa2V5LmRhdGUoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJL
ZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHJldC5hcHBlbmQoMSwgJ1x4MicpOworICAgICAgICBy
ZXQgKz0gZW5jb2RlRG91YmxlKGtleS5udW1iZXIoKSk7CisgICAgICAgIHJldHVybiByZXQ7Cisg
ICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlS2V5KGNvbnN0IGNoYXIqIHAsIGNv
bnN0IGNoYXIqIGxpbWl0LCBSZWZQdHI8SURCS2V5PiogZm91bmRLZXkpCit7CisgICAgQVNTRVJU
KGxpbWl0ID49IHApOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9ICpwKys7CisgICAgU3RyaW5nIHM7CisgICAgZG91Ymxl
IGQ7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIC8vIFN0cmlu
Zy4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsICZzKTsKKyAgICAg
ICAgKmZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBw
OworICAgIGNhc2UgMToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29kZURvdWJs
ZShwLCBsaW1pdCwgJmQpOworICAgICAgICAqZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUo
ZCk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2UgMjoKKyAgICAgICAgLy8gTnVtYmVyLgor
ICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7CisgICAgICAgICpmb3VuZEtl
eSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKGQpOworICAgICAgICByZXR1cm4gcDsKKyAgICBkZWZh
dWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorfQorCitzdGF0aWMgaW50IGNvdW50Tm9uWmVyb0J5dGVzKGludDY0X3QgbikKK3sKKyAg
ICBpbnQgYyA9IDE7CisgICAgd2hpbGUgKG4gPj49IDgpCisgICAgICAgIGMrKzsKKyAgICByZXR1
cm4gYzsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBpbnQgZGF0
YWJhc2VCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKGRhdGFiYXNlSWQpOworICAgIGludCBvYmpl
Y3RTdG9yZUJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMob2JqZWN0U3RvcmVJZCk7CisgICAgaW50
IGluZGV4Qnl0ZXMgPSBjb3VudE5vblplcm9CeXRlcyhpbmRleElkKTsKKworICAgIEFTU0VSVChk
YXRhYmFzZUJ5dGVzIDw9IDgpOworICAgIEFTU0VSVChvYmplY3RTdG9yZUJ5dGVzIDw9IDgpOwor
ICAgIEFTU0VSVChpbmRleEJ5dGVzIDw9IDQpOworCisgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5
dGUgPSAoZGF0YWJhc2VCeXRlcyAtIDEpIDw8IDUgfCAob2JqZWN0U3RvcmVCeXRlcyAtIDEpIDw8
IDIgfCAoaW5kZXhCeXRlcyAtIDEpOworICAgIHN0ZDo6c3RyaW5nIHMoMSwgZmlyc3RCeXRlKTsg
Ly8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKyAgICBzICs9IGVuY29kZUludChkYXRh
YmFzZUlkKTsKKyAgICBzICs9IGVuY29kZUludChvYmplY3RTdG9yZUlkKTsKKyAgICBzICs9IGVu
Y29kZUludChpbmRleElkKTsKKworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgY2hh
ciogZGVjb2RlUHJlZml4KGNvbnN0IGNoYXIqIHAsIGludDY0X3QmIGRhdGFiYXNlSWQsIGludDY0
X3QmIG9iamVjdFN0b3JlSWQsIGludDY0X3QmIGluZGV4SWQpIC8vIFhYWDogTGltaXQuCit7Cisg
ICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqcCsrOworCisgICAgaW50IGRhdGFiYXNlQnl0
ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgIGludCBvYmplY3RTdG9yZUJ5
dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsKKyAgICBpbnQgaW5kZXhCeXRlcyA9
IChmaXJzdEJ5dGUgJiAweDMpICsgMTsKKworICAgIGRhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3Rk
OjpzdHJpbmcocCwgZGF0YWJhc2VCeXRlcykpOworICAgIHAgKz0gZGF0YWJhc2VCeXRlczsKKyAg
ICBvYmplY3RTdG9yZUlkID0gZGVjb2RlSW50KHN0ZDo6c3RyaW5nKHAsIG9iamVjdFN0b3JlQnl0
ZXMpKTsKKyAgICBwICs9IG9iamVjdFN0b3JlQnl0ZXM7CisgICAgaW5kZXhJZCA9IGRlY29kZUlu
dChzdGQ6OnN0cmluZyhwLCBpbmRleEJ5dGVzKSk7CisgICAgcCArPSBpbmRleEJ5dGVzOworCisg
ICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBudW1i
ZXIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCk7CisgICAgY2hhciBjID0gbnVtYmVyOworICAgIHMuYXBwZW5kKCZjLCAx
KTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3Qgc3RkOjpzdHJpbmcmIHN0cikKK3sKKyAgICBzdGQ6OnN0cmluZyBzID0gbWFrZUtleShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBzICs9IHN0cjsKKyAgICByZXR1
cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qgc3RkOjpzdHJp
bmcmIHN0ciwgaW50NjRfdCB2ZXJzaW9uKQoreworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIHN0cik7CisgICAgcyArPSBlbmNv
ZGVWYXJJbnQodmVyc2lvbik7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmlu
ZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQsIGludCBudW1iZXIsIGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIHN0ZDo6
c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG51
bWJlcik7CisgICAgcyArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cik7CisgICAgcmV0dXJuIHM7
Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBuYnIxLCBpbnQ2NF90IG5i
cjIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMik7CisgICAg
cmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBudW1iZXIs
IGNvbnN0IFN0cmluZyYgc3RyMSwgY29uc3QgU3RyaW5nJiBzdHIyKQoreworICAgIHN0ZDo6c3Ry
aW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG51bWJl
ciwgc3RyMSk7CisgICAgcyArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cjIpOworICAgIHJldHVy
biBzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUtleShpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBpbnQgbmJyMSwgaW50NjRf
dCBuYnIyLCBpbnQ2NF90IG5icjMpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVW
YXJJbnQobmJyMik7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMyk7CisgICAgcmV0dXJuIHM7
Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBuYnIxLCBpbnQ2NF90IG5i
cjIsIGludDY0X3QgbmJyMywgaW50IG5icjQpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBl
bmNvZGVWYXJJbnQobmJyMik7CisgICAgcyArPSBlbmNvZGVWYXJJbnQobmJyMyk7CisgICAgcyAr
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihuYnI0KTsKKyAgICByZXR1cm4gczsKK30KKwor
c3RhdGljIGJvb2wgZ2V0SW50KGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtl
eSwgaW50NjRfdCogZm91bmRJbnQpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGxl
dmVsZGI6OlN0YXR1cyBzID0gZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRi
OjpTbGljZShrZXkpLCAmcmVzdWx0KTsKKworICAgIGlmIChzLklzTm90Rm91bmQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgKmZvdW5kSW50ID0g
ZGVjb2RlSW50KHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1
dEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgdmFs
dWUpCit7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBrZXksIGVuY29kZUludCh2YWx1ZSkpOworICAgIGlmICghcy5vaygpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGdldFN0
cmluZyhsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIFN0cmluZyogZm91
bmRTdHJpbmcpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1
cyBzID0gZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiOjpTbGljZShrZXkp
LCAmcmVzdWx0KTsKKworICAgIGlmIChzLklzTm90Rm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgKmZvdW5kU3RyaW5nID0gZGVjb2RlU3Ry
aW5nKHJlc3VsdC5jX3N0cigpLCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dFN0cmluZyhsZXZlbGRiOjpEQiog
ZGIsIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBs
ZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSwg
ZW5jb2RlU3RyaW5nKHZhbHVlKSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIEtleVByZWZp
eCB7CitwdWJsaWM6CisgICAgS2V5UHJlZml4KCkge30KKworICAgIEtleVByZWZpeChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQorICAg
ICAgICA6IG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVJ
ZChvYmplY3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhJZChpbmRleElkKQorICAgIHsKKyAg
ICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAo
c3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGZpcnN0Qnl0ZSA9ICpzdGFydCsrOworCisgICAgICAgIGludCBkYXRhYmFzZUlkQnl0
ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgICAgICBpbnQgb2JqZWN0U3Rv
cmVJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsKKyAgICAgICAgaW50IGlu
ZGV4SWRCeXRlcyA9IChmaXJzdEJ5dGUgJiAweDMpICsgMTsKKworICAgICAgICBpZiAoc3RhcnQg
KyBkYXRhYmFzZUlkQnl0ZXMgKyBvYmplY3RTdG9yZUlkQnl0ZXMgKyBpbmRleElkQnl0ZXMgPiBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHJlc3VsdC0+bV9kYXRhYmFz
ZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGRhdGFiYXNlSWRCeXRlcyk7CisgICAgICAg
IHN0YXJ0ICs9IGRhdGFiYXNlSWRCeXRlczsKKyAgICAgICAgcmVzdWx0LT5tX29iamVjdFN0b3Jl
SWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgb2JqZWN0U3RvcmVJZEJ5dGVzKTsKKyAgICAg
ICAgc3RhcnQgKz0gb2JqZWN0U3RvcmVJZEJ5dGVzOworICAgICAgICByZXN1bHQtPm1faW5kZXhJ
ZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBpbmRleElkQnl0ZXMpOworICAgICAgICBzdGFy
dCArPSBpbmRleElkQnl0ZXM7CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgIH0KKworICAg
IHN0ZDo6c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgZGF0YWJhc2VJ
ZEJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMobV9kYXRhYmFzZUlkKTsKKyAgICAgICAgaW50IG9i
amVjdFN0b3JlSWRCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKG1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIGludCBpbmRleElkQnl0ZXMgPSBjb3VudE5vblplcm9CeXRlcyhtX2luZGV4SWQpOwor
CisgICAgICAgIEFTU0VSVChkYXRhYmFzZUlkQnl0ZXMgPD0gOCk7CisgICAgICAgIEFTU0VSVChv
YmplY3RTdG9yZUlkQnl0ZXMgPD0gOCk7CisgICAgICAgIEFTU0VSVChpbmRleElkQnl0ZXMgPD0g
NCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgczsKKyAgICAgICAgcy5yZXNlcnZlKDEgKyBkYXRh
YmFzZUlkQnl0ZXMgKyBvYmplY3RTdG9yZUlkQnl0ZXMgKyBpbmRleElkQnl0ZXMpOworCisgICAg
ICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKGRhdGFiYXNlSWRCeXRlcyAtIDEpIDw8IDUg
fCAob2JqZWN0U3RvcmVJZEJ5dGVzIC0gMSkgPDwgMiB8IChpbmRleElkQnl0ZXMgLSAxKTsKKyAg
ICAgICAgcyArPSBmaXJzdEJ5dGU7CisgICAgICAgIHMgKz0gZW5jb2RlSW50KG1fZGF0YWJhc2VJ
ZCk7CisgICAgICAgIHMgKz0gZW5jb2RlSW50KG1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIHMg
Kz0gZW5jb2RlSW50KG1faW5kZXhJZCk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisg
ICAgaW50IGNvbXBhcmUoY29uc3QgS2V5UHJlZml4JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChtX2RhdGFiYXNlSWQgIT0gb3RoZXIubV9kYXRhYmFzZUlkKQorICAgICAgICAgICAg
cmV0dXJuIG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICAgICAgaWYgKG1f
b2JqZWN0U3RvcmVJZCAhPSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1
cm4gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOworICAgICAgICBpZiAo
bV9pbmRleElkICE9IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4
SWQgLSBvdGhlci5tX2luZGV4SWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVu
dW0gVHlwZSB7CisgICAgICAgIGtHbG9iYWxNZXRhRGF0YSwKKyAgICAgICAga0RhdGFiYXNlTWV0
YURhdGEsCisgICAgICAgIGtPYmplY3RTdG9yZURhdGEsCisgICAgICAgIGtFeGlzdHNFbnRyeSwK
KyAgICAgICAga0luZGV4RGF0YSwKKyAgICAgICAga0ludmFsaWRUeXBlCisgICAgfTsKKworICAg
IFR5cGUgdHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIW1fZGF0YWJhc2VJZCkKKyAg
ICAgICAgICAgIHJldHVybiBrR2xvYmFsTWV0YURhdGE7CisgICAgICAgIGlmICghbV9vYmplY3RT
dG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIGtEYXRhYmFzZU1ldGFEYXRhOworICAgICAgICBp
ZiAobV9pbmRleElkID09IDEpCisgICAgICAgICAgICByZXR1cm4ga09iamVjdFN0b3JlRGF0YTsK
KyAgICAgICAgaWYgKG1faW5kZXhJZCA9PSAyKQorICAgICAgICAgICAgcmV0dXJuIGtFeGlzdHNF
bnRyeTsKKyAgICAgICAgaWYgKG1faW5kZXhJZCA+PSAzMCkKKyAgICAgICAgICAgIHJldHVybiBr
SW5kZXhEYXRhOworCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4ga0ludmFsaWRUeXBlOworICAgIH0KKworICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAg
IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworfTsKKwor
Y2xhc3MgRGF0YWJhc2VGcmVlTGlzdEtleSB7CitwdWJsaWM6CisgICAgRGF0YWJhc2VGcmVlTGlz
dEtleSgpIHt9CisKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KGludDY0X3QgZGF0YWJhc2VJZCkK
KyAgICAgICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICB7CisgICAgfQorCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIERhdGFiYXNlRnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChz
dGFydCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVj
b2RlVmFySW50KHN0YXJ0LCBsaW1pdCwgJnJlc3VsdC0+bV9kYXRhYmFzZUlkKTsKKyAgICB9CisK
KyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVu
Y29kZVZhckludChtX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0
IERhdGFiYXNlRnJlZUxpc3RLZXkmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBpbnQ2NF90
IG1fZGF0YWJhc2VJZDsKK307CisKK2NsYXNzIERhdGFiYXNlTmFtZUtleSB7CitwdWJsaWM6Cisg
ICAgRGF0YWJhc2VOYW1lS2V5KCkge30KKworICAgIERhdGFiYXNlTmFtZUtleShTdHJpbmcgb3Jp
Z2luLCBTdHJpbmcgZGF0YWJhc2VOYW1lKQorICAgICAgICA6IG1fb3JpZ2luKG9yaWdpbikKKyAg
ICAgICAgLCBtX2RhdGFiYXNlTmFtZShkYXRhYmFzZU5hbWUpCisgICAgeworICAgIH0KKworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFy
dCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdGFydCA9IGRlY29k
ZVN0cmluZ1dpdGhMZW4oc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX29yaWdpbik7CisgICAgICAg
IGlmICghc3RhcnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29k
ZVN0cmluZ1dpdGhMZW4oc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX2RhdGFiYXNlTmFtZSk7Cisg
ICAgfQorCisgICAgc3RkOjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBlbmNvZGVTdHJpbmdXaXRoTGVuKG1fb3JpZ2luKSArIGVuY29kZVN0cmluZ1dpdGhMZW4o
bV9kYXRhYmFzZU5hbWUpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNl
TmFtZUtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaW50IHggPSBjb2RlUG9p
bnRDb21wYXJlKG1fb3JpZ2luLCBvdGhlci5tX29yaWdpbikpCisgICAgICAgICAgICByZXR1cm4g
eDsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9kYXRhYmFzZU5hbWUsIG90aGVy
Lm1fZGF0YWJhc2VOYW1lKTsKKyAgICB9CisKKyAgICBTdHJpbmcgbV9vcmlnaW47IC8vIEZJWE1F
OiBTdG9yZSBlbmNvZGVkIHN0cmluZ3MsIG9yIGp1c3QgcG9pbnRlcnMuCisgICAgU3RyaW5nIG1f
ZGF0YWJhc2VOYW1lOworfTsKKworY2xhc3MgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSB7CitwdWJs
aWM6CisgICAgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSgpIHt9CisKKyAgICBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBtZXRhRGF0YVR5cGUpCisg
ICAgICAgIDogbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9tZXRh
RGF0YVR5cGUobWV0YURhdGFUeXBlKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3Qg
Y2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0
U3RvcmVNZXRhRGF0YUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGxp
bWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgc3RhcnQgPSBkZWNvZGVWYXJJ
bnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAo
IXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJ
bnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX21ldGFEYXRhVHlwZSk7CisgICAgfQorCisgICAg
c3RkOjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHM7
IC8vIEZJWE1FOiBSZXNpemU7CisgICAgICAgIHMgKz0gZW5jb2RlVmFySW50KG1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgICAgIHMgKz0gZW5jb2RlVmFySW50KG1fbWV0YURhdGFUeXBlKTsKKyAgICAg
ICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaW50NjRfdCB4ID0g
bV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0
dXJuIHg7CisgICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFU
eXBlOworICAgIH0KKworICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3Qg
bV9tZXRhRGF0YVR5cGU7IC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBieXRlLgorfTsKKworY2xhc3Mg
SW5kZXhNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgSW5kZXhNZXRhRGF0YUtleSgpIHt9CisK
KyAgICBJbmRleE1ldGFEYXRhS2V5KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKKyAgICAgICAgOiBtX29iamVjdFN0b3Jl
SWQob2JqZWN0U3RvcmVJZCkKKyAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKKyAgICAgICAg
LCBtX21ldGFEYXRhVHlwZShtZXRhRGF0YVR5cGUpCisgICAgeworICAgIH0KKworICAgIHN0YXRp
YyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0
LCBJbmRleE1ldGFEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBzdGFydCA9IGRlY29kZVZh
ckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlm
ICghc3RhcnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RhcnQgPSBkZWNvZGVW
YXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX2luZGV4SWQpOworICAgICAgICBpZiAoIXN0
YXJ0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXN1bHQtPm1fbWV0YURhdGFUeXBlID0g
KnN0YXJ0Kys7CisgICAgICAgIHJldHVybiBzdGFydDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmlu
ZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgczsgLy8gRklYTUU6
IFJlc2l6ZTsKKyAgICAgICAgcyArPSBlbmNvZGVWYXJJbnQobV9vYmplY3RTdG9yZUlkKTsKKyAg
ICAgICAgcyArPSBlbmNvZGVWYXJJbnQobV9pbmRleElkKTsKKyAgICAgICAgcyArPSBtX21ldGFE
YXRhVHlwZTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29u
c3QgSW5kZXhNZXRhRGF0YUtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaW50
NjRfdCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAg
ICAgICAgcmV0dXJuIHg7CisgICAgICAgIGlmIChpbnQ2NF90IHggPSBtX2luZGV4SWQgLSBvdGhl
ci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIG1fbWV0
YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7CisgICAgfQorCisgICAgaW50NjRfdCBt
X29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7CisgICAgdW5zaWduZWQgY2hh
ciBtX21ldGFEYXRhVHlwZTsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgewor
cHVibGljOgorICAgIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkoKSB7fQorCisgICAgT2JqZWN0U3Rv
cmVGcmVlTGlzdEtleShpbnQ2NF90IG9iamVjdFN0b3JlSWQpCisgICAgICAgIDogbV9vYmplY3RT
dG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RT
dG9yZUZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQgPT0gbGlt
aXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChz
dGFydCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgfQorCisgICAgc3Rk
OjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVWYXJJ
bnQobV9vYmplY3RTdG9yZUlkKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQ7CisgICAgfQorCisgICAgaW50
NjRfdCBtX29iamVjdFN0b3JlSWQ7Cit9OworCitjbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKK3B1
YmxpYzoKKyAgICBJbmRleEZyZWVMaXN0S2V5KCkge30KKworICAgIEluZGV4RnJlZUxpc3RLZXko
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgICAgIDogbV9vYmpl
Y3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCisg
ICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciog
c3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAg
eworICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgc3RhcnQgPSBkZWNvZGVWYXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVj
dFN0b3JlSWQpOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX2luZGV4
SWQpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gZW5jb2RlVmFySW50KG1fb2JqZWN0U3RvcmVJZCkgKyBlbmNvZGVWYXJJbnQo
bV9pbmRleElkKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleEZyZWVMaXN0
S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbnQ2NF90IHggPSBtX29iamVj
dFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4geDsK
KyAgICAgICAgcmV0dXJuIG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKKyAgICB9CisKKyAg
ICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJZDsKK307CisK
K2NsYXNzIE9iamVjdFN0b3JlTmFtZXNLZXkgeworcHVibGljOgorICAgIE9iamVjdFN0b3JlTmFt
ZXNLZXkoKSB7fQorCisgICAgT2JqZWN0U3RvcmVOYW1lc0tleShTdHJpbmcgbmFtZSkKKyAgICAg
ICAgOiBtX25hbWUobmFtZSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIq
IGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3Jl
TmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbihz
dGFydCwgbGltaXQsICZyZXN1bHQtPm1fbmFtZSk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcg
ZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmdXaXRoTGVu
KG1fbmFtZSk7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1l
c0tleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFy
ZShtX25hbWUsIG90aGVyLm1fbmFtZSk7CisgICAgfQorCisgICAgU3RyaW5nIG1fbmFtZTsgLy8g
RklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmluZyAocHJlZmVyYWJseSBqdXN0IHBvaW50ZXJz
IHRvIGl0Li4uKQorfTsKKworY2xhc3MgSW5kZXhOYW1lc0tleSB7CitwdWJsaWM6CisgICAgSW5k
ZXhOYW1lc0tleSgpIHt9CisKKyAgICBJbmRleE5hbWVzS2V5KGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgU3RyaW5nIG5hbWUpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQp
CisgICAgICAgICwgbV9uYW1lKG5hbWUpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRl
eE5hbWVzS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RhcnQgPSBkZWNvZGVWYXJJbnQoc3RhcnQs
IGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXN0YXJ0KQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVu
KHN0YXJ0LCBsaW1pdCwgJnJlc3VsdC0+bV9uYW1lKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmlu
ZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZVZhckludChtX29i
amVjdFN0b3JlSWQpICsgZW5jb2RlU3RyaW5nV2l0aExlbihtX25hbWUpOworICAgIH0KKworICAg
IGludCBjb21wYXJlKGNvbnN0IEluZGV4TmFtZXNLZXkmIG90aGVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgaWYgKGludDY0X3QgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3Rv
cmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29t
cGFyZShtX25hbWUsIG90aGVyLm1fbmFtZSk7CisgICAgfQorCisgICAgaW50NjRfdCBtX29iamVj
dFN0b3JlSWQ7CisgICAgU3RyaW5nIG1fbmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVk
IHN0cmluZyAocHJlZmVyYWJseSBqdXN0IHBvaW50ZXJzIHRvIGl0Li4uKQorfTsKKworY2xhc3Mg
T2JqZWN0U3RvcmVEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZURhdGFLZXkoKSB7
fQorCisgICAgT2JqZWN0U3RvcmVEYXRhS2V5KFBhc3NSZWZQdHI8SURCS2V5PiBrZXkpCisgICAg
ICAgIDogbV9rZXkoa2V5KQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVE
YXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZUtleShzdGFydCwgbGltaXQs
ICZyZXN1bHQtPm1fa2V5KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUtleSgqbV9rZXkpOworICAgIH0KKworICAg
IGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlRGF0YUtleSYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAobV9rZXktPmlzTGVzc1RoYW4ob3RoZXIubV9rZXkuZ2V0KCkpKQorICAg
ICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAob3RoZXIubV9rZXktPmlzTGVzc1RoYW4o
bV9rZXkuZ2V0KCkpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+IG1fa2V5OyAvLyBGSVhNRTogVGhpcyBpcyB2ZXJ5
IGV4cGVuc2l2ZS4gU3RvcmUgaXQgZW5jb2RlZC4KK307CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5
IHsKK3B1YmxpYzoKKyAgICBFeGlzdHNFbnRyeUtleSgpIHt9CisKKyAgICBFeGlzdHNFbnRyeUtl
eShQYXNzUmVmUHRyPElEQktleT4ga2V5KQorICAgICAgICA6IG1fa2V5KGtleSkKKyAgICB7Cisg
ICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogbGltaXQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCisgICAgeworICAgICAg
ICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0
dXJuIGRlY29kZUtleShzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fa2V5KTsKKyAgICB9CisKKyAg
ICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29k
ZUtleSgqbV9rZXkpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5
S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2tleS0+aXNMZXNzVGhhbihv
dGhlci5tX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChv
dGhlci5tX2tleS0+aXNMZXNzVGhhbihtX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4g
MTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUmVmUHRyPElEQktleT4gbV9rZXk7
IC8vIEZJWE1FOiBUaGlzIGlzIHZlcnkgZXhwZW5zaXZlLiBTdG9yZSBpdCBlbmNvZGVkLgorfTsK
KworY2xhc3MgSW5kZXhEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleERhdGFLZXkoKSB7fQor
CisgICAgSW5kZXhEYXRhS2V5KFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIGludDY0X3Qgc2VxdWVu
Y2VOdW1iZXIpCisgICAgICAgIDogbV9rZXkoa2V5KQorICAgICAgICAsIG1fc2VxdWVuY2VOdW1i
ZXIoc2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFL
ZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBzdGFydCA9IGRlY29kZUtleShzdGFydCwgbGltaXQsICZy
ZXN1bHQtPm1fa2V5KTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAw
OworCisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkgeyAvLyBGSVhNRTogU2hvdWxkbid0IGhh
dmUgdG8gaGFuZGxlIHRoaXMuCisgICAgICAgICAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIg
PSAwOworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIGRlY29kZVZhckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIp
OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gZW5jb2RlS2V5KCptX2tleSkgKyBlbmNvZGVWYXJJbnQobV9zZXF1ZW5jZU51bWJl
cik7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwg
Ym9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2tl
eS0+aXNMZXNzVGhhbihvdGhlci5tX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7
CisgICAgICAgIGlmIChvdGhlci5tX2tleS0+aXNMZXNzVGhhbihtX2tleS5nZXQoKSkpCisgICAg
ICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpZiAoIWlnbm9yZVNlcXVlbmNlTnVtYmVyKSB7
CisgICAgICAgICAgICBpZiAoaW50NjRfdCB4ID0gbV9zZXF1ZW5jZU51bWJlciAtIG90aGVyLm1f
c2VxdWVuY2VOdW1iZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX2tleTsgLy8g
RklYTUU6IFRoaXMgaXMgdmVyeSBleHBlbnNpdmUuIFN0b3JlIGl0IGVuY29kZWQuCisgICAgaW50
NjRfdCBtX3NlcXVlbmNlTnVtYmVyOworfTsKKworY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBs
ZXZlbGRiOjpDb21wYXJhdG9yIHsKK3B1YmxpYzoKKyAgICBpbnQgQ29tcGFyZShjb25zdCBsZXZl
bGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAg
ICAgICBpbnQgeSA9IFJlYWxDb21wYXJlKGEsIGIpOworICAgICAgICByZXR1cm4geTsKKyAgICB9
CisgICAgaW50IFhDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRi
OjpTbGljZSYgYikgY29uc3QKKyAgICB7CisgICAgICAgIGludCB4ID0gQ29tcGFyZShhLCBiKTsK
KyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGludCBDb21wYXJlSW5kZXhLZXlzKGNvbnN0
IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QKKyAgICB7
CisgICAgICAgIGludCB5ID0gUmVhbENvbXBhcmUoYSwgYiwgdHJ1ZSk7CisgICAgICAgIHJldHVy
biB5OworICAgIH0KKyAgICBpbnQgUmVhbENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEs
IGNvbnN0IGxldmVsZGI6OlNsaWNlJiBiLCBib29sIGluZGV4S2V5cyA9IGZhbHNlKSBjb25zdAor
ICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogcHRyQSA9IGEuZGF0YSgpOworICAgICAgICBjb25z
dCBjaGFyKiBwdHJCID0gYi5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZEEgPSBwdHJB
ICsgYS5zaXplKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBwdHJCICsgYi5zaXplKCk7
CisKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeEE7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXhC
OworCisgICAgICAgIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJBLCBlbmRBLCAmcHJlZml4
QSk7CisgICAgICAgIHB0ckIgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJCLCBlbmRCLCAmcHJlZml4
Qik7CisgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAg
ICAgIGlmIChpbnQgeCA9IHByZWZpeEEuY29tcGFyZShwcmVmaXhCKSkKKyAgICAgICAgICAgIHJl
dHVybiB4OworCisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtHbG9i
YWxNZXRhRGF0YSkgeworICAgICAgICAgICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAg
ICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKKworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0
eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIg
PSAqcHRyQisrOworCisgICAgICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0
ZUIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgICAgIGlmICh0eXBlQnl0
ZUEgPD0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICh0eXBl
Qnl0ZUEgPT0gMTAwKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBkYXRh
YmFzZUZyZWVMaXN0S2V5QTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5IGRh
dGFiYXNlRnJlZUxpc3RLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IERhdGFiYXNlRnJl
ZUxpc3RLZXk6OmRlY29kZShwdHJBLCBlbmRBLCAmZGF0YWJhc2VGcmVlTGlzdEtleUEpOworICAg
ICAgICAgICAgICAgIHB0ckIgPSBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkZWNvZGUocHRyQiwgZW5k
QiwgJmRhdGFiYXNlRnJlZUxpc3RLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7
CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJu
IGRhdGFiYXNlRnJlZUxpc3RLZXlBLmNvbXBhcmUoZGF0YWJhc2VGcmVlTGlzdEtleUIpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAyMDEpIHsKKyAgICAgICAg
ICAgICAgICBEYXRhYmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5QTsKKyAgICAgICAgICAgICAg
ICBEYXRhYmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5QjsKKworICAgICAgICAgICAgICAgIHB0
ckEgPSBEYXRhYmFzZU5hbWVLZXk6OmRlY29kZShwdHJBLCBlbmRBLCAmZGF0YWJhc2VOYW1lS2V5
QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKHB0ckIs
IGVuZEIsICZkYXRhYmFzZU5hbWVLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7
CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJu
IGRhdGFiYXNlTmFtZUtleUEuY29tcGFyZShkYXRhYmFzZU5hbWVLZXlCKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6
OmtEYXRhYmFzZU1ldGFEYXRhKSB7CisgICAgICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsK
KyAgICAgICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAgICAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5
cGVCeXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAt
IHR5cGVCeXRlQikKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICAgICAgaWYg
KHR5cGVCeXRlQSA8PSAzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
aWYgKHR5cGVCeXRlQSA9PSA1MCkgeworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURh
dGFLZXkgbWV0YURhdGFLZXlBOworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFL
ZXkgbWV0YURhdGFLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmRlY29kZShwdHJBLCBlbmRBLCAmbWV0YURhdGFLZXlBKTsKKyAgICAgICAgICAg
ICAgICBwdHJCID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZt
ZXRhRGF0YUtleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFLZXlB
LmNvbXBhcmUobWV0YURhdGFLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0
eXBlQnl0ZUEgPT0gMTAwKSB7CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRh
RGF0YUtleUE7CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleUI7
CisKKyAgICAgICAgICAgICAgICBwdHJBID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHB0ckEs
IGVuZEEsICZtZXRhRGF0YUtleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBJbmRleE1ldGFE
YXRhS2V5OjpkZWNvZGUocHRyQiwgZW5kQiwgJm1ldGFEYXRhS2V5Qik7CisgICAgICAgICAgICAg
ICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAg
ICAgICAgICAgIHJldHVybiBtZXRhRGF0YUtleUEuY29tcGFyZShtZXRhRGF0YUtleUIpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAxNTApIHsKKyAgICAgICAg
ICAgICAgICBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0RW50cnlLZXlBOworICAgICAg
ICAgICAgICAgIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUI7CisKKyAg
ICAgICAgICAgICAgICBwdHJBID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKHB0ckEs
IGVuZEEsICZmcmVlTGlzdEVudHJ5S2V5QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IE9iamVj
dFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmZnJlZUxpc3RFbnRyeUtleUIp
OworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJlZUxpc3RFbnRyeUtleUEuY29tcGFy
ZShmcmVlTGlzdEVudHJ5S2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlw
ZUJ5dGVBID09IDE1MSkgeworICAgICAgICAgICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxp
c3RFbnRyeUtleUE7CisgICAgICAgICAgICAgICAgSW5kZXhGcmVlTGlzdEtleSBmcmVlTGlzdEVu
dHJ5S2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNv
ZGUocHRyQSwgZW5kQSwgJmZyZWVMaXN0RW50cnlLZXlBKTsKKyAgICAgICAgICAgICAgICBwdHJC
ID0gSW5kZXhGcmVlTGlzdEtleTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZmcmVlTGlzdEVudHJ5S2V5
Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VS
VChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmcmVlTGlzdEVudHJ5S2V5QS5jb21w
YXJlKGZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0
eXBlQnl0ZUEgPT0gMjAwKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0U3RvcmVOYW1lc0tleSBv
YmplY3RTdG9yZU5hbWVzS2V5QTsKKyAgICAgICAgICAgICAgICBPYmplY3RTdG9yZU5hbWVzS2V5
IG9iamVjdFN0b3JlTmFtZXNLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0
b3JlTmFtZXNLZXk6OmRlY29kZShwdHJBLCBlbmRBLCAmb2JqZWN0U3RvcmVOYW1lc0tleUEpOwor
ICAgICAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUocHRyQiwg
ZW5kQiwgJm9iamVjdFN0b3JlTmFtZXNLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRy
QSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0
dXJuIG9iamVjdFN0b3JlTmFtZXNLZXlBLmNvbXBhcmUob2JqZWN0U3RvcmVOYW1lc0tleUIpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAyMDEpIHsKKyAgICAg
ICAgICAgICAgICBJbmRleE5hbWVzS2V5IGluZGV4TmFtZXNLZXlBOworICAgICAgICAgICAgICAg
IEluZGV4TmFtZXNLZXkgaW5kZXhOYW1lc0tleUI7CisKKyAgICAgICAgICAgICAgICBwdHJBID0g
SW5kZXhOYW1lc0tleTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZpbmRleE5hbWVzS2V5QSk7CisgICAg
ICAgICAgICAgICAgcHRyQiA9IEluZGV4TmFtZXNLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmaW5k
ZXhOYW1lc0tleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhOYW1lc0tl
eUEuY29tcGFyZShpbmRleE5hbWVzS2V5Qik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprT2JqZWN0U3RvcmVE
YXRhKSB7CisgICAgICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikK
KyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhp
c3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5Lgor
CisgICAgICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVEYXRhS2V5QTsKKyAg
ICAgICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXlCOworCisgICAg
ICAgICAgICBwdHJBID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocHRyQSwgZW5kQSwgJm9i
amVjdFN0b3JlRGF0YUtleUEpOworICAgICAgICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRGF0YUtl
eTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZvYmplY3RTdG9yZURhdGFLZXlCKTsKKyAgICAgICAgICAg
IEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAg
cmV0dXJuIG9iamVjdFN0b3JlRGF0YUtleUEuY29tcGFyZShvYmplY3RTdG9yZURhdGFLZXlCKTsK
KyAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprRXhp
c3RzRW50cnkpIHsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRC
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5k
QSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAocHRyQiA9PSBl
bmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5v
bi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3
YXkuCisKKyAgICAgICAgICAgIEV4aXN0c0VudHJ5S2V5IGV4aXN0c0VudHJ5S2V5QTsKKyAgICAg
ICAgICAgIEV4aXN0c0VudHJ5S2V5IGV4aXN0c0VudHJ5S2V5QjsKKworICAgICAgICAgICAgcHRy
QSA9IEV4aXN0c0VudHJ5S2V5OjpkZWNvZGUocHRyQSwgZW5kQSwgJmV4aXN0c0VudHJ5S2V5QSk7
CisgICAgICAgICAgICBwdHJCID0gRXhpc3RzRW50cnlLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAm
ZXhpc3RzRW50cnlLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAg
IEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgcmV0dXJuIGV4aXN0c0VudHJ5S2V5QS5jb21w
YXJlKGV4aXN0c0VudHJ5S2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeEEudHlw
ZSgpID09IEtleVByZWZpeDo6a0luZGV4RGF0YSkgeworICAgICAgICAgICAgaWYgKHB0ckEgPT0g
ZW5kQSAmJiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
ICAgICBpZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAg
ICAgICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJ
WE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUg
dG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKworICAgICAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4
RGF0YUtleUE7CisgICAgICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QjsKKworICAg
ICAgICAgICAgcHRyQSA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZpbmRleERh
dGFLZXlBKTsKKyAgICAgICAgICAgIHB0ckIgPSBJbmRleERhdGFLZXk6OmRlY29kZShwdHJCLCBl
bmRCLCAmaW5kZXhEYXRhS2V5Qik7CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAg
ICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgIGJvb2wgaWdub3JlU2VxdWVuY2VOdW1i
ZXIgPSBpbmRleEtleXM7CisgICAgICAgICAgICByZXR1cm4gaW5kZXhEYXRhS2V5QS5jb21wYXJl
KGluZGV4RGF0YUtleUIsIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAg
ICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQorICAgIHZv
aWQgRmluZFNob3J0ZXN0U2VwYXJhdG9yKHN0ZDo6c3RyaW5nKiwgY29uc3QgbGV2ZWxkYjo6U2xp
Y2UmKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCisgICAgdm9pZCBG
aW5kU2hvcnRTdWNjZXNzb3Ioc3RkOjpzdHJpbmcqKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVt
ZW50IGV2ZW50dWFsbHkuCit9IGNvbXBhcmF0b3I7Cit9CisKK3N0YXRpYyBib29sIHNldFVwTWV0
YWRhdGEobGV2ZWxkYjo6REIqIGRiKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGFEYXRh
S2V5ID0gbWFrZUtleSgwLCAwLCAwLCAwKTsKKworICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbjsK
KyAgICBpZiAoIWdldEludChkYiwgbWV0YURhdGFLZXksICZzY2hlbWFWZXJzaW9uKSkgeworICAg
ICAgICBzY2hlbWFWZXJzaW9uID0gMDsKKyAgICAgICAgaWYgKCFwdXRJbnQoZGIsIG1ldGFEYXRh
S2V5LCBzY2hlbWFWZXJzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBpZiAoc2NoZW1hVmVyc2lvbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBEb24ndCBr
bm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZlcnNpb24uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNl
LCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJG
YWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCit7CisgICAgU3RyaW5nIHBhdGhCYXNlMiA9IHBh
dGhCYXNlOworCisgICAgaWYgKHBhdGhCYXNlMi5pc0VtcHR5KCkpCisgICAgICAgIHBhdGhCYXNl
MiA9ICIvdG1wL2luLW1lbS1sZXZlbGRiIjsgLy8gRklYTUU6IERvbid0IGxhbmQgdGhpcyEgT25s
eSBmb3IgdGVzdGluZy4KKworICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNlMikp
IHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIEluZGV4ZWREQiBkYXRhYmFz
ZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVzZSBhIHNpbmdsZSBMZXZlbCBEQiBmb3Ig
YWxsIG9yaWdpbnMuCisgICAgU3RyaW5nIHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQo
cGF0aEJhc2UyLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4
ZWRkYi5sZXZlbGRiIik7CisKKyAgICBsZXZlbGRiOjpEQiogZGI7CisgICAgbGV2ZWxkYjo6T3B0
aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcGFyYXRvciA9ICZjb21wYXJhdG9yOworICAg
IG9wdGlvbnMuY3JlYXRlX2lmX21pc3NpbmcgPSB0cnVlOworICAgIGxldmVsZGI6OlN0YXR1cyBz
dGF0dXMgPSBsZXZlbGRiOjpEQjo6T3BlbihvcHRpb25zLCBwYXRoLnV0ZjgoKS5kYXRhKCksICZk
Yik7CisKKyAgICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAgICAgIC8vIEZJWE1FOiBJZiBjb21w
YXJhdG9yIG5hbWUgY2hhbmdlZCwgYmxvdyBhd2F5IHRoZSBvbGQgZGF0YWJhc2UgYW5kIHN0YXJ0
IGEgbmV3IG9uZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUmVmUHRyPElEQkxl
dmVsREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZShmaWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CisKKyAgICBpZiAoIXNl
dFVwTWV0YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlLnJlbGVhc2UoKTsKK30KKworYm9vbCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcm
IG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKQoreworICAgIGJv
b2wgb2sgPSBnZXRJbnQobV9kYi5nZXQoKSwgbWFrZUtleSgwLCAwLCAwLCAyMDEsIG1faWRlbnRp
ZmllciwgbmFtZSksICZmb3VuZElkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBvayA9IGdldFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGZvdW5kSWQsIDAs
IDAsIDIpLCAmZm91bmRWZXJzaW9uKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0TmV3RGF0YWJh
c2VJZChsZXZlbGRiOjpEQiogZGIpCit7CisgICAgLy8gTG9vayBpbiBmcmVlLWxpc3QuCisgICAg
c3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KDAsIDAsIDAsIDEwMCk7CisgICAgc3RkOjpz
dHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoMCwgMCwgMCwgMTAxKTsKKworICAgIE93blB0cjxsZXZl
bGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkp
KTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRv
ci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAg
IGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRh
KCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5z
aWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBkID09IDEwMCk7
CisKKyAgICAgICAgaW50NjRfdCBkYXRhYmFzZUlkOworICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpLCAmZGF0YWJhc2VJZCk7CisK
KyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICBy
ZXR1cm4gZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUg
d2FzIG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQ7CisgICAgaWYgKCFn
ZXRJbnQoZGIsIG1ha2VLZXkoMCwgMCwgMCwgMSksICZtYXhEYXRhYmFzZUlkKSkKKyAgICAgICAg
bWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFz
ZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KDAsIDAsIDAsIDEpLCBk
YXRhYmFzZUlkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gZGF0YWJhc2VJZDsKKworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNl
dElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZl
cnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK3sKKyAgICBpZiAoaW52
YWxpZFJvd0lkKSB7CisgICAgICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJhc2VJZChtX2RiLmdldCgp
KTsKKworICAgICAgICBpZiAoIXB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KDAsIDAsIDAsIDIw
MSwgbV9pZGVudGlmaWVyLCBuYW1lKSwgcm93SWQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGlmICghcHV0U3RyaW5nKG1fZGIuZ2V0KCksIG1ha2VLZXkocm93SWQs
IDAsIDAsIDIpLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVz
KGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0
cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8
Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKQoreworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0
S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgMSwgMCk7CisgICAgc3RkOjpzdHJp
bmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTEpOworCisgICAgT3duUHRy
PGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0
aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNv
bXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgewor
ICAgICAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5
KCkuZGF0YSgpOworICAgICAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAgICAg
ICBBU1NFUlQoYSA9PSBkYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFiKTsKKyAgICAgICAg
QVNTRVJUKCFjKTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIGQgPSAqcCsrOworICAgICAgICBB
U1NFUlRfVU5VU0VEKGQsIGQgPT0gNTApOworCisgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBpdC0+a2V5KCkuZGF0YSgpICsgaXQtPmtl
eSgpLnNpemUoKSwgJm9iamVjdFN0b3JlSWQpOworCisgICAgICAgIFN0cmluZyBvYmplY3RTdG9y
ZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRh
KCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBp
ZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxu
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGtleVBh
dGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkg
KyBpdC0+dmFsdWUoKS5zaXplKCkpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAo
IWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhdXRvSW5jcmVt
ZW50ID0gKml0LT52YWx1ZSgpLmRhdGEoKTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAg
aWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRc
biIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIElzIGV2aWNh
dGFibGUKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgewor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIC8vIExhc3QgdmVyc2lvbgorICAgICAgICBpdC0+TmV4
dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
Iml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAg
ICAgLy8gTWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9jYXRlZAorCisgICAgICAgIGZvdW5kSWRz
LmFwcGVuZChvYmplY3RTdG9yZUlkKTsKKyAgICAgICAgZm91bmROYW1lcy5hcHBlbmQob2JqZWN0
U3RvcmVOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7CisgICAg
ICAgIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmFwcGVuZChhdXRvSW5jcmVtZW50KTsKKyAgICB9
Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld09iamVjdFN0b3JlSWQobGV2ZWxkYjo6REIqIGRi
LCBpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAgLy8gTG9vayBpbiBmcmVlLWxpc3QuCisgICAg
c3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDE1MCwgMCk7
CisgICAgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUx
LCAwLCAwKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJh
dG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5
KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkg
PCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29u
c3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgo
cCwgYSwgYiwgYyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAg
QVNTRVJUX1VOVVNFRChkLCBkID09IDE1MCk7CisKKyAgICAgICAgaW50NjRfdCBvYmplY3RTdG9y
ZUlkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+
a2V5KCkuc2l6ZSgpLCAmb2JqZWN0U3RvcmVJZCk7CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVz
IHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAg
ICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICByZXR1cm4gb2JqZWN0U3RvcmVJZDsKKyAg
ICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAg
ICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQ7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgMyksICZtYXhPYmplY3RTdG9yZUlkKSkKKyAgICAgICAgbWF4T2Jq
ZWN0U3RvcmVJZCA9IDA7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQgPSBtYXhPYmplY3RT
dG9yZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQs
IDAsIDAsIDMpLCBvYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gb2JqZWN0U3RvcmVJZDsKK30KKworYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQs
IGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKK3sKKyAgICBpbnQ2NF90IG9iamVjdFN0
b3JlSWQgPSBnZXROZXdPYmplY3RTdG9yZUlkKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQpOworCisg
ICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAs
IDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAg
ICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgbmFtZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFz
ZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgMSksIGtleVBhdGgpOworICAgIGlmICghb2sp
IHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGtleSBwYXRoIik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtl
S2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAyKSwgYXV0b0luY3JlbWVu
dCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgYXV0
byBpbmNyZW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0g
cHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0
b3JlSWQsIDMpLCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZh
aWxlZCB0byBzZXQgZXZpY3RhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUw
LCBvYmplY3RTdG9yZUlkLCA0KSwgMSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJS
T1IoImZhaWxlZCB0byBzZXQgbGFzdCB2ZXJzaW9uIG51bWJlciIpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgLy8gRklYTUU6IE5vdCBzdXJlIHdlIGV2ZW4gbmVlZCB0byBz
ZXQgdGhpcz8KKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQs
IDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwgMzApOworICAgIGlmICghb2spIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG1heCBpbmRleCBpZCIpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWFrZUtleShk
YXRhYmFzZUlkLCAwLCAwLCAyMDAsIG5hbWUpLCBvYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIW9r
KSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBvYmplY3Qgc3RvcmUgaWQiKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGFzc2lnbmVkT2JqZWN0U3RvcmVJ
ZCA9IG9iamVjdFN0b3JlSWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wg
ZGVsZXRlUmFuZ2UobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgYmVnaW4sIGNv
bnN0IHN0ZDo6c3RyaW5nJiBlbmQpCit7CisgICAgLy8gRklYTUU6IFVzZSBzb21lIHNvcnQgb2Yg
YnVsayBkZWxldGUgb3BlcmF0aW9uIGZpcnN0PworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJh
dG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZv
ciAoaXQtPlNlZWsoYmVnaW4pOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLlhDb21wYXJlKGl0
LT5rZXkoKSwgZW5kKSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVz
IHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAg
ICAgICBpZiAoIXMub2soKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVP
YmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sK
KyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOworICAgIGdldFN0cmluZyhtX2RiLmdldCgpLCBt
YWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCAwKSwgJm9iamVjdFN0
b3JlTmFtZSk7CisKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1h
a2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDApKTsKKyAgICBtX2Ri
LT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwg
MCwgNTAsIG9iamVjdFN0b3JlSWQsIDEpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3Jp
dGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQs
IDIpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDMpKTsKKyAgICBtX2RiLT5EZWxl
dGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAs
IG9iamVjdFN0b3JlSWQsIDQpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRp
b25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDUpKTsK
KworICAgIC8vIEluc2VydCBpbnRvIGZyZWUtbGlzdC4KKyAgICBwdXRTdHJpbmcobV9kYi5nZXQo
KSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTAsIG9iamVjdFN0b3JlSWQpLCAiIik7CisK
KyAgICAvLyBGSVhNRTogRGVsZXRlIHRoZSBvYmplY3Qgc3RvcmUgbmFtZSBmcm9tIHRoZSBtYXBw
aW5nICh3ZSBuZWVkIHRvIGxvb2sgaXQgdXApCisgICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6Oldy
aXRlT3B0aW9ucygpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDIwMCwgb2JqZWN0U3RvcmVO
YW1lKSk7CisKKyAgICAvLyBXZSBjb3VsZCBqdXN0IGRvIG9uZSBiaWcgZGVsZXRlUmFuZ2UgZm9y
IHRoZSBzdHVmZiBiZWxvdy4uLgorCisgICAgLy8gT2JqZWN0IHN0b3JlIGRhdGEsIGV4aXN0cyBk
YXRhLCBpbmRleCBkYXRhLgorICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkICsgMSwgMCkpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJy
b3IuCisKKyAgICAvLyBJbmRleCBpZCBmcmVlLWxpc3QKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1f
ZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCBvYmplY3RTdG9yZUlkKSwg
bWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQgKyAxKSkpCisgICAg
ICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKworICAgIC8vIEluZGV4IG1ldGEt
ZGF0YQorICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQsIDAsIDApLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAs
IDAsIDEwMCwgb2JqZWN0U3RvcmVJZCArIDEsIDAsIDApKSkKKyAgICAgICAgcmV0dXJuOyAvLyBG
SVhNRTogUmVwb3J0IGVycm9yLgorCit9CisKK1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2
ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5
KGtleSkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7Cisg
ICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGludDY0X3Qg
dmVyc2lvbjsKKyAgICBzdGF0aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsKKyAgICBjb25zdCBjaGFy
KiBwID0gZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0cigpICsgZGF0YS5sZW5n
dGgoKSwgJnZlcnNpb24pOworCisgICAgcmV0dXJuIGRlY29kZVN0cmluZyhwLCBkYXRhLmNfc3Ry
KCkgKyBkYXRhLmxlbmd0aCgpKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIExldmVsREJSZWNv
cmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRs
ZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlJlY29yZEhhbmRsZShjb25zdCBzdGQ6OnN0cmluZyYg
cHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtleShwcmltYXJ5S2V5KSwg
bV92ZXJzaW9uKHZlcnNpb24pIHt9CisgICAgc3RkOjpzdHJpbmcgcHJpbWFyeUtleSgpIGNvbnN0
IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIGludDY0X3QgdmVyc2lvbigpIGNvbnN0IHsg
cmV0dXJuIG1fdmVyc2lvbjsgfQorcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlL
ZXk7IC8vIHRoZSByZXN1bHQgb2YgZW5jb2RlS2V5KElEQktleSkgYmFzaWNhbGx5LgorICAgIGlu
dDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0TmV3VmVyc2lvbk51
bWJlcihsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkKQoreworICAgIGludDY0X3QgbGFzdFZlcnNpb247CisgICAgaWYgKCFnZXRJbnQoZGIs
IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpLCAmbGFzdFZl
cnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBBU1NFUlQobGFzdFZlcnNp
b24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lvbiArIDE7CisgICAg
Ym9vbCBvayA9IHB1dEludChkYiwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0
U3RvcmVJZCwgNCksIHZlcnNpb24pOworICAgIEFTU0VSVChvayk7CisKKyAgICAvLyBGSVhNRTog
RGV0ZWN0IG92ZXJmbG93PyBOb3QgbXVjaCB3ZSBjYW4gZG8gYWJvdXQgaXQgYW55d2F5Li4uPyBB
bmQgaXQgcHJvYmFibHkgaXNuJ3QgYSBjYXRhc3Ryb3BoZSBhbnl3YXkuLi4KKworICAgIHJldHVy
biB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0
b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiYgcmVjb3JkSGFuZGxlKQoreworICAgIGludDY0X3QgdmVyc2lvbiA9IGdldE5l
d1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7Cisg
ICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVkYXRhS2V5ID0gbWFrZUtleShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBlbmNvZGVLZXkoa2V5KSk7CisKKyAgICBsZXZlbGRiOjpT
dGF0dXMgcyA9IG1fZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgb2JqZWN0U3RvcmVk
YXRhS2V5LCBlbmNvZGVWYXJJbnQodmVyc2lvbikgKyBlbmNvZGVTdHJpbmcodmFsdWUpKTsKKyAg
ICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3Qgc3RkOjpz
dHJpbmcgZXhpc3RzRW50cnlLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IDIsIGVuY29kZUtleShrZXkpKTsKKworICAgIHMgPSBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVP
cHRpb25zKCksIGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJbnQodmVyc2lvbikpOworICAgIGlmICgh
cy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZJWE1FOiBJZGVhbGx5LCB3ZSB3YW50
IHRvIHJvbGwgYmFjayB0aGUgcHV0IGFib3ZlPworCisgICAgcmVjb3JkSGFuZGxlID0gYWRvcHRS
ZWYobmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5jb2RlS2V5KGtleSksIHZlcnNpb24pKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9i
amVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorewor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCk7IC8vIE5vdCBpbmNsdWRlZC4KKworICAg
IGRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBzdG9wS2V5KTsKK30KKwordm9pZCBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICBjb25zdCBMZXZlbERCUmVjb3JkSGFuZGxlJiBs
ZXZlbERCUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZEhhbmRs
ZSY+KHJlY29yZEhhbmRsZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBsZXZlbERCUmVjb3JkSGFuZGxlLnByaW1hcnlL
ZXkoKSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpX
cml0ZU9wdGlvbnMoKSwga2V5KTsKK30KKworZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9w
S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsgLy8gTm90IGluY2x1
ZGVkLgorCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRv
cihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAgICBpbnQgbWF4TnVtZXJpY0tleSA9IDA7
CisKKyAgICAvLyBGSVhNRTogQmUgc21hcnRlcjogc2VlayB0byBzb21ldGhpbmcgYWZ0ZXIgdGhl
IG9iamVjdCBzdG9yZSBkYXRhLCB0aGVuIHJldmVyc2UuCisKKyAgICBmb3IgKGl0LT5TZWVrKHN0
YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3Rv
cEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlUHJlZml4KGl0LT5rZXkoKS5kYXRhKCksIGEsIGIs
IGMpOworICAgICAgICBBU1NFUlQoYSA9PSBkYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKGIg
PT0gb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVChjID09IDEpOworCisgICAgICAgIFJl
ZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2RlS2V5KHAsIGl0LT5rZXkoKS5kYXRhKCkg
KyBpdC0+a2V5KCkuc2l6ZSgpLCAma2V5KTsKKworICAgICAgICBpZiAoa2V5LT50eXBlKCkgPT0g
SURCS2V5OjpOdW1iZXJUeXBlKSB7CisgICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2Fz
dDxpbnQ2NF90PihrZXktPm51bWJlcigpKTsKKyAgICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJp
Y0tleSkKKyAgICAgICAgICAgICAgICBtYXhOdW1lcmljS2V5ID0gbjsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiBtYXhOdW1lcmljS2V5ICsgMTsKK30KKworYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgUmVmUHRyPE9iamVjdFN0
b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRSZWNvcmRIYW5kbGUpCit7CisgICAgY29uc3Qgc3RkOjpz
dHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwg
ZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpT
dGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAm
ZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlu
dDY0X3QgdmVyc2lvbjsKKyAgICBkZWNvZGVWYXJJbnQoZGF0YS5jX3N0cigpLCBkYXRhLmNfc3Ry
KCkgKyBkYXRhLmxlbmd0aCgpLCAmdmVyc2lvbik7CisKKyAgICBmb3VuZFJlY29yZEhhbmRsZSA9
IGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFuZGxlKGVuY29kZUtleShrZXkpLCB2ZXJzaW9u
KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKK3sKKyAgICBj
b25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgIE93blB0cjxs
ZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlv
bnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21w
YXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAg
ICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5r
ZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpOworICAgICAgICBjb25zdCBjaGFyKiBwID0g
ZGVjb2RlUHJlZml4KGl0LT5rZXkoKS5kYXRhKCksIGEsIGIsIGMpOworCisgICAgICAgIFJlZlB0
cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRlY29kZUtleShwLCBsaW1pdCwgJnByaW1h
cnlLZXkpOworCisgICAgICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICAgICAgY29uc3QgY2hhciog
cSA9IGRlY29kZVZhckludChpdC0+dmFsdWUoKS5kYXRhKCksIGl0LT52YWx1ZSgpLmRhdGEoKSAr
IGl0LT52YWx1ZSgpLnNpemUoKSwgJnZlcnNpb24pOworCisgICAgICAgIFJlZlB0cjxMZXZlbERC
UmVjb3JkSGFuZGxlPiByaChhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZEhhbmRsZShlbmNvZGVL
ZXkoKnByaW1hcnlLZXkpLCB2ZXJzaW9uKSkpOworICAgICAgICBTdHJpbmcgaWRiVmFsdWUgPSBk
ZWNvZGVTdHJpbmcocSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsK
KworICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygqcmgsIGlkYlZhbHVlKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRl
eGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50
NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKK3sKKyAg
ICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBv
YmplY3RTdG9yZUlkLCAwLCAwKTsKKyAgICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQgKyAxLCAwLCAwKTsKKworICAgIE93
blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVh
ZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAm
JiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkp
IHsKKyAgICAgICAgaW50NjRfdCBhLCBiLCBjOworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQt
PmtleSgpLmRhdGEoKTsKKyAgICAgICAgcCA9IGRlY29kZVByZWZpeChwLCBhLCBiLCBjKTsKKwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGQgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKGQs
IGQgPT0gMTAwKTsKKworICAgICAgICBpbnQ2NF90IGluZGV4SWQ7CisgICAgICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgaXQtPmtleSgpLmRhdGEoKSArIGl0LT5rZXkoKS5zaXplKCksICZpbmRleElk
KTsKKworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgp
LmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKyAgICAg
ICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAg
TE9HX0VSUk9SKCJpdCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOworICAg
ICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCku
ZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisgICAg
ICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElkKTsKKyAgICAgICAgZm91bmROYW1lcy5hcHBlbmQo
aW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7CisgICAg
ICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKGluZGV4VW5pcXVlKTsKKyAgICB9Cit9CisKK3N0
YXRpYyBpbnQ2NF90IGdldE5ld0luZGV4SWQobGV2ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICAvLyBMb29rIGluIGZyZWUtbGlz
dC4KKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwg
MTUxLCBvYmplY3RTdG9yZUlkKTsKKyAgICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShk
YXRhYmFzZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3JlSWQgKyAxKTsKKworICAgIE93blB0cjxs
ZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25z
KCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFy
YXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAg
ICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5k
YXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisKKyAgICAgICAg
dW5zaWduZWQgY2hhciBkID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChkLCBkID09IDE1
MSk7CisKKyAgICAgICAgaW50NjRfdCB0cmFzaDsgLy8gb2JqZWN0IHN0b3JlIGlkCisgICAgICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgaXQtPmtleSgpLmRhdGEoKSArIGl0LT5rZXkoKS5zaXplKCks
ICZ0cmFzaCk7CisKKyAgICAgICAgaW50NjRfdCBpbmRleElkOworICAgICAgICBwID0gZGVjb2Rl
VmFySW50KHAsIGl0LT5rZXkoKS5kYXRhKCkgKyBpdC0+a2V5KCkuc2l6ZSgpLCAmaW5kZXhJZCk7
CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRl
T3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAg
ICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAgICAgIHJldHVybiBpbmRleElkOworICAgIH0K
KworICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0LgorICAgIGlu
dDY0X3QgbWF4SW5kZXhJZDsKKyAgICBpZiAoIWdldEludChkYiwgbWFrZUtleShkYXRhYmFzZUlk
LCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNSksICZtYXhJbmRleElkKSkKKyAgICAgICAgbWF4
SW5kZXhJZCA9IDMwOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IGl0IHN0YXJ0cyBhdCAzMCEhCisK
KyAgICBpbnQ2NF90IGluZGV4SWQgPSBtYXhJbmRleElkICsgMTsKKyAgICBib29sIG9rID0gcHV0
SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlkLCA1KSwg
aW5kZXhJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0
dXJuIGluZGV4SWQ7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5k
ZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBp
bmRleElkKQoreworICAgIGluZGV4SWQgPSBnZXROZXdJbmRleElkKG1fZGIuZ2V0KCksIGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdl
dCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCwgMCksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQg
dG8gc2V0IGluZGV4IG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTAwLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCAxKSwgaXNVbmlxdWUpOworICAgIGlmICghb2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGlzX3VuaXF1ZSIpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtl
eShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDIpLCBrZXlQ
YXRoKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBr
ZXkgcGF0aCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKK3sK
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4gSXNuJ3QgdGhp
cyB1c2VkPyBPciBkbyB3ZSBub3QgdGVzdCBmb3IgaXQ/CisgICAgcmV0dXJuOworfQorCitib29s
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkK
K3sKKyAgICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZEhh
bmRsZSYgbGV2ZWxEQlJlY29yZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNv
cmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOworCisgICAgY29uc3QgaW50NjRfdCBnbG9iYWxTZXF1
ZW5jZU51bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaW5kZXhEYXRhS2V5ID0gbWFr
ZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoa2V5KSwg
Z2xvYmFsU2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRhdGEgPSBlbmNv
ZGVWYXJJbnQobGV2ZWxEQlJlY29yZEhhbmRsZS52ZXJzaW9uKCkpICsgbGV2ZWxEQlJlY29yZEhh
bmRsZS5wcmltYXJ5S2V5KCk7CisKKyAgICByZXR1cm4gbV9kYi0+UHV0KGxldmVsZGI6OldyaXRl
T3B0aW9ucygpLCBpbmRleERhdGFLZXksIGRhdGEpLm9rKCk7Cit9CisKK3N0YXRpYyBib29sIGZp
bmRHcmVhdGVzdEtleUxlc3NUaGFuKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQoreworICAgIE93blB0cjxsZXZlbGRiOjpJ
dGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAg
ICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICBp
dC0+U2Vla1RvTGFzdCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChjb21wYXJhdG9yLkNvbXBhcmVJbmRl
eEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID49IDApIHsKKyAgICAgICAgaXQtPlByZXYoKTsKKyAg
ICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICAqZm91bmRLZXkgPSBpdC0+a2V5KCkuVG9TdHJpbmcoKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSkKK3sK
KyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQgc2luY2Ugd2UgaW52YWxpZGF0ZSBpbmRl
eCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVjaGFuaXNtLgorICAgIHJldHVybiB0cnVl
OworfQorCitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9
IGdldFByaW1hcnlLZXlWaWFJbmRleChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCBrZXkpOworICAgIGlmICghcHJpbWFyeUtleSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOwor
CisgICAgcmV0dXJuIGdldE9iamVjdFN0b3JlUmVjb3JkKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsICpwcmltYXJ5S2V5KTsKK30KKworc3RhdGljIGJvb2wgdmVyc2lvbkV4aXN0cyhsZXZlbGRi
OjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkUHJpbWFyeUtleSkKK3sKKyAg
ICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDIsIGVuY29kZWRQcmltYXJ5S2V5KTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAg
bGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGtleSwg
JmRhdGEpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gZGVjb2RlSW50KGRhdGEpID09IHZlcnNpb247Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5
PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5JiBrZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5O
ZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgY29uc3Qgc3RkOjpzdHJp
bmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCwgZW5jb2RlS2V5KGtleSkpOworICAgIGl0LT5TZWVrKGxldmVsZGJLZXkpOworCisgICAgZm9y
ICg7OykgeworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIGlmIChjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZl
bGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpbnQ2NF90IHZl
cnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCku
ZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCksICZ2ZXJzaW9u
KTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZFByaW1hcnlLZXkgPSBzdGQ6OnN0cmluZyhw
LCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGlm
ICghdmVyc2lvbkV4aXN0cyhtX2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2
ZXJzaW9uLCBlbmNvZGVkUHJpbWFyeUtleSkpIHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFs
ZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBjb250aW51ZS4KKyAgICAgICAgICAgIG1fZGItPkRlbGV0
ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5O
ZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZlB0
cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRlY29kZUtleShlbmNvZGVkUHJpbWFyeUtl
eS5jX3N0cigpLCBlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpICsgZW5jb2RlZFByaW1hcnlLZXku
bGVuZ3RoKCksICZwcmltYXJ5S2V5KTsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlLZXkucmVsZWFz
ZSgpOworICAgIH0KK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJ
bkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxl
dmVsREJLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVu
Y29kZUtleShrZXkpKTsKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5l
d0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKworICAgIGJvb2wgZm91bmQgPSBm
YWxzZTsKKworICAgIGl0LT5TZWVrKGxldmVsREJLZXkpOworICAgIGlmIChpdC0+VmFsaWQoKSAm
JiAhY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKS5Ub1N0cmluZygpLCBsZXZl
bERCS2V5KSkKKyAgICAgICAgZm91bmQgPSB0cnVlOworCisgICAgcmV0dXJuIGZvdW5kOworfQor
CituYW1lc3BhY2UgeworY2xhc3MgQ3Vyc29ySW1wbENvbW1vbiA6IHB1YmxpYyBJREJCYWNraW5n
U3RvcmU6OkN1cnNvciB7CitwdWJsaWM6CisgICAgQ3Vyc29ySW1wbENvbW1vbihsZXZlbGRiOjpE
QiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3Rk
OjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAg
OiBtX2RiKGRiKQorICAgICAgICAsIG1fbG93S2V5KGxvd0tleSkKKyAgICAgICAgLCBtX2xvd09w
ZW4obG93T3BlbikKKyAgICAgICAgLCBtX2hpZ2hLZXkoaGlnaEtleSkKKyAgICAgICAgLCBtX2hp
Z2hPcGVuKGhpZ2hPcGVuKQorICAgICAgICAsIG1fZm9yd2FyZChmb3J3YXJkKQorICAgIHsKKyAg
ICB9CisgICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9CisKKyAgICAvLyBJREJCYWNr
aW5nU3RvcmU6OkN1cnNvcgorICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0
IElEQktleSopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0dXJu
IG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlL
ZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgp
ID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9y
ZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSA9IDA7IC8vIEZJWE1FOiBJ
cyB0aGlzIGFjdHVhbGx5IHVzZWQgYnkgYW55b25lPworICAgIHZpcnR1YWwgaW50NjRfdCBpbmRl
eERhdGFJZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpID0gMDsK
KyAgICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0ZWQ6CisgICAgbGV2ZWxkYjo6REIqIG1f
ZGI7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBtX2l0ZXJhdG9yOworICAgIHN0ZDo6
c3RyaW5nIG1fbG93S2V5OworICAgIGJvb2wgbV9sb3dPcGVuOworICAgIHN0ZDo6c3RyaW5nIG1f
aGlnaEtleTsKKyAgICBib29sIG1faGlnaE9wZW47CisgICAgYm9vbCBtX2ZvcndhcmQ7CisgICAg
UmVmUHRyPElEQktleT4gbV9jdXJyZW50S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29tbW9u
OjpmaXJzdFNlZWsoKQoreworICAgIG1faXRlcmF0b3IgPSBtX2RiLT5OZXdJdGVyYXRvcihsZXZl
bGRiOjpSZWFkT3B0aW9ucygpKTsKKworICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgIG1faXRl
cmF0b3ItPlNlZWsobV9sb3dLZXkpOworICAgIGVsc2UKKyAgICAgICAgbV9pdGVyYXRvci0+U2Vl
ayhtX2hpZ2hLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIW1faXRlcmF0b3It
PlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1fZm9y
d2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJh
dG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFy
ZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBj
b21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8
PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAm
JiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5r
ZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICBpZiAobV9mb3J3YXJkICYmIG1fbG93T3BlbikgeworICAgICAgICAgICAgLy8gbG93S2V5IHNo
b3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKGNvbXBh
cmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDAp
IHsKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7CisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX2Zvcndh
cmQgJiYgbV9oaWdoT3BlbikgeworICAgICAgICAgICAgLy8gaGlnaEtleSBzaG91bGQgbm90IGJl
IGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFy
ZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSB7CisgICAgICAg
ICAgICAgICAgbV9pdGVyYXRvci0+UHJldigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygp
KSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAgICAgICAgIG1faXRlcmF0
b3ItPk5leHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9y
LT5QcmV2KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1
bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNoYXJlcyBh
IGxvdCBvZiBjb2RlIHdpdGggZmlyc3RTZWVrLgorCisgICAgZm9yICg7OykgeworICAgICAgICBp
ZiAobV9mb3J3YXJkKQorICAgICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisKKyAgICAgICAgaWYgKCFtX2l0
ZXJhdG9yLT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHN0
ZDo6c3RyaW5nIHRyYXNoOworICAgICAgICBpZiAobV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRp
b25zKCksIG1faXRlcmF0b3ItPmtleSgpLCAmdHJhc2gpLklzTm90Rm91bmQoKSkKKyAgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1faGlnaE9wZW4gJiYg
Y29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkp
ID49IDApIC8vIGhpZ2gga2V5IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBh
cmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDAp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1f
bG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCks
IG1fbG93S2V5KSA8PSAwKSAvLyBsb3cga2V5IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVu
ICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dL
ZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWxvYWRD
dXJyZW50Um93KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoa2V5KSB7
CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fY3Vy
cmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS0+aXNMZXNzVGhh
bihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBPYmV5IHRoZSB1bmlx
dWVuZXNzIGNvbnN0cmFpbnQgKGFuZCB0ZXN0IGZvciBpdCEpCisKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1w
bCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZUN1
cnNvckltcGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgbG93S2V5LCBib29s
IGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29sIGhpZ2hPcGVuLCBib29s
IGZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihkYiwgbG93S2V5LCBsb3dPcGVu
LCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkKKyAgICB7CisgICAgfQorCisgICAgLy8gQ3Vy
c29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJy
ZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmpl
Y3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJ
ZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29s
IGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVl
OworfTsKKworYm9vbCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sK
KyAgICBpbnQ2NF90IGEsIGIsIGM7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0b3ItPmtl
eSgpLmRhdGEoKTsKKyAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAgIHAgPSBk
ZWNvZGVLZXkocCwgbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpICsgbV9pdGVyYXRvci0+a2V5KCku
c2l6ZSgpLCAmbV9jdXJyZW50S2V5KTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25z
dCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCBtX2l0
ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpLCAmdmVy
c2lvbik7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7CisKKyAgICBtX2N1cnJlbnRW
YWx1ZSA9IGRlY29kZVN0cmluZyhxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRl
cmF0b3ItPnZhbHVlKCkuc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJ
bmRleEtleUN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6Cisg
ICAgSW5kZXhLZXlDdXJzb3JJbXBsKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9vbCBo
aWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIsIGxv
d0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAgIH0K
KworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhh
bmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBy
ZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05P
VF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93
KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworfTsKKwor
Ym9vbCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBpbnQ2NF90
IGEsIGIsIGM7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmRhdGEoKTsK
KyAgICBwID0gZGVjb2RlUHJlZml4KHAsIGEsIGIsIGMpOworICAgIHAgPSBkZWNvZGVLZXkocCwg
bV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpICsgbV9pdGVyYXRvci0+a2V5KCkuc2l6ZSgpLCAmbV9j
dXJyZW50S2V5KTsKKworICAgIC8vIFdlIGp1c3QgaWdub3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIu
Li4KKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFy
SW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEo
KSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpLCAmdmVyc2lvbik7CisgICAgc3RhdGljX2Nh
c3Q8dm9pZD4odmVyc2lvbik7IC8vIEZJWE1FOiBXZSBzaG91bGQgcHJ1bmUgZW50cmllcyB3aXRo
IG9sZCB2ZXJzaW9uLCBidXQgSSB0aGluayBrZXlFeGlzdHNJbk9iamVjdFN0b3JlIHRha2VzIGNh
cmUgb2YgaXQgZm9yIG5vdyg/PykKKyAgICBkZWNvZGVLZXkocSwgbV9pdGVyYXRvci0+dmFsdWUo
KS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNpemUoKSwgJm1fcHJpbWFyeUtleSk7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5kZXhDdXJzb3JJbXBsIDogcHVibGljIEN1
cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIEluZGV4Q3Vyc29ySW1wbChsZXZlbGRiOjpE
QiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3Rk
OjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAg
OiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVu
LCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAg
dmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQor
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7
IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29sIGxvYWRDdXJyZW50Um93KCk7CisK
K3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworICAgIFN0cmluZyBt
X3ZhbHVlOworICAgIHN0ZDo6c3RyaW5nIG1fcHJpbWFyeUxldmVsREJLZXk7Cit9OworCitib29s
IEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGludDY0X3QgYSwgYiwg
YzsKKyAgICBjb25zdCBjaGFyKiBwID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIHAg
PSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisgICAgcCA9IGRlY29kZUtleShwLCBtX2l0ZXJh
dG9yLT5rZXkoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT5rZXkoKS5zaXplKCksICZtX2N1cnJlbnRL
ZXkpOworCisgICAgLy8gRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIs
IHJpZ2h0PworCisgICAgaW50NjRfdCBpbmRleERhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIq
IHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCksIG1faXRlcmF0b3It
PnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCksICZpbmRleERhdGFW
ZXJzaW9uKTsKKyAgICBxID0gZGVjb2RlS2V5KHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgp
ICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCksICZtX3ByaW1hcnlLZXkpOworCisgICAgbV9w
cmltYXJ5TGV2ZWxEQktleSA9IG1ha2VLZXkoYSwgYiwgMSwgZW5jb2RlS2V5KCptX3ByaW1hcnlL
ZXkpKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBtX3ByaW1hcnlMZXZlbERCS2V5LCAm
cmVzdWx0KTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNv
ZGVWYXJJbnQocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxlbmd0aCgp
LCAmb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRhVmVy
c2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRi
OjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29kZVN0cmluZyh0LCByZXN1bHQuY19zdHIo
KSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30KKworc3RhdGlj
IGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6
OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyogZm91bmRLZXkpCit7CisgICAgT3duUHRyPGxl
dmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMo
KSkpOworICAgIGl0LT5TZWVrKHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoaXQtPlZhbGlkKCkgJiYgIWNvbXBhcmF0
b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkpIHsKKyAgICAgICAgKmZvdW5k
S2V5ID0gaXQtPmtleSgpLlRvU3RyaW5nKCk7CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgfQor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJh
bmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJv
dW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFu
Z2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJ
REJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5F
WFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBz
dGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFy
dEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgICAgIGxv
d2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBz
dGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5
KCpyYW5nZS0+bG93ZXIoKSkpOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVu
KCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBt
YWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIpOworICAgICAgICB1cHBlck9wZW4g
PSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdl
IG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtl
eUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+dXBwZXIoKSkpOworICAgICAgICB1cHBlck9w
ZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbD4gY3Vyc29yID0gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1wbCht
X2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndh
cmQpKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNv
cihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVj
dGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsK
KyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBib29s
IGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwg
ZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxvd2VyT3BlbiwgdXBw
ZXJPcGVuOworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5LCBzdG9wS2V5OworCisgICAgaWYgKCFs
b3dlckJvdW5kKSB7CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleElkKTsgLy8gRklYTUU6IFRoaXMgY291bGQgbWVhbiBwcm9ibGVtcy4K
KyAgICAgICAgbG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorICAgIH0gZWxzZSB7
CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCBlbmNvZGVLZXkoKnJhbmdlLT5sb3dlcigpKSk7CisgICAgICAgIGxvd2VyT3BlbiA9
IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAg
ICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCArIDEpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAg
ICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAg
ICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXks
ICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVy
T3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9
IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpy
YW5nZS0+dXBwZXIoKSkpOworICAgICAgICBpZiAoIWZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1f
ZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBp
biB0aGUgc2V0IG9mIG5vbi11bmlxdWUga2V5cy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJl
ZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9IGFkb3B0UmVmKG5ldyBJbmRleEtleUN1
cnNvckltcGwobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBwZXJP
cGVuLCBmb3J3YXJkKSk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5k
ZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlv
biBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxv
d2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7Cisg
ICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElD
QVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9w
ZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAg
IGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNvdWxkIG1lYW4gcHJv
YmxlbXMuCisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9
IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOworICAgICAgICBsb3dl
ck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5k
KSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQgKyAxKTsKKyAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVk
LgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3Rz
LgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBz
dG9wS2V5LCAmc3RvcEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAg
ICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0
b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29k
ZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsKKyAgICAgICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1
YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0
KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKyAgICB9CisK
KyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJlZihuZXcgSW5kZXhD
dXJzb3JJbXBsKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0b3BLZXksIHVwcGVy
T3BlbiwgZm9yd2FyZCkpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworbmFtZXNwYWNl
IHsKK2NsYXNzIER1bW15VHJhbnNhY3Rpb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGJlZ2luKCkge30KKyAgICB2aXJ0
dWFsIHZvaWQgY29tbWl0KCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcm9sbGJhY2soKSB7fQorfTsK
K30KKworCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24+IElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKCkKK3sKKyAgICAvLyBGSVhNRTogV2Ug
bmVlZCB0byBpbXBsZW1lbnQgYSB0cmFuc2FjdGlvbiBhYnN0cmFjdGlvbiB0aGF0IGFsbG93cyBm
b3Igcm9sbC1iYWNrcywgYW5kIHdyaXRlIHRlc3RzIGZvciBpdC4KKworICAgIHJldHVybiBhZG9w
dFJlZihuZXcgRHVtbXlUcmFuc2FjdGlvbigpKTsKK30KKworLy8gRklYTUU6IGRlbGV0ZURhdGFi
YXNlIHNob3VsZCBiZSBwYXJ0IG9mIElEQkJhY2tpbmdTdG9yZS4KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxFKElO
REVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxl
dmVsREJCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjI3M2NmODE5ZDFkZDMxMDRmZTM4NThlNmI0OTU4ODdl
MGE3ODgxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxl
dmVsREJCYWNraW5nU3RvcmUuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJREJM
ZXZlbERCQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZV9oCisK
KyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworI2lu
Y2x1ZGUgIklEQkJhY2tpbmdTdG9yZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFt
ZXNwYWNlIGxldmVsZGIgeworY2xhc3MgREI7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZSA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmUgewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gb3BlbihTZWN1
cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUs
IGNvbnN0IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCopOwor
ICAgIHZpcnR1YWwgfklEQkxldmVsREJCYWNraW5nU3RvcmUoKTsKKworICAgIHZpcnR1YWwgYm9v
bCBleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmluZyYg
Zm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0SURC
RGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lv
biwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZv
dW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5k
S2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpOworICAgIHZp
cnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGlu
dDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9i
amVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAg
ICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29s
IHB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBSZWZQdHI8T2JqZWN0
U3RvcmVSZWNvcmRIYW5kbGU+Jik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwg
dm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKTsKKyAgICB2aXJ0
dWFsIGRvdWJsZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0luT2JqZWN0
U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElE
QktleSYsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIGZvdW5kUmVjb3JkSGFuZGxl
KTsKKworICAgIHZpcnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJh
Y2smKTsKKworICAgIHZpcnR1YWwgdm9pZCBnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rv
cjxib29sPiYgZm91bmRVbmlxdWVGbGFncyk7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5k
ZXhJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOworICAgIHZpcnR1YWwgYm9v
bCBwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3Rv
cmVSZWNvcmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9yUmVj
b3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7CisgICAgdmlydHVhbCBTdHJp
bmcgZ2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBQYXNz
UmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOwor
ICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworCisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSos
IElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBv
cGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVj
dGlvbik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29yKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworCisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPFRyYW5zYWN0aW9uPiBjcmVhdGVUcmFuc2FjdGlvbigpOworCitwcml2YXRl
OgorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3Rv
cnlCYWNrZW5kSW1wbCosIGxldmVsZGI6OkRCKik7CisKKyAgICBTdHJpbmcgbV9pZGVudGlmaWVy
OworICAgIFJlZlB0cjxJREJGYWN0b3J5QmFja2VuZEltcGw+IG1fZmFjdG9yeTsKKyAgICBPd25Q
dHI8bGV2ZWxkYjo6REI+IG1fZGI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKwor
I2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQorCisjZW5kaWYgLy8gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZV9oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcAppbmRleCAw
NDMzZWQ3NTc4YTJjZGNiNmM0ODZjOTVmODEyMjFjNmRmMjlkY2I5Li4xOTFiODY0NzI1OGZmMTUx
N2FiMzgyNzVjN2YzNTM0ZWY4NGMzZDdkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKQEAgLTUwLDggKzUwLDkgQEAgSURC
T2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6fklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoKQogewog
fQogCi1JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
KElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcm
IG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50KQorSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5n
U3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IGlkLCBjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50
KQogICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICwgbV9kYXRhYmFzZUlk
KGRhdGFiYXNlSWQpCiAgICAgLCBtX2lkKGlkKQogICAgICwgbV9uYW1lKG5hbWUpCiAgICAgLCBt
X2tleVBhdGgoa2V5UGF0aCkKQEAgLTYxLDggKzYyLDkgQEAgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdT
dG8KICAgICBsb2FkSW5kZXhlcygpOwogfQogCi1JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpJ
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVt
ZW50KQorSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50
KQogICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICwgbV9kYXRhYmFzZUlk
KGRhdGFiYXNlSWQpCiAgICAgLCBtX2lkKEludmFsaWRJZCkKICAgICAsIG1fbmFtZShuYW1lKQog
ICAgICwgbV9rZXlQYXRoKGtleVBhdGgpCkBAIC05MCw3ICs5Miw3IEBAIHZvaWQgSURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbDo6Z2V0KFBhc3NSZWZQdHI8SURCS2V5PiBwcnBLZXksIFBhc3NSZWZQ
dHI8SURCQ2FsCiAKIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Z2V0SW50ZXJuYWwo
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIFBhc3NSZWZQdHI8SURC
Q2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgU3RyaW5nIHdpcmVEYXRhID0gb2JqZWN0U3Rv
cmUtPm1fYmFja2luZ1N0b3JlLT5nZXRPYmplY3RTdG9yZVJlY29yZChvYmplY3RTdG9yZS0+aWQo
KSwgKmtleSk7CisgICAgU3RyaW5nIHdpcmVEYXRhID0gb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0
b3JlLT5nZXRPYmplY3RTdG9yZVJlY29yZChvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZS0+aWQoKSwgKmtleSk7CiAgICAgaWYgKHdpcmVEYXRhLmlzTnVsbCgpKSB7CiAgICAg
ICAgIGNhbGxiYWNrcy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6dW5kZWZpbmVk
VmFsdWUoKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTIyNyw4ICsyMjksOCBAQCB2b2lkIElEQk9i
amVjdFN0b3JlQmFja2VuZEltcGw6OnB1dEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPAogICAgICAgICBpbmRleEtleXMuYXBwZW5kKGtleS5yZWxlYXNlKCkpOwog
ICAgIH0KIAotICAgIGludDY0X3QgZGF0YVJvd0lkID0gSW52YWxpZElkOwotICAgIGJvb2wgaXNF
eGlzdGluZ1ZhbHVlID0gb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbk9i
amVjdFN0b3JlKG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCBkYXRhUm93SWQpOworICAgIFJlZlB0
cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiByZWNvcmRIYW5kbGU7
CisgICAgYm9vbCBpc0V4aXN0aW5nVmFsdWUgPSBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUt
PmtleUV4aXN0c0luT2JqZWN0U3RvcmUob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmUtPmlkKCksICprZXksIHJlY29yZEhhbmRsZSk7CiAKICAgICBpZiAocHV0TW9kZSA9PSBB
ZGRPbmx5ICYmIGlzRXhpc3RpbmdWYWx1ZSkgewogICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3Io
SURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpDT05TVFJBSU5U
X0VSUiwgIktleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgb2JqZWN0IHN0b3JlLiIpKTsKQEAgLTIz
NywxNCArMjM5LDcgQEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpwdXRJbnRlcm5h
bChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjwKIAogICAgIC8vIEJlZm9yZSB0
aGlzIHBvaW50LCBkb24ndCBkbyBhbnkgbXV0YXRpb24uICBBZnRlciB0aGlzIHBvaW50LCByb2xs
YmFjayB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBlcnJvci4KIAotICAgIGlmICghb2JqZWN0
U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5wdXRPYmplY3RTdG9yZVJlY29yZChvYmplY3RTdG9yZS0+
aWQoKSwgKmtleSwgdmFsdWUtPnRvV2lyZVN0cmluZygpLCBkYXRhUm93SWQsIGRhdGFSb3dJZCA9
PSBJbnZhbGlkSWQpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGUgSW5kZXhlZCBEYXRhYmFzZSBz
cGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXJyb3IgY29kZSBkZWRpY2F0ZWQgdG8gSS9P
IGVycm9ycy4KLSAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNy
ZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9XTl9FUlIsICJFcnJvciB3cml0aW5nIGRh
dGEgdG8gc3RhYmxlIHN0b3JhZ2UuIikpOwotICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQoKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2lu
Z1N0b3JlLT5kZWxldGVJbmRleERhdGFGb3JSZWNvcmQoZGF0YVJvd0lkKSkgeworICAgIGlmICgh
b2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5wdXRPYmplY3RTdG9yZVJlY29yZChvYmplY3RT
dG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgKmtleSwgdmFsdWUtPnRvV2ly
ZVN0cmluZygpLCByZWNvcmRIYW5kbGUpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBUaGUgSW5kZXhl
ZCBEYXRhYmFzZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXJyb3IgY29kZSBkZWRp
Y2F0ZWQgdG8gSS9PIGVycm9ycy4KICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFi
YXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9XTl9FUlIsICJFcnJv
ciB3cml0aW5nIGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2UuIikpOwogICAgICAgICB0cmFuc2FjdGlv
bi0+YWJvcnQoKTsKQEAgLTI1NSw3ICsyNTAsMTUgQEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsOjpwdXRJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjwK
ICAgICBmb3IgKEluZGV4TWFwOjppdGVyYXRvciBpdCA9IG9iamVjdFN0b3JlLT5tX2luZGV4ZXMu
YmVnaW4oKTsgaXQgIT0gb2JqZWN0U3RvcmUtPm1faW5kZXhlcy5lbmQoKTsgKytpdCwgKytpKSB7
CiAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzVmFsaWRJZCgpKQogICAgICAgICAgICAgY29u
dGludWU7IC8vIFRoZSBpbmRleCBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IGRvZXMgbm90
IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB5ZXQuCi0gICAgICAgIGlmICghb2JqZWN0U3RvcmUtPm1f
YmFja2luZ1N0b3JlLT5wdXRJbmRleERhdGFGb3JSZWNvcmQoaXQtPnNlY29uZC0+aWQoKSwgKmlu
ZGV4S2V5c1tpXSwgZGF0YVJvd0lkKSkgeworCisgICAgICAgIGlmICghb2JqZWN0U3RvcmUtPm1f
YmFja2luZ1N0b3JlLT5kZWxldGVJbmRleERhdGFGb3JSZWNvcmQob2JqZWN0U3RvcmUtPm1fZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksIGl0LT5zZWNvbmQtPmlkKCksICpyZWNvcmRIYW5k
bGUpKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhlIEluZGV4ZWQgRGF0YWJhc2Ugc3BlY2lm
aWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFuIGVycm9yIGNvZGUgZGVkaWNhdGVkIHRvIEkvTyBlcnJv
cnMuCisgICAgICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3Jl
YXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVTktOT1dOX0VSUiwgIkVycm9yIHdyaXRpbmcgZGF0
YSB0byBzdGFibGUgc3RvcmFnZS4iKSk7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQo
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb2JqZWN0
U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5wdXRJbmRleERhdGFGb3JSZWNvcmQob2JqZWN0U3RvcmUt
Pm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksIGl0LT5zZWNvbmQtPmlkKCksICppbmRl
eEtleXNbaV0sICpyZWNvcmRIYW5kbGUpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogVGhlIElu
ZGV4ZWQgRGF0YWJhc2Ugc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFuIGVycm9yIGNvZGUg
ZGVkaWNhdGVkIHRvIEkvTyBlcnJvcnMuCiAgICAgICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3Io
SURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVTktOT1dOX0VS
UiwgIkVycm9yIHdyaXRpbmcgZGF0YSB0byBzdGFibGUgc3RvcmFnZS4iKSk7CiAgICAgICAgICAg
ICB0cmFuc2FjdGlvbi0+YWJvcnQoKTsKQEAgLTI4MywxMyArMjg2LDIxIEBAIHZvaWQgSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kSW1wbDo6ZGVsZXRlRnVuY3Rpb24oUGFzc1JlZlB0cjxJREJLZXk+IHBy
cEtleSwgUGFzc1JlCiAKIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6ZGVsZXRlSW50
ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIFBhc3NSZWZQ
dHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgaW50NjRfdCBpZDsKLSAgICBpZiAo
IW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5PYmplY3RTdG9yZShvYmpl
Y3RTdG9yZS0+aWQoKSwgKmtleSwgaWQpKSB7CisgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6
T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IHJlY29yZEhhbmRsZTsKKyAgICBpZiAoIW9iamVjdFN0
b3JlLT5tX2JhY2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5PYmplY3RTdG9yZShvYmplY3RTdG9yZS0+
bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgKmtleSwgcmVjb3JkSGFuZGxlKSkgewog
ICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRh
dGFiYXNlRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSLCAiS2V5IGRvZXMgbm90IGV4aXN0IGluIHRo
ZSBvYmplY3Qgc3RvcmUuIikpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgb2JqZWN0
U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5kZWxldGVPYmplY3RTdG9yZVJlY29yZChvYmplY3RTdG9y
ZS0+aWQoKSwgaWQpOworICAgIGZvciAoSW5kZXhNYXA6Oml0ZXJhdG9yIGl0ID0gb2JqZWN0U3Rv
cmUtPm1faW5kZXhlcy5iZWdpbigpOyBpdCAhPSBvYmplY3RTdG9yZS0+bV9pbmRleGVzLmVuZCgp
OyArK2l0KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzVmFsaWRJZCgpKQorICAgICAg
ICAgICAgY29udGludWU7IC8vIFRoZSBpbmRleCBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgYnV0
IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB5ZXQuCisKKyAgICAgICAgaWYgKCFvYmpl
Y3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChvYmplY3RT
dG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQoKSwgaXQtPnNlY29uZC0+aWQoKSwg
KnJlY29yZEhhbmRsZSkpCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9
CisKKyAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZU9iamVjdFN0b3JlUmVj
b3JkKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCAqcmVjb3Jk
SGFuZGxlKTsKICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhTZXJpYWxpemVkU2NyaXB0VmFsdWU6
Om51bGxWYWx1ZSgpKTsKIH0KIApAQCAtMzA5LDI2ICszMjAsMjggQEAgdm9pZCBJREJPYmplY3RT
dG9yZUJhY2tlbmRJbXBsOjpjbGVhcihQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gcHJwQ2FsbGJh
Y2tzLCBJREIKIAogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjbGVhckludGVybmFs
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQog
ewotICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+Y2xlYXJPYmplY3RTdG9yZShvYmpl
Y3RTdG9yZS0+aWQoKSk7CisgICAgb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5jbGVhck9i
amVjdFN0b3JlKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpKTsK
ICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhTZXJpYWxpemVkU2NyaXB0VmFsdWU6OnVuZGVmaW5l
ZFZhbHVlKCkpOwogfQogCiBuYW1lc3BhY2UgewogY2xhc3MgUG9wdWxhdGVJbmRleENhbGxiYWNr
IDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayB7CiBw
dWJsaWM6Ci0gICAgUG9wdWxhdGVJbmRleENhbGxiYWNrKElEQkJhY2tpbmdTdG9yZSYgYmFja2lu
Z1N0b3JlLCBjb25zdCBTdHJpbmcmIGluZGV4S2V5UGF0aCwgaW50NjRfdCBpbmRleElkKQorICAg
IFBvcHVsYXRlSW5kZXhDYWxsYmFjayhJREJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSwgY29u
c3QgU3RyaW5nJiBpbmRleEtleVBhdGgsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCiAgICAgICAgIDogbV9iYWNraW5nU3RvcmUoYmFj
a2luZ1N0b3JlKQogICAgICAgICAsIG1faW5kZXhLZXlQYXRoKGluZGV4S2V5UGF0aCkKKyAgICAg
ICAgLCBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICAgICAgLCBtX29iamVjdFN0b3JlSWQo
b2JqZWN0U3RvcmVJZCkKICAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKICAgICB7CiAgICAg
fQogCi0gICAgdmlydHVhbCBib29sIGNhbGxiYWNrKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQs
IGNvbnN0IFN0cmluZyYgdmFsdWUpCisgICAgdmlydHVhbCBib29sIGNhbGxiYWNrKGNvbnN0IElE
QkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRsZSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgICB7CiAgICAgICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0
VmFsdWU+IG9iamVjdFZhbHVlID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGVGcm9tV2ly
ZSh2YWx1ZSk7CiAgICAgICAgIFJlZlB0cjxJREJLZXk+IGluZGV4S2V5ID0gZmV0Y2hLZXlGcm9t
S2V5UGF0aChvYmplY3RWYWx1ZS5nZXQoKSwgbV9pbmRleEtleVBhdGgpOwogCi0gICAgICAgIGlm
ICghbV9iYWNraW5nU3RvcmUucHV0SW5kZXhEYXRhRm9yUmVjb3JkKG1faW5kZXhJZCwgKmluZGV4
S2V5LCBvYmplY3RTdG9yZURhdGFJZCkpCisgICAgICAgIGlmICghbV9iYWNraW5nU3RvcmUucHV0
SW5kZXhEYXRhRm9yUmVjb3JkKG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2luZGV4
SWQsICppbmRleEtleSwgcmVjb3JkSGFuZGxlKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
IAogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMzNywxNCArMzUwLDE2IEBAIHB1YmxpYzoKIHBy
aXZhdGU6CiAgICAgSURCQmFja2luZ1N0b3JlJiBtX2JhY2tpbmdTdG9yZTsKICAgICBjb25zdCBT
dHJpbmcmIG1faW5kZXhLZXlQYXRoOworICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGlu
dDY0X3QgbV9vYmplY3RTdG9yZUlkOwogICAgIGludDY0X3QgbV9pbmRleElkOwogfTsKIH0KIAot
c3RhdGljIGJvb2wgcG9wdWxhdGVJbmRleChJREJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IFN0cmluZyYgaW5k
ZXhLZXlQYXRoKQorc3RhdGljIGJvb2wgcG9wdWxhdGVJbmRleChJREJCYWNraW5nU3RvcmUmIGJh
Y2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgpCiB7Ci0gICAgUG9wdWxh
dGVJbmRleENhbGxiYWNrIGNhbGxiYWNrKGJhY2tpbmdTdG9yZSwgaW5kZXhLZXlQYXRoLCBpbmRl
eElkKTsKLSAgICBpZiAoIWJhY2tpbmdTdG9yZS5mb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQob2Jq
ZWN0U3RvcmVJZCwgY2FsbGJhY2spKQorICAgIFBvcHVsYXRlSW5kZXhDYWxsYmFjayBjYWxsYmFj
ayhiYWNraW5nU3RvcmUsIGluZGV4S2V5UGF0aCwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCk7CisgICAgaWYgKCFiYWNraW5nU3RvcmUuZm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGNhbGxiYWNrKSkKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzYwLDcgKzM3NSw3IEBAIFBhc3NSZWZQdHI8
SURCSW5kZXhCYWNrZW5kSW50ZXJmYWNlPiBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVh
dGVJbmRleChjb25zCiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIFJlZlB0cjxJREJJ
bmRleEJhY2tlbmRJbXBsPiBpbmRleCA9IElEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZShtX2Jh
Y2tpbmdTdG9yZS5nZXQoKSwgbmFtZSwgbV9uYW1lLCBrZXlQYXRoLCB1bmlxdWUpOworICAgIFJl
ZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBpbmRleCA9IElEQkluZGV4QmFja2VuZEltcGw6OmNy
ZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbV9kYXRhYmFzZUlkLCB0aGlzLCBuYW1lLCBtX25h
bWUsIGtleVBhdGgsIHVuaXF1ZSk7CiAgICAgQVNTRVJUKGluZGV4LT5uYW1lKCkgPT0gbmFtZSk7
CiAKICAgICBSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUgPSB0
aGlzOwpAQCAtMzc4LDE0ICszOTMsMTQgQEAgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbnRl
cmZhY2U+IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZUluZGV4KGNvbnMKIHZvaWQg
SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y3JlYXRlSW5kZXhJbnRlcm5hbChTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBvYmpl
Y3RTdG9yZSwgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiBpbmRleCwgUGFzc1JlZlB0
cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2U+IHRyYW5zYWN0aW9uKQogewogICAgIGlu
dDY0X3QgaWQ7Ci0gICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmNyZWF0ZUlu
ZGV4KG9iamVjdFN0b3JlLT5tX2lkLCBpbmRleC0+bmFtZSgpLCBpbmRleC0+a2V5UGF0aCgpLCBp
bmRleC0+dW5pcXVlKCksIGlkKSkgeworICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0
b3JlLT5jcmVhdGVJbmRleChvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+
aWQoKSwgaW5kZXgtPm5hbWUoKSwgaW5kZXgtPmtleVBhdGgoKSwgaW5kZXgtPnVuaXF1ZSgpLCBp
ZCkpIHsKICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKICAgICBpbmRleC0+c2V0SWQoaWQpOwogCi0gICAgaWYgKCFwb3B1bGF0ZUluZGV4KCpv
YmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUsIG9iamVjdFN0b3JlLT5tX2lkLCBpZCwgaW5kZXgt
PmtleVBhdGgoKSkpIHsKKyAgICBpZiAoIXBvcHVsYXRlSW5kZXgoKm9iamVjdFN0b3JlLT5tX2Jh
Y2tpbmdTdG9yZSwgb2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPm1faWQs
IGlkLCBpbmRleC0+a2V5UGF0aCgpKSkgewogICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQoKTsK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQyOCw3ICs0NDMsNyBAQCB2b2lkIElEQk9iamVj
dFN0b3JlQmFja2VuZEltcGw6OmRlbGV0ZUluZGV4KGNvbnN0IFN0cmluZyYgbmFtZSwgSURCVHJh
bnNhY3Rpb25CYQogCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmRlbGV0ZUluZGV4
SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1w
bD4gaW5kZXgsIFBhc3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlPiB0cmFu
c2FjdGlvbikKIHsKLSAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZUluZGV4
KGluZGV4LT5pZCgpKTsKKyAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmRlbGV0ZUlu
ZGV4KG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCBpbmRleC0+
aWQoKSk7CiAgICAgdHJhbnNhY3Rpb24tPmRpZENvbXBsZXRlVGFza0V2ZW50cygpOwogfQogCkBA
IC00NDYsNyArNDYxLDcgQEAgdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpvcGVuQ3Vy
c29ySW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3MKIHsKICAgICBJREJDdXJz
b3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdGF0aWNfY2FzdDxJREJDdXJzb3I6OkRpcmVjdGlv
bj4odG1wRGlyZWN0aW9uKTsKIAotICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
YmFja2luZ1N0b3JlQ3Vyc29yID0gb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5vcGVuT2Jq
ZWN0U3RvcmVDdXJzb3Iob2JqZWN0U3RvcmUtPmlkKCksIHJhbmdlLmdldCgpLCBkaXJlY3Rpb24p
OworICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gYmFja2luZ1N0b3JlQ3Vyc29y
ID0gb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5vcGVuT2JqZWN0U3RvcmVDdXJzb3Iob2Jq
ZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksIHJhbmdlLmdldCgpLCBk
aXJlY3Rpb24pOwogICAgIGlmICghYmFja2luZ1N0b3JlQ3Vyc29yKSB7CiAgICAgICAgIGNhbGxi
YWNrcy0+b25TdWNjZXNzKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6bnVsbFZhbHVlKCkpOwogICAg
ICAgICByZXR1cm47CkBAIC00NjIsMTQgKzQ3NywxNCBAQCB2b2lkIElEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGw6OmxvYWRJbmRleGVzKCkKICAgICBWZWN0b3I8U3RyaW5nPiBuYW1lczsKICAgICBW
ZWN0b3I8U3RyaW5nPiBrZXlQYXRoczsKICAgICBWZWN0b3I8Ym9vbD4gdW5pcXVlRmxhZ3M7Ci0g
ICAgbV9iYWNraW5nU3RvcmUtPmdldEluZGV4ZXMobV9pZCwgaWRzLCBuYW1lcywga2V5UGF0aHMs
IHVuaXF1ZUZsYWdzKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+Z2V0SW5kZXhlcyhtX2RhdGFiYXNl
SWQsIG1faWQsIGlkcywgbmFtZXMsIGtleVBhdGhzLCB1bmlxdWVGbGFncyk7CiAKICAgICBBU1NF
UlQobmFtZXMuc2l6ZSgpID09IGlkcy5zaXplKCkpOwogICAgIEFTU0VSVChrZXlQYXRocy5zaXpl
KCkgPT0gaWRzLnNpemUoKSk7CiAgICAgQVNTRVJUKHVuaXF1ZUZsYWdzLnNpemUoKSA9PSBpZHMu
c2l6ZSgpKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKQot
ICAgICAgICBtX2luZGV4ZXMuc2V0KG5hbWVzW2ldLCBJREJJbmRleEJhY2tlbmRJbXBsOjpjcmVh
dGUobV9iYWNraW5nU3RvcmUuZ2V0KCksIGlkc1tpXSwgbmFtZXNbaV0sIG1fbmFtZSwga2V5UGF0
aHNbaV0sIHVuaXF1ZUZsYWdzW2ldKSk7CisgICAgICAgIG1faW5kZXhlcy5zZXQobmFtZXNbaV0s
IElEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZShtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbV9kYXRh
YmFzZUlkLCB0aGlzLCBpZHNbaV0sIG5hbWVzW2ldLCBtX25hbWUsIGtleVBhdGhzW2ldLCB1bmlx
dWVGbGFnc1tpXSkpOwogfQogCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OnJlbW92
ZUluZGV4RnJvbU1hcChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJPYmpl
Y3RTdG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJJbmRleEJhY2tl
bmRJbXBsPiBpbmRleCkKQEAgLTQ5MCw3ICs1MDUsNyBAQCBQYXNzUmVmUHRyPElEQktleT4gSURC
T2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Z2VuQXV0b0luY3JlbWVudEtleSgpCiAgICAgaWYgKG1f
YXV0b0luY3JlbWVudE51bWJlciA+IDApCiAgICAgICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZU51
bWJlcihtX2F1dG9JbmNyZW1lbnROdW1iZXIrKyk7CiAKLSAgICBtX2F1dG9JbmNyZW1lbnROdW1i
ZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fYmFja2luZ1N0b3JlLT5uZXh0QXV0b0luY3JlbWVudE51
bWJlcihpZCgpKSk7CisgICAgbV9hdXRvSW5jcmVtZW50TnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50
PihtX2JhY2tpbmdTdG9yZS0+bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIobV9kYXRhYmFzZUlkLCBp
ZCgpKSk7CiAgICAgcmV0dXJuIElEQktleTo6Y3JlYXRlTnVtYmVyKG1fYXV0b0luY3JlbWVudE51
bWJlcisrKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmpl
Y3RTdG9yZUJhY2tlbmRJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwuaAppbmRleCA0NDc5ZDFlMGQ3NGJmMDY4MDkyNDdkOGYyZDVmY2I2YjY3
NzZiNmUwLi5lY2UzZmU0ZjU4NjdjOTliNTg0Yzc2ZDlkNDUyNjFhNTdlN2MyZWM1IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaApA
QCAtNDIsMTMgKzQyLDEzIEBAIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CiAKIGNsYXNz
IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwgOiBwdWJsaWMgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW50ZXJmYWNlIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0
X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1
dG9JbmNyZW1lbnQpCisgICAgc3RhdGljIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQ
YXRoLCBib29sIGF1dG9JbmNyZW1lbnQpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBpZCwgbmFtZSwga2V5
UGF0aCwgYXV0b0luY3JlbWVudCkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQk9i
amVjdFN0b3JlQmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBpZCwgbmFtZSwg
a2V5UGF0aCwgYXV0b0luY3JlbWVudCkpOwogICAgIH0KLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJ
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsPiBjcmVhdGUoSURCQmFja2luZ1N0b3JlKiBiYWNraW5n
U3RvcmUsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1
dG9JbmNyZW1lbnQpCisgICAgc3RhdGljIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1
dG9JbmNyZW1lbnQpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQk9iamVj
dFN0b3JlQmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBuYW1lLCBrZXlQYXRoLCBhdXRvSW5jcmVt
ZW50KSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbChiYWNraW5nU3RvcmUsIGRhdGFiYXNlSWQsIG5hbWUsIGtleVBhdGgsIGF1dG9JbmNyZW1l
bnQpKTsKICAgICB9CiAgICAgdmlydHVhbCB+SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCgpOwog
CkBAIC01OSw2ICs1OSw3IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1faWQ7CiAgICAgfQog
ICAgIHZvaWQgc2V0SWQoaW50NjRfdCBpZCkgeyBtX2lkID0gaWQ7IH0KKyAgICBpbnQ2NF90IGRh
dGFiYXNlSWQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlSWQ7IH0KIAogICAgIHZpcnR1YWwg
U3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KICAgICB2aXJ0dWFsIFN0cmlu
ZyBrZXlQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9rZXlQYXRoOyB9CkBAIC03Nyw4ICs3OCw4IEBA
IHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgb3BlbkN1cnNvcihQYXNzUmVmUHRyPElEQktleVJh
bmdlPiByYW5nZSwgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9uLCBQYXNzUmVmUHRyPElEQkNhbGxi
YWNrcz4sIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSosIEV4Y2VwdGlvbkNvZGUmKTsK
IAogcHJpdmF0ZToKLSAgICBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9y
ZSosIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
LCBib29sIGF1dG9JbmNyZW1lbnQpOwotICAgIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURC
QmFja2luZ1N0b3JlKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgs
IGJvb2wgYXV0b0luY3JlbWVudCk7CisgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJC
YWNraW5nU3RvcmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QgaWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQpOworICAg
IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwgaW50NjRfdCBkYXRh
YmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBh
dXRvSW5jcmVtZW50KTsKIAogICAgIHZvaWQgbG9hZEluZGV4ZXMoKTsKICAgICBQYXNzUmVmUHRy
PElEQktleT4gZ2VuQXV0b0luY3JlbWVudEtleSgpOwpAQCAtOTksNiArMTAwLDcgQEAgcHJpdmF0
ZToKIAogICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0b3JlOwogCisgICAg
aW50NjRfdCBtX2RhdGFiYXNlSWQ7CiAgICAgaW50NjRfdCBtX2lkOwogICAgIFN0cmluZyBtX25h
bWU7CiAgICAgU3RyaW5nIG1fa2V5UGF0aDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2Uv
SURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcAppbmRleCBlNDNiN2EzNjA2OTUxZTNkMmNhNjUzMGU0
NmMxZjlhMmRmMmY1MWNkLi45ZWYwYzI0MGYzMmMzZmU4ZThiOGNhMWUxNTQxYWM3Zjg5OWE3MTIz
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9y
ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUu
Y3BwCkBAIC0xNzMsNyArMTczLDcgQEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQlNR
TGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJpdHkKICAgICBpZiAo
IXBhdGhCYXNlLmlzRW1wdHkoKSkgewogICAgICAgICBpZiAoIW1ha2VBbGxEaXJlY3Rvcmllcyhw
YXRoQmFzZSkpIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBJcyB0aGVyZSBhbnkgb3RoZXIgdGhp
bmcgd2UgY291bGQgcG9zc2libHkgZG8gdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50PyBJZiBzbywg
ZG8gaXQgcmF0aGVyIHRoYW4ganVzdCBlcnJvcmluZyBvdXQuCi0gICAgICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZWQgdG8gY3JlYXRlIExvY2FsU3RvcmFnZSBkYXRhYmFzZSBwYXRoICVzIiwgcGF0
aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBj
cmVhdGUgSW5kZXhlZCBEQiBkYXRhYmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEo
KSk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBwYXRoID0gcGF0
aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYiIpOwpAQCAtMjYzLDcgKzI2Myw3IEBAIHZvaWQgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBW
ZWN0b3I8aW50NjRfdD4mCiAgICAgfQogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6
Y3JlYXRlT2JqZWN0U3RvcmUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90JiBhc3Np
Z25lZE9iamVjdFN0b3JlSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlT2Jq
ZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90JiBhc3NpZ25lZE9iamVj
dFN0b3JlSWQpCiB7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQgSU5U
TyBPYmplY3RTdG9yZXMgKG5hbWUsIGtleVBhdGgsIGRvQXV0b0luY3JlbWVudCwgZGF0YWJhc2VJ
ZCkgVkFMVUVTICg/LCA/LCA/LCA/KSIpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FM
UmVzdWx0T2spCkBAIC0yOTEsNyArMjkxLDcgQEAgc3RhdGljIHZvaWQgZG9EZWxldGUoU1FMaXRl
RGF0YWJhc2UmIGRiLCBjb25zdCBjaGFyKiBzcWwsIGludDY0X3QgaWQpCiAgICAgQVNTRVJUX1VO
VVNFRChvaywgb2spOyAvLyBGSVhNRTogQmV0dGVyIGVycm9yIGhhbmRsaW5nLgogfQogCi12b2lk
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RT
dG9yZUlkKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewogICAgIGRvRGVsZXRl
KG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZXMgV0hFUkUgaWQgPSA/Iiwgb2JqZWN0U3Rv
cmVJZCk7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVjdFN0b3JlRGF0YSBX
SEVSRSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwpAQCAtMzczLDcgKzM3Myw3
IEBAIHN0YXRpYyBTdHJpbmcgdXBwZXJDdXJzb3JXaGVyZUZyYWdtZW50KGNvbnN0IElEQktleSYg
a2V5LCBTdHJpbmcgY29tcGFyaXNvbk9wZXJhCiAgICAgcmV0dXJuICIiOwogfQogCi1TdHJpbmcg
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5KQorU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5KQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVy
eShtX2RiLCAiU0VMRUNUIGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSBGUk9N
IE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQgIiArIHdoZXJlU3lu
dGF4Rm9yS2V5KGtleSkpOwogICAgIGJvb2wgb2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVz
dWx0T2s7CkBAIC00MjIsNTggKzQyMiw2MyBAQCBzdGF0aWMgdm9pZCBiaW5kS2V5VG9RdWVyeVdp
dGhOdWxscyhTUUxpdGVTdGF0ZW1lbnQmIHF1ZXJ5LCBpbnQgYmFzZUNvbHVtbiwgY29ucwogICAg
IH0KIH0KIAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IFN0cmluZyYg
dmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK25hbWVzcGFjZSB7Citj
bGFzcyBTUUxpdGVSZWNvcmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RT
dG9yZVJlY29yZEhhbmRsZSB7CitwdWJsaWM6CisgICAgU1FMaXRlUmVjb3JkSGFuZGxlKGludDY0
X3QgaWQpIDogbV9pZChpZCkge30KKyAgICBpbnQ2NF90IGlkKCkgY29uc3QgeyByZXR1cm4gbV9p
ZDsgfQorcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1faWQ7Cit9OworfQorCitib29sIElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZh
bHVlLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiByZWNvcmRIYW5kbGUpCiB7Ci0g
ICAgU3RyaW5nIHNxbCA9ICFpbnZhbGlkUm93SWQgPyAiVVBEQVRFIE9iamVjdFN0b3JlRGF0YSBT
RVQga2V5U3RyaW5nID0gPywga2V5RGF0ZSA9ID8sIGtleU51bWJlciA9ID8sIHZhbHVlID0gPyBX
SEVSRSBpZCA9ID8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSU5TRVJUIElO
VE8gT2JqZWN0U3RvcmVEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgdmFsdWUs
IG9iamVjdFN0b3JlSWQpIFZBTFVFUyAoPywgPywgPywgPywgPykiOworICAgIFNRTGl0ZVJlY29y
ZEhhbmRsZSogc3FsaXRlUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8U1FMaXRlUmVjb3JkSGFu
ZGxlKj4ocmVjb3JkSGFuZGxlLmdldCgpKTsKKworICAgIFN0cmluZyBzcWwgPSBzcWxpdGVSZWNv
cmRIYW5kbGUgPyAiVVBEQVRFIE9iamVjdFN0b3JlRGF0YSBTRVQga2V5U3RyaW5nID0gPywga2V5
RGF0ZSA9ID8sIGtleU51bWJlciA9ID8sIHZhbHVlID0gPyBXSEVSRSBpZCA9ID8iCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTlNFUlQgSU5UTyBPYmplY3RTdG9yZURh
dGEgKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCB2YWx1ZSwgb2JqZWN0U3RvcmVJZCkg
VkFMVUVTICg/LCA/LCA/LCA/LCA/KSI7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIs
IHNxbCk7CiAgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCiAgICAgYmluZEtleVRvUXVlcnlXaXRoTnVsbHMocXVlcnksIDEsIGtl
eSk7CiAgICAgcXVlcnkuYmluZEJsb2IoNCwgdmFsdWUpOwotICAgIGlmICghaW52YWxpZFJvd0lk
KQotICAgICAgICBxdWVyeS5iaW5kSW50NjQoNSwgcm93SWQpOworICAgIGlmIChzcWxpdGVSZWNv
cmRIYW5kbGUpCisgICAgICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCBzcWxpdGVSZWNvcmRIYW5kbGUt
PmlkKCkpOwogICAgIGVsc2UKICAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIG9iamVjdFN0b3Jl
SWQpOwogCiAgICAgaWYgKHF1ZXJ5LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKLSAgICBpZiAoaW52YWxpZFJvd0lkKQotICAgICAgICByb3dJZCA9IG1f
ZGIubGFzdEluc2VydFJvd0lEKCk7CisgICAgaWYgKCFzcWxpdGVSZWNvcmRIYW5kbGUpCisgICAg
ICAgIHJlY29yZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBTUUxpdGVSZWNvcmRIYW5kbGUobV9kYi5s
YXN0SW5zZXJ0Um93SUQoKSkpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkK
K3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewogICAgIGRvRGVsZXRlKG1fZGIsICJE
RUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgSU4gKFNFTEVDVCBp
ZCBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPykiLCBvYmplY3RT
dG9yZUlkKTsKICAgICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVEYXRh
IFdIRVJFIG9iamVjdFN0b3JlSWQgPSA/Iiwgb2JqZWN0U3RvcmVJZCk7CiB9CiAKLXZvaWQgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90LCBpbnQ2
NF90IG9iamVjdFN0b3JlRGF0YUlkKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0
ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYgcmVjb3JkSGFuZGxlKQogeworICAg
IGNvbnN0IFNRTGl0ZVJlY29yZEhhbmRsZSYgc3FsaXRlUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nh
c3Q8Y29uc3QgU1FMaXRlUmVjb3JkSGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKKwogICAgIFNRTGl0
ZVN0YXRlbWVudCBvc1F1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hF
UkUgaWQgPSA/Iik7CiAgICAgYm9vbCBvayA9IG9zUXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3Vs
dE9rOwogICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBo
YW5kbGluZz8KIAotICAgIG9zUXVlcnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlRGF0YUlkKTsK
KyAgICBvc1F1ZXJ5LmJpbmRJbnQ2NCgxLCBzcWxpdGVSZWNvcmRIYW5kbGUuaWQoKSk7CiAKICAg
ICBvayA9IG9zUXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7CiAgICAgQVNTRVJUX1VOVVNF
RChvaywgb2spOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IGluZGV4UXVlcnkobV9kYiwgIkRFTEVU
RSBGUk9NIEluZGV4RGF0YSBXSEVSRSBvYmplY3RTdG9yZURhdGFJZCA9ID8iKTsKLSAgICBvayA9
IGluZGV4UXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwotICAgIEFTU0VSVF9VTlVTRUQo
b2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZz8KLQotICAgIGluZGV4UXVl
cnkuYmluZEludDY0KDEsIG9iamVjdFN0b3JlRGF0YUlkKTsKLQotICAgIG9rID0gaW5kZXhRdWVy
eS5zdGVwKCkgPT0gU1FMUmVzdWx0RG9uZTsKLSAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CiB9
CiAKLWRvdWJsZSBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVy
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK2RvdWJsZSBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om5l
eHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIG1heChr
ZXlOdW1iZXIpICsgMSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0g
PyBBTkQga2V5U3RyaW5nIElTIE5VTEwgQU5EIGtleURhdGUgSVMgTlVMTCIpOwogICAgIGJvb2wg
b2sgPSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CkBAIC00ODcsNyArNDkyLDcgQEAg
ZG91YmxlIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50
NjRfdCBvYmplY3RTdG9yZUlkKQogICAgIHJldHVybiBxdWVyeS5nZXRDb2x1bW5Eb3VibGUoMCk7
CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3Jl
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIGludDY0X3QmIGZvdW5k
T2JqZWN0U3RvcmVEYXRhSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3Rz
SW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiBrZXksIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mIGZvdW5k
UmVjb3JkSGFuZGxlKQogewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBpZCBGUk9N
IE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyBBTkQgIikgKyB3aGVyZVN5
bnRheEZvcktleShrZXkpOwogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwpA
QCAtNTAwLDExICs1MDUsMTEgQEAgYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmtleUV4aXN0
c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdAogICAgIGlmIChxdWVy
eS5zdGVwKCkgIT0gU1FMUmVzdWx0Um93KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBm
b3VuZE9iamVjdFN0b3JlRGF0YUlkID0gcXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CisgICAgZm91
bmRSZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgU1FMaXRlUmVjb3JkSGFuZGxlKHF1ZXJ5Lmdl
dENvbHVtbkludDY0KDApKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKK2Jvb2wgSURCU1FMaXRl
QmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smIGNhbGxi
YWNrKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIGlkLCB2YWx1
ZSBGUk9NIE9iamVjdFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIpOwogICAgIGlm
IChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCkBAIC01MTUsMTQgKzUyMCwxNSBAQCBi
b29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZQogICAgIHdoaWxlIChxdWVyeS5zdGVwKCkgPT0gU1FMUmVz
dWx0Um93KSB7CiAgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQgPSBxdWVyeS5nZXRD
b2x1bW5JbnQ2NCgwKTsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnkuZ2V0Q29sdW1uQmxv
YkFzU3RyaW5nKDEpOwotICAgICAgICBpZiAoIWNhbGxiYWNrLmNhbGxiYWNrKG9iamVjdFN0b3Jl
RGF0YUlkLCB2YWx1ZSkpCisgICAgICAgIFJlZlB0cjxTUUxpdGVSZWNvcmRIYW5kbGU+IHJlY29y
ZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBTUUxpdGVSZWNvcmRIYW5kbGUob2JqZWN0U3RvcmVEYXRh
SWQpKTsKKyAgICAgICAgaWYgKCFjYWxsYmFjay5jYWxsYmFjaygqcmVjb3JkSGFuZGxlLCB2YWx1
ZSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7
CiB9CiAKLXZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZv
dW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZv
dW5kVW5pcXVlRmxhZ3MpCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+
JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpCiB7CiAgICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJTRUxFQ1QgaWQsIG5hbWUsIGtleVBhdGgsIGlzVW5p
cXVlIEZST00gSW5kZXhlcyBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIpOwogICAgIGJvb2wgb2sg
PSBxdWVyeS5wcmVwYXJlKCkgPT0gU1FMUmVzdWx0T2s7CkBAIC01NDMsNyArNTQ5LDcgQEAgdm9p
ZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBWZWN0b3I8aW50NjRfdD4mIGYKICAgICB9CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0
b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElk
KQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCkKIHsKICAgICBT
UUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIklOU0VSVCBJTlRPIEluZGV4ZXMgKG9iamVjdFN0
b3JlSWQsIG5hbWUsIGtleVBhdGgsIGlzVW5pcXVlKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAg
ICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKQEAgLTU2MSwzNiArNTY3LDQx
IEBAIGJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQg
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2NF90IGluZGV4SWQpCit2b2lk
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKIHsKICAgICBkb0RlbGV0ZSht
X2RiLCAiREVMRVRFIEZST00gSW5kZXhlcyBXSEVSRSBpZCA9ID8iLCBpbmRleElkKTsKICAgICBk
b0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIGluZGV4SWQgPSA/Iiwg
aW5kZXhJZCk7CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFG
b3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgaW50NjRfdCBvYmpl
Y3RTdG9yZURhdGFJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFG
b3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFu
ZGxlJiByZWNvcmRIYW5kbGUpCiB7CisgICAgY29uc3QgU1FMaXRlUmVjb3JkSGFuZGxlJiBzcWxp
dGVSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxjb25zdCBTUUxpdGVSZWNvcmRIYW5kbGUmPihy
ZWNvcmRIYW5kbGUpOworCiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQg
SU5UTyBJbmRleERhdGEgKGtleVN0cmluZywga2V5RGF0ZSwga2V5TnVtYmVyLCBpbmRleElkLCBv
YmplY3RTdG9yZURhdGFJZCkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSIpOwogICAgIGlmIChxdWVy
eS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAg
IGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKHF1ZXJ5LCAxLCBrZXkpOwogICAgIHF1ZXJ5LmJpbmRJ
bnQ2NCg0LCBpbmRleElkKTsKLSAgICBxdWVyeS5iaW5kSW50NjQoNSwgb2JqZWN0U3RvcmVEYXRh
SWQpOworICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCBzcWxpdGVSZWNvcmRIYW5kbGUuaWQoKSk7CiAK
ICAgICByZXR1cm4gcXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7CiB9CiAKLWJvb2wgSURC
U1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBvYmpl
Y3RTdG9yZURhdGFJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERh
dGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRs
ZSkKIHsKLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4
RGF0YSBXSEVSRSBvYmplY3RTdG9yZURhdGFJZCA9ID8iKTsKKyAgICBjb25zdCBTUUxpdGVSZWNv
cmRIYW5kbGUmIHNxbGl0ZVJlY29yZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IFNRTGl0ZVJl
Y29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnko
bV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBvYmplY3RTdG9yZURhdGFJZCA9ID8g
QU5EIGluZGV4SWQgPSA/Iik7CiAgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRP
aykKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcXVlcnkuYmluZEludDY0KDEsIG9iamVj
dFN0b3JlRGF0YUlkKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoMSwgc3FsaXRlUmVjb3JkSGFuZGxl
LmlkKCkpOworICAgIHF1ZXJ5LmJpbmRJbnQ2NCgyLCBpbmRleElkKTsKICAgICByZXR1cm4gcXVl
cnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7CiB9CiAKLVN0cmluZyBJREJTUUxpdGVCYWNraW5n
U3RvcmU6OmdldE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBr
ZXkpCitTdHJpbmcgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmIGtleSkKIHsKICAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxFQ1QgIikK
ICAgICAgICAgICAgICAgICAgKyAiT2JqZWN0U3RvcmVEYXRhLnZhbHVlICIKQEAgLTYyOSw3ICs2
NDAsNyBAQCBzdGF0aWMgUGFzc1JlZlB0cjxJREJLZXk+IGtleUZyb21RdWVyeShTUUxpdGVTdGF0
ZW1lbnQmIHF1ZXJ5LCBpbnQgYmFzZUNvbHVtbikKICAgICByZXR1cm4gSURCS2V5OjpjcmVhdGVO
dWxsKCk7CiB9CiAKLVBhc3NSZWZQdHI8SURCS2V5PiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Omdl
dFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQor
UGFzc1JlZlB0cjxJREJLZXk+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZp
YUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmco
IlNFTEVDVCAiKQogICAgICAgICAgICAgICAgICArICJPYmplY3RTdG9yZURhdGEua2V5U3RyaW5n
LCBPYmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtleU51bWJlciAiCkBA
IC02NTEsNyArNjYyLDcgQEAgUGFzc1JlZlB0cjxJREJLZXk+IElEQlNRTGl0ZUJhY2tpbmdTdG9y
ZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwKICAgICByZXR1cm4gZm91
bmRLZXkucmVsZWFzZSgpOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhp
c3RzSW5JbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQorYm9vbCBJREJT
UUxpdGVCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkp
CiB7CiAgICAgU3RyaW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIGlkIEZST00gSW5kZXhEYXRhIFdI
RVJFIGluZGV4SWQgPSA/IEFORCAiKSArIHdoZXJlU3ludGF4Rm9yS2V5KGtleSk7CiAgICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsIHNxbCk7CkBAIC02ODIsNyArNjkzLDcgQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0dXJuIG1fY3VycmVu
dEtleTsgfQogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJl
dHVybiBtX2N1cnJlbnRLZXk7IH0KICAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpID0gMDsKLSAg
ICB2aXJ0dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSA9IDA7CisgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVj
dFN0b3JlUmVjb3JkSGFuZGxlKCkgPSAwOwogICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJ
ZCgpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpID0gMDsKQEAgLTc0
MSw3ICs3NTIsNyBAQCBwdWJsaWM6CiAKICAgICAvLyBDdXJzb3JJbXBsQ29tbW9uLgogICAgIHZp
cnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KLSAgICB2aXJ0
dWFsIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQor
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3Jk
SGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBT
UUxpdGVSZWNvcmRIYW5kbGUobV9jdXJyZW50SWQpKTsgfQogICAgIHZpcnR1YWwgaW50NjRfdCBp
bmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CiAgICAgdmly
dHVhbCB2b2lkIGxvYWRDdXJyZW50Um93KCk7CiAgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dF
eGlzdHMoKTsKQEAgLTc3OSw3ICs3OTAsNyBAQCBwdWJsaWM6CiAgICAgLy8gQ3Vyc29ySW1wbENv
bW1vbgogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVy
biBtX2N1cnJlbnRQcmltYXJ5S2V5OyB9CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGludDY0
X3Qgb2JqZWN0U3RvcmVEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsg
fQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyByZXR1
cm4gbV9jdXJyZW50SWQ7IH0KICAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKTsKICAg
ICB2aXJ0dWFsIGJvb2wgY3VycmVudFJvd0V4aXN0cygpOwpAQCAtODE3LDcgKzgyOCw3IEBAIHB1
YmxpYzoKICAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPElE
QktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVudFByaW1hcnlLZXk7IH0KICAgICB2
aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fY3VycmVudFZhbHVlOyB9Ci0gICAgdmly
dHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
cmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmpl
Y3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJ
ZCgpIHsgcmV0dXJuIG1fY3VycmVudElkOyB9CiAgICAgdmlydHVhbCB2b2lkIGxvYWRDdXJyZW50
Um93KCk7CiAgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKQEAgLTg0OSw3ICs4
NjAsNyBAQCBib29sIEluZGV4Q3Vyc29ySW1wbDo6Y3VycmVudFJvd0V4aXN0cygpCiAKIH0gLy8g
bmFtZXNwYWNlCiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rp
b24pCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5n
U3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVj
dGlvbiBkaXJlY3Rpb24pCiB7CiAgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2Ut
Pmxvd2VyKCk7CiAgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7
CkBAIC04ODYsNyArODk3LDcgQEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
SURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IKICAgICByZXR1cm4g
Y3Vyc29yLnJlbGVhc2UoKTsKIH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVj
dGlvbikKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tp
bmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwg
SURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQogewogICAgIFN0cmluZyBzcWwgPSBTdHJp
bmcoIlNFTEVDVCBJbmRleERhdGEuaWQsIEluZGV4RGF0YS5rZXlTdHJpbmcsIEluZGV4RGF0YS5r
ZXlEYXRlLCBJbmRleERhdGEua2V5TnVtYmVyLCAiKQogICAgICAgICAgICAgICAgICArICgiT2Jq
ZWN0U3RvcmVEYXRhLmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtleURhdGUsIE9iamVjdFN0
b3JlRGF0YS5rZXlOdW1iZXIgIikKQEAgLTkyNiw3ICs5MzcsNyBAQCBQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1
cnNvcihpbgogICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOwogfQogCi1QYXNzUmVmUHRyPElE
QkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1
cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29y
OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAgICAgU3Ry
aW5nIHNxbCA9IFN0cmluZygiU0VMRUNUIEluZGV4RGF0YS5pZCwgSW5kZXhEYXRhLmtleVN0cmlu
ZywgSW5kZXhEYXRhLmtleURhdGUsIEluZGV4RGF0YS5rZXlOdW1iZXIsICIpCiAgICAgICAgICAg
ICAgICAgICsgKCJPYmplY3RTdG9yZURhdGEudmFsdWUsIE9iamVjdFN0b3JlRGF0YS5rZXlTdHJp
bmcsIE9iamVjdFN0b3JlRGF0YS5rZXlEYXRlLCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9y
ZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaAppbmRl
eCBmZTBjNmMxNzUxNmRlOWU0MGZhOTc4N2IxY2U1ZjBlNjMyMGI1OWI3Li4wNjU0ODk1N2FkY2U2
NWJlZmQwOTc1NjY2MzE5NTUwMGYxM2FlZWIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKQEAgLTQxLDI5ICs0MSwyOSBAQCBwdWJsaWM6CiAg
ICAgdmlydHVhbCBib29sIHNldElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJ
ZCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZ2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJ
ZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMs
IFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0lu
Y3JlbWVudEZsYWdzKTsKLSAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2JqZWN0U3RvcmUoY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwg
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpOwotICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwot
ICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgSURCS2V5Jik7Ci0gICAgdmlydHVhbCBib29sIHB1dE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgaW50NjRfdCYgcm93SWQsIGJvb2wgaW52YWxpZFJvd0lkKTsKLSAgICB2aXJ0dWFsIHZv
aWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAgIHZpcnR1YWwg
dm9pZCBkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIHZpcnR1YWwgZG91YmxlIG5leHRBdXRvSW5jcmVt
ZW50TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7Ci0gICAgdmlydHVhbCBib29sIGtleUV4
aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBp
bnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKTsKLQotICAgIHZpcnR1YWwgYm9vbCBmb3JF
YWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJl
Y29yZENhbGxiYWNrJik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBm
b3VuZFVuaXF1ZUZsYWdzKTsKLSAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlSW5kZXgoaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwg
Ym9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCk7Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0
ZUluZGV4KGludDY0X3QgaW5kZXhJZCk7Ci0gICAgdmlydHVhbCBib29sIHB1dEluZGV4RGF0YUZv
clJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGludDY0X3Qgb2JqZWN0U3Rv
cmVEYXRhSWQpOwotICAgIHZpcnR1YWwgYm9vbCBkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZURhdGFJZCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0Vmlh
SW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKLSAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmKTsKLSAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IElEQktleSYpOwotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4g
b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5
UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1
cnNvcj4gb3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFu
Z2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNv
cj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJ
REJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZU9iamVjdFN0b3Jl
KGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtl
eVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlk
KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgU3RyaW5nIGdldE9iamVjdFN0
b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0
IFN0cmluZyYgdmFsdWUsIFJlZlB0cjxPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4mKTsKKyAgICB2
aXJ0dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RT
dG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZpcnR1YWwgZG91YmxlIG5leHRBdXRvSW5jcmVtZW50
TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2
aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgUmVmUHRyPE9iamVjdFN0b3JlUmVj
b3JkSGFuZGxlPiYgZm91bmRSZWNvcmRIYW5kbGUpOworCisgICAgdmlydHVhbCBib29sIGZvckVh
Y2hPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpOworCisgICAgdmlydHVhbCB2b2lkIGdl
dEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3Rv
cjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKTsK
KyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
LCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRleElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVs
ZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCk7CisgICAgdmlydHVhbCBib29sIHB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBj
b25zdCBJREJLZXkmLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZpcnR1
YWwgYm9vbCBkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5
VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0lu
SW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5Jik7CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29y
PiBvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8Q3Vyc29yPiBvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJz
b3I6OkRpcmVjdGlvbik7CiAKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNy
ZWF0ZVRyYW5zYWN0aW9uKCk7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXggMmIwZTEz
Y2ZmMjE5MjM0MGIxNWEwZDE0ZmYxMDA5NjUxZTZiODY5Ni4uNGQ2NmFjNGRhZGNlNjg5MTM0Mjdm
MzY2YWQxMjc3MTBkZjQ2NTJlOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyAr
MSwxNCBAQAorMjAxMS0wMy0zMSAgSGFucyBXZW5uYm9yZyAgPGhhbnNAY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIExldmVsREIg
YmFja2VuZCBmb3IgSW5kZXhlZERCCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01NzM3MgorCisgICAgICAgICogZmVhdHVyZXMuZ3lwaToKKyAgICAgICAg
KiBwdWJsaWMvV2ViSURCRmFjdG9yeS5oOgorICAgICAgICAoV2ViS2l0OjpXZWJJREJGYWN0b3J5
OjpvcGVuKToKKwogMjAxMS0wMy0zMCAgRGF2aWQgTGV2aW4gIDxsZXZpbkBjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRG1pdHJ5IFRpdG92LgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBpIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9m
ZWF0dXJlcy5neXBpCmluZGV4IDczNTRlYjhlOGMxOTljNDg4NmRjYjI3YmFkMDUwYjg5NGQwNWZh
MzQuLjAwNjE1YjQzN2E4ZDdiZDAzMTIxOWYyMzRkOGZkOTllZTQzYjQ0ODQgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQorKysgYi9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgICAgJ0VOQUJM
RV9JTlBVVF9TUEVFQ0g9MScsCiAgICAgICAgICdFTkFCTEVfSkFWQVNDUklQVF9ERUJVR0dFUj0x
JywKICAgICAgICAgJ0VOQUJMRV9KU0NfTVVMVElQTEVfVEhSRUFEUz0wJywKKyAgICAgICAgJ0VO
QUJMRV9MRVZFTERCPTAnLAogICAgICAgICAnRU5BQkxFX0xJTktfUFJFRkVUQ0g9MScsCiAgICAg
ICAgICdFTkFCTEVfTUFUSE1MPTAnLAogICAgICAgICAnRU5BQkxFX01FRElBX1NUQVRJU1RJQ1M9
MScsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJGYWN0
b3J5LmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJGYWN0b3J5LmgKaW5k
ZXggMjk0MTRlODA1ZGFhYzdmMzc1OWNmYWE3YzgzY2JlNWY5MzIwY2EwMC4uNzFiMjk0MTgzZjEz
NTllYzc1NzY5NzFiNWMyNTY1ZmE0YzczNGNmNSAxMDA3NTUKLS0tIGEvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9wdWJsaWMvV2ViSURCRmFjdG9yeS5oCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21p
dW0vcHVibGljL1dlYklEQkZhY3RvcnkuaApAQCAtNTcsMTEgKzU3LDcgQEAgcHVibGljOgogICAg
IH07CiAKICAgICAvLyBUaGUgV2ViS2l0IGltcGxlbWVudGF0aW9uIG9mIG9wZW4gaWdub3JlcyB0
aGUgV2ViRnJhbWUqIHBhcmFtZXRlci4KLSAgICAvLyBGSVhNRTogQXNzZXJ0IG5vdCByZWFjaGVk
IHdoZW4gQ2hyb21pdW0gc2lkZSBpcyB1cGRhdGVkLgotICAgIHZpcnR1YWwgdm9pZCBvcGVuKGNv
bnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJhY2tzKiBjYWxsYmFja3MsIGNvbnN0IFdl
YlNlY3VyaXR5T3JpZ2luJiBvcmlnaW4sIFdlYkZyYW1lKiBmcmFtZSwgY29uc3QgV2ViU3RyaW5n
JiBkYXRhRGlyLCB1bnNpZ25lZCBsb25nIGxvbmcgbWF4aW11bVNpemUsIEJhY2tpbmdTdG9yZVR5
cGUpIHsgb3BlbihuYW1lLCBjYWxsYmFja3MsIG9yaWdpbiwgZnJhbWUsIGRhdGFEaXIsIG1heGlt
dW1TaXplKTsgfQotCi0gICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHdoZW4gQ2hyb21pdW0gc2lk
ZSBpcyB1cGRhdGVkLgotICAgIHZpcnR1YWwgdm9pZCBvcGVuKGNvbnN0IFdlYlN0cmluZyYgbmFt
ZSwgV2ViSURCQ2FsbGJhY2tzKiBjYWxsYmFja3MsIGNvbnN0IFdlYlNlY3VyaXR5T3JpZ2luJiBv
cmlnaW4sIFdlYkZyYW1lKiBmcmFtZSwgY29uc3QgV2ViU3RyaW5nJiBkYXRhRGlyLCB1bnNpZ25l
ZCBsb25nIGxvbmcgbWF4aW11bVNpemUpIHsgb3BlbihuYW1lLCBjYWxsYmFja3MsIG9yaWdpbiwg
ZnJhbWUsIGRhdGFEaXIsIG1heGltdW1TaXplLCBEZWZhdWx0QmFja2luZ1N0b3JlKTsgfQorICAg
IHZpcnR1YWwgdm9pZCBvcGVuKGNvbnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJhY2tz
KiwgY29uc3QgV2ViU2VjdXJpdHlPcmlnaW4mLCBXZWJGcmFtZSosIGNvbnN0IFdlYlN0cmluZyYg
ZGF0YURpciwgdW5zaWduZWQgbG9uZyBsb25nIG1heGltdW1TaXplLCBCYWNraW5nU3RvcmVUeXBl
KSB7IFdFQktJVF9BU1NFUlRfTk9UX1JFQUNIRUQoKTsgfQogCiAgICAgdmlydHVhbCB2b2lkIGRl
bGV0ZURhdGFiYXNlKGNvbnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJhY2tzKiwgY29u
c3QgV2ViU2VjdXJpdHlPcmlnaW4mLCBXZWJGcmFtZSosIGNvbnN0IFdlYlN0cmluZyYgZGF0YURp
cikgeyBXRUJLSVRfQVNTRVJUX05PVF9SRUFDSEVEKCk7IH0KIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87877</attachid>
            <date>2011-04-01 10:15:47 -0700</date>
            <delta_ts>2011-04-12 08:35:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110401181545.patch</filename>
            <type>text/plain</type>
            <size>153664</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAzNDhmZjkzMDIwYjM5ZTU2MWY5NGFlMDFhMTA5ZjhhMTcyNTI2ZTY4Li5j
YjA5ZmZiZWMyYzFjNDAyMTYxZDk3ZGNmMGQ1OTk5ZmJmZDEyYTUyIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTg0IEBACisyMDExLTA0LTAxICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEp
CisKKyAgICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3Jl
Lmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaDoKKyAgICAgICAgKFdl
YkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU6On5PYmplY3RT
dG9yZVJlY29yZEhhbmRsZSk6CisgICAgICAgICogc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0
ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZEltcGw6
OmNyZWF0ZU9iamVjdFN0b3JlSW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJh
c2VCYWNrZW5kSW1wbDo6ZGVsZXRlT2JqZWN0U3RvcmVJbnRlcm5hbCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpsb2FkT2JqZWN0U3RvcmVzKToKKyAgICAgICAg
KiBzdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
REJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4pOgorICAgICAgICAqIHN0b3JhZ2UvSURCSW5kZXhC
YWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJbXBsOjpJ
REJJbmRleEJhY2tlbmRJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZElt
cGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tl
bmRJbXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJJbmRleEJhY2tlbmRJ
bXBsOjphZGRpbmdLZXlBbGxvd2VkKToKKyAgICAgICAgKiBzdG9yYWdlL0lEQkluZGV4QmFja2Vu
ZEltcGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkluZGV4QmFja2VuZEltcGw6OmNyZWF0ZSk6
CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJM
ZXZlbERCQmFja2luZ1N0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnByaW50U3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRl
Y29kZVZhckludCk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVTdHJpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dp
dGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nV2l0aExlbik6CisgICAgICAg
IChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91Ymxl
KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNv
ZGVLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y291bnROb25aZXJvQnl0ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6bWFrZUtleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVQcmVmaXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0SW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEludCk6CisgICAg
ICAgIChXZWJDb3JlOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToK
KyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUJ5dGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpEYXRhYmFzZUZyZWVMaXN0S2V5OjpEYXRhYmFzZUZyZWVMaXN0S2V5KToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6Y29tcGFyZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmZpcnN0
S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6
bGFzdEtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFtZUtleTo6
RGF0YWJhc2VOYW1lS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VO
YW1lS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5h
bWVLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFt
ZUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2Vi
Q29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpjb21wYXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6SW5kZXhNZXRh
RGF0YUtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6
OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6
OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6
OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZUZyZWVM
aXN0S2V5OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmZpcnN0S2V5
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6
bGFzdEtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6
OkluZGV4RnJlZUxpc3RLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZy
ZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZy
ZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZy
ZWVMaXN0S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVOYW1lc0tleTo6T2JqZWN0U3RvcmVOYW1lc0tleSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmNvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE5hbWVzS2V5OjpJbmRleE5hbWVzS2V5KToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tleTo6ZW5jb2RlKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6T2JqZWN0U3RvcmVEYXRhS2V5KToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6Y29t
cGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5OjpFeGlz
dHNFbnRyeUtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5
OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50cnlLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OkluZGV4
RGF0YUtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6ZGVj
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjplbmNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmNvbXBhcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6WENvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlSW5kZXhLZXlzKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6UmVhbENvbXBhcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpOYW1lKToKKyAgICAgICAgKFdlYkNv
cmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6RmluZFNob3J0ZXN0U2VwYXJhdG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6RmluZFNob3J0U3VjY2Vzc29yKToK
KyAgICAgICAgKFdlYkNvcmU6OnNldFVwTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpnZXROZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6
OmdldE5ld09iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVsZXRlUmFu
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2Jq
ZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJl
cik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RT
dG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
bGVhck9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3Jl
UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldElu
ZGV4ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQpOgorICAg
ICAgICAoV2ViQ29yZTo6ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4pOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFZpYUluZGV4
KToKKyAgICAgICAgKFdlYkNvcmU6OnZlcnNpb25FeGlzdHMpOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6ZmluZExhc3RJbmRleEtleUVxdWFsVG8pOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcik6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJz
b3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJh
bnNhY3Rpb24pOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsOjpnZXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsOjpwdXRJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsOjpkZWxldGVJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RT
dG9yZUJhY2tlbmRJbXBsOjpjbGVhckludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OnBvcHVs
YXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6
Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bDo6Y3JlYXRlSW5kZXhJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsOjpkZWxldGVJbmRleEludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw6Om9wZW5DdXJzb3JJbnRlcm5hbCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpsb2FkSW5kZXhlcyk6CisgICAgICAg
IChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpnZW5BdXRvSW5jcmVtZW50S2V5
KToKKyAgICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpkYXRhYmFzZUlkKToKKyAgICAg
ICAgKiBzdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FM
aXRlQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3Rv
cmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmpl
Y3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6
Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAgICAgICAgKFdl
YkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9y
UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2Jq
ZWN0VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2luZ1N0b3JlOjpn
ZXRQcmltYXJ5S2V5VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRlQmFja2lu
Z1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKToKKyAgICAgICAgKiBz
dG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oOgorCiAyMDExLTAzLTMxICBZdXJ5IFNlbWlr
aGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVs
IEZlbGRtYW4uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3Jl
Lmd5cCBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDU5M2I2
MjBmYjg4ZTU5ZDQ3ZjMwY2JkMDA4NDYyZmY3ZDM5MWE0Y2YuLjk5NjFlY2I5MTIzMmQ2YWY3NjQx
OGRmYTY3NWYxNGE2OWM0NTAzNDEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwL1dlYkNvcmUuZ3lwCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUu
Z3lwCkBAIC0xMTgzLDYgKzExODMsMTQgQEAKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgfSwK
ICAgICAgICAgfV0sCisgICAgICAgIFsnIkVOQUJMRV9MRVZFTERCPTEiIGluIGZlYXR1cmVfZGVm
aW5lcycsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoY2hy
b21pdW1fc3JjX2RpcikvdGhpcmRfcGFydHkvbGV2ZWxkYi9sZXZlbGRiLmd5cDpsZXZlbGRiJywK
KyAgICAgICAgICBdLAorICAgICAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWwor
ICAgICAgICAgICAgJzwoY2hyb21pdW1fc3JjX2RpcikvdGhpcmRfcGFydHkvbGV2ZWxkYi9sZXZl
bGRiLmd5cDpsZXZlbGRiJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAg
ICAgfSwKICAgICB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggZWYwNzFkYzdkODNmNWZiOTYwZjNjYTU1
NjcyNWFiYzI4Y2U4MjcwNy4uYmI2NGU0YWNkMWI5MjMxMWIzN2Y3YzY4YjVjZGMwYzc4ZmRkYjdi
NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtNTQ0OCw2ICs1NDQ4LDggQEAKICAgICAgICAgICAgICdz
dG9yYWdlL0lEQktleVBhdGhCYWNrZW5kSW1wbC5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lE
QktleVJhbmdlLmNwcCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlSYW5nZS5oJywKKyAg
ICAgICAgICAgICdzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwJywKKyAgICAgICAg
ICAgICdzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaCcsCiAgICAgICAgICAgICAnc3Rv
cmFnZS9JREJPYmplY3RTdG9yZS5jcHAnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCT2JqZWN0
U3RvcmUuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
LmNwcCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkJhY2tpbmdTdG9y
ZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJCYWNraW5nU3RvcmUuaAppbmRleCAyOTUy
M2EyZmI1Yzk2YjcxN2UzNDQ2NTY4MDI4YzY4ZDY1OTMxZTQwLi4xMGZjZjg1MTk2YTkwNTZlYTJh
ZmM5NzZhMjAyZGExZTg5MThjNzY4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCQmFja2lu
Z1N0b3JlLmgKQEAgLTUwLDMwICs1MCwzNSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIHNl
dElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZl
cnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkgPSAwOwogCiAgICAgdmly
dHVhbCB2b2lkIGdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2
NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5n
PiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykg
PSAwOwotICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVPYmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkgPSAwOwotICAgIHZpcnR1
YWwgdm9pZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKLSAg
ICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleSYpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgcHV0T2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcm
IHZhbHVlLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpID0gMDsKLSAgICB2aXJ0
dWFsIHZvaWQgY2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQpID0gMDsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKSA9IDA7Ci0gICAgdmlydHVhbCBkb3VibGUg
bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7Ci0gICAg
dmlydHVhbCBib29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmLCBpbnQ2NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKSA9IDA7Cisg
ICAgdmlydHVhbCBib29sIGNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVu
dCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lk
IGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkKSA9IDA7CisKKyAgICBjbGFzcyBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSA6IHB1YmxpYyBS
ZWZDb3VudGVkPElEQkJhY2tpbmdTdG9yZT4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVh
bCB+T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7fSAKKyAgICB9OworICAgIHZpcnR1YWwgU3Ry
aW5nIGdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVhbCBib29sIHB1dE9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNv
cmRIYW5kbGU+JikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBjbGVhck9iamVjdFN0b3JlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIGRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpID0gMDsKKyAgICB2
aXJ0dWFsIGRvdWJsZSBuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJ
bk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiBmb3VuZFJlY29y
ZEhhbmRsZSkgPSAwOwogCiAgICAgY2xhc3MgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayB7CiAg
ICAgcHVibGljOgotICAgICAgICAgdmlydHVhbCBib29sIGNhbGxiYWNrKGludDY0X3Qgb2JqZWN0
U3RvcmVEYXRhSWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpID0gMDsKKyAgICAgICAgIHZpcnR1YWwg
Ym9vbCBjYWxsYmFjayhjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYsIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpID0gMDsKICAgICAgICAgIHZpcnR1YWwgfk9iamVjdFN0b3JlUmVjb3JkQ2FsbGJh
Y2soKSB7fTsKICAgICB9OwotICAgIHZpcnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNv
cmQoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJikgPSAw
OworICAgIHZpcnR1YWwgYm9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2sm
KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVz
LCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1
ZUZsYWdzKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4KGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wg
aXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRl
SW5kZXgoaW50NjRfdCBpbmRleElkKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIHB1dEluZGV4RGF0
YUZvclJlY29yZChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGludDY0X3Qgb2JqZWN0
U3RvcmVEYXRhSWQpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9yUmVj
b3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpID0gMDsKLSAgICB2aXJ0dWFsIFN0cmluZyBn
ZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpID0gMDsKLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGtleUV4aXN0
c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKSA9IDA7CisgICAgdmlydHVh
bCB2b2lkIGdldEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVz
LCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1
ZUZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCkgPSAwOworICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKSA9IDA7CisgICAgdmlydHVhbCBib29sIHB1dElu
ZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmLCBjb25zdCBPYmplY3RTdG9yZVJlY29y
ZEhhbmRsZSYpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJikgPSAwOworICAgIHZpcnR1YWwgU3Ry
aW5nIGdldE9iamVjdFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpID0gMDsKKyAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8SURCS2V5PiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5
JikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJh
c2VpZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYpID0gMDsKIAogICAgIGNsYXNzIEN1cnNvciA6IHB1YmxpYyBSZWZDb3VudGVkPEN1cnNvcj4g
ewogICAgIHB1YmxpYzoKQEAgLTgxLDE0ICs4NiwxNCBAQCBwdWJsaWM6CiAgICAgICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpID0gMDsKICAgICAgICAgdmlydHVhbCBQYXNzUmVm
UHRyPElEQktleT4gcHJpbWFyeUtleSgpID0gMDsKICAgICAgICAgdmlydHVhbCBTdHJpbmcgdmFs
dWUoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpID0g
MDsKKyAgICAgICAgdmlydHVhbCBQYXNzUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiBv
YmplY3RTdG9yZVJlY29yZEhhbmRsZSgpID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGlu
ZGV4RGF0YUlkKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIH5DdXJzb3IoKSB7fTsKICAgICB9Owog
Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3JlQ3Vyc29yKGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVj
dGlvbikgPSAwOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1
cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24pID0gMDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhDdXJz
b3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0
aW9uKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3Jl
Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJ
REJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBQYXNz
UmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwg
SURCQ3Vyc29yOjpEaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29y
PiBvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVj
dGlvbikgPSAwOwogCiAgICAgY2xhc3MgVHJhbnNhY3Rpb24gOiBwdWJsaWMgUmVmQ291bnRlZDxU
cmFuc2FjdGlvbj4gewogICAgIHB1YmxpYzoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCRGF0YWJhc2VCYWNrZW5kSW1wbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkRhdGFiYXNlQmFja2VuZEltcGwuY3BwCmluZGV4IDk0ZTMwNWIxYmMwMzI5MGFhYzI3MDVl
ZWUwNDNjMTkzMTFjNzllZTIuLmYxOGY2OGZmZWYxMzQ5ZjhhYWM5ZmIzMzY1Mjk3N2E2NmM4N2I3
MjMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRGF0YWJhc2VCYWNrZW5k
SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmNwcApAQCAtOTcsNyArOTcsNyBAQCBQYXNzUmVmUHRyPERPTVN0cmluZ0xpc3Q+IElEQkRh
dGFiYXNlQmFja2VuZEltcGw6Om9iamVjdFN0b3JlTmFtZXMoKSBjb25zdAogICAgIHJldHVybiBv
YmplY3RTdG9yZU5hbWVzLnJlbGVhc2UoKTsKIH0KIAotUGFzc1JlZlB0cjxJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbnRlcmZhY2U+ICBJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpjcmVhdGVPYmplY3RT
dG9yZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRv
SW5jcmVtZW50LCBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UqIHRyYW5zYWN0aW9uUHRy
LCBFeGNlcHRpb25Db2RlJiBlYykKK1Bhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW50
ZXJmYWNlPiBJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpjcmVhdGVPYmplY3RTdG9yZShjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50LCBJ
REJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UqIHRyYW5zYWN0aW9uUHRyLCBFeGNlcHRpb25D
b2RlJiBlYykKIHsKICAgICBBU1NFUlQodHJhbnNhY3Rpb25QdHItPm1vZGUoKSA9PSBJREJUcmFu
c2FjdGlvbjo6VkVSU0lPTl9DSEFOR0UpOwogCkBAIC0xMDYsNyArMTA2LDcgQEAgUGFzc1JlZlB0
cjxJREJPYmplY3RTdG9yZUJhY2tlbmRJbnRlcmZhY2U+ICBJREJEYXRhYmFzZUJhY2tlbmRJbXBs
OjpjcmVhdGVPYmplY3QKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgUmVmUHRyPElE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlID0gSURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBuYW1lLCBrZXlQYXRoLCBhdXRv
SW5jcmVtZW50KTsKKyAgICBSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0
U3RvcmUgPSBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGUobV9iYWNraW5nU3RvcmUu
Z2V0KCksIG1faWQsIG5hbWUsIGtleVBhdGgsIGF1dG9JbmNyZW1lbnQpOwogICAgIEFTU0VSVChv
YmplY3RTdG9yZS0+bmFtZSgpID09IG5hbWUpOwogCiAgICAgUmVmUHRyPElEQkRhdGFiYXNlQmFj
a2VuZEltcGw+IGRhdGFiYXNlID0gdGhpczsKQEAgLTEyNSw3ICsxMjUsNyBAQCB2b2lkIElEQkRh
dGFiYXNlQmFja2VuZEltcGw6OmNyZWF0ZU9iamVjdFN0b3JlSW50ZXJuYWwoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosCiB7CiAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkOwogCi0gICAgaWYgKCFk
YXRhYmFzZS0+bV9iYWNraW5nU3RvcmUtPmNyZWF0ZU9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5u
YW1lKCksIG9iamVjdFN0b3JlLT5rZXlQYXRoKCksIG9iamVjdFN0b3JlLT5hdXRvSW5jcmVtZW50
KCksIGRhdGFiYXNlLT5pZCgpLCBvYmplY3RTdG9yZUlkKSkgeworICAgIGlmICghZGF0YWJhc2Ut
Pm1fYmFja2luZ1N0b3JlLT5jcmVhdGVPYmplY3RTdG9yZShkYXRhYmFzZS0+aWQoKSwgb2JqZWN0
U3RvcmUtPm5hbWUoKSwgb2JqZWN0U3RvcmUtPmtleVBhdGgoKSwgb2JqZWN0U3RvcmUtPmF1dG9J
bmNyZW1lbnQoKSwgb2JqZWN0U3RvcmVJZCkpIHsKICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0
KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTgsNyArMTU4LDcgQEAgdm9pZCBJREJE
YXRhYmFzZUJhY2tlbmRJbXBsOjpkZWxldGVPYmplY3RTdG9yZShjb25zdCBTdHJpbmcmIG5hbWUs
IElEQlRyYW5zYWN0aW8KIAogdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpkZWxldGVPYmpl
Y3RTdG9yZUludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQkRh
dGFiYXNlQmFja2VuZEltcGw+IGRhdGFiYXNlLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0b3JlQmFj
a2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZElu
dGVyZmFjZT4gdHJhbnNhY3Rpb24pCiB7Ci0gICAgZGF0YWJhc2UtPm1fYmFja2luZ1N0b3JlLT5k
ZWxldGVPYmplY3RTdG9yZShvYmplY3RTdG9yZS0+aWQoKSk7CisgICAgZGF0YWJhc2UtPm1fYmFj
a2luZ1N0b3JlLT5kZWxldGVPYmplY3RTdG9yZShkYXRhYmFzZS0+aWQoKSwgb2JqZWN0U3RvcmUt
PmlkKCkpOwogICAgIHRyYW5zYWN0aW9uLT5kaWRDb21wbGV0ZVRhc2tFdmVudHMoKTsKIH0KIApA
QCAtMjUwLDcgKzI1MCw3IEBAIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kSW1wbDo6bG9hZE9iamVj
dFN0b3JlcygpCiAgICAgQVNTRVJUKGF1dG9JbmNyZW1lbnRGbGFncy5zaXplKCkgPT0gaWRzLnNp
emUoKSk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkcy5zaXplKCk7IGkrKykKLSAg
ICAgICAgbV9vYmplY3RTdG9yZXMuc2V0KG5hbWVzW2ldLCBJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsOjpjcmVhdGUobV9iYWNraW5nU3RvcmUuZ2V0KCksIGlkc1tpXSwgbmFtZXNbaV0sIGtleVBh
dGhzW2ldLCBhdXRvSW5jcmVtZW50RmxhZ3NbaV0pKTsKKyAgICAgICAgbV9vYmplY3RTdG9yZXMu
c2V0KG5hbWVzW2ldLCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGUobV9iYWNraW5n
U3RvcmUuZ2V0KCksIG1faWQsIGlkc1tpXSwgbmFtZXNbaV0sIGtleVBhdGhzW2ldLCBhdXRvSW5j
cmVtZW50RmxhZ3NbaV0pKTsKIH0KIAogdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRJbXBsOjpyZW1v
dmVPYmplY3RTdG9yZUZyb21NYXAoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8
SURCRGF0YWJhc2VCYWNrZW5kSW1wbD4gZGF0YWJhc2UsIFBhc3NSZWZQdHI8SURCT2JqZWN0U3Rv
cmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKaW5kZXggNDYxZTkzMGJjMTc2MDRiOTM5NTUxZmZk
Y2JkYTQ1OGY0NzNjZmUxNy4uZTY3YmU0OTM1ZjM4MWQyZWRkYjE3YzkwZTIwOTNmMDRjYThlNjFj
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZElt
cGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBs
LmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIkRPTVN0cmluZ0xpc3QuaCIKICNpbmNs
dWRlICJJREJEYXRhYmFzZUJhY2tlbmRJbXBsLmgiCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VFeGNl
cHRpb24uaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQmFja2luZ1N0b3JlLmgiCiAjaW5jbHVkZSAi
SURCU1FMaXRlQmFja2luZ1N0b3JlLmgiCiAjaW5jbHVkZSAiSURCVHJhbnNhY3Rpb25Db29yZGlu
YXRvci5oIgogI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCkBAIC02OSw3ICs3MCw3IEBAIHZv
aWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpyZW1vdmVJREJCYWNraW5nU3RvcmUoY29uc3QgU3Ry
aW5nJiB1bmlxdWVJZGVudGlmaWVyCiAgICAgbV9iYWNraW5nU3RvcmVNYXAucmVtb3ZlKHVuaXF1
ZUlkZW50aWZpZXIpOwogfQogCi12b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25z
dCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NS
ZWZQdHI8U2VjdXJpdHlPcmlnaW4+IHNlY3VyaXR5T3JpZ2luLCBGcmFtZSosIGNvbnN0IFN0cmlu
ZyYgZGF0YURpciwgaW50NjRfdCBtYXhpbXVtU2l6ZSwgQmFja2luZ1N0b3JlVHlwZSkKK3ZvaWQg
SURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0
cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcywgUGFzc1JlZlB0cjxTZWN1cml0eU9yaWdpbj4gc2Vj
dXJpdHlPcmlnaW4sIEZyYW1lKiwgY29uc3QgU3RyaW5nJiBkYXRhRGlyLCBpbnQ2NF90IG1heGlt
dW1TaXplLCBCYWNraW5nU3RvcmVUeXBlIGJhY2tpbmdTdG9yZVR5cGUpCiB7CiAgICAgU3RyaW5n
IGZpbGVJZGVudGlmaWVyID0gc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpOwog
ICAgIFN0cmluZyB1bmlxdWVJZGVudGlmaWVyID0gZmlsZUlkZW50aWZpZXIgKyAiQCIgKyBuYW1l
OwpAQCAtODEsMTIgKzgyLDE5IEBAIHZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKGNv
bnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhCiAKICAgICAvLyBG
SVhNRTogRXZlcnl0aGluZyBmcm9tIG5vdyBvbiBzaG91bGQgYmUgZG9uZSBvbiBhbm90aGVyIHRo
cmVhZC4KIAorICAgIGJhY2tpbmdTdG9yZVR5cGUgPSBMZXZlbERCQmFja2luZ1N0b3JlOyAvLyBG
SVhNRTogRG9uJ3QgY29tbWl0IHRoaXMhIEl0IGp1c3QgaGVscHMgbWUgdGVzdCBMZXZlbERCIHdp
dGggRHVtcFJlbmRlclRyZWUuCisKICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBiYWNraW5n
U3RvcmU7CiAgICAgSURCQmFja2luZ1N0b3JlTWFwOjppdGVyYXRvciBpdDIgPSBtX2JhY2tpbmdT
dG9yZU1hcC5maW5kKGZpbGVJZGVudGlmaWVyKTsKICAgICBpZiAoaXQyICE9IG1fYmFja2luZ1N0
b3JlTWFwLmVuZCgpKQogICAgICAgICBiYWNraW5nU3RvcmUgPSBpdDItPnNlY29uZDsKICAgICBl
bHNlIHsKLSAgICAgICAgYmFja2luZ1N0b3JlID0gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVu
KHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgZmlsZUlkZW50aWZp
ZXIsIHRoaXMpOworICAgICAgICBpZiAoYmFja2luZ1N0b3JlVHlwZSA9PSBEZWZhdWx0QmFja2lu
Z1N0b3JlKQorICAgICAgICAgICAgYmFja2luZ1N0b3JlID0gSURCU1FMaXRlQmFja2luZ1N0b3Jl
OjpvcGVuKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgZmlsZUlk
ZW50aWZpZXIsIHRoaXMpOworI2lmIEVOQUJMRShMRVZFTERCKQorICAgICAgICBlbHNlIGlmIChi
YWNraW5nU3RvcmVUeXBlID09IExldmVsREJCYWNraW5nU3RvcmUpCisgICAgICAgICAgICBiYWNr
aW5nU3RvcmUgPSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuKHNlY3VyaXR5T3JpZ2luLmdl
dCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgZmlsZUlkZW50aWZpZXIsIHRoaXMpOworI2VuZGlm
CiAgICAgICAgIGlmICghYmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgICBjYWxsYmFja3MtPm9u
RXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVTktO
T1dOX0VSUiwgIkludGVybmFsIGVycm9yLiIpKTsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5kZXhCYWNrZW5kSW1wbC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkluZGV4QmFja2VuZEltcGwuY3BwCmluZGV4IDYyZTUz
NjRiZWY4MjJkYjk4Y2MwZGU1NTQwMDVlZTMzZDIwMWY1ZTQuLjA2Zjg1ODg0M2MyNTI1ODdmMzM2
ZWM5ZTk3MDkwZWIyZDIyNjM0NGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2Uv
SURCSW5kZXhCYWNrZW5kSW1wbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJJ
bmRleEJhY2tlbmRJbXBsLmNwcApAQCAtNDAsOCArNDAsMTAgQEAKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCi1JREJJbmRleEJhY2tlbmRJbXBsOjpJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tp
bmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVl
KQorSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1wbChJREJCYWNraW5nU3Rv
cmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsKiBvYmplY3RTdG9yZUJhY2tlbmQsIGludDY0X3QgaWQsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwg
Ym9vbCB1bmlxdWUpCiAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAgLCBt
X2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICAsIG1fb2JqZWN0U3RvcmVCYWNrZW5kKG9iamVj
dFN0b3JlQmFja2VuZCkKICAgICAsIG1faWQoaWQpCiAgICAgLCBtX25hbWUobmFtZSkKICAgICAs
IG1fc3RvcmVOYW1lKHN0b3JlTmFtZSkKQEAgLTUwLDggKzUyLDEwIEBAIElEQkluZGV4QmFja2Vu
ZEltcGw6OklEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUs
IGludDY0X3QKIHsKIH0KIAotSURCSW5kZXhCYWNrZW5kSW1wbDo6SURCSW5kZXhCYWNrZW5kSW1w
bChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSkK
K0lEQkluZGV4QmFja2VuZEltcGw6OklEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3Jl
KiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbCogb2JqZWN0U3RvcmVCYWNrZW5kLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKQog
ICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICwgbV9kYXRhYmFzZUlkKGRh
dGFiYXNlSWQpCisgICAgLCBtX29iamVjdFN0b3JlQmFja2VuZChvYmplY3RTdG9yZUJhY2tlbmQp
CiAgICAgLCBtX2lkKEludmFsaWRJZCkKICAgICAsIG1fbmFtZShuYW1lKQogICAgICwgbV9zdG9y
ZU5hbWUoc3RvcmVOYW1lKQpAQCAtNzIsMTAgKzc2LDEwIEBAIHZvaWQgSURCSW5kZXhCYWNrZW5k
SW1wbDo6b3BlbkN1cnNvckludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVm
UHRyCiAKICAgICBzd2l0Y2ggKGN1cnNvclR5cGUpIHsKICAgICBjYXNlIElEQkN1cnNvckJhY2tl
bmRJbnRlcmZhY2U6OkluZGV4S2V5Q3Vyc29yOgotICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3Ig
PSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEtleUN1cnNvcihpbmRleC0+aWQoKSwg
cmFuZ2UuZ2V0KCksIGRpcmVjdGlvbik7CisgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IGlu
ZGV4LT5tX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4S2V5Q3Vyc29yKGluZGV4LT5tX2RhdGFiYXNl
SWQsIGluZGV4LT5tX29iamVjdFN0b3JlQmFja2VuZC0+aWQoKSwgaW5kZXgtPmlkKCksIHJhbmdl
LmdldCgpLCBkaXJlY3Rpb24pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIElEQkN1cnNvckJh
Y2tlbmRJbnRlcmZhY2U6OkluZGV4Q3Vyc29yOgotICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3Ig
PSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEN1cnNvcihpbmRleC0+aWQoKSwgcmFu
Z2UuZ2V0KCksIGRpcmVjdGlvbik7CisgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IGluZGV4
LT5tX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4Q3Vyc29yKGluZGV4LT5tX2RhdGFiYXNlSWQsIGlu
ZGV4LT5tX29iamVjdFN0b3JlQmFja2VuZC0+aWQoKSwgaW5kZXgtPmlkKCksIHJhbmdlLmdldCgp
LCBkaXJlY3Rpb24pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIElEQkN1cnNvckJhY2tlbmRJ
bnRlcmZhY2U6Ok9iamVjdFN0b3JlQ3Vyc29yOgogICAgIGNhc2UgSURCQ3Vyc29yQmFja2VuZElu
dGVyZmFjZTo6SW52YWxpZEN1cnNvclR5cGU6CkBAIC0xMjAsMTQgKzEyNCwxNCBAQCB2b2lkIElE
QkluZGV4QmFja2VuZEltcGw6OmdldEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzUmVmUHRyPElEQkluZAogewogICAgIC8vIEZJWE1FOiBTcGxpdCBnZXRJbnRlcm5hbCBpbnRv
IHR3byBmdW5jdGlvbnMsIGdldHRpbmcgcmlkIG9mZiB8Z2V0T2JqZWN0fC4KICAgICBpZiAoZ2V0
T2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGluZGV4LT5tX2JhY2tpbmdTdG9yZS0+
Z2V0T2JqZWN0VmlhSW5kZXgoaW5kZXgtPmlkKCksICprZXkpOworICAgICAgICBTdHJpbmcgdmFs
dWUgPSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPmdldE9iamVjdFZpYUluZGV4KGluZGV4LT5tX2Rh
dGFiYXNlSWQsIGluZGV4LT5tX29iamVjdFN0b3JlQmFja2VuZC0+aWQoKSwgaW5kZXgtPmlkKCks
ICprZXkpOwogICAgICAgICBpZiAodmFsdWUuaXNOdWxsKCkpIHsKICAgICAgICAgICAgIGNhbGxi
YWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRp
b246Ok5PVF9GT1VORF9FUlIsICJLZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGluZGV4LiIpKTsK
ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjYWxsYmFja3MtPm9uU3Vj
Y2VzcyhTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZUZyb21XaXJlKHZhbHVlKSk7CiAgICAg
fSBlbHNlIHsKLSAgICAgICAgUmVmUHRyPElEQktleT4ga2V5UmVzdWx0ID0gaW5kZXgtPm1fYmFj
a2luZ1N0b3JlLT5nZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW5kZXgtPmlkKCksICprZXkpOworICAg
ICAgICBSZWZQdHI8SURCS2V5PiBrZXlSZXN1bHQgPSBpbmRleC0+bV9iYWNraW5nU3RvcmUtPmdl
dFByaW1hcnlLZXlWaWFJbmRleChpbmRleC0+bV9kYXRhYmFzZUlkLCBpbmRleC0+bV9vYmplY3RT
dG9yZUJhY2tlbmQtPmlkKCksIGluZGV4LT5pZCgpLCAqa2V5KTsKICAgICAgICAgaWYgKCFrZXlS
ZXN1bHQpIHsKICAgICAgICAgICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9y
OjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246Ok5PVF9GT1VORF9FUlIsICJLZXkgZG9lcyBu
b3QgZXhpc3QgaW4gdGhlIGluZGV4LiIpKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1OSw3
ICsxNjMsNyBAQCBib29sIElEQkluZGV4QmFja2VuZEltcGw6OmFkZGluZ0tleUFsbG93ZWQoSURC
S2V5KiBrZXkpCiAgICAgaWYgKCFtX3VuaXF1ZSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAg
ICByZXR1cm4gIW1fYmFja2luZ1N0b3JlLT5rZXlFeGlzdHNJbkluZGV4KG1faWQsICprZXkpOwor
ICAgIHJldHVybiAhbV9iYWNraW5nU3RvcmUtPmtleUV4aXN0c0luSW5kZXgobV9kYXRhYmFzZUlk
LCBtX29iamVjdFN0b3JlQmFja2VuZC0+aWQoKSwgbV9pZCwgKmtleSk7CiB9CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCSW5k
ZXhCYWNrZW5kSW1wbC5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJ
bXBsLmgKaW5kZXggZTJhMDZiOGUwNTY0OTM5NjhhYzZjNjIzODY1NmY2YTVjZWY2ZDYwZC4uNmVm
ZmJkZDAyNjI3ZmUxMGQ0MDI2ZjBhZjI5M2ZiMzI5ZmVhYTY3NyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJJbmRleEJhY2tlbmRJbXBsLmgKQEAgLTQwLDEzICs0MCwxMyBAQCBjbGFz
cyBTY3JpcHRFeGVjdXRpb25Db250ZXh0OwogCiBjbGFzcyBJREJJbmRleEJhY2tlbmRJbXBsIDog
cHVibGljIElEQkluZGV4QmFja2VuZEludGVyZmFjZSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBh
c3NSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYg
c3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKQorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUq
IGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBJREJPYmplY3RTdG9yZUJh
Y2tlbmRJbXBsKiBvYmplY3RTdG9yZUJhY2tlbmQsIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYg
bmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9v
bCB1bmlxdWUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQkluZGV4QmFj
a2VuZEltcGwoYmFja2luZ1N0b3JlLCBpZCwgbmFtZSwgc3RvcmVOYW1lLCBrZXlQYXRoLCB1bmlx
dWUpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJJbmRleEJhY2tlbmRJbXBsKGJh
Y2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVCYWNrZW5kLCBpZCwgbmFtZSwgc3Rv
cmVOYW1lLCBrZXlQYXRoLCB1bmlxdWUpKTsKICAgICB9Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8
SURCSW5kZXhCYWNrZW5kSW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3Jl
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJp
bmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQkluZGV4
QmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRf
dCBkYXRhYmFzZUlkLCBjb25zdCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKiBvYmplY3RTdG9y
ZUJhY2tlbmQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCB1bmlxdWUpCiAgICAgewotICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IElEQkluZGV4QmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBuYW1lLCBzdG9y
ZU5hbWUsIGtleVBhdGgsIHVuaXF1ZSkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElE
QkluZGV4QmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUJh
Y2tlbmQsIG5hbWUsIHN0b3JlTmFtZSwga2V5UGF0aCwgdW5pcXVlKSk7CiAgICAgfQogICAgIHZp
cnR1YWwgfklEQkluZGV4QmFja2VuZEltcGwoKTsKIApAQCAtNzIsOCArNzIsOCBAQCBwdWJsaWM6
CiAgICAgdmlydHVhbCB2b2lkIGdldEtleShQYXNzUmVmUHRyPElEQktleT4sIFBhc3NSZWZQdHI8
SURCQ2FsbGJhY2tzPiwgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiwgRXhjZXB0aW9u
Q29kZSYpOwogCiBwcml2YXRlOgotICAgIElEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0
b3JlKiwgaW50NjRfdCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3Jl
TmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIHVuaXF1ZSk7Ci0gICAgSURCSW5kZXhC
YWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYgc3RvcmVOYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgdW5pcXVlKTsKKyAg
ICBJREJJbmRleEJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGludDY0X3QgZGF0YWJhc2VJ
ZCwgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbCosIGludDY0X3QgaWQsIGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBzdG9yZU5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0
aCwgYm9vbCB1bmlxdWUpOworICAgIElEQkluZGV4QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3Jl
KiwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKiwg
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHN0b3JlTmFtZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoLCBib29sIHVuaXF1ZSk7CiAKICAgICBzdGF0aWMgdm9pZCBvcGVuQ3Vyc29ySW50
ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCSW5kZXhCYWNrZW5k
SW1wbD4sIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+LCB1bnNpZ25lZCBzaG9ydCBkaXJlY3Rpb24s
IElEQkN1cnNvckJhY2tlbmRJbnRlcmZhY2U6OkN1cnNvclR5cGUsIFBhc3NSZWZQdHI8SURCQ2Fs
bGJhY2tzPiwgUGFzc1JlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2U+KTsKICAg
ICBzdGF0aWMgdm9pZCBnZXRJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1Jl
ZlB0cjxJREJJbmRleEJhY2tlbmRJbXBsPiwgUGFzc1JlZlB0cjxJREJLZXk+LCBib29sIGdldE9i
amVjdCwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+KTsKQEAgLTgyLDYgKzgyLDggQEAgcHJpdmF0
ZToKIAogICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0b3JlOwogCisgICAg
aW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgY29uc3QgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bCogbV9vYmplY3RTdG9yZUJhY2tlbmQ7CiAgICAgaW50NjRfdCBtX2lkOwogICAgIFN0cmluZyBt
X25hbWU7CiAgICAgU3RyaW5nIG1fc3RvcmVOYW1lOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjJlNDY3N2FmMTU2
NTI0Yzg5ODAyOTFiYTVjMDJmYmI2MDk0NDM4NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKQEAgLTAsMCArMSwyMzA2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQkxldmVsREJCYWNr
aW5nU3RvcmUuaCIKKworI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQorI2lmIEVOQUJMRShM
RVZFTERCKQorCisjaW5jbHVkZSAiQXNzZXJ0aW9ucy5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0u
aCIKKyNpbmNsdWRlICJJREJGYWN0b3J5QmFja2VuZEltcGwuaCIKKyNpbmNsdWRlICJJREJLZXlS
YW5nZS5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSA8bGV2ZWxkYi9j
b21wYXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9kYi5oPgorI2luY2x1ZGUgPGxldmVsZGIv
aXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL3NsaWNlLmg+CisjaW5jbHVkZSA8bGV2ZWxk
Yi93cml0ZV9iYXRjaC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2lmbmRlZiBJTlQ2NF9NQVgK
Ky8vIEZJWE1FOiBEbyB0aGlzIG1vcmUgcHJvcGVybHkuCisjZGVmaW5lIElOVDY0X01BWCAweDdm
ZmZmZmZmZmZmZmZmZmZMTAorI2VuZGlmCisKKy8vIEZJWE1FOiBDb21tZW50IGRvY3VtZW50aW5n
IHRoZSBrZXkgbGF5b3V0IGZvcm1hdC4gKEZvciBub3csIHNlZSBodHRwczovL2RvY3MuZ29vZ2xl
LmNvbS9kb2N1bWVudC9kLzFnaGFIalFHdWV4S0FEbTZubDRCbmRnSENabTZuMWJlVEtXQ2p5cW1F
WFRvL2VkaXQ/aGw9ZW4mYXV0aGtleT1DSzI2eGM0TykKKy8vIEZJWE1FOiBNYWtlIHN1cmUgdG8g
dmFsaWRhdGUgcmV0dXJuIHZhbHVlcyBmcm9tIGFsbCBkZWNvZGluZyBmdW5jdGlvbnMgdGhhdCBy
ZXR1cm4gbnVsbCBvbiBmYWlsdXJlLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lEQkxldmVs
REJCYWNraW5nU3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIs
IElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSwgbGV2ZWxkYjo6REIqIGRiKQorICAgIDog
bV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkKKyAgICAs
IG1fZGIoZGIpCit7CisgICAgbV9mYWN0b3J5LT5hZGRJREJCYWNraW5nU3RvcmUoaWRlbnRpZmll
ciwgdGhpcyk7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2lu
Z1N0b3JlKCkKK3sKKyAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZShtX2lkZW50
aWZpZXIpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgcHJpbnRTdHJpbmcoY29uc3Qgc3RkOjpz
dHJpbmcmIHMpCit7CisgICAgcHJpbnRmKCIweCIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNbaV07Cisg
ICAgICAgIHByaW50ZigiJTAyeCIsIChpbnQpYyk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRp
YyBzdGQ6OnN0cmluZyBlbmNvZGVJbnQoaW50NjRfdCBuKQoreworICAgIEFTU0VSVChuID49IDAp
OworICAgIHN0ZDo6c3RyaW5nIHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4K
KworICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbjsKKyAgICAgICAgcmV0LmFw
cGVuZCgxLCBzdGF0aWNfY2FzdDxjaGFyPihjKSk7CisgICAgICAgIG4gPj49IDg7CisgICAgfSB3
aGlsZSAobik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50NjRfdCBkZWNvZGVJ
bnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkKK3sKKyAgICBpbnQ2NF90IHJl
dCA9IDA7CisKKyAgICB3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisgICAgICAgIHVuc2lnbmVkIGNo
YXIgYyA9ICpiZWdpbisrOworICAgICAgICByZXQgPSAocmV0IDw8IDgpIHwgYzsKKyAgICB9CisK
KyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50NjRfdCBkZWNvZGVJbnQoY29uc3Qgc3Rk
OjpzdHJpbmcmIHMpIC8vIEZJWE1FOiBUYWtlIGEgcG9pbnRlciByYW5nZSBpbnN0ZWFkLgorewor
ICAgIGludDY0X3QgcmV0ID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IHMubGVu
Z3RoKCk7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBzW2ldOworICAgICAgICBy
ZXQgPSAocmV0IDw8IDgpIHwgYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0
aWMgc3RkOjpzdHJpbmcgZW5jb2RlVmFySW50KGludDY0X3QgbikKK3sKKyAgICBzdGQ6OnN0cmlu
ZyByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBkbyB7CisgICAg
ICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAweDdmOworICAgICAgICBuID4+PSA3OworICAgICAg
ICBpZiAobikKKyAgICAgICAgICAgIGMgfD0gMTI4OworICAgICAgICByZXQuYXBwZW5kKDEsIHN0
YXRpY19jYXN0PGNoYXI+KGMpKTsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVybiByZXQ7
Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciAqcCwgY29u
c3QgY2hhciogbGltaXQsIGludDY0X3QqIGZvdW5kSW50KQoreworICAgIEFTU0VSVChsaW1pdCA+
PSBwKTsKKyAgICAqZm91bmRJbnQgPSAwOworCisgICAgZG8geworICAgICAgICBpZiAocCA9PSBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICpmb3VuZEludCA9ICgqZm91
bmRJbnQgPDwgNykgfCAoKnAgJiAweDdmKTsKKyAgICB9IHdoaWxlICgqcCsrICYgMTI4KTsKKyAg
ICByZXR1cm4gcDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZVN0cmluZyhjb25zdCBT
dHJpbmcmIHMpCit7CisgICAgc3RkOjpzdHJpbmcgcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0
IGNyZWF0aW9uLgorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsr
aSkgeworICAgICAgICBVQ2hhciB1ID0gc1tpXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9
IHUgPj4gODsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9IHU7CisgICAgICAgIHJldC5hcHBl
bmQoMSwgaGkpOworICAgICAgICByZXQuYXBwZW5kKDEsIGxvKTsKKyAgICB9CisKKyAgICByZXR1
cm4gcmV0OworfQorCitzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZyhjb25zdCBjaGFyKiBwLCBj
b25zdCBjaGFyKiBlbmQpCit7CisgICAgQVNTRVJUKGVuZCA+PSBwKTsKKyAgICBBU1NFUlQoISgo
ZW5kIC0gcCkgJSAyKSk7CisKKyAgICBzaXplX3QgbGVuID0gKGVuZCAtIHApIC8gMjsKKyAgICBW
ZWN0b3I8VUNoYXI+IHZlY3RvcihsZW4pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBs
ZW47ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGhpID0gKnArKzsKKyAgICAgICAgdW5z
aWduZWQgY2hhciBsbyA9ICpwKys7CisKKyAgICAgICAgdmVjdG9yW2ldID0gKGhpIDw8IDgpIHwg
bG87CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQodmVjdG9yKTsKK30KKworc3Rh
dGljIHN0ZDo6c3RyaW5nIGVuY29kZVN0cmluZ1dpdGhMZW4oY29uc3QgU3RyaW5nJiBzKQorewor
ICAgIHN0ZDo6c3RyaW5nIHJldCA9IGVuY29kZVZhckludChzLmxlbmd0aCgpKTsKKyAgICByZXQg
Kz0gZW5jb2RlU3RyaW5nKHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0
LCBTdHJpbmcqIGZvdW5kU3RyaW5nKQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsKKyAgICBp
bnQ2NF90IGxlbjsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCAmbGVuKTsKKyAgICBp
ZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwICsgbGVuICogMiA+IGxpbWl0KQor
ICAgICAgICByZXR1cm4gMDsKKworICAgICpmb3VuZFN0cmluZyA9IGRlY29kZVN0cmluZyhwLCBw
ICsgbGVuICogMik7CisgICAgcCArPSBsZW4gKiAyOworICAgIHJldHVybiBwOworfQorCitzdGF0
aWMgc3RkOjpzdHJpbmcgZW5jb2RlRG91YmxlKGRvdWJsZSB4KQoreworICAgIHN0ZDo6c3RyaW5n
IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKyAgICBjaGFyKiBwID0gcmVp
bnRlcnByZXRfY2FzdDxjaGFyKj4oJngpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6
ZW9mKHgpOyArK2kpCisgICAgICAgIHJldC5hcHBlbmQoMSwgcFtpXSk7CisgICAgcmV0dXJuIHJl
dDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBj
b25zdCBjaGFyKiBsaW1pdCwgZG91YmxlKiBkKQoreworICAgIGlmIChwICsgc2l6ZW9mKCpkKSA+
IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNoYXIqIHggPSByZWludGVycHJldF9j
YXN0PGNoYXIqPihkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZigqZCk7ICsr
aSkKKyAgICAgICAgKngrKyA9ICpwKys7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6
OnN0cmluZyBlbmNvZGVLZXkoY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgc3RkOjpzdHJpbmcg
cmV0OworCisgICAgc3dpdGNoIChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJLZXk6Ok51bGxU
eXBlOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuICIiOwor
ICAgIGNhc2UgSURCS2V5OjpTdHJpbmdUeXBlOgorICAgICAgICByZXQuYXBwZW5kKDEsICdceDAn
KTsKKyAgICAgICAgcmV0ICs9IGVuY29kZVN0cmluZ1dpdGhMZW4oa2V5LnN0cmluZygpKTsKKyAg
ICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6CisgICAgICAgIHJl
dC5hcHBlbmQoMSwgJ1x4MScpOworICAgICAgICByZXQgKz0gZW5jb2RlRG91YmxlKGtleS5kYXRl
KCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgor
ICAgICAgICByZXQuYXBwZW5kKDEsICdceDInKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZURvdWJs
ZShrZXkubnVtYmVyKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworc3RhdGlj
IGNvbnN0IGNoYXIqIGRlY29kZUtleShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwg
UmVmUHRyPElEQktleT4qIGZvdW5kS2V5KQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsKKyAg
ICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBjaGFy
IHR5cGUgPSAqcCsrOworICAgIFN0cmluZyBzOworICAgIGRvdWJsZSBkOworCisgICAgc3dpdGNo
ICh0eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgICAvLyBTdHJpbmcuCisgICAgICAgIHAgPSBk
ZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCAmcyk7CisgICAgICAgICpmb3VuZEtleSA9IElE
QktleTo6Y3JlYXRlU3RyaW5nKHMpOworICAgICAgICByZXR1cm4gcDsKKyAgICBjYXNlIDE6Cisg
ICAgICAgIC8vIERhdGUuCisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsK
KyAgICAgICAgKmZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKGQpOworICAgICAgICByZXR1
cm4gcDsKKyAgICBjYXNlIDI6CisgICAgICAgIC8vIE51bWJlci4KKyAgICAgICAgcCA9IGRlY29k
ZURvdWJsZShwLCBsaW1pdCwgJmQpOworICAgICAgICAqZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0
ZU51bWJlcihkKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGlj
IGludCBjb3VudE5vblplcm9CeXRlcyhpbnQ2NF90IG4pCit7CisgICAgaW50IGMgPSAxOworICAg
IHdoaWxlIChuID4+PSA4KQorICAgICAgICBjKys7CisgICAgcmV0dXJuIGM7Cit9CisKKy8vIEZJ
WE1FOiBSZXBsYWNlIGFsbCB0aGVzZSBtYWtlS2V5LCBkZWNvZGVQcmVmaXgsIGV0Yy4gd2l0aCBj
bGFzc2VzCisvLyByZXByZXNlbnRpbmcgYWxsIHR5cGVzIG9mIGtleXMsIGFuZCB0aGF0IGtub3cg
aG93IHRvIGVuY29kZSwgZGVjb2RlLCBhbmQgZG8KKy8vIGNvbXBhcmlzb24uIFNlZSB0aGUgY2xh
c3NlcyBLZXlQcmVmaXgsIERhdGFiYXNlRnJlZUxpc3RLZXksIGV0Yy4KKy8vIFBvc3NpYmx5IG1v
dmUgdGhhdCBzdHVmZiBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KKworc3RhdGljIHN0ZDo6c3RyaW5n
IG1ha2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCkKK3sKKyAgICBpbnQgZGF0YWJhc2VCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVz
KGRhdGFiYXNlSWQpOworICAgIGludCBvYmplY3RTdG9yZUJ5dGVzID0gY291bnROb25aZXJvQnl0
ZXMob2JqZWN0U3RvcmVJZCk7CisgICAgaW50IGluZGV4Qnl0ZXMgPSBjb3VudE5vblplcm9CeXRl
cyhpbmRleElkKTsKKworICAgIEFTU0VSVChkYXRhYmFzZUJ5dGVzIDw9IDgpOworICAgIEFTU0VS
VChvYmplY3RTdG9yZUJ5dGVzIDw9IDgpOworICAgIEFTU0VSVChpbmRleEJ5dGVzIDw9IDQpOwor
CisgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAoZGF0YWJhc2VCeXRlcyAtIDEpIDw8IDUg
fCAob2JqZWN0U3RvcmVCeXRlcyAtIDEpIDw8IDIgfCAoaW5kZXhCeXRlcyAtIDEpOworICAgIHN0
ZDo6c3RyaW5nIHMoMSwgZmlyc3RCeXRlKTsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlv
bi4KKyAgICBzICs9IGVuY29kZUludChkYXRhYmFzZUlkKTsKKyAgICBzICs9IGVuY29kZUludChv
YmplY3RTdG9yZUlkKTsKKyAgICBzICs9IGVuY29kZUludChpbmRleElkKTsKKworICAgIHJldHVy
biBzOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlUHJlZml4KGNvbnN0IGNoYXIqIHAs
IGludDY0X3QmIGRhdGFiYXNlSWQsIGludDY0X3QmIG9iamVjdFN0b3JlSWQsIGludDY0X3QmIGlu
ZGV4SWQpCit7CisgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqcCsrOworCisgICAgaW50
IGRhdGFiYXNlQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgIGludCBv
YmplY3RTdG9yZUJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsKKyAgICBpbnQg
aW5kZXhCeXRlcyA9IChmaXJzdEJ5dGUgJiAweDMpICsgMTsKKworICAgIGRhdGFiYXNlSWQgPSBk
ZWNvZGVJbnQoc3RkOjpzdHJpbmcocCwgZGF0YWJhc2VCeXRlcykpOworICAgIHAgKz0gZGF0YWJh
c2VCeXRlczsKKyAgICBvYmplY3RTdG9yZUlkID0gZGVjb2RlSW50KHN0ZDo6c3RyaW5nKHAsIG9i
amVjdFN0b3JlQnl0ZXMpKTsKKyAgICBwICs9IG9iamVjdFN0b3JlQnl0ZXM7CisgICAgaW5kZXhJ
ZCA9IGRlY29kZUludChzdGQ6OnN0cmluZyhwLCBpbmRleEJ5dGVzKSk7CisgICAgcCArPSBpbmRl
eEJ5dGVzOworCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIGludCBudW1iZXIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgY2hhciBjID0gbnVtYmVyOworICAgIHMu
YXBwZW5kKCZjLCAxKTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1h
a2VLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikKK3sKKyAgICBzdGQ6OnN0cmluZyBzID0g
bWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBzICs9IHN0
cjsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3Qgc3RkOjpzdHJpbmcmIHN0ciwgaW50NjRfdCB2ZXJzaW9uKQoreworICAgIHN0ZDo6c3RyaW5n
IHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIHN0cik7Cisg
ICAgcyArPSBlbmNvZGVWYXJJbnQodmVyc2lvbik7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRp
YyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBudW1iZXIsIGNvbnN0IFN0cmluZyYgc3RyKQor
eworICAgIHN0ZDo6c3RyaW5nIHMgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQsIG51bWJlcik7CisgICAgcyArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKHN0cik7Cisg
ICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGludCBuYnIx
LCBpbnQ2NF90IG5icjIpCit7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbmJyMSk7CisgICAgcyArPSBlbmNvZGVWYXJJbnQo
bmJyMik7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtYWtlS2V5KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGludCBuYnIxLCBpbnQ2NF90IG5icjIsIGludDY0X3QgbmJyMykKK3sKKyAgICBzdGQ6OnN0cmlu
ZyBzID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBuYnIxKTsK
KyAgICBzICs9IGVuY29kZVZhckludChuYnIyKTsKKyAgICBzICs9IGVuY29kZVZhckludChuYnIz
KTsKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG1ha2VLZXkoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgaW50
IG5icjEsIGludDY0X3QgbmJyMiwgaW50NjRfdCBuYnIzLCBpbnQgbmJyNCkKK3sKKyAgICBzdGQ6
OnN0cmluZyBzID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBu
YnIxKTsKKyAgICBzICs9IGVuY29kZVZhckludChuYnIyKTsKKyAgICBzICs9IGVuY29kZVZhcklu
dChuYnIzKTsKKyAgICBzICs9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KG5icjQpOworICAg
IHJldHVybiBzOworfQorCitzdGF0aWMgYm9vbCBnZXRJbnQobGV2ZWxkYjo6REIqIGRiLCBjb25z
dCBzdGQ6OnN0cmluZyYga2V5LCBpbnQ2NF90KiBmb3VuZEludCkKK3sKKyAgICBzdGQ6OnN0cmlu
ZyByZXN1bHQ7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRP
cHRpb25zKCksIGxldmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOworCisgICAgaWYgKHMuSXNO
b3RGb3VuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKHMub2soKSk7CisK
KyAgICAqZm91bmRJbnQgPSBkZWNvZGVJbnQocmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kworc3RhdGljIGJvb2wgcHV0SW50KGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IGtleSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSwgZW5jb2RlSW50KHZhbHVlKSk7CisgICAgaWYg
KCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
c3RhdGljIGJvb2wgZ2V0U3RyaW5nKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IGtleSwgU3RyaW5nKiBmb3VuZFN0cmluZykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Cisg
ICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxl
dmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOworCisgICAgaWYgKHMuSXNOb3RGb3VuZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKHMub2soKSk7CisKKyAgICAqZm91bmRT
dHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5jX3N0cigpICsgcmVz
dWx0Lmxlbmd0aCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcHV0U3Ry
aW5nKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcga2V5LCBjb25zdCBTdHJpbmcm
IHZhbHVlKQoreworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPlB1dChsZXZlbGRiOjpXcml0
ZU9wdGlvbnMoKSwga2V5LCBlbmNvZGVTdHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3Rk
OjpzdHJpbmcgZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyIGMpCit7CisgICAgcmV0dXJuIHN0ZDo6
c3RyaW5nKDEsIGMpOworfQorCituYW1lc3BhY2UgeworY2xhc3MgS2V5UHJlZml4IHsKK3B1Ymxp
YzoKKyAgICBLZXlQcmVmaXgoKSB7fQorCisgICAgS2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgICAgIDogbV9k
YXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0
b3JlSWQpCisgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCisgICAgeworICAgIH0KKworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBLZXlQcmVmaXgqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZmly
c3RCeXRlID0gKnN0YXJ0Kys7CisKKyAgICAgICAgaW50IGRhdGFiYXNlSWRCeXRlcyA9ICgoZmly
c3RCeXRlID4+IDUpICYgMHg3KSArIDE7CisgICAgICAgIGludCBvYmplY3RTdG9yZUlkQnl0ZXMg
PSAoKGZpcnN0Qnl0ZSA+PiAyKSAmIDB4NykgKyAxOworICAgICAgICBpbnQgaW5kZXhJZEJ5dGVz
ID0gKGZpcnN0Qnl0ZSAmIDB4MykgKyAxOworCisgICAgICAgIGlmIChzdGFydCArIGRhdGFiYXNl
SWRCeXRlcyArIG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyA+IGxpbWl0KQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNv
ZGVJbnQoc3RhcnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzKTsKKyAgICAgICAgc3RhcnQgKz0g
ZGF0YWJhc2VJZEJ5dGVzOworICAgICAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IGRlY29k
ZUludChzdGFydCwgc3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0ZXMpOworICAgICAgICBzdGFydCAr
PSBvYmplY3RTdG9yZUlkQnl0ZXM7CisgICAgICAgIHJlc3VsdC0+bV9pbmRleElkID0gZGVjb2Rl
SW50KHN0YXJ0LCBzdGFydCArIGluZGV4SWRCeXRlcyk7CisgICAgICAgIHN0YXJ0ICs9IGluZGV4
SWRCeXRlczsKKworICAgICAgICByZXR1cm4gc3RhcnQ7CisgICAgfQorCisgICAgc3RkOjpzdHJp
bmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIGludCBkYXRhYmFzZUlkQnl0ZXMgPSBj
b3VudE5vblplcm9CeXRlcyhtX2RhdGFiYXNlSWQpOworICAgICAgICBpbnQgb2JqZWN0U3RvcmVJ
ZEJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMobV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaW50
IGluZGV4SWRCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKG1faW5kZXhJZCk7CisKKyAgICAgICAg
QVNTRVJUKGRhdGFiYXNlSWRCeXRlcyA8PSA4KTsKKyAgICAgICAgQVNTRVJUKG9iamVjdFN0b3Jl
SWRCeXRlcyA8PSA4KTsKKyAgICAgICAgQVNTRVJUKGluZGV4SWRCeXRlcyA8PSA0KTsKKworICAg
ICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICBzLnJlc2VydmUoMSArIGRhdGFiYXNlSWRCeXRl
cyArIG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyk7CisKKyAgICAgICAgdW5zaWdu
ZWQgY2hhciBmaXJzdEJ5dGUgPSAoZGF0YWJhc2VJZEJ5dGVzIC0gMSkgPDwgNSB8IChvYmplY3RT
dG9yZUlkQnl0ZXMgLSAxKSA8PCAyIHwgKGluZGV4SWRCeXRlcyAtIDEpOworICAgICAgICBzICs9
IGZpcnN0Qnl0ZTsKKyAgICAgICAgcyArPSBlbmNvZGVJbnQobV9kYXRhYmFzZUlkKTsKKyAgICAg
ICAgcyArPSBlbmNvZGVJbnQobV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgcyArPSBlbmNvZGVJ
bnQobV9pbmRleElkKTsKKworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBpbnQgY29t
cGFyZShjb25zdCBLZXlQcmVmaXgmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1f
ZGF0YWJhc2VJZCAhPSBvdGhlci5tX2RhdGFiYXNlSWQpCisgICAgICAgICAgICByZXR1cm4gbV9k
YXRhYmFzZUlkIC0gb3RoZXIubV9kYXRhYmFzZUlkOworICAgICAgICBpZiAobV9vYmplY3RTdG9y
ZUlkICE9IG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiBtX29iamVj
dFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQ7CisgICAgICAgIGlmIChtX2luZGV4SWQg
IT0gb3RoZXIubV9pbmRleElkKQorICAgICAgICAgICAgcmV0dXJuIG1faW5kZXhJZCAtIG90aGVy
Lm1faW5kZXhJZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZW51bSBUeXBlIHsK
KyAgICAgICAga0dsb2JhbE1ldGFEYXRhLAorICAgICAgICBrRGF0YWJhc2VNZXRhRGF0YSwKKyAg
ICAgICAga09iamVjdFN0b3JlRGF0YSwKKyAgICAgICAga0V4aXN0c0VudHJ5LAorICAgICAgICBr
SW5kZXhEYXRhLAorICAgICAgICBrSW52YWxpZFR5cGUKKyAgICB9OworCisgICAgVHlwZSB0eXBl
KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghbV9kYXRhYmFzZUlkKQorICAgICAgICAgICAg
cmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKKyAgICAgICAgaWYgKCFtX29iamVjdFN0b3JlSWQpCisg
ICAgICAgICAgICByZXR1cm4ga0RhdGFiYXNlTWV0YURhdGE7CisgICAgICAgIGlmIChtX2luZGV4
SWQgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0U3RvcmVEYXRhOworICAgICAgICBp
ZiAobV9pbmRleElkID09IDIpCisgICAgICAgICAgICByZXR1cm4ga0V4aXN0c0VudHJ5OworICAg
ICAgICBpZiAobV9pbmRleElkID49IDMwKQorICAgICAgICAgICAgcmV0dXJuIGtJbmRleERhdGE7
CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBrSW52YWxp
ZFR5cGU7CisgICAgfQorCisgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgaW50NjRfdCBt
X29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7Cit9OworCitjbGFzcyBEYXRh
YmFzZUZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCkge30K
KworICAgIERhdGFiYXNlRnJlZUxpc3RLZXkoaW50NjRfdCBkYXRhYmFzZUlkKQorICAgICAgICA6
IG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29u
c3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0
YWJhc2VGcmVlTGlzdEtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGxp
bWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQo
c3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIHN0ZDo6
c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZSgx
MDApICsgZW5jb2RlVmFySW50KG1fZGF0YWJhc2VJZCk7CisgICAgfQorCisgICAgaW50IGNvbXBh
cmUoY29uc3QgRGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV9kYXRhYmFzZUlkIC0gb3RoZXIubV9kYXRhYmFzZUlkOworICAgIH0KKworICAg
IHN0YXRpYyBEYXRhYmFzZUZyZWVMaXN0S2V5IGZpcnN0S2V5KCkgeyByZXR1cm4gRGF0YWJhc2VG
cmVlTGlzdEtleSgwKTsgfQorICAgIHN0YXRpYyBEYXRhYmFzZUZyZWVMaXN0S2V5IGxhc3RLZXko
KSB7IHJldHVybiBEYXRhYmFzZUZyZWVMaXN0S2V5KElOVDY0X01BWCk7IH0KKworICAgIGludDY0
X3QgbV9kYXRhYmFzZUlkOworfTsKKworY2xhc3MgRGF0YWJhc2VOYW1lS2V5IHsKK3B1YmxpYzoK
KyAgICBEYXRhYmFzZU5hbWVLZXkoKSB7fQorCisgICAgRGF0YWJhc2VOYW1lS2V5KFN0cmluZyBv
cmlnaW4sIFN0cmluZyBkYXRhYmFzZU5hbWUpCisgICAgICAgIDogbV9vcmlnaW4ob3JpZ2luKQor
ICAgICAgICAsIG1fZGF0YWJhc2VOYW1lKGRhdGFiYXNlTmFtZSkKKyAgICB7CisgICAgfQorCisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hh
ciogbGltaXQsIERhdGFiYXNlTmFtZUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKHN0
YXJ0ID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0YXJ0ID0gZGVj
b2RlU3RyaW5nV2l0aExlbihzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fb3JpZ2luKTsKKyAgICAg
ICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVj
b2RlU3RyaW5nV2l0aExlbihzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fZGF0YWJhc2VOYW1lKTsK
KyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIGVuY29kZUJ5dGUoMjAxKSArIGVuY29kZVN0cmluZ1dpdGhMZW4obV9vcmlnaW4pICsg
ZW5jb2RlU3RyaW5nV2l0aExlbihtX2RhdGFiYXNlTmFtZSk7CisgICAgfQorCisgICAgaW50IGNv
bXBhcmUoY29uc3QgRGF0YWJhc2VOYW1lS2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAg
IGlmIChpbnQgeCA9IGNvZGVQb2ludENvbXBhcmUobV9vcmlnaW4sIG90aGVyLm1fb3JpZ2luKSkK
KyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZSht
X2RhdGFiYXNlTmFtZSwgb3RoZXIubV9kYXRhYmFzZU5hbWUpOworICAgIH0KKworICAgIFN0cmlu
ZyBtX29yaWdpbjsgLy8gRklYTUU6IFN0b3JlIGVuY29kZWQgc3RyaW5ncywgb3IganVzdCBwb2lu
dGVycy4KKyAgICBTdHJpbmcgbV9kYXRhYmFzZU5hbWU7Cit9OworCitjbGFzcyBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KCkge30K
KworICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IG1ldGFEYXRhVHlwZSkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJ
ZCkKKyAgICAgICAgLCBtX21ldGFEYXRhVHlwZShtZXRhRGF0YVR5cGUpCisgICAgeworICAgIH0K
KworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0
IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAg
ICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAg
ICBzdGFydCA9IGRlY29kZVZhckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgcmV0dXJuIGRlY29kZVZhckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fbWV0YURhdGFU
eXBlKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgc3RkOjpzdHJpbmcgczsgLy8gRklYTUU6IFJlc2l6ZTsKKyAgICAgICAgcyArPSBlbmNv
ZGVCeXRlKDUwKTsKKyAgICAgICAgcyArPSBlbmNvZGVWYXJJbnQobV9vYmplY3RTdG9yZUlkKTsK
KyAgICAgICAgcyArPSBlbmNvZGVWYXJJbnQobV9tZXRhRGF0YVR5cGUpOworICAgICAgICByZXR1
cm4gczsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbnQ2NF90IHggPSBtX29iamVj
dFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4geDsK
KyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7Cisg
ICAgfQorCisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX21ldGFE
YXRhVHlwZTsgLy8gRklYTUU6IE1ha2UgdGhpcyBhIGJ5dGUuCit9OworCitjbGFzcyBJbmRleE1l
dGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleE1ldGFEYXRhS2V5KCkge30KKworICAgIElu
ZGV4TWV0YURhdGFLZXkoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVu
c2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZChvYmpl
Y3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhJZChpbmRleElkKQorICAgICAgICAsIG1fbWV0
YURhdGFUeXBlKG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4
TWV0YURhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkK
KyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHN0YXJ0ID0gZGVjb2RlVmFySW50KHN0
YXJ0LCBsaW1pdCwgJnJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYgKCFzdGFy
dCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdGFydCA9IGRlY29kZVZhckludChz
dGFydCwgbGltaXQsICZyZXN1bHQtPm1faW5kZXhJZCk7CisgICAgICAgIGlmICghc3RhcnQpCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGxpbWl0KQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUgPSAqc3RhcnQr
KzsKKyAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29k
ZSgpIGNvbnN0CisgICAgeworICAgICAgICBzdGQ6OnN0cmluZyBzOyAvLyBGSVhNRTogUmVzaXpl
OworICAgICAgICBzICs9IGVuY29kZUJ5dGUoMTAwKTsKKyAgICAgICAgcyArPSBlbmNvZGVWYXJJ
bnQobV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgcyArPSBlbmNvZGVWYXJJbnQobV9pbmRleElk
KTsKKyAgICAgICAgcyArPSBtX21ldGFEYXRhVHlwZTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAg
fQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhNZXRhRGF0YUtleSYgb3RoZXIpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoaW50NjRfdCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIu
bV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIGlmIChpbnQ2
NF90IHggPSBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4g
eDsKKyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7
CisgICAgfQorCisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2lu
ZGV4SWQ7CisgICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlwZTsKK307CisKK2NsYXNzIE9i
amVjdFN0b3JlRnJlZUxpc3RLZXkgeworcHVibGljOgorICAgIE9iamVjdFN0b3JlRnJlZUxpc3RL
ZXkoKSB7fQorCisgICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleShpbnQ2NF90IG9iamVjdFN0b3Jl
SWQpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgeworICAg
IH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNv
bnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAgewor
ICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgcmV0dXJuIGRlY29kZVZhckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBlbmNvZGVCeXRlKDE1MCkgKyBlbmNvZGVWYXJJbnQobV9vYmplY3RTdG9y
ZUlkKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0
S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQg
LSBvdGhlci5tX29iamVjdFN0b3JlSWQ7CisgICAgfQorCisgICAgc3RhdGljIE9iamVjdFN0b3Jl
RnJlZUxpc3RLZXkgZmlyc3RLZXkoKSB7IHJldHVybiBPYmplY3RTdG9yZUZyZWVMaXN0S2V5KDAp
OyB9CisgICAgc3RhdGljIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgbGFzdEtleSgpIHsgcmV0dXJu
IE9iamVjdFN0b3JlRnJlZUxpc3RLZXkoSU5UNjRfTUFYKTsgfQorCisgICAgaW50NjRfdCBtX29i
amVjdFN0b3JlSWQ7Cit9OworCitjbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAg
ICBJbmRleEZyZWVMaXN0S2V5KCkge30KKworICAgIEluZGV4RnJlZUxpc3RLZXkoaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlk
KG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCisgICAgeworICAg
IH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNv
bnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAgeworICAgICAg
ICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3Rh
cnQgPSBkZWNvZGVWYXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlSWQp
OworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
dHVybiBkZWNvZGVWYXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX2luZGV4SWQpOworICAg
IH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gZW5jb2RlQnl0ZSgxNTEpICsgZW5jb2RlVmFySW50KG1fb2JqZWN0U3RvcmVJZCkgKyBlbmNv
ZGVWYXJJbnQobV9pbmRleElkKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRl
eEZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbnQ2NF90IHgg
PSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICBy
ZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKKyAg
ICB9CisKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJ
ZDsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlTmFtZXNLZXkgeworcHVibGljOgorICAgIE9iamVj
dFN0b3JlTmFtZXNLZXkoKSB7fQorCisgICAgT2JqZWN0U3RvcmVOYW1lc0tleShTdHJpbmcgbmFt
ZSkKKyAgICAgICAgOiBtX25hbWUobmFtZSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9i
amVjdFN0b3JlTmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5n
V2l0aExlbihzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fbmFtZSk7CisgICAgfQorCisgICAgc3Rk
OjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGVCeXRl
KDIwMCkgKyBlbmNvZGVTdHJpbmdXaXRoTGVuKG1fbmFtZSk7CisgICAgfQorCisgICAgaW50IGNv
bXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX25hbWUsIG90aGVyLm1fbmFtZSk7CisgICAg
fQorCisgICAgU3RyaW5nIG1fbmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmlu
ZyAocHJlZmVyYWJseSBqdXN0IHBvaW50ZXJzIHRvIGl0Li4uKQorfTsKKworY2xhc3MgSW5kZXhO
YW1lc0tleSB7CitwdWJsaWM6CisgICAgSW5kZXhOYW1lc0tleSgpIHt9CisKKyAgICBJbmRleE5h
bWVzS2V5KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgU3RyaW5nIG5hbWUpCisgICAgICAgIDogbV9v
YmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9uYW1lKG5hbWUpCisgICAg
eworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3Rh
cnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiByZXN1bHQpCisgICAgeworICAg
ICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
c3RhcnQgPSBkZWNvZGVWYXJJbnQoc3RhcnQsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3Jl
SWQpOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuKHN0YXJ0LCBsaW1pdCwgJnJlc3VsdC0+bV9uYW1l
KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGVuY29kZUJ5dGUoMjAxKSArIGVuY29kZVZhckludChtX29iamVjdFN0b3JlSWQp
ICsgZW5jb2RlU3RyaW5nV2l0aExlbihtX25hbWUpOworICAgIH0KKworICAgIGludCBjb21wYXJl
KGNvbnN0IEluZGV4TmFtZXNLZXkmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlu
dDY0X3QgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAg
ICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX25hbWUs
IG90aGVyLm1fbmFtZSk7CisgICAgfQorCisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Cisg
ICAgU3RyaW5nIG1fbmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmluZyAocHJl
ZmVyYWJseSBqdXN0IHBvaW50ZXJzIHRvIGl0Li4uKQorfTsKKworY2xhc3MgT2JqZWN0U3RvcmVE
YXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZURhdGFLZXkoKSB7fQorCisgICAgT2Jq
ZWN0U3RvcmVEYXRhS2V5KFBhc3NSZWZQdHI8SURCS2V5PiBrZXkpCisgICAgICAgIDogbV9rZXko
a2V5KQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0
IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVEYXRhS2V5KiByZXN1
bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZUtleShzdGFydCwgbGltaXQsICZyZXN1bHQtPm1f
a2V5KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGVuY29kZUtleSgqbV9rZXkpOworICAgIH0KKworICAgIGludCBjb21wYXJl
KGNvbnN0IE9iamVjdFN0b3JlRGF0YUtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBp
ZiAobV9rZXktPmlzTGVzc1RoYW4ob3RoZXIubV9rZXkuZ2V0KCkpKQorICAgICAgICAgICAgcmV0
dXJuIC0xOworICAgICAgICBpZiAob3RoZXIubV9rZXktPmlzTGVzc1RoYW4obV9rZXkuZ2V0KCkp
KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IFJlZlB0cjxJREJLZXk+IG1fa2V5OyAvLyBGSVhNRTogVGhpcyBpcyB2ZXJ5IGV4cGVuc2l2ZS4g
U3RvcmUgaXQgZW5jb2RlZC4KK307CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5IHsKK3B1YmxpYzoK
KyAgICBFeGlzdHNFbnRyeUtleSgpIHt9CisKKyAgICBFeGlzdHNFbnRyeUtleShQYXNzUmVmUHRy
PElEQktleT4ga2V5KQorICAgICAgICA6IG1fa2V5KGtleSkKKyAgICB7CisgICAgfQorCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBpZiAoc3RhcnQg
PT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZUtl
eShzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fa2V5KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmlu
ZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUtleSgqbV9rZXkp
OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2tleS0+aXNMZXNzVGhhbihvdGhlci5tX2tleS5n
ZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChvdGhlci5tX2tleS0+
aXNMZXNzVGhhbihtX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorCisgICAgUmVmUHRyPElEQktleT4gbV9rZXk7IC8vIEZJWE1FOiBU
aGlzIGlzIHZlcnkgZXhwZW5zaXZlLiBTdG9yZSBpdCBlbmNvZGVkLgorfTsKKworY2xhc3MgSW5k
ZXhEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleERhdGFLZXkoKSB7fQorCisgICAgSW5kZXhE
YXRhS2V5KFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIGludDY0X3Qgc2VxdWVuY2VOdW1iZXIpCisg
ICAgICAgIDogbV9rZXkoa2V5KQorICAgICAgICAsIG1fc2VxdWVuY2VOdW1iZXIoc2VxdWVuY2VO
dW1iZXIpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCkK
KyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICBzdGFydCA9IGRlY29kZUtleShzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fa2V5
KTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAg
IGlmIChzdGFydCA9PSBsaW1pdCkgeyAvLyBGSVhNRTogU2hvdWxkbid0IGhhdmUgdG8gaGFuZGxl
IHRoaXMuCisgICAgICAgICAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIgPSAwOworICAgICAg
ICAgICAgcmV0dXJuIHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZVZh
ckludChzdGFydCwgbGltaXQsICZyZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIpOworICAgIH0KKwor
ICAgIHN0ZDo6c3RyaW5nIGVuY29kZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZW5j
b2RlS2V5KCptX2tleSkgKyBlbmNvZGVWYXJJbnQobV9zZXF1ZW5jZU51bWJlcik7CisgICAgfQor
CisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVT
ZXF1ZW5jZU51bWJlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2tleS0+aXNMZXNzVGhh
bihvdGhlci5tX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlm
IChvdGhlci5tX2tleS0+aXNMZXNzVGhhbihtX2tleS5nZXQoKSkpCisgICAgICAgICAgICByZXR1
cm4gMTsKKworICAgICAgICBpZiAoIWlnbm9yZVNlcXVlbmNlTnVtYmVyKSB7CisgICAgICAgICAg
ICBpZiAoaW50NjRfdCB4ID0gbV9zZXF1ZW5jZU51bWJlciAtIG90aGVyLm1fc2VxdWVuY2VOdW1i
ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX2tleTsgLy8gRklYTUU6IFRoaXMg
aXMgdmVyeSBleHBlbnNpdmUuIFN0b3JlIGl0IGVuY29kZWQuCisgICAgaW50NjRfdCBtX3NlcXVl
bmNlTnVtYmVyOworfTsKKworY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBsZXZlbGRiOjpDb21w
YXJhdG9yIHsKK3B1YmxpYzoKKyAgICBpbnQgQ29tcGFyZShjb25zdCBsZXZlbGRiOjpTbGljZSYg
YSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgeSA9
IFJlYWxDb21wYXJlKGEsIGIpOworICAgICAgICByZXR1cm4geTsKKyAgICB9CisgICAgaW50IFhD
b21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikg
Y29uc3QKKyAgICB7CisgICAgICAgIGludCB4ID0gQ29tcGFyZShhLCBiKTsKKyAgICAgICAgcmV0
dXJuIHg7CisgICAgfQorICAgIGludCBDb21wYXJlSW5kZXhLZXlzKGNvbnN0IGxldmVsZGI6OlNs
aWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QKKyAgICB7CisgICAgICAgIGlu
dCB5ID0gUmVhbENvbXBhcmUoYSwgYiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB5OworICAgIH0K
KyAgICBpbnQgUmVhbENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNvbnN0IGxldmVs
ZGI6OlNsaWNlJiBiLCBib29sIGluZGV4S2V5cyA9IGZhbHNlKSBjb25zdAorICAgIHsKKyAgICAg
ICAgY29uc3QgY2hhciogcHRyQSA9IGEuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyKiBwdHJC
ID0gYi5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZEEgPSBwdHJBICsgYS5zaXplKCk7
CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBwdHJCICsgYi5zaXplKCk7CisKKyAgICAgICAg
S2V5UHJlZml4IHByZWZpeEE7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXhCOworCisgICAgICAg
IHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJBLCBlbmRBLCAmcHJlZml4QSk7CisgICAgICAg
IHB0ckIgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJCLCBlbmRCLCAmcHJlZml4Qik7CisgICAgICAg
IEFTU0VSVChwdHJBKTsKKyAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgIGlmIChpbnQg
eCA9IHByZWZpeEEuY29tcGFyZShwcmVmaXhCKSkKKyAgICAgICAgICAgIHJldHVybiB4OworCisg
ICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtHbG9iYWxNZXRhRGF0YSkg
eworICAgICAgICAgICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgICAgICBBU1NFUlQo
cHRyQiAhPSBlbmRCKTsKKworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUEgPSAq
cHRyQSsrOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOwor
CisgICAgICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPD0gMSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gMTAw
KSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBkYXRhYmFzZUZyZWVMaXN0
S2V5QTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5IGRhdGFiYXNlRnJlZUxp
c3RLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRl
Y29kZShwdHJBLCBlbmRBLCAmZGF0YWJhc2VGcmVlTGlzdEtleUEpOworICAgICAgICAgICAgICAg
IHB0ckIgPSBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkZWNvZGUocHRyQiwgZW5kQiwgJmRhdGFiYXNl
RnJlZUxpc3RLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlRnJl
ZUxpc3RLZXlBLmNvbXBhcmUoZGF0YWJhc2VGcmVlTGlzdEtleUIpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAyMDEpIHsKKyAgICAgICAgICAgICAgICBEYXRh
YmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5QTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZU5h
bWVLZXkgZGF0YWJhc2VOYW1lS2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEgPSBEYXRhYmFz
ZU5hbWVLZXk6OmRlY29kZShwdHJBLCBlbmRBLCAmZGF0YWJhc2VOYW1lS2V5QSk7CisgICAgICAg
ICAgICAgICAgcHRyQiA9IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZkYXRh
YmFzZU5hbWVLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlTmFt
ZUtleUEuY29tcGFyZShkYXRhYmFzZU5hbWVLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorCisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtEYXRhYmFzZU1l
dGFEYXRhKSB7CisgICAgICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsKKyAgICAgICAgICAg
IEFTU0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVC
eXRlQSA9ICpwdHJBKys7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQiA9ICpw
dHJCKys7CisKKyAgICAgICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikK
KyAgICAgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA8
PSAzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHR5cGVCeXRl
QSA9PSA1MCkgeworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURh
dGFLZXlBOworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURhdGFL
ZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRl
Y29kZShwdHJBLCBlbmRBLCAmbWV0YURhdGFLZXlBKTsKKyAgICAgICAgICAgICAgICBwdHJCID0g
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZtZXRhRGF0YUtleUIp
OworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFLZXlBLmNvbXBhcmUobWV0
YURhdGFLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0g
MTAwKSB7CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleUE7Cisg
ICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleUI7CisKKyAgICAgICAg
ICAgICAgICBwdHJBID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZtZXRh
RGF0YUtleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNv
ZGUocHRyQiwgZW5kQiwgJm1ldGFEYXRhS2V5Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0
ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJl
dHVybiBtZXRhRGF0YUtleUEuY29tcGFyZShtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAxNTApIHsKKyAgICAgICAgICAgICAgICBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0RW50cnlLZXlBOworICAgICAgICAgICAgICAgIE9i
amVjdFN0b3JlRnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUI7CisKKyAgICAgICAgICAgICAg
ICBwdHJBID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZmcmVl
TGlzdEVudHJ5S2V5QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRnJlZUxp
c3RLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmZnJlZUxpc3RFbnRyeUtleUIpOworICAgICAgICAg
ICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZnJlZUxpc3RFbnRyeUtleUEuY29tcGFyZShmcmVlTGlzdEVu
dHJ5S2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IDE1
MSkgeworICAgICAgICAgICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUE7
CisgICAgICAgICAgICAgICAgSW5kZXhGcmVlTGlzdEtleSBmcmVlTGlzdEVudHJ5S2V5QjsKKwor
ICAgICAgICAgICAgICAgIHB0ckEgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUocHRyQSwgZW5k
QSwgJmZyZWVMaXN0RW50cnlLZXlBKTsKKyAgICAgICAgICAgICAgICBwdHJCID0gSW5kZXhGcmVl
TGlzdEtleTo6ZGVjb2RlKHB0ckIsIGVuZEIsICZmcmVlTGlzdEVudHJ5S2V5Qik7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKwor
ICAgICAgICAgICAgICAgIHJldHVybiBmcmVlTGlzdEVudHJ5S2V5QS5jb21wYXJlKGZyZWVMaXN0
RW50cnlLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0g
MjAwKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0U3RvcmVOYW1lc0tleSBvYmplY3RTdG9yZU5h
bWVzS2V5QTsKKyAgICAgICAgICAgICAgICBPYmplY3RTdG9yZU5hbWVzS2V5IG9iamVjdFN0b3Jl
TmFtZXNLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6
OmRlY29kZShwdHJBLCBlbmRBLCAmb2JqZWN0U3RvcmVOYW1lc0tleUEpOworICAgICAgICAgICAg
ICAgIHB0ckIgPSBPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUocHRyQiwgZW5kQiwgJm9iamVj
dFN0b3JlTmFtZXNLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFN0
b3JlTmFtZXNLZXlBLmNvbXBhcmUob2JqZWN0U3RvcmVOYW1lc0tleUIpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSAyMDEpIHsKKyAgICAgICAgICAgICAgICBJ
bmRleE5hbWVzS2V5IGluZGV4TmFtZXNLZXlBOworICAgICAgICAgICAgICAgIEluZGV4TmFtZXNL
ZXkgaW5kZXhOYW1lc0tleUI7CisKKyAgICAgICAgICAgICAgICBwdHJBID0gSW5kZXhOYW1lc0tl
eTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZpbmRleE5hbWVzS2V5QSk7CisgICAgICAgICAgICAgICAg
cHRyQiA9IEluZGV4TmFtZXNLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmaW5kZXhOYW1lc0tleUIp
OworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhOYW1lc0tleUEuY29tcGFyZShp
bmRleE5hbWVzS2V5Qik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprT2JqZWN0U3RvcmVEYXRhKSB7CisgICAg
ICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAg
ICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBr
ZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgICAg
ICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVEYXRhS2V5QTsKKyAgICAgICAgICAgIE9i
amVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXlCOworCisgICAgICAgICAgICBwdHJB
ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocHRyQSwgZW5kQSwgJm9iamVjdFN0b3JlRGF0
YUtleUEpOworICAgICAgICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHB0
ckIsIGVuZEIsICZvYmplY3RTdG9yZURhdGFLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJB
KTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgcmV0dXJuIG9iamVj
dFN0b3JlRGF0YUtleUEuY29tcGFyZShvYmplY3RTdG9yZURhdGFLZXlCKTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprRXhpc3RzRW50cnkpIHsK
KyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAg
ICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1
c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAg
ICAgICAgIEV4aXN0c0VudHJ5S2V5IGV4aXN0c0VudHJ5S2V5QTsKKyAgICAgICAgICAgIEV4aXN0
c0VudHJ5S2V5IGV4aXN0c0VudHJ5S2V5QjsKKworICAgICAgICAgICAgcHRyQSA9IEV4aXN0c0Vu
dHJ5S2V5OjpkZWNvZGUocHRyQSwgZW5kQSwgJmV4aXN0c0VudHJ5S2V5QSk7CisgICAgICAgICAg
ICBwdHJCID0gRXhpc3RzRW50cnlLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmZXhpc3RzRW50cnlL
ZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJC
KTsKKworICAgICAgICAgICAgcmV0dXJuIGV4aXN0c0VudHJ5S2V5QS5jb21wYXJlKGV4aXN0c0Vu
dHJ5S2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVBy
ZWZpeDo6a0luZGV4RGF0YSkgeworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJC
ID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAocHRy
QSA9PSBlbmRBKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChw
dHJCID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNh
c2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxl
ZCB0aGlzIHdheS4KKworICAgICAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleUE7Cisg
ICAgICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QjsKKworICAgICAgICAgICAgcHRy
QSA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHB0ckEsIGVuZEEsICZpbmRleERhdGFLZXlBKTsKKyAg
ICAgICAgICAgIHB0ckIgPSBJbmRleERhdGFLZXk6OmRlY29kZShwdHJCLCBlbmRCLCAmaW5kZXhE
YXRhS2V5Qik7CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICBBU1NFUlQo
cHRyQik7CisKKyAgICAgICAgICAgIGJvb2wgaWdub3JlU2VxdWVuY2VOdW1iZXIgPSBpbmRleEtl
eXM7CisgICAgICAgICAgICByZXR1cm4gaW5kZXhEYXRhS2V5QS5jb21wYXJlKGluZGV4RGF0YUtl
eUIsIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFy
KiBOYW1lKCkgY29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQorICAgIHZvaWQgRmluZFNob3J0
ZXN0U2VwYXJhdG9yKHN0ZDo6c3RyaW5nKiwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmKSBjb25zdCB7
fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCisgICAgdm9pZCBGaW5kU2hvcnRTdWNj
ZXNzb3Ioc3RkOjpzdHJpbmcqKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFs
bHkuCit9IGNvbXBhcmF0b3I7Cit9CisKK3N0YXRpYyBib29sIHNldFVwTWV0YWRhdGEobGV2ZWxk
Yjo6REIqIGRiKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGFEYXRhS2V5ID0gbWFrZUtl
eSgwLCAwLCAwLCAwKTsKKworICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbjsKKyAgICBpZiAoIWdl
dEludChkYiwgbWV0YURhdGFLZXksICZzY2hlbWFWZXJzaW9uKSkgeworICAgICAgICBzY2hlbWFW
ZXJzaW9uID0gMDsKKyAgICAgICAgaWYgKCFwdXRJbnQoZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFW
ZXJzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc2No
ZW1hVmVyc2lvbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBEb24ndCBrbm93IHdoYXQgdG8g
ZG8gd2l0aCB0aGlzIHZlcnNpb24uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0
cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlP
cmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1h
eGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2Vu
ZEltcGwqIGZhY3RvcnkpCit7CisgICAgU3RyaW5nIHBhdGhCYXNlMiA9IHBhdGhCYXNlOworCisg
ICAgaWYgKHBhdGhCYXNlMi5pc0VtcHR5KCkpCisgICAgICAgIHBhdGhCYXNlMiA9ICIvdG1wL2lu
LW1lbS1sZXZlbGRiIjsgLy8gRklYTUU6IERvbid0IGxhbmQgdGhpcyEgT25seSBmb3IgdGVzdGlu
Zy4KKworICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNlMikpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIEluZGV4ZWREQiBkYXRhYmFzZSBwYXRoICVzIiwg
cGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkIHVzZSBhIHNpbmdsZSBMZXZlbCBEQiBmb3IgYWxsIG9yaWdpbnMu
CisgICAgU3RyaW5nIHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UyLCBz
ZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRi
Iik7CisKKyAgICBsZXZlbGRiOjpEQiogZGI7CisgICAgbGV2ZWxkYjo6T3B0aW9ucyBvcHRpb25z
OworICAgIG9wdGlvbnMuY29tcGFyYXRvciA9ICZjb21wYXJhdG9yOworICAgIG9wdGlvbnMuY3Jl
YXRlX2lmX21pc3NpbmcgPSB0cnVlOworICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBsZXZl
bGRiOjpEQjo6T3BlbihvcHRpb25zLCBwYXRoLnV0ZjgoKS5kYXRhKCksICZkYik7CisKKyAgICBp
ZiAoIXN0YXR1cy5vaygpKSB7CisgICAgICAgIC8vIEZJWE1FOiBJZiBjb21wYXJhdG9yIG5hbWUg
Y2hhbmdlZCwgYmxvdyBhd2F5IHRoZSBvbGQgZGF0YWJhc2UgYW5kIHN0YXJ0IGEgbmV3IG9uZS4K
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUmVmUHRyPElEQkxldmVsREJCYWNraW5n
U3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShm
aWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CisKKyAgICBpZiAoIXNldFVwTWV0YWRhdGEo
YmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1
cm4gYmFja2luZ1N0b3JlLnJlbGVhc2UoKTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmlu
ZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKQoreworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIGtleSA9IEtleVByZWZpeCgwLCAwLCAwKS5lbmNvZGUoKSArIERhdGFiYXNlTmFtZUtleSht
X2lkZW50aWZpZXIsIG5hbWUpLmVuY29kZSgpOworICAgIGJvb2wgb2sgPSBnZXRJbnQobV9kYi5n
ZXQoKSwga2V5LCAmZm91bmRJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShmb3VuZElkLCAwLCAw
LCAyKSwgJmZvdW5kVmVyc2lvbik7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld0RhdGFiYXNl
SWQobGV2ZWxkYjo6REIqIGRiKQoreworICAgIC8vIExvb2sgaW4gZnJlZS1saXN0LgorICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gS2V5UHJlZml4KDAsIDAsIDApLmVuY29kZSgpICsg
RGF0YWJhc2VGcmVlTGlzdEtleTo6Zmlyc3RLZXkoKS5lbmNvZGUoKTsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBzdG9wS2V5ID0gS2V5UHJlZml4KDAsIDAsIDApLmVuY29kZSgpICsgRGF0YWJhc2VG
cmVlTGlzdEtleTo6bGFzdEtleSgpLmVuY29kZSgpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0
ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAg
IGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBh
cmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgS2V5UHJl
Zml4IGtleVByZWZpeDsKKworICAgICAgICBjb25zdCBjaGFyICpwID0gaXQtPmtleSgpLmRhdGEo
KTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBwICsgaXQtPmtleSgpLnNpemUoKTsKKwor
ICAgICAgICBwID0gS2V5UHJlZml4OjpkZWNvZGUocCwgbGltaXQsICZrZXlQcmVmaXgpOworICAg
ICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7
CisgICAgICAgIEFTU0VSVCh0eXBlQnl0ZSA9PSAxMDApOworCisgICAgICAgIERhdGFiYXNlRnJl
ZUxpc3RLZXkgZnJlZUxpc3RLZXk7CisgICAgICAgIHAgPSBEYXRhYmFzZUZyZWVMaXN0S2V5Ojpk
ZWNvZGUocCwgbGltaXQsICZmcmVlTGlzdEtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAg
ICAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBmcmVlTGlzdEtleS5tX2RhdGFiYXNlSWQ7CisKKyAg
ICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9u
cygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICByZXR1
cm4gZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2Fz
IG5vIGZyZWUtbGlzdC4KKyAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQ7CisgICAgaWYgKCFnZXRJ
bnQoZGIsIG1ha2VLZXkoMCwgMCwgMCwgMSksICZtYXhEYXRhYmFzZUlkKSkKKyAgICAgICAgbWF4
RGF0YWJhc2VJZCA9IDA7CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFzZUlk
ICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KDAsIDAsIDAsIDEpLCBkYXRh
YmFzZUlkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1
cm4gZGF0YWJhc2VJZDsKKworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElE
QkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNp
b24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK3sKKyAgICBpZiAoaW52YWxp
ZFJvd0lkKSB7CisgICAgICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJhc2VJZChtX2RiLmdldCgpKTsK
KworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBLZXlQcmVmaXgoMCwgMCwgMCkuZW5j
b2RlKCkgKyBEYXRhYmFzZU5hbWVLZXkobV9pZGVudGlmaWVyLCBuYW1lKS5lbmNvZGUoKTsKKyAg
ICAgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCByb3dJZCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgbWFr
ZUtleShyb3dJZCwgMCwgMCwgMiksIHZlcnNpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRP
YmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRz
LCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0
aHMsIFZlY3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpCit7CisgICAgc3RkOjpz
dHJpbmcgc3RhcnRLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCAxLCAwKTsKKyAg
ICBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCA1MSk7CisK
KyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVs
ZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZh
bGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+
TmV4dCgpKSB7CisgICAgICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICAgICAgY29uc3QgY2hhciAq
cCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwg
Yyk7CisgICAgICAgIEFTU0VSVChhID09IGRhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIWIp
OworICAgICAgICBBU1NFUlQoIWMpOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZCA9ICpwKys7
CisgICAgICAgIEFTU0VSVF9VTlVTRUQoZCwgZCA9PSA1MCk7CisKKyAgICAgICAgaW50NjRfdCBv
YmplY3RTdG9yZUlkOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGl0LT5rZXkoKS5kYXRh
KCkgKyBpdC0+a2V5KCkuc2l6ZSgpLCAmb2JqZWN0U3RvcmVJZCk7CisKKyAgICAgICAgU3RyaW5n
IG9iamVjdFN0b3JlTmFtZSA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5kYXRhKCksIGl0LT52
YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSk7CisgICAgICAgIGl0LT5OZXh0KCk7
CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiaXQg
bm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBT
dHJpbmcga2V5UGF0aCA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5kYXRhKCksIGl0LT52YWx1
ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSk7CisgICAgICAgIGl0LT5OZXh0KCk7Cisg
ICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiaXQgbm90
IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBib29s
IGF1dG9JbmNyZW1lbnQgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOworICAgICAgICBpdC0+TmV4dCgp
OworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0
IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAg
Ly8gSXMgZXZpY2F0YWJsZQorICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5W
YWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gTGFzdCB2ZXJzaW9uCisgICAg
ICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAg
IExPR19FUlJPUigiaXQgbm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICAvLyBNYXhpbXVtIGluZGV4IGlkIGV2ZXIgYWxsb2NhdGVkCisKKyAgICAg
ICAgZm91bmRJZHMuYXBwZW5kKG9iamVjdFN0b3JlSWQpOworICAgICAgICBmb3VuZE5hbWVzLmFw
cGVuZChvYmplY3RTdG9yZU5hbWUpOworICAgICAgICBmb3VuZEtleVBhdGhzLmFwcGVuZChrZXlQ
YXRoKTsKKyAgICAgICAgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MuYXBwZW5kKGF1dG9JbmNyZW1l
bnQpOworICAgIH0KK30KKworc3RhdGljIGludDY0X3QgZ2V0TmV3T2JqZWN0U3RvcmVJZChsZXZl
bGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKK3sKKyAgICAvLyBMb29rIGluIGZyZWUt
bGlzdC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IEtleVByZWZpeChkYXRhYmFz
ZUlkLCAwLCAwKS5lbmNvZGUoKSArIE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmZpcnN0S2V5KCku
ZW5jb2RlKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IEtleVByZWZpeChkYXRh
YmFzZUlkLCAwLCAwKS5lbmNvZGUoKSArIE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6Omxhc3RLZXko
KS5lbmNvZGUoKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0
ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0
S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtl
eSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIEtleVByZWZpeCBrZXlQcmVmaXg7CisKKyAg
ICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNo
YXIqIGxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAgcCA9IEtleVByZWZp
eDo6ZGVjb2RlKHAsIGxpbWl0LCAma2V5UHJlZml4KTsKKyAgICAgICAgQVNTRVJUKHApOworCisg
ICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlQodHlw
ZUJ5dGUgPT0gMTUwKTsKKworICAgICAgICBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0
S2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0
LCAmZnJlZUxpc3RLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaW50NjRfdCBv
YmplY3RTdG9yZUlkID0gZnJlZUxpc3RLZXkubV9vYmplY3RTdG9yZUlkOworCisgICAgICAgIGxl
dmVsZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQt
PmtleSgpKTsKKyAgICAgICAgQVNTRVJUKHMub2soKSk7CisKKyAgICAgICAgcmV0dXJuIG9iamVj
dFN0b3JlSWQ7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZXJlIHdhcyBubyBm
cmVlLWxpc3QuCisgICAgaW50NjRfdCBtYXhPYmplY3RTdG9yZUlkOworICAgIGlmICghZ2V0SW50
KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDMpLCAmbWF4T2JqZWN0U3RvcmVJZCkpCisg
ICAgICAgIG1heE9iamVjdFN0b3JlSWQgPSAwOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlk
ID0gbWF4T2JqZWN0U3RvcmVJZCArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbWFrZUtl
eShkYXRhYmFzZUlkLCAwLCAwLCAzKSwgb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIG9iamVjdFN0b3JlSWQ7Cit9CisKK2Jv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRh
YmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBh
dXRvSW5jcmVtZW50LCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpCit7CisgICAgaW50
NjRfdCBvYmplY3RTdG9yZUlkID0gZ2V0TmV3T2JqZWN0U3RvcmVJZChtX2RiLmdldCgpLCBkYXRh
YmFzZUlkKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVLZXkgPSBLZXlQcmVmaXgoZGF0
YWJhc2VJZCwgMCwgMCkuZW5jb2RlKCkgKyBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KG9iamVjdFN0
b3JlSWQsIDApLmVuY29kZSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleVBhdGhLZXkgPSBL
ZXlQcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCkuZW5jb2RlKCkgKyBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5KG9iamVjdFN0b3JlSWQsIDEpLmVuY29kZSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGF1
dG9JbmNyZW1lbnRLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCkuZW5jb2RlKCkgKyBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5KG9iamVjdFN0b3JlSWQsIDIpLmVuY29kZSgpOworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIGV2aWN0YWJsZUtleSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCAwLCAw
KS5lbmNvZGUoKSArIE9iamVjdFN0b3JlTWV0YURhdGFLZXkob2JqZWN0U3RvcmVJZCwgMykuZW5j
b2RlKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGFzdFZlcnNpb25LZXkgPSBLZXlQcmVmaXgo
ZGF0YWJhc2VJZCwgMCwgMCkuZW5jb2RlKCkgKyBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KG9iamVj
dFN0b3JlSWQsIDQpLmVuY29kZSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1heEluZGV4SWRL
ZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCkuZW5jb2RlKCkgKyBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KG9iamVjdFN0b3JlSWQsIDUpLmVuY29kZSgpOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIG5hbWVzS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIDAsIDApLmVuY29kZSgpICsgT2Jq
ZWN0U3RvcmVOYW1lc0tleShuYW1lKS5lbmNvZGUoKTsKKworICAgIGJvb2wgb2sgPSBwdXRTdHJp
bmcobV9kYi5nZXQoKSwgbmFtZUtleSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBM
T0dfRVJST1IoImZhaWxlZCB0byBzZXQgbmFtZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0
aCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQga2V5
IHBhdGgiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50
KG1fZGIuZ2V0KCksIGF1dG9JbmNyZW1lbnRLZXksIGF1dG9JbmNyZW1lbnQpOworICAgIGlmICgh
b2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGF1dG8gaW5jcmVtZW50Iik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdl
dCgpLCBldmljdGFibGVLZXksIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19F
UlJPUigiZmFpbGVkIHRvIHNldCBldmljdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIGxhc3RWZXJzaW9uS2V5LCAxKTsK
KyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBsYXN0IHZl
cnNpb24gbnVtYmVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogTm90IHN1cmUgd2UgZXZlbiBuZWVkIHRvIHNldCB0aGlzPworICAgIG9rID0gcHV0SW50
KG1fZGIuZ2V0KCksIG1heEluZGV4SWRLZXksIDMwKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAg
IExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBtYXggaW5kZXggaWQiKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG5hbWVzS2V5LCBv
YmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVk
IHRvIHNldCBvYmplY3Qgc3RvcmUgaWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCA9IG9iamVjdFN0b3JlSWQ7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UobGV2ZWxkYjo6REIqIGRiLCBj
b25zdCBzdGQ6OnN0cmluZyYgYmVnaW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmQpCit7CisgICAg
Ly8gRklYTUU6IFVzZSBzb21lIHNvcnQgb2YgYnVsayBkZWxldGUgb3BlcmF0aW9uIGZpcnN0Pwor
CisgICAgbGV2ZWxkYjo6V3JpdGVCYXRjaCBiYXRjaDsKKworICAgIE93blB0cjxsZXZlbGRiOjpJ
dGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAg
ICBmb3IgKGl0LT5TZWVrKGJlZ2luKTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5YQ29tcGFy
ZShpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+TmV4dCgpKQorICAgICAgICBiYXRjaC5EZWxldGUo
aXQtPmtleSgpKTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPldyaXRlKGxldmVsZGI6
OldyaXRlT3B0aW9ucygpLCAmYmF0Y2gpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCkKK3sKKyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOworICAgIGdldFN0cmlu
ZyhtX2RiLmdldCgpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9yZUlk
LCAwKSwgJm9iamVjdFN0b3JlTmFtZSk7CisKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3Jp
dGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQs
IDApKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXko
ZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDEpKTsKKyAgICBtX2RiLT5EZWxl
dGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAs
IG9iamVjdFN0b3JlSWQsIDIpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRp
b25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDMpKTsK
KyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJh
c2VJZCwgMCwgMCwgNTAsIG9iamVjdFN0b3JlSWQsIDQpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2
ZWxkYjo6V3JpdGVPcHRpb25zKCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgNTAsIG9iamVj
dFN0b3JlSWQsIDUpKTsKKworICAgIC8vIEluc2VydCBpbnRvIGZyZWUtbGlzdC4KKyAgICBwdXRT
dHJpbmcobV9kYi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTAsIG9iamVjdFN0
b3JlSWQpLCAiIik7CisKKyAgICAvLyBGSVhNRTogRGVsZXRlIHRoZSBvYmplY3Qgc3RvcmUgbmFt
ZSBmcm9tIHRoZSBtYXBwaW5nICh3ZSBuZWVkIHRvIGxvb2sgaXQgdXApCisgICAgbV9kYi0+RGVs
ZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDIw
MCwgb2JqZWN0U3RvcmVOYW1lKSk7CisKKyAgICAvLyBXZSBjb3VsZCBqdXN0IGRvIG9uZSBiaWcg
ZGVsZXRlUmFuZ2UgZm9yIHRoZSBzdHVmZiBiZWxvdy4uLgorCisgICAgLy8gT2JqZWN0IHN0b3Jl
IGRhdGEsIGV4aXN0cyBkYXRhLCBpbmRleCBkYXRhLgorICAgIGlmICghZGVsZXRlUmFuZ2UobV9k
Yi5nZXQoKSwgbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgbWFrZUtleShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkpKQorICAgICAgICByZXR1cm47IC8vIEZJ
WE1FOiBSZXBvcnQgZXJyb3IuCisKKyAgICAvLyBJbmRleCBpZCBmcmVlLWxpc3QKKyAgICBpZiAo
IWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIG1ha2VLZXkoZGF0YWJhc2VJZCwgMCwgMCwgMTUxLCBv
YmplY3RTdG9yZUlkKSwgbWFrZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxNTEsIG9iamVjdFN0b3Jl
SWQgKyAxKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKworICAg
IC8vIEluZGV4IG1ldGEtZGF0YQorICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgbWFr
ZUtleShkYXRhYmFzZUlkLCAwLCAwLCAxMDAsIG9iamVjdFN0b3JlSWQsIDAsIDApLCBtYWtlS2V5
KGRhdGFiYXNlSWQsIDAsIDAsIDEwMCwgb2JqZWN0U3RvcmVJZCArIDEsIDAsIDApKSkKKyAgICAg
ICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorCit9CisKK1N0cmluZyBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZl
bGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRi
S2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBzdGF0aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsK
KyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0
cigpICsgZGF0YS5sZW5ndGgoKSwgJnZlcnNpb24pOworCisgICAgcmV0dXJuIGRlY29kZVN0cmlu
ZyhwLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKTsKK30KKworbmFtZXNwYWNlIHsKK2Ns
YXNzIExldmVsREJSZWNvcmRIYW5kbGUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RT
dG9yZVJlY29yZEhhbmRsZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlJlY29yZEhhbmRsZShjb25z
dCBzdGQ6OnN0cmluZyYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtl
eShwcmltYXJ5S2V5KSwgbV92ZXJzaW9uKHZlcnNpb24pIHt9CisgICAgc3RkOjpzdHJpbmcgcHJp
bWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIGludDY0X3QgdmVy
c2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorcHJpdmF0ZToKKyAgICBzdGQ6OnN0
cmluZyBtX3ByaW1hcnlLZXk7IC8vIHRoZSByZXN1bHQgb2YgZW5jb2RlS2V5KElEQktleSkgYmFz
aWNhbGx5LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGljIGludDY0X3Qg
Z2V0TmV3VmVyc2lvbk51bWJlcihsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxhc3RWZXJz
aW9uS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIDAsIDApLmVuY29kZSgpICsgT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleShvYmplY3RTdG9yZUlkLCA0KS5lbmNvZGUoKTsKKworICAgIGludDY0X3Qg
bGFzdFZlcnNpb247CisgICAgaWYgKCFnZXRJbnQoZGIsIGxhc3RWZXJzaW9uS2V5LCAmbGFzdFZl
cnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBBU1NFUlQobGFzdFZlcnNp
b24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lvbiArIDE7CisgICAg
Ym9vbCBvayA9IHB1dEludChkYiwgbGFzdFZlcnNpb25LZXksIHZlcnNpb24pOworICAgIEFTU0VS
VChvayk7CisKKyAgICAvLyBGSVhNRTogRGV0ZWN0IG92ZXJmbG93PyBOb3QgbXVjaCB3ZSBjYW4g
ZG8gYWJvdXQgaXQgYW55d2F5Li4uPyBBbmQgaXQgcHJvYmFibHkgaXNuJ3QgYSBjYXRhc3Ryb3Bo
ZSBhbnl3YXkuLi4KKworICAgIHJldHVybiB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgcmVjb3JkSGFuZGxlKQoreworICAg
IGludDY0X3QgdmVyc2lvbiA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVk
YXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxLCBlbmNvZGVLZXko
a2V5KSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPlB1dChsZXZlbGRiOjpXcml0
ZU9wdGlvbnMoKSwgb2JqZWN0U3RvcmVkYXRhS2V5LCBlbmNvZGVWYXJJbnQodmVyc2lvbikgKyBl
bmNvZGVTdHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhpc3RzRW50cnlLZXkgPSBtYWtlS2V5KGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIsIGVuY29kZUtleShrZXkpKTsKKworICAgIHMgPSBt
X2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJ
bnQodmVyc2lvbikpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8v
IEZJWE1FOiBJZGVhbGx5LCB3ZSB3YW50IHRvIHJvbGwgYmFjayB0aGUgcHV0IGFib3ZlPworCisg
ICAgcmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRIYW5kbGUoZW5jb2Rl
S2V5KGtleSksIHZlcnNpb24pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0g
S2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLmVuY29kZSgpOworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCArIDEsIDApLmVuY29kZSgpOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICBkZWxldGVSYW5n
ZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiByZWNv
cmRIYW5kbGUpCit7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSYgbGV2ZWxEQlJlY29y
ZEhhbmRsZSA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUmPihyZWNvcmRI
YW5kbGUpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgMSwgbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCkpOworCisg
ICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25z
KCksIGtleSk7Cit9CisKK2RvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0lu
Y3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkK
K3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IEtleVByZWZpeChkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCAxKS5lbmNvZGUoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9w
S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIpLmVuY29kZSgpOwor
CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZl
bGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAgICBpbnQgbWF4TnVtZXJpY0tleSA9IDA7CisKKyAg
ICAvLyBGSVhNRTogQmUgc21hcnRlcjogc2VlayB0byBzb21ldGhpbmcgYWZ0ZXIgdGhlIG9iamVj
dCBzdG9yZSBkYXRhLCB0aGVuIHJldmVyc2UuCisKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5
KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkg
PCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuZGF0
YSgpOworICAgICAgICBjb25zdCBjaGFyICpsaW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgpOwor
CisgICAgICAgIEtleVByZWZpeCBrZXlQcmVmaXg7CisgICAgICAgIHAgPSBLZXlQcmVmaXg6OmRl
Y29kZShwLCBsaW1pdCwgJmtleVByZWZpeCk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAg
ICBPYmplY3RTdG9yZURhdGFLZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0
YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YUtleSk7CisKKyAgICAgICAgaWYgKGRhdGFLZXku
bV9rZXktPnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpIHsKKyAgICAgICAgICAgIGludDY0
X3QgbiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGRhdGFLZXkubV9rZXktPm51bWJlcigpKTsKKyAg
ICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAgICAgICAgICAgICBtYXhOdW1l
cmljS2V5ID0gbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhOdW1lcmljS2V5
ICsgMTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVj
dFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJ
REJLZXkmIGtleSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgZm91bmRSZWNvcmRI
YW5kbGUpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KGtleSkpOworICAgIHN0ZDo6c3Ry
aW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpS
ZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBkZWNvZGVWYXJJ
bnQoZGF0YS5jX3N0cigpLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpLCAmdmVyc2lvbik7
CisKKyAgICBmb3VuZFJlY29yZEhhbmRsZSA9IGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFu
ZGxlKGVuY29kZUtleShrZXkpLCB2ZXJzaW9uKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENh
bGxiYWNrJiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IEtl
eVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAxKS5lbmNvZGUoKTsKKyAgICBjb25z
dCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDIpLmVuY29kZSgpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2Ri
LT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2Vl
ayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCks
IHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBjb25zdCBjaGFyICpwID0gaXQt
PmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBwICsgaXQtPmtleSgp
LnNpemUoKTsKKworICAgICAgICBLZXlQcmVmaXgga2V5UHJlZml4OworICAgICAgICBwID0gS2V5
UHJlZml4OjpkZWNvZGUocCwgbGltaXQsICZrZXlQcmVmaXgpOworICAgICAgICBBU1NFUlQocCk7
CisKKyAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IGRhdGFLZXk7CisgICAgICAgIHAgPSBPYmpl
Y3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOworICAgICAgICBBU1NF
UlQocCk7CisKKyAgICAgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9IGRhdGFLZXkubV9r
ZXk7CisKKyAgICAgICAgaW50NjRfdCB2ZXJzaW9uOworICAgICAgICBjb25zdCBjaGFyKiBxID0g
ZGVjb2RlVmFySW50KGl0LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQt
PnZhbHVlKCkuc2l6ZSgpLCAmdmVyc2lvbik7CisKKyAgICAgICAgUmVmUHRyPExldmVsREJSZWNv
cmRIYW5kbGU+IHJoKGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSGFuZGxlKGVuY29kZUtleSgq
cHJpbWFyeUtleSksIHZlcnNpb24pKSk7CisgICAgICAgIFN0cmluZyBpZGJWYWx1ZSA9IGRlY29k
ZVN0cmluZyhxLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisg
ICAgICAgIGNhbGxiYWNrLmNhbGxiYWNrKCpyaCwgaWRiVmFsdWUpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90
PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYg
Zm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQoreworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIDAsIDApLmVu
Y29kZSgpICsgSW5kZXhNZXRhRGF0YUtleShvYmplY3RTdG9yZUlkLCAwLCAwKS5lbmNvZGUoKTsK
KyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIDAs
IDApLmVuY29kZSgpICsgSW5kZXhNZXRhRGF0YUtleShvYmplY3RTdG9yZUlkICsgMSwgMCwgMCku
ZW5jb2RlKCk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0
ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0
S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtl
eSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCku
ZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgp
OworCisgICAgICAgIEtleVByZWZpeCBrZXlQcmVmaXg7CisgICAgICAgIHAgPSBLZXlQcmVmaXg6
OmRlY29kZShwLCBsaW1pdCwgJmtleVByZWZpeCk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAg
ICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVC
eXRlID09IDEwMCk7CisKKyAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKKyAg
ICAgICAgcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRhS2V5
KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGludDY0X3QgaW5kZXhJZCA9IG1ldGFE
YXRhS2V5Lm1faW5kZXhJZDsKKworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3Ry
aW5nKGl0LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCku
c2l6ZSgpKTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkg
eworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAqaXQtPnZhbHVl
KCkuZGF0YSgpOworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgp
KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJp
bmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5z
aXplKCkpOworCisgICAgICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElkKTsKKyAgICAgICAgZm91
bmROYW1lcy5hcHBlbmQoaW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQo
a2V5UGF0aCk7CisgICAgICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKGluZGV4VW5pcXVlKTsK
KyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld0luZGV4SWQobGV2ZWxkYjo6REIqIGRi
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICAvLyBM
b29rIGluIGZyZWUtbGlzdC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IEtleVBy
ZWZpeChkYXRhYmFzZUlkLCAwLCAwKS5lbmNvZGUoKSArIEluZGV4RnJlZUxpc3RLZXkob2JqZWN0
U3RvcmVJZCwgMCkuZW5jb2RlKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IEtl
eVByZWZpeChkYXRhYmFzZUlkLCAwLCAwKS5lbmNvZGUoKSArIEluZGV4RnJlZUxpc3RLZXkob2Jq
ZWN0U3RvcmVJZCArIDEsIDApLmVuY29kZSgpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJh
dG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZv
ciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUo
aXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gcCAr
IGl0LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAgS2V5UHJlZml4IGtleVByZWZpeDsKKyAgICAg
ICAgcCA9IEtleVByZWZpeDo6ZGVjb2RlKHAsIGxpbWl0LCAma2V5UHJlZml4KTsKKyAgICAgICAg
QVNTRVJUKHApOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAg
ICAgICBBU1NFUlQodHlwZUJ5dGUgPT0gMTUxKTsKKworICAgICAgICBJbmRleEZyZWVMaXN0S2V5
IGZyZWVMaXN0S2V5OworICAgICAgICBwID0gSW5kZXhGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxp
bWl0LCAmZnJlZUxpc3RLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaW50NjRf
dCBpbmRleElkID0gZnJlZUxpc3RLZXkubV9pbmRleElkOworICAgICAgICBBU1NFUlQoaW5kZXhJ
ZCA+PSAzMCk7CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVs
ZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsK
KworICAgICAgICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAgICAgIHJldHVybiBpbmRleElk
OworICAgIH0KKworICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0
LgorICAgIGludDY0X3QgbWF4SW5kZXhJZDsKKyAgICBpZiAoIWdldEludChkYiwgbWFrZUtleShk
YXRhYmFzZUlkLCAwLCAwLCA1MCwgb2JqZWN0U3RvcmVJZCwgNSksICZtYXhJbmRleElkKSkKKyAg
ICAgICAgbWF4SW5kZXhJZCA9IDMwOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IGl0IHN0YXJ0cyBh
dCAzMCEhCisKKyAgICBpbnQ2NF90IGluZGV4SWQgPSBtYXhJbmRleElkICsgMTsKKyAgICBib29s
IG9rID0gcHV0SW50KGRiLCBtYWtlS2V5KGRhdGFiYXNlSWQsIDAsIDAsIDUwLCBvYmplY3RTdG9y
ZUlkLCA1KSwgaW5kZXhJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgcmV0dXJuIGluZGV4SWQ7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNv
bnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBp
bnQ2NF90JiBpbmRleElkKQoreworICAgIGluZGV4SWQgPSBnZXROZXdJbmRleElkKG1fZGIuZ2V0
KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcg
bmFtZUtleSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCAwLCAwKS5lbmNvZGUoKSArIEluZGV4TWV0
YURhdGFLZXkob2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCkuZW5jb2RlKCk7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcgdW5pcXVlS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIDAsIDApLmVuY29k
ZSgpICsgSW5kZXhNZXRhRGF0YUtleShvYmplY3RTdG9yZUlkLCBpbmRleElkLCAxKS5lbmNvZGUo
KTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXlQYXRoS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNl
SWQsIDAsIDApLmVuY29kZSgpICsgSW5kZXhNZXRhRGF0YUtleShvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCAyKS5lbmNvZGUoKTsKKworICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwg
bmFtZUtleSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxl
ZCB0byBzZXQgaW5kZXggbmFtZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgdW5pcXVlS2V5LCBpc1VuaXF1ZSk7CisgICAgaWYg
KCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgaXNfdW5pcXVlIik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dFN0cmluZyhtX2RiLmdl
dCgpLCBrZXlQYXRoS2V5LCBrZXlQYXRoKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19F
UlJPUigiZmFpbGVkIHRvIHNldCBrZXkgcGF0aCIpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6
IEltcGxlbWVudC4gSXNuJ3QgdGhpcyB1c2VkPyBPciBkbyB3ZSBub3QgdGVzdCBmb3IgaXQ/Cisg
ICAgcmV0dXJuOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0
YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRI
YW5kbGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICBBU1NFUlQoaW5kZXhJZCA+PSAzMCk7CisgICAg
Y29uc3QgTGV2ZWxEQlJlY29yZEhhbmRsZSYgbGV2ZWxEQlJlY29yZEhhbmRsZSA9IHN0YXRpY19j
YXN0PGNvbnN0IExldmVsREJSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOworCisgICAgY29u
c3QgaW50NjRfdCBnbG9iYWxTZXF1ZW5jZU51bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9k
Yi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJp
bmcgaW5kZXhEYXRhS2V5ID0gbWFrZUtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBlbmNvZGVLZXkoa2V5KSwgZ2xvYmFsU2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0IHN0
ZDo6c3RyaW5nIGRhdGEgPSBlbmNvZGVWYXJJbnQobGV2ZWxEQlJlY29yZEhhbmRsZS52ZXJzaW9u
KCkpICsgbGV2ZWxEQlJlY29yZEhhbmRsZS5wcmltYXJ5S2V5KCk7CisKKyAgICByZXR1cm4gbV9k
Yi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpbmRleERhdGFLZXksIGRhdGEpLm9rKCk7
Cit9CisKK3N0YXRpYyBib29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKGxldmVsZGI6OkRCKiBk
YiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQorewor
ICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6
OlJlYWRPcHRpb25zKCkpKTsKKyAgICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAgaWYgKCFpdC0+
VmFsaWQoKSkgeworICAgICAgICBpdC0+U2Vla1RvTGFzdCgpOworICAgICAgICBpZiAoIWl0LT5W
YWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChj
b21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID49IDApIHsKKyAg
ICAgICAgaXQtPlByZXYoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqZm91bmRLZXkgPSBpdC0+a2V5KCkuVG9TdHJp
bmcoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5k
bGUmIHJlY29yZEhhbmRsZSkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQgc2lu
Y2Ugd2UgaW52YWxpZGF0ZSBpbmRleCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVjaGFu
aXNtLgorICAgIHJldHVybiB0cnVlOworfQorCitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgUmVmUHRy
PElEQktleT4gcHJpbWFyeUtleSA9IGdldFByaW1hcnlLZXlWaWFJbmRleChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOworICAgIGlmICghcHJpbWFyeUtleSkKKyAgICAg
ICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJuIGdldE9iamVjdFN0b3JlUmVjb3JkKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpwcmltYXJ5S2V5KTsKK30KKworc3RhdGljIGJvb2wg
dmVyc2lvbkV4aXN0cyhsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNv
ZGVkUHJpbWFyeUtleSkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBLZXlQcmVmaXgo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMikuZW5jb2RlKCkgKyBlbmNvZGVkUHJpbWFyeUtl
eTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+
R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGtleSwgJmRhdGEpOworICAgIGlmICghcy5vaygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGVjb2RlSW50KGRhdGEpID09
IHZlcnNpb247Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5PiBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgT3du
UHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFk
T3B0aW9ucygpKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9IG1ha2VLZXko
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KGtleSkpOworICAg
IGl0LT5TZWVrKGxldmVsZGJLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0
LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjb21wYXJhdG9y
LkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCisgICAgICAgICAg
ICByZXR1cm4gMDsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNo
YXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRh
KCkgKyBpdC0+dmFsdWUoKS5zaXplKCksICZ2ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpzdHJpbmcg
ZW5jb2RlZFByaW1hcnlLZXkgPSBzdGQ6OnN0cmluZyhwLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBp
dC0+dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyhtX2RiLmdl
dCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJpbWFyeUtl
eSkpIHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBj
b250aW51ZS4KKyAgICAgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMo
KSwgaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7Cisg
ICAgICAgIGRlY29kZUtleShlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpLCBlbmNvZGVkUHJpbWFy
eUtleS5jX3N0cigpICsgZW5jb2RlZFByaW1hcnlLZXkubGVuZ3RoKCksICZwcmltYXJ5S2V5KTsK
KyAgICAgICAgcmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KK30KKworYm9vbCBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYg
a2V5KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsREJLZXkgPSBtYWtlS2V5KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUtleShrZXkpKTsKKyAgICBPd25Q
dHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRP
cHRpb25zKCkpKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIGl0LT5TZWVrKGxl
dmVsREJLZXkpOworICAgIGlmIChpdC0+VmFsaWQoKSAmJiAhY29tcGFyYXRvci5Db21wYXJlSW5k
ZXhLZXlzKGl0LT5rZXkoKS5Ub1N0cmluZygpLCBsZXZlbERCS2V5KSkKKyAgICAgICAgZm91bmQg
PSB0cnVlOworCisgICAgcmV0dXJuIGZvdW5kOworfQorCituYW1lc3BhY2UgeworY2xhc3MgQ3Vy
c29ySW1wbENvbW1vbiA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7CitwdWJsaWM6
CisgICAgLy8gSURCQmFja2luZ1N0b3JlOjpDdXJzb3IKKyAgICB2aXJ0dWFsIGJvb2wgY29udGlu
dWVGdW5jdGlvbihjb25zdCBJREJLZXkqKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5
PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CisgICAgdmlydHVh
bCBTdHJpbmcgdmFsdWUoKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkg
PSAwOyAvLyBGSVhNRTogSXMgdGhpcyBhY3R1YWxseSB1c2VkIGJ5IGFueW9uZT8KKyAgICB2aXJ0
dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1
cnJlbnRSb3coKSA9IDA7CisgICAgYm9vbCBmaXJzdFNlZWsoKTsKKworcHJvdGVjdGVkOgorICAg
IEN1cnNvckltcGxDb21tb24obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgbG93
S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29sIGhpZ2hP
cGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogbV9kYihkYikKKyAgICAgICAgLCBtX2xvd0tl
eShsb3dLZXkpCisgICAgICAgICwgbV9sb3dPcGVuKGxvd09wZW4pCisgICAgICAgICwgbV9oaWdo
S2V5KGhpZ2hLZXkpCisgICAgICAgICwgbV9oaWdoT3BlbihoaWdoT3BlbikKKyAgICAgICAgLCBt
X2ZvcndhcmQoZm9yd2FyZCkKKyAgICB7CisgICAgfQorICAgIHZpcnR1YWwgfkN1cnNvckltcGxD
b21tb24oKSB7fQorCisgICAgbGV2ZWxkYjo6REIqIG1fZGI7CisgICAgT3duUHRyPGxldmVsZGI6
Okl0ZXJhdG9yPiBtX2l0ZXJhdG9yOworICAgIHN0ZDo6c3RyaW5nIG1fbG93S2V5OworICAgIGJv
b2wgbV9sb3dPcGVuOworICAgIHN0ZDo6c3RyaW5nIG1faGlnaEtleTsKKyAgICBib29sIG1faGln
aE9wZW47CisgICAgYm9vbCBtX2ZvcndhcmQ7CisgICAgUmVmUHRyPElEQktleT4gbV9jdXJyZW50
S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpmaXJzdFNlZWsoKQoreworICAgIG1f
aXRlcmF0b3IgPSBtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKTsKKwor
ICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgIG1faXRlcmF0b3ItPlNlZWsobV9sb3dLZXkpOwor
ICAgIGVsc2UKKyAgICAgICAgbV9pdGVyYXRvci0+U2VlayhtX2hpZ2hLZXkpOworCisgICAgZm9y
ICg7OykgeworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPlZhbGlkKCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNv
bXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+
PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJkICYm
ICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5r
ZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtl
eXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8PSAwKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0
b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1fbG93
T3BlbikgeworICAgICAgICAgICAgLy8gbG93S2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4g
dGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBtX2l0
ZXJhdG9yLT5OZXh0KCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbikgeworICAg
ICAgICAgICAgLy8gaGlnaEtleSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByYW5nZQor
ICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5r
ZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+UHJl
digpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKSB7CisgICAgICAgICAgICBpZiAobV9m
b3J3YXJkKQorICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwor
Ym9vbCBDdXJzb3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5
KQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNoYXJlcyBhIGxvdCBvZiBjb2RlIHdpdGggZmlyc3RT
ZWVrLgorCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAg
ICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2l0ZXJh
dG9yLT5QcmV2KCk7CisKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5WYWxpZCgpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYXNoOworICAgICAg
ICBpZiAobV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1faXRlcmF0b3ItPmtleSgp
LCAmdHJhc2gpLklzTm90Rm91bmQoKSkKKyAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBpZiAobV9mb3J3YXJkICYmIG1faGlnaE9wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhL
ZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIC8vIGhpZ2gga2V5IG5vdCBp
bmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
bV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNv
bXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8PSAwKSAvLyBsb3cg
a2V5IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUlu
ZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAobV9mb3J3
YXJkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIEZJWE1FOiBPYmV5IHRoZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgKGFuZCB0
ZXN0IGZvciBpdCEpCisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2NsYXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29t
bW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUN1cnNvcklt
cGw+IGNyZWF0ZShsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJv
b2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJv
b2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3
YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3Ry
aW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3Rv
cmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAg
IHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJl
dHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6
CisgICAgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpz
dHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwg
Ym9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24o
ZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgewor
ICAgIH0KKworICAgIFN0cmluZyBtX2N1cnJlbnRWYWx1ZTsKK307CisKK2Jvb2wgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgaW50NjRfdCBhLCBiLCBjOwor
ICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCk7CisgICAgcCA9IGRl
Y29kZVByZWZpeChwLCBhLCBiLCBjKTsKKyAgICBwID0gZGVjb2RlS2V5KHAsIG1faXRlcmF0b3It
PmtleSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPmtleSgpLnNpemUoKSwgJm1fY3VycmVudEtleSk7
CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogcSA9IGRlY29kZVZhcklu
dChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCkg
KyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNpemUoKSwgJnZlcnNpb24pOworICAgIHN0YXRpY19jYXN0
PHZvaWQ+KHZlcnNpb24pOworCisgICAgbV9jdXJyZW50VmFsdWUgPSBkZWNvZGVTdHJpbmcocSwg
bV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNpemUoKSk7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVi
bGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElu
ZGV4S2V5Q3Vyc29ySW1wbD4gY3JlYXRlKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJp
bmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9v
bCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBJbmRleEtleUN1cnNvckltcGwoZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGln
aE9wZW4sIGZvcndhcmQpKTsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAg
dmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3Ry
aW5nKCk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyBy
ZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkg
eyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludDY0X3Qg
aW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZp
cnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIEluZGV4S2V5Q3Vy
c29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wg
bG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wg
Zm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4s
IGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8
SURCS2V5PiBtX3ByaW1hcnlLZXk7Cit9OworCitib29sIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9h
ZEN1cnJlbnRSb3coKQoreworICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICBjb25zdCBjaGFyKiBw
ID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwg
YiwgYyk7CisgICAgcCA9IGRlY29kZUtleShwLCBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCkgKyBt
X2l0ZXJhdG9yLT5rZXkoKS5zaXplKCksICZtX2N1cnJlbnRLZXkpOworCisgICAgLy8gV2UganVz
dCBpZ25vcmUgdGhlIHNlcXVlbmNlIG51bWJlci4uLgorCisgICAgaW50NjRfdCB2ZXJzaW9uOwor
ICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5kYXRh
KCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXpl
KCksICZ2ZXJzaW9uKTsKKyAgICBzdGF0aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsgLy8gRklYTUU6
IFdlIHNob3VsZCBwcnVuZSBlbnRyaWVzIHdpdGggb2xkIHZlcnNpb24sIGJ1dCBJIHRoaW5rIGtl
eUV4aXN0c0luT2JqZWN0U3RvcmUgdGFrZXMgY2FyZSBvZiBpdCBmb3Igbm93KD8/KQorICAgIGRl
Y29kZUtleShxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVl
KCkuc2l6ZSgpLCAmbV9wcmltYXJ5S2V5KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFz
cyBJbmRleEN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFBhc3NSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjcmVhdGUoKTsKKworICAgIElu
ZGV4Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXks
IGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4s
IGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxv
d09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAgICAv
LyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBt
X3ZhbHVlOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsg
cmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgp
IHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90
IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBi
b29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPElEQktleT4gbV9w
cmltYXJ5S2V5OworICAgIFN0cmluZyBtX3ZhbHVlOworICAgIHN0ZDo6c3RyaW5nIG1fcHJpbWFy
eUxldmVsREJLZXk7Cit9OworCitib29sIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3co
KQoreworICAgIGludDY0X3QgYSwgYiwgYzsKKyAgICBjb25zdCBjaGFyKiBwID0gbV9pdGVyYXRv
ci0+a2V5KCkuZGF0YSgpOworICAgIHAgPSBkZWNvZGVQcmVmaXgocCwgYSwgYiwgYyk7CisgICAg
cCA9IGRlY29kZUtleShwLCBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT5r
ZXkoKS5zaXplKCksICZtX2N1cnJlbnRLZXkpOworCisgICAgLy8gRklYTUU6IFdlIGp1c3QgaWdu
b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIsIHJpZ2h0PworCisgICAgaW50NjRfdCBpbmRleERhdGFW
ZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFs
dWUoKS5kYXRhKCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFs
dWUoKS5zaXplKCksICZpbmRleERhdGFWZXJzaW9uKTsKKyAgICBxID0gZGVjb2RlS2V5KHEsIG1f
aXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCksICZt
X3ByaW1hcnlLZXkpOworCisgICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IG1ha2VLZXkoYSwgYiwg
MSwgZW5jb2RlS2V5KCptX3ByaW1hcnlLZXkpKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsK
KyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygp
LCBtX3ByaW1hcnlMZXZlbERCS2V5LCAmcmVzdWx0KTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOwor
ICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5j
X3N0cigpICsgcmVzdWx0Lmxlbmd0aCgpLCAmb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisKKyAg
ICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAg
ICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5
KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29k
ZVN0cmluZyh0LCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK30KKworc3RhdGljIGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8obGV2
ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyogZm91
bmRLZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVrKHRhcmdldCk7CisKKyAg
ICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAo
aXQtPlZhbGlkKCkgJiYgIWNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRh
cmdldCkpIHsKKyAgICAgICAgKmZvdW5kS2V5ID0gaXQtPmtleSgpLlRvU3RyaW5nKCk7CisgICAg
ICAgIGl0LT5OZXh0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5P
YmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rp
b24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Cisg
ICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBm
b3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRp
cmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVy
T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93
ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4K
KyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOworICAgICAgICBsb3dl
ck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5k
KSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IDIpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAg
ICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAg
ICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksICZz
dG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3Bl
biA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IG1h
a2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSwgZW5jb2RlS2V5KCpyYW5nZS0+dXBw
ZXIoKSkpOworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQor
CisgICAgUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVD
dXJzb3JJbXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtl
eSwgdXBwZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNv
cjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAm
JiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+
dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVY
VF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBi
b29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5LCBzdG9w
S2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtl
eShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsgLy8gRklYTUU6IFRoaXMgY291
bGQgbWVhbiBwcm9ibGVtcy4KKyAgICAgICAgbG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1
ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0S2V5ID0gbWFrZUtleShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVLZXkoKnJhbmdlLT5sb3dlcigpKSk7Cisg
ICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAo
IXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCArIDEpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBO
b3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkg
dGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1f
ZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgICAgc3RvcEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+dXBwZXIoKSkpOworICAgICAgICBpZiAoIWZpbmRMYXN0
SW5kZXhLZXlFcXVhbFRvKG1fZGIuZ2V0KCksIHN0b3BLZXksICZzdG9wS2V5KSkgLy8gU2VlayB0
byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlxdWUga2V5cy4KKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3Blbigp
OworICAgIH0KKworICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9IEluZGV4
S2V5Q3Vyc29ySW1wbDo6Y3JlYXRlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0
b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2Vlaygp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQor
CitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJz
b3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2Ug
JiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2Ut
PnVwcGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5F
WFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAg
Ym9vbCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3Rv
cEtleTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IG1ha2VL
ZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7IC8vIEZJWE1FOiBUaGlzIGNv
dWxkIG1lYW4gcHJvYmxlbXMuCisgICAgICAgIGxvd2VyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNs
dWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IG1ha2VLZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlS2V5KCpyYW5nZS0+bG93ZXIoKSkpOwor
ICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYg
KCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGluZGV4SWQgKyAxKTsKKyAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8g
Tm90IGluY2x1ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5
IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbiht
X2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIHN0b3BLZXkgPSBtYWtlS2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsIGVuY29kZUtleSgqcmFuZ2UtPnVwcGVyKCkpKTsKKyAgICAgICAgaWYgKCFmaW5kTGFz
dEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkpIC8vIFNlZWsg
dG8gdGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4o
KTsKKyAgICB9CisKKyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBhZG9wdFJl
ZihuZXcgSW5kZXhDdXJzb3JJbXBsKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0
b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCkpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWso
KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30K
KworbmFtZXNwYWNlIHsKK2NsYXNzIER1bW15VHJhbnNhY3Rpb24gOiBwdWJsaWMgSURCQmFja2lu
Z1N0b3JlOjpUcmFuc2FjdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGJlZ2luKCkg
e30KKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcm9sbGJh
Y2soKSB7fQorfTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9u
PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlvbigpCit7CisgICAgLy8g
RklYTUU6IFdlIG5lZWQgdG8gaW1wbGVtZW50IGEgdHJhbnNhY3Rpb24gYWJzdHJhY3Rpb24gdGhh
dCBhbGxvd3MgZm9yIHJvbGwtYmFja3MsIGFuZCB3cml0ZSB0ZXN0cyBmb3IgaXQuCisKKyAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IER1bW15VHJhbnNhY3Rpb24oKSk7Cit9CisKKy8vIEZJWE1FOiBk
ZWxldGVEYXRhYmFzZSBzaG91bGQgYmUgcGFydCBvZiBJREJCYWNraW5nU3RvcmUuCisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8v
IEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lE
QkxldmVsREJCYWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yNzNjZjgxOWQxZGQzMTA0ZmUzODU4
ZTZiNDk1ODg3ZTBhNzg4MTUzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZV9oCisjZGVmaW5lIElEQkxldmVsREJCYWNraW5n
U3RvcmVfaAorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisjaWYgRU5BQkxFKExFVkVM
REIpCisKKyNpbmNsdWRlICJJREJCYWNraW5nU3RvcmUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisKK25hbWVzcGFjZSBsZXZlbGRiIHsKK2NsYXNzIERCOworfQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIElEQkxldmVsREJCYWNraW5nU3RvcmUgOiBwdWJsaWMgSURCQmFja2lu
Z1N0b3JlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+
IG9wZW4oU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1h
eGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2Vu
ZEltcGwqKTsKKyAgICB2aXJ0dWFsIH5JREJMZXZlbERCQmFja2luZ1N0b3JlKCk7CisKKyAgICB2
aXJ0dWFsIGJvb2wgZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1l
LCBTdHJpbmcmIGZvdW5kVmVyc2lvbiwgaW50NjRfdCYgZm91bmRJZCk7CisgICAgdmlydHVhbCBi
b29sIHNldElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHZlcnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCk7CisKKyAgICB2
aXJ0dWFsIHZvaWQgZ2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGlu
dDY0X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJp
bmc+JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdz
KTsKKyAgICB2aXJ0dWFsIGJvb2wgY3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlk
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5j
cmVtZW50LCBpbnQ2NF90JiBhc3NpZ25lZE9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgdm9p
ZCBkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCk7CisgICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpOworICAgIHZp
cnR1YWwgYm9vbCBwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUmVm
UHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYpOworICAgIHZpcnR1YWwgdm9pZCBjbGVhck9i
amVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7
CisgICAgdmlydHVhbCBkb3VibGUgbmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgYm9vbCBrZXlFeGlz
dHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+JiBmb3VuZFJl
Y29yZEhhbmRsZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJl
Y29yZENhbGxiYWNrJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5kZXhlcyhpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmb3VuZElk
cywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZEtleVBh
dGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpOworICAgIHZpcnR1YWwgYm9vbCBj
cmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGlu
dDY0X3QmIGluZGV4SWQpOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKKyAgICB2
aXJ0dWFsIGJvb2wgcHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYsIGNvbnN0
IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJik7CisgICAgdmlydHVhbCBib29sIGRlbGV0ZUluZGV4
RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZEhhbmRsZSYpOworICAgIHZp
cnR1YWwgU3RyaW5nIGdldE9iamVjdFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJ
REJLZXkmKTsKKyAgICB2aXJ0dWFsIGJvb2wga2V5RXhpc3RzSW5JbmRleChpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmKTsKKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1
cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
S2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRy
PEN1cnNvcj4gb3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vy
c29yOjpEaXJlY3Rpb24pOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRl
eEN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKTsKKwor
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFuc2FjdGlvbj4gY3JlYXRlVHJhbnNhY3Rpb24oKTsK
KworcHJpdmF0ZToKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVy
LCBJREJGYWN0b3J5QmFja2VuZEltcGwqLCBsZXZlbGRiOjpEQiopOworCisgICAgU3RyaW5nIG1f
aWRlbnRpZmllcjsKKyAgICBSZWZQdHI8SURCRmFjdG9yeUJhY2tlbmRJbXBsPiBtX2ZhY3Rvcnk7
CisgICAgT3duUHRyPGxldmVsZGI6OkRCPiBtX2RiOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKKyNlbmRpZiAvLyBFTkFCTEUoSU5E
RVhFRF9EQVRBQkFTRSkKKworI2VuZGlmIC8vIElEQkxldmVsREJCYWNraW5nU3RvcmVfaApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5j
cHAKaW5kZXggMDQzM2VkNzU3OGEyY2RjYjZjNDg2Yzk1ZjgxMjIxYzZkZjI5ZGNiOS4uMTkxYjg2
NDcyNThmZjE1MTdhYjM4Mjc1YzdmMzUzNGVmODRjM2Q3ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwCkBAIC01MCw4ICs1
MCw5IEBAIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6On5JREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsKCkKIHsKIH0KIAotSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6SURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBpZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVu
dCkKK0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwo
SURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCkKICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKKyAgICAsIG1f
ZGF0YWJhc2VJZChkYXRhYmFzZUlkKQogICAgICwgbV9pZChpZCkKICAgICAsIG1fbmFtZShuYW1l
KQogICAgICwgbV9rZXlQYXRoKGtleVBhdGgpCkBAIC02MSw4ICs2Miw5IEBAIElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwoSURCQmFja2luZ1N0b3Jl
KiBiYWNraW5nU3RvCiAgICAgbG9hZEluZGV4ZXMoKTsKIH0KIAotSURCT2JqZWN0U3RvcmVCYWNr
ZW5kSW1wbDo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqIGJhY2tp
bmdTdG9yZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wg
YXV0b0luY3JlbWVudCkKK0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OklEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJh
c2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCkKICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKKyAgICAsIG1f
ZGF0YWJhc2VJZChkYXRhYmFzZUlkKQogICAgICwgbV9pZChJbnZhbGlkSWQpCiAgICAgLCBtX25h
bWUobmFtZSkKICAgICAsIG1fa2V5UGF0aChrZXlQYXRoKQpAQCAtOTAsNyArOTIsNyBAQCB2b2lk
IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmdldChQYXNzUmVmUHRyPElEQktleT4gcHJwS2V5
LCBQYXNzUmVmUHRyPElEQkNhbAogCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6Omdl
dEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQktleT4ga2V5LCBQYXNz
UmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewotICAgIFN0cmluZyB3aXJlRGF0YSA9
IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0
U3RvcmUtPmlkKCksICprZXkpOworICAgIFN0cmluZyB3aXJlRGF0YSA9IG9iamVjdFN0b3JlLT5t
X2JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVSZWNvcmQob2JqZWN0U3RvcmUtPm1fZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksICprZXkpOwogICAgIGlmICh3aXJlRGF0YS5pc051bGwo
KSkgewogICAgICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhTZXJpYWxpemVkU2NyaXB0VmFsdWU6
OnVuZGVmaW5lZFZhbHVlKCkpOwogICAgICAgICByZXR1cm47CkBAIC0yMjcsOCArMjI5LDggQEAg
dm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpwdXRJbnRlcm5hbChTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiwgUGFzc1JlZlB0cjwKICAgICAgICAgaW5kZXhLZXlzLmFwcGVuZChrZXkucmVs
ZWFzZSgpKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IGRhdGFSb3dJZCA9IEludmFsaWRJZDsKLSAg
ICBib29sIGlzRXhpc3RpbmdWYWx1ZSA9IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+a2V5
RXhpc3RzSW5PYmplY3RTdG9yZShvYmplY3RTdG9yZS0+aWQoKSwgKmtleSwgZGF0YVJvd0lkKTsK
KyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZEhhbmRsZT4gcmVj
b3JkSGFuZGxlOworICAgIGJvb2wgaXNFeGlzdGluZ1ZhbHVlID0gb2JqZWN0U3RvcmUtPm1fYmFj
a2luZ1N0b3JlLT5rZXlFeGlzdHNJbk9iamVjdFN0b3JlKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNl
SWQsIG9iamVjdFN0b3JlLT5pZCgpLCAqa2V5LCByZWNvcmRIYW5kbGUpOwogCiAgICAgaWYgKHB1
dE1vZGUgPT0gQWRkT25seSAmJiBpc0V4aXN0aW5nVmFsdWUpIHsKICAgICAgICAgY2FsbGJhY2tz
LT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6
Q09OU1RSQUlOVF9FUlIsICJLZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG9iamVjdCBzdG9yZS4i
KSk7CkBAIC0yMzcsMTQgKzIzOSw3IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6
cHV0SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8CiAKICAgICAv
LyBCZWZvcmUgdGhpcyBwb2ludCwgZG9uJ3QgZG8gYW55IG11dGF0aW9uLiAgQWZ0ZXIgdGhpcyBw
b2ludCwgcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGluIGNhc2Ugb2YgZXJyb3IuCiAKLSAgICBp
ZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0T2JqZWN0U3RvcmVSZWNvcmQob2Jq
ZWN0U3RvcmUtPmlkKCksICprZXksIHZhbHVlLT50b1dpcmVTdHJpbmcoKSwgZGF0YVJvd0lkLCBk
YXRhUm93SWQgPT0gSW52YWxpZElkKSkgewotICAgICAgICAvLyBGSVhNRTogVGhlIEluZGV4ZWQg
RGF0YWJhc2Ugc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFuIGVycm9yIGNvZGUgZGVkaWNh
dGVkIHRvIEkvTyBlcnJvcnMuCi0gICAgICAgIGNhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFz
ZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVOS05PV05fRVJSLCAiRXJyb3Ig
d3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlLiIpKTsKLSAgICAgICAgdHJhbnNhY3Rpb24t
PmFib3J0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW9iamVjdFN0b3Jl
LT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGRhdGFSb3dJZCkpIHsK
KyAgICBpZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0T2JqZWN0U3RvcmVSZWNv
cmQob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksICprZXksIHZh
bHVlLT50b1dpcmVTdHJpbmcoKSwgcmVjb3JkSGFuZGxlKSkgewogICAgICAgICAvLyBGSVhNRTog
VGhlIEluZGV4ZWQgRGF0YWJhc2Ugc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFuIGVycm9y
IGNvZGUgZGVkaWNhdGVkIHRvIEkvTyBlcnJvcnMuCiAgICAgICAgIGNhbGxiYWNrcy0+b25FcnJv
cihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVOS05PV05f
RVJSLCAiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlLiIpKTsKICAgICAgICAg
dHJhbnNhY3Rpb24tPmFib3J0KCk7CkBAIC0yNTUsNyArMjUwLDE1IEBAIHZvaWQgSURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbDo6cHV0SW50ZXJuYWwoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBh
c3NSZWZQdHI8CiAgICAgZm9yIChJbmRleE1hcDo6aXRlcmF0b3IgaXQgPSBvYmplY3RTdG9yZS0+
bV9pbmRleGVzLmJlZ2luKCk7IGl0ICE9IG9iamVjdFN0b3JlLT5tX2luZGV4ZXMuZW5kKCk7ICsr
aXQsICsraSkgewogICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc1ZhbGlkSWQoKSkKICAgICAg
ICAgICAgIGNvbnRpbnVlOyAvLyBUaGUgaW5kZXggb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIGJ1
dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgeWV0LgotICAgICAgICBpZiAoIW9iamVj
dFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGl0LT5zZWNvbmQt
PmlkKCksICppbmRleEtleXNbaV0sIGRhdGFSb3dJZCkpIHsKKworICAgICAgICBpZiAoIW9iamVj
dFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKG9iamVjdFN0
b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCBpdC0+c2Vjb25kLT5pZCgpLCAq
cmVjb3JkSGFuZGxlKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRoZSBJbmRleGVkIERhdGFi
YXNlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBlcnJvciBjb2RlIGRlZGljYXRlZCB0
byBJL08gZXJyb3JzLgorICAgICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNl
RXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VU5LTk9XTl9FUlIsICJFcnJvciB3
cml0aW5nIGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2UuIikpOworICAgICAgICAgICAgdHJhbnNhY3Rp
b24tPmFib3J0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIW9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+cHV0SW5kZXhEYXRhRm9yUmVjb3JkKG9i
amVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCBpdC0+c2Vjb25kLT5p
ZCgpLCAqaW5kZXhLZXlzW2ldLCAqcmVjb3JkSGFuZGxlKSkgewogICAgICAgICAgICAgLy8gRklY
TUU6IFRoZSBJbmRleGVkIERhdGFiYXNlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBl
cnJvciBjb2RlIGRlZGljYXRlZCB0byBJL08gZXJyb3JzLgogICAgICAgICAgICAgY2FsbGJhY2tz
LT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6
VU5LTk9XTl9FUlIsICJFcnJvciB3cml0aW5nIGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2UuIikpOwog
ICAgICAgICAgICAgdHJhbnNhY3Rpb24tPmFib3J0KCk7CkBAIC0yODMsMTMgKzI4NiwyMSBAQCB2
b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmRlbGV0ZUZ1bmN0aW9uKFBhc3NSZWZQdHI8
SURCS2V5PiBwcnBLZXksIFBhc3NSZQogCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6
OmRlbGV0ZUludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElEQk9i
amVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQktleT4ga2V5
LCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewotICAgIGludDY0X3QgaWQ7
Ci0gICAgaWYgKCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmtleUV4aXN0c0luT2JqZWN0
U3RvcmUob2JqZWN0U3RvcmUtPmlkKCksICprZXksIGlkKSkgeworICAgIFJlZlB0cjxJREJCYWNr
aW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiByZWNvcmRIYW5kbGU7CisgICAgaWYg
KCFvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmtleUV4aXN0c0luT2JqZWN0U3RvcmUob2Jq
ZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksICprZXksIHJlY29yZEhh
bmRsZSkpIHsKICAgICAgICAgY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNy
ZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUiwgIktleSBkb2VzIG5vdCBl
eGlzdCBpbiB0aGUgb2JqZWN0IHN0b3JlLiIpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAot
ICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQo
b2JqZWN0U3RvcmUtPmlkKCksIGlkKTsKKyAgICBmb3IgKEluZGV4TWFwOjppdGVyYXRvciBpdCA9
IG9iamVjdFN0b3JlLT5tX2luZGV4ZXMuYmVnaW4oKTsgaXQgIT0gb2JqZWN0U3RvcmUtPm1faW5k
ZXhlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc1ZhbGlkSWQo
KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUaGUgaW5kZXggb2JqZWN0IGhhcyBiZWVuIGNy
ZWF0ZWQsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgeWV0LgorCisgICAgICAg
IGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5kZWxldGVJbmRleERhdGFGb3JSZWNv
cmQob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmUtPmlkKCksIGl0LT5zZWNv
bmQtPmlkKCksICpyZWNvcmRIYW5kbGUpKQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgfQorCisgICAgb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5kZWxldGVPYmpl
Y3RTdG9yZVJlY29yZChvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQo
KSwgKnJlY29yZEhhbmRsZSk7CiAgICAgY2FsbGJhY2tzLT5vblN1Y2Nlc3MoU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpudWxsVmFsdWUoKSk7CiB9CiAKQEAgLTMwOSwyNiArMzIwLDI4IEBAIHZvaWQg
SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y2xlYXIoUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+
IHBycENhbGxiYWNrcywgSURCCiAKIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6Y2xl
YXJJbnRlcm5hbChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxJREJPYmplY3RT
dG9yZUJhY2tlbmRJbXBsPiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNh
bGxiYWNrcykKIHsKLSAgICBvYmplY3RTdG9yZS0+bV9iYWNraW5nU3RvcmUtPmNsZWFyT2JqZWN0
U3RvcmUob2JqZWN0U3RvcmUtPmlkKCkpOworICAgIG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9y
ZS0+Y2xlYXJPYmplY3RTdG9yZShvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZS0+aWQoKSk7CiAgICAgY2FsbGJhY2tzLT5vblN1Y2Nlc3MoU2VyaWFsaXplZFNjcmlwdFZhbHVl
Ojp1bmRlZmluZWRWYWx1ZSgpKTsKIH0KIAogbmFtZXNwYWNlIHsKIGNsYXNzIFBvcHVsYXRlSW5k
ZXhDYWxsYmFjayA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkQ2Fs
bGJhY2sgewogcHVibGljOgotICAgIFBvcHVsYXRlSW5kZXhDYWxsYmFjayhJREJCYWNraW5nU3Rv
cmUmIGJhY2tpbmdTdG9yZSwgY29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgsIGludDY0X3QgaW5k
ZXhJZCkKKyAgICBQb3B1bGF0ZUluZGV4Q2FsbGJhY2soSURCQmFja2luZ1N0b3JlJiBiYWNraW5n
U3RvcmUsIGNvbnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQogICAgICAgICA6IG1fYmFja2lu
Z1N0b3JlKGJhY2tpbmdTdG9yZSkKICAgICAgICAgLCBtX2luZGV4S2V5UGF0aChpbmRleEtleVBh
dGgpCisgICAgICAgICwgbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmpl
Y3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCiAgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCiAg
ICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBjYWxsYmFjayhpbnQ2NF90IG9iamVjdFN0
b3JlRGF0YUlkLCBjb25zdCBTdHJpbmcmIHZhbHVlKQorICAgIHZpcnR1YWwgYm9vbCBjYWxsYmFj
ayhjb25zdCBJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiByZWNvcmRI
YW5kbGUsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgewogICAgICAgICBSZWZQdHI8U2VyaWFs
aXplZFNjcmlwdFZhbHVlPiBvYmplY3RWYWx1ZSA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3Jl
YXRlRnJvbVdpcmUodmFsdWUpOwogICAgICAgICBSZWZQdHI8SURCS2V5PiBpbmRleEtleSA9IGZl
dGNoS2V5RnJvbUtleVBhdGgob2JqZWN0VmFsdWUuZ2V0KCksIG1faW5kZXhLZXlQYXRoKTsKIAot
ICAgICAgICBpZiAoIW1fYmFja2luZ1N0b3JlLnB1dEluZGV4RGF0YUZvclJlY29yZChtX2luZGV4
SWQsICppbmRleEtleSwgb2JqZWN0U3RvcmVEYXRhSWQpKQorICAgICAgICBpZiAoIW1fYmFja2lu
Z1N0b3JlLnB1dEluZGV4RGF0YUZvclJlY29yZChtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmVJ
ZCwgbV9pbmRleElkLCAqaW5kZXhLZXksIHJlY29yZEhhbmRsZSkpCiAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMzcsMTQgKzM1MCwxNiBAQCBw
dWJsaWM6CiBwcml2YXRlOgogICAgIElEQkJhY2tpbmdTdG9yZSYgbV9iYWNraW5nU3RvcmU7CiAg
ICAgY29uc3QgU3RyaW5nJiBtX2luZGV4S2V5UGF0aDsKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJ
ZDsKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKICAgICBpbnQ2NF90IG1faW5kZXhJZDsK
IH07CiB9CiAKLXN0YXRpYyBib29sIHBvcHVsYXRlSW5kZXgoSURCQmFja2luZ1N0b3JlJiBiYWNr
aW5nU3RvcmUsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBT
dHJpbmcmIGluZGV4S2V5UGF0aCkKK3N0YXRpYyBib29sIHBvcHVsYXRlSW5kZXgoSURCQmFja2lu
Z1N0b3JlJiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoKQogewot
ICAgIFBvcHVsYXRlSW5kZXhDYWxsYmFjayBjYWxsYmFjayhiYWNraW5nU3RvcmUsIGluZGV4S2V5
UGF0aCwgaW5kZXhJZCk7Ci0gICAgaWYgKCFiYWNraW5nU3RvcmUuZm9yRWFjaE9iamVjdFN0b3Jl
UmVjb3JkKG9iamVjdFN0b3JlSWQsIGNhbGxiYWNrKSkKKyAgICBQb3B1bGF0ZUluZGV4Q2FsbGJh
Y2sgY2FsbGJhY2soYmFja2luZ1N0b3JlLCBpbmRleEtleVBhdGgsIGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQpOworICAgIGlmICghYmFja2luZ1N0b3JlLmZvckVhY2hPYmplY3RT
dG9yZVJlY29yZChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBjYWxsYmFjaykpCiAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTM2MCw3ICszNzUsNyBAQCBQ
YXNzUmVmUHRyPElEQkluZGV4QmFja2VuZEludGVyZmFjZT4gSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbDo6Y3JlYXRlSW5kZXgoY29ucwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBS
ZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gaW5kZXggPSBJREJJbmRleEJhY2tlbmRJbXBsOjpj
cmVhdGUobV9iYWNraW5nU3RvcmUuZ2V0KCksIG5hbWUsIG1fbmFtZSwga2V5UGF0aCwgdW5pcXVl
KTsKKyAgICBSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gaW5kZXggPSBJREJJbmRleEJhY2tl
bmRJbXBsOjpjcmVhdGUobV9iYWNraW5nU3RvcmUuZ2V0KCksIG1fZGF0YWJhc2VJZCwgdGhpcywg
bmFtZSwgbV9uYW1lLCBrZXlQYXRoLCB1bmlxdWUpOwogICAgIEFTU0VSVChpbmRleC0+bmFtZSgp
ID09IG5hbWUpOwogCiAgICAgUmVmUHRyPElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVj
dFN0b3JlID0gdGhpczsKQEAgLTM3OCwxNCArMzkzLDE0IEBAIFBhc3NSZWZQdHI8SURCSW5kZXhC
YWNrZW5kSW50ZXJmYWNlPiBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpjcmVhdGVJbmRleChj
b25zCiB2b2lkIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmNyZWF0ZUluZGV4SW50ZXJuYWwo
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURCSW5kZXhCYWNrZW5kSW1wbD4gaW5kZXgs
IFBhc3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlPiB0cmFuc2FjdGlvbikK
IHsKICAgICBpbnQ2NF90IGlkOwotICAgIGlmICghb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3Jl
LT5jcmVhdGVJbmRleChvYmplY3RTdG9yZS0+bV9pZCwgaW5kZXgtPm5hbWUoKSwgaW5kZXgtPmtl
eVBhdGgoKSwgaW5kZXgtPnVuaXF1ZSgpLCBpZCkpIHsKKyAgICBpZiAoIW9iamVjdFN0b3JlLT5t
X2JhY2tpbmdTdG9yZS0+Y3JlYXRlSW5kZXgob2JqZWN0U3RvcmUtPm1fZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmUtPmlkKCksIGluZGV4LT5uYW1lKCksIGluZGV4LT5rZXlQYXRoKCksIGluZGV4LT51
bmlxdWUoKSwgaWQpKSB7CiAgICAgICAgIHRyYW5zYWN0aW9uLT5hYm9ydCgpOwogICAgICAgICBy
ZXR1cm47CiAgICAgfQogCiAgICAgaW5kZXgtPnNldElkKGlkKTsKIAotICAgIGlmICghcG9wdWxh
dGVJbmRleCgqb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLCBvYmplY3RTdG9yZS0+bV9pZCwg
aWQsIGluZGV4LT5rZXlQYXRoKCkpKSB7CisgICAgaWYgKCFwb3B1bGF0ZUluZGV4KCpvYmplY3RT
dG9yZS0+bV9iYWNraW5nU3RvcmUsIG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0
b3JlLT5tX2lkLCBpZCwgaW5kZXgtPmtleVBhdGgoKSkpIHsKICAgICAgICAgdHJhbnNhY3Rpb24t
PmFib3J0KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC00MjgsNyArNDQzLDcgQEAgdm9p
ZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpkZWxldGVJbmRleChjb25zdCBTdHJpbmcmIG5h
bWUsIElEQlRyYW5zYWN0aW9uQmEKIAogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpk
ZWxldGVJbmRleEludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPElE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw+IG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPElEQkluZGV4
QmFja2VuZEltcGw+IGluZGV4LCBQYXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVy
ZmFjZT4gdHJhbnNhY3Rpb24pCiB7Ci0gICAgb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3JlLT5k
ZWxldGVJbmRleChpbmRleC0+aWQoKSk7CisgICAgb2JqZWN0U3RvcmUtPm1fYmFja2luZ1N0b3Jl
LT5kZWxldGVJbmRleChvYmplY3RTdG9yZS0+bV9kYXRhYmFzZUlkLCBvYmplY3RTdG9yZS0+aWQo
KSwgaW5kZXgtPmlkKCkpOwogICAgIHRyYW5zYWN0aW9uLT5kaWRDb21wbGV0ZVRhc2tFdmVudHMo
KTsKIH0KIApAQCAtNDQ2LDcgKzQ2MSw3IEBAIHZvaWQgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bDo6b3BlbkN1cnNvckludGVybmFsKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzCiB7CiAg
ICAgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uID0gc3RhdGljX2Nhc3Q8SURCQ3Vyc29y
OjpEaXJlY3Rpb24+KHRtcERpcmVjdGlvbik7CiAKLSAgICBSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IGJhY2tpbmdTdG9yZUN1cnNvciA9IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9y
ZS0+b3Blbk9iamVjdFN0b3JlQ3Vyc29yKG9iamVjdFN0b3JlLT5pZCgpLCByYW5nZS5nZXQoKSwg
ZGlyZWN0aW9uKTsKKyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGJhY2tpbmdT
dG9yZUN1cnNvciA9IG9iamVjdFN0b3JlLT5tX2JhY2tpbmdTdG9yZS0+b3Blbk9iamVjdFN0b3Jl
Q3Vyc29yKG9iamVjdFN0b3JlLT5tX2RhdGFiYXNlSWQsIG9iamVjdFN0b3JlLT5pZCgpLCByYW5n
ZS5nZXQoKSwgZGlyZWN0aW9uKTsKICAgICBpZiAoIWJhY2tpbmdTdG9yZUN1cnNvcikgewogICAg
ICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhTZXJpYWxpemVkU2NyaXB0VmFsdWU6Om51bGxWYWx1
ZSgpKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNDYyLDE0ICs0NzcsMTQgQEAgdm9pZCBJREJPYmpl
Y3RTdG9yZUJhY2tlbmRJbXBsOjpsb2FkSW5kZXhlcygpCiAgICAgVmVjdG9yPFN0cmluZz4gbmFt
ZXM7CiAgICAgVmVjdG9yPFN0cmluZz4ga2V5UGF0aHM7CiAgICAgVmVjdG9yPGJvb2w+IHVuaXF1
ZUZsYWdzOwotICAgIG1fYmFja2luZ1N0b3JlLT5nZXRJbmRleGVzKG1faWQsIGlkcywgbmFtZXMs
IGtleVBhdGhzLCB1bmlxdWVGbGFncyk7CisgICAgbV9iYWNraW5nU3RvcmUtPmdldEluZGV4ZXMo
bV9kYXRhYmFzZUlkLCBtX2lkLCBpZHMsIG5hbWVzLCBrZXlQYXRocywgdW5pcXVlRmxhZ3MpOwog
CiAgICAgQVNTRVJUKG5hbWVzLnNpemUoKSA9PSBpZHMuc2l6ZSgpKTsKICAgICBBU1NFUlQoa2V5
UGF0aHMuc2l6ZSgpID09IGlkcy5zaXplKCkpOwogICAgIEFTU0VSVCh1bmlxdWVGbGFncy5zaXpl
KCkgPT0gaWRzLnNpemUoKSk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkcy5zaXpl
KCk7IGkrKykKLSAgICAgICAgbV9pbmRleGVzLnNldChuYW1lc1tpXSwgSURCSW5kZXhCYWNrZW5k
SW1wbDo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCBpZHNbaV0sIG5hbWVzW2ldLCBtX25h
bWUsIGtleVBhdGhzW2ldLCB1bmlxdWVGbGFnc1tpXSkpOworICAgICAgICBtX2luZGV4ZXMuc2V0
KG5hbWVzW2ldLCBJREJJbmRleEJhY2tlbmRJbXBsOjpjcmVhdGUobV9iYWNraW5nU3RvcmUuZ2V0
KCksIG1fZGF0YWJhc2VJZCwgdGhpcywgaWRzW2ldLCBuYW1lc1tpXSwgbV9uYW1lLCBrZXlQYXRo
c1tpXSwgdW5pcXVlRmxhZ3NbaV0pKTsKIH0KIAogdm9pZCBJREJPYmplY3RTdG9yZUJhY2tlbmRJ
bXBsOjpyZW1vdmVJbmRleEZyb21NYXAoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gb2JqZWN0U3RvcmUsIFBhc3NSZWZQdHI8SURC
SW5kZXhCYWNrZW5kSW1wbD4gaW5kZXgpCkBAIC00OTAsNyArNTA1LDcgQEAgUGFzc1JlZlB0cjxJ
REJLZXk+IElEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OmdlbkF1dG9JbmNyZW1lbnRLZXkoKQog
ICAgIGlmIChtX2F1dG9JbmNyZW1lbnROdW1iZXIgPiAwKQogICAgICAgICByZXR1cm4gSURCS2V5
OjpjcmVhdGVOdW1iZXIobV9hdXRvSW5jcmVtZW50TnVtYmVyKyspOwogCi0gICAgbV9hdXRvSW5j
cmVtZW50TnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50PihtX2JhY2tpbmdTdG9yZS0+bmV4dEF1dG9J
bmNyZW1lbnROdW1iZXIoaWQoKSkpOworICAgIG1fYXV0b0luY3JlbWVudE51bWJlciA9IHN0YXRp
Y19jYXN0PGludD4obV9iYWNraW5nU3RvcmUtPm5leHRBdXRvSW5jcmVtZW50TnVtYmVyKG1fZGF0
YWJhc2VJZCwgaWQoKSkpOwogICAgIHJldHVybiBJREJLZXk6OmNyZWF0ZU51bWJlcihtX2F1dG9J
bmNyZW1lbnROdW1iZXIrKyk7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgKaW5kZXggNDQ3OWQxZTBkNzRiZjA2ODA5MjQ3ZDhm
MmQ1ZmNiNmI2Nzc2YjZlMC4uZWNlM2ZlNGY1ODY3Yzk5YjU4NGM3NmQ5ZDQ1MjYxYTU3ZTdjMmVj
NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsLmgKQEAgLTQyLDEzICs0MiwxMyBAQCBjbGFzcyBTY3JpcHRFeGVjdXRpb25Db250ZXh0
OwogCiBjbGFzcyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsIDogcHVibGljIElEQk9iamVjdFN0
b3JlQmFja2VuZEludGVyZmFjZSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8SURC
T2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0
b3JlLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0
aCwgYm9vbCBhdXRvSW5jcmVtZW50KQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50KQogICAgIHsKLSAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgaWQs
IG5hbWUsIGtleVBhdGgsIGF1dG9JbmNyZW1lbnQpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwg
aWQsIG5hbWUsIGtleVBhdGgsIGF1dG9JbmNyZW1lbnQpKTsKICAgICB9Ci0gICAgc3RhdGljIFBh
c3NSZWZQdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbD4gY3JlYXRlKElEQkJhY2tpbmdTdG9y
ZSogYmFja2luZ1N0b3JlLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0
aCwgYm9vbCBhdXRvSW5jcmVtZW50KQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50
NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0
aCwgYm9vbCBhdXRvSW5jcmVtZW50KQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKGJhY2tpbmdTdG9yZSwgbmFtZSwga2V5UGF0aCwg
YXV0b0luY3JlbWVudCkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwoYmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBuYW1lLCBrZXlQYXRoLCBh
dXRvSW5jcmVtZW50KSk7CiAgICAgfQogICAgIHZpcnR1YWwgfklEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwoKTsKIApAQCAtNTksNiArNTksNyBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX2lk
OwogICAgIH0KICAgICB2b2lkIHNldElkKGludDY0X3QgaWQpIHsgbV9pZCA9IGlkOyB9CisgICAg
aW50NjRfdCBkYXRhYmFzZUlkKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhYmFzZUlkOyB9CiAKICAg
ICB2aXJ0dWFsIFN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CiAgICAgdmly
dHVhbCBTdHJpbmcga2V5UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fa2V5UGF0aDsgfQpAQCAtNzcs
OCArNzgsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIG9wZW5DdXJzb3IoUGFzc1JlZlB0
cjxJREJLZXlSYW5nZT4gcmFuZ2UsIHVuc2lnbmVkIHNob3J0IGRpcmVjdGlvbiwgUGFzc1JlZlB0
cjxJREJDYWxsYmFja3M+LCBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UqLCBFeGNlcHRp
b25Db2RlJik7CiAKIHByaXZhdGU6Ci0gICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJC
YWNraW5nU3RvcmUqLCBpbnQ2NF90IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmlu
ZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVtZW50KTsKLSAgICBJREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQpOworICAgIElEQk9iamVjdFN0b3JlQmFja2Vu
ZEltcGwoSURCQmFja2luZ1N0b3JlKiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IGlkLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRvSW5jcmVt
ZW50KTsKKyAgICBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGlu
dDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgsIGJvb2wgYXV0b0luY3JlbWVudCk7CiAKICAgICB2b2lkIGxvYWRJbmRleGVzKCk7CiAgICAg
UGFzc1JlZlB0cjxJREJLZXk+IGdlbkF1dG9JbmNyZW1lbnRLZXkoKTsKQEAgLTk5LDYgKzEwMCw3
IEBAIHByaXZhdGU6CiAKICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9y
ZTsKIAorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOwogICAgIGludDY0X3QgbV9pZDsKICAgICBT
dHJpbmcgbV9uYW1lOwogICAgIFN0cmluZyBtX2tleVBhdGg7CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAKaW5kZXggZTQzYjdhMzYwNjk1MWUz
ZDJjYTY1MzBlNDZjMWY5YTJkZjJmNTFjZC4uOWVmMGMyNDBmMzJjM2ZlOGU4YjhjYTFlMTU0MWFj
N2Y4OTlhNzEyMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVC
YWNraW5nU3RvcmUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFj
a2luZ1N0b3JlLmNwcApAQCAtMTczLDcgKzE3Myw3IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5
CiAgICAgaWYgKCFwYXRoQmFzZS5pc0VtcHR5KCkpIHsKICAgICAgICAgaWYgKCFtYWtlQWxsRGly
ZWN0b3JpZXMocGF0aEJhc2UpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogSXMgdGhlcmUgYW55
IG90aGVyIHRoaW5nIHdlIGNvdWxkIHBvc3NpYmx5IGRvIHRvIHJlY292ZXIgYXQgdGhpcyBwb2lu
dD8gSWYgc28sIGRvIGl0IHJhdGhlciB0aGFuIGp1c3QgZXJyb3Jpbmcgb3V0LgotICAgICAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGVkIHRvIGNyZWF0ZSBMb2NhbFN0b3JhZ2UgZGF0YWJhc2UgcGF0
aCAlcyIsIHBhdGhCYXNlLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgTE9HX0VSUk9SKCJV
bmFibGUgdG8gY3JlYXRlIEluZGV4ZWQgREIgZGF0YWJhc2UgcGF0aCAlcyIsIHBhdGhCYXNlLnV0
ZjgoKS5kYXRhKCkpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAg
cGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIiKTsKQEAgLTI2Myw3ICsyNjMsNyBA
QCB2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0
YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+JgogICAgIH0KIH0KIAotYm9vbCBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6
OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCYgYXNz
aWduZWRPYmplY3RTdG9yZUlkKQogewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAi
SU5TRVJUIElOVE8gT2JqZWN0U3RvcmVzIChuYW1lLCBrZXlQYXRoLCBkb0F1dG9JbmNyZW1lbnQs
IGRhdGFiYXNlSWQpIFZBTFVFUyAoPywgPywgPywgPykiKTsKICAgICBpZiAocXVlcnkucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKQpAQCAtMjkxLDcgKzI5MSw3IEBAIHN0YXRpYyB2b2lkIGRvRGVs
ZXRlKFNRTGl0ZURhdGFiYXNlJiBkYiwgY29uc3QgY2hhciogc3FsLCBpbnQ2NF90IGlkKQogICAg
IEFTU0VSVF9VTlVTRUQob2ssIG9rKTsgLy8gRklYTUU6IEJldHRlciBlcnJvciBoYW5kbGluZy4K
IH0KIAotdm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0
X3Qgb2JqZWN0U3RvcmVJZCkKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpkZWxldGVPYmpl
Y3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKICAg
ICBkb0RlbGV0ZShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3RvcmVzIFdIRVJFIGlkID0gPyIs
IG9iamVjdFN0b3JlSWQpOwogICAgIGRvRGVsZXRlKG1fZGIsICJERUxFVEUgRlJPTSBPYmplY3RT
dG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iLCBvYmplY3RTdG9yZUlkKTsKQEAgLTM3
Myw3ICszNzMsNyBAQCBzdGF0aWMgU3RyaW5nIHVwcGVyQ3Vyc29yV2hlcmVGcmFnbWVudChjb25z
dCBJREJLZXkmIGtleSwgU3RyaW5nIGNvbXBhcmlzb25PcGVyYQogICAgIHJldHVybiAiIjsKIH0K
IAotU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKK1N0cmluZyBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKICAgICBTUUxpdGVTdGF0
ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVDVCBrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwg
dmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EICIg
KyB3aGVyZVN5bnRheEZvcktleShrZXkpKTsKICAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgp
ID09IFNRTFJlc3VsdE9rOwpAQCAtNDIyLDU4ICs0MjIsNjMgQEAgc3RhdGljIHZvaWQgYmluZEtl
eVRvUXVlcnlXaXRoTnVsbHMoU1FMaXRlU3RhdGVtZW50JiBxdWVyeSwgaW50IGJhc2VDb2x1bW4s
IGNvbnMKICAgICB9CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpwdXRPYmplY3RT
dG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBjb25z
dCBTdHJpbmcmIHZhbHVlLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpCituYW1l
c3BhY2UgeworY2xhc3MgU1FMaXRlUmVjb3JkSGFuZGxlIDogcHVibGljIElEQkJhY2tpbmdTdG9y
ZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUgeworcHVibGljOgorICAgIFNRTGl0ZVJlY29yZEhh
bmRsZShpbnQ2NF90IGlkKSA6IG1faWQoaWQpIHt9CisgICAgaW50NjRfdCBpZCgpIGNvbnN0IHsg
cmV0dXJuIG1faWQ7IH0KK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX2lkOworfTsKK30KKworYm9v
bCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSwgUmVmUHRyPE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlPiYgcmVjb3JkSGFu
ZGxlKQogewotICAgIFN0cmluZyBzcWwgPSAhaW52YWxpZFJvd0lkID8gIlVQREFURSBPYmplY3RT
dG9yZURhdGEgU0VUIGtleVN0cmluZyA9ID8sIGtleURhdGUgPSA/LCBrZXlOdW1iZXIgPSA/LCB2
YWx1ZSA9ID8gV0hFUkUgaWQgPSA/IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDog
IklOU0VSVCBJTlRPIE9iamVjdFN0b3JlRGF0YSAoa2V5U3RyaW5nLCBrZXlEYXRlLCBrZXlOdW1i
ZXIsIHZhbHVlLCBvYmplY3RTdG9yZUlkKSBWQUxVRVMgKD8sID8sID8sID8sID8pIjsKKyAgICBT
UUxpdGVSZWNvcmRIYW5kbGUqIHNxbGl0ZVJlY29yZEhhbmRsZSA9IHN0YXRpY19jYXN0PFNRTGl0
ZVJlY29yZEhhbmRsZSo+KHJlY29yZEhhbmRsZS5nZXQoKSk7CisKKyAgICBTdHJpbmcgc3FsID0g
c3FsaXRlUmVjb3JkSGFuZGxlID8gIlVQREFURSBPYmplY3RTdG9yZURhdGEgU0VUIGtleVN0cmlu
ZyA9ID8sIGtleURhdGUgPSA/LCBrZXlOdW1iZXIgPSA/LCB2YWx1ZSA9ID8gV0hFUkUgaWQgPSA/
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSU5TRVJUIElOVE8gT2Jq
ZWN0U3RvcmVEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwgdmFsdWUsIG9iamVj
dFN0b3JlSWQpIFZBTFVFUyAoPywgPywgPywgPywgPykiOwogICAgIFNRTGl0ZVN0YXRlbWVudCBx
dWVyeShtX2RiLCBzcWwpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGJpbmRLZXlUb1F1ZXJ5V2l0aE51bGxzKHF1
ZXJ5LCAxLCBrZXkpOwogICAgIHF1ZXJ5LmJpbmRCbG9iKDQsIHZhbHVlKTsKLSAgICBpZiAoIWlu
dmFsaWRSb3dJZCkKLSAgICAgICAgcXVlcnkuYmluZEludDY0KDUsIHJvd0lkKTsKKyAgICBpZiAo
c3FsaXRlUmVjb3JkSGFuZGxlKQorICAgICAgICBxdWVyeS5iaW5kSW50NjQoNSwgc3FsaXRlUmVj
b3JkSGFuZGxlLT5pZCgpKTsKICAgICBlbHNlCiAgICAgICAgIHF1ZXJ5LmJpbmRJbnQ2NCg1LCBv
YmplY3RTdG9yZUlkKTsKIAogICAgIGlmIChxdWVyeS5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKGludmFsaWRSb3dJZCkKLSAgICAgICAg
cm93SWQgPSBtX2RiLmxhc3RJbnNlcnRSb3dJRCgpOworICAgIGlmICghc3FsaXRlUmVjb3JkSGFu
ZGxlKQorICAgICAgICByZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgU1FMaXRlUmVjb3JkSGFu
ZGxlKG1fZGIubGFzdEluc2VydFJvd0lEKCkpKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCi12
b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IG9iamVj
dFN0b3JlSWQpCit2b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKICAgICBkb0RlbGV0
ZShtX2RiLCAiREVMRVRFIEZST00gSW5kZXhEYXRhIFdIRVJFIG9iamVjdFN0b3JlRGF0YUlkIElO
IChTRUxFQ1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8p
Iiwgb2JqZWN0U3RvcmVJZCk7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIE9iamVj
dFN0b3JlRGF0YSBXSEVSRSBvYmplY3RTdG9yZUlkID0gPyIsIG9iamVjdFN0b3JlSWQpOwogfQog
Ci12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCkKK3ZvaWQgSURCU1FMaXRlQmFja2luZ1N0
b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmIHJlY29yZEhhbmRs
ZSkKIHsKKyAgICBjb25zdCBTUUxpdGVSZWNvcmRIYW5kbGUmIHNxbGl0ZVJlY29yZEhhbmRsZSA9
IHN0YXRpY19jYXN0PGNvbnN0IFNRTGl0ZVJlY29yZEhhbmRsZSY+KHJlY29yZEhhbmRsZSk7CisK
ICAgICBTUUxpdGVTdGF0ZW1lbnQgb3NRdWVyeShtX2RiLCAiREVMRVRFIEZST00gT2JqZWN0U3Rv
cmVEYXRhIFdIRVJFIGlkID0gPyIpOwogICAgIGJvb2wgb2sgPSBvc1F1ZXJ5LnByZXBhcmUoKSA9
PSBTUUxSZXN1bHRPazsKICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0
ZXIgZXJyb3IgaGFuZGxpbmc/CiAKLSAgICBvc1F1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9y
ZURhdGFJZCk7CisgICAgb3NRdWVyeS5iaW5kSW50NjQoMSwgc3FsaXRlUmVjb3JkSGFuZGxlLmlk
KCkpOwogCiAgICAgb2sgPSBvc1F1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwogICAgIEFT
U0VSVF9VTlVTRUQob2ssIG9rKTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBpbmRleFF1ZXJ5KG1f
ZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7
Ci0gICAgb2sgPSBpbmRleFF1ZXJ5LnByZXBhcmUoKSA9PSBTUUxSZXN1bHRPazsKLSAgICBBU1NF
UlRfVU5VU0VEKG9rLCBvayk7IC8vIEZJWE1FOiBCZXR0ZXIgZXJyb3IgaGFuZGxpbmc/Ci0KLSAg
ICBpbmRleFF1ZXJ5LmJpbmRJbnQ2NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7Ci0KLSAgICBvayA9
IGluZGV4UXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdERvbmU7Ci0gICAgQVNTRVJUX1VOVVNFRChv
aywgb2spOwogfQogCi1kb3VibGUgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3Jl
bWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpCitkb3VibGUgSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCkKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNF
TEVDVCBtYXgoa2V5TnVtYmVyKSArIDEgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0
U3RvcmVJZCA9ID8gQU5EIGtleVN0cmluZyBJUyBOVUxMIEFORCBrZXlEYXRlIElTIE5VTEwiKTsK
ICAgICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwpAQCAtNDg3LDcg
KzQ5Miw3IEBAIGRvdWJsZSBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50
TnVtYmVyKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKICAgICByZXR1cm4gcXVlcnkuZ2V0Q29sdW1u
RG91YmxlKDApOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5P
YmplY3RTdG9yZShpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBpbnQ2
NF90JiBmb3VuZE9iamVjdFN0b3JlRGF0YUlkKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6
OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5k
bGU+JiBmb3VuZFJlY29yZEhhbmRsZSkKIHsKICAgICBTdHJpbmcgc3FsID0gU3RyaW5nKCJTRUxF
Q1QgaWQgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8gQU5EICIp
ICsgd2hlcmVTeW50YXhGb3JLZXkoa2V5KTsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9k
Yiwgc3FsKTsKQEAgLTUwMCwxMSArNTA1LDExIEBAIGJvb2wgSURCU1FMaXRlQmFja2luZ1N0b3Jl
OjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QKICAg
ICBpZiAocXVlcnkuc3RlcCgpICE9IFNRTFJlc3VsdFJvdykKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogCi0gICAgZm91bmRPYmplY3RTdG9yZURhdGFJZCA9IHF1ZXJ5LmdldENvbHVtbkludDY0KDAp
OworICAgIGZvdW5kUmVjb3JkSGFuZGxlID0gYWRvcHRSZWYobmV3IFNRTGl0ZVJlY29yZEhhbmRs
ZShxdWVyeS5nZXRDb2x1bW5JbnQ2NCgwKSkpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29s
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYgY2FsbGJhY2spCitib29s
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxi
YWNrJiBjYWxsYmFjaykKIHsKICAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYiwgIlNFTEVD
VCBpZCwgdmFsdWUgRlJPTSBPYmplY3RTdG9yZURhdGEgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8i
KTsKICAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQpAQCAtNTE1LDE0ICs1
MjAsMTUgQEAgYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJl
Y29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamUKICAgICB3aGlsZSAocXVlcnkuc3RlcCgp
ID09IFNRTFJlc3VsdFJvdykgewogICAgICAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkID0g
cXVlcnkuZ2V0Q29sdW1uSW50NjQoMCk7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5Lmdl
dENvbHVtbkJsb2JBc1N0cmluZygxKTsKLSAgICAgICAgaWYgKCFjYWxsYmFjay5jYWxsYmFjayhv
YmplY3RTdG9yZURhdGFJZCwgdmFsdWUpKQorICAgICAgICBSZWZQdHI8U1FMaXRlUmVjb3JkSGFu
ZGxlPiByZWNvcmRIYW5kbGUgPSBhZG9wdFJlZihuZXcgU1FMaXRlUmVjb3JkSGFuZGxlKG9iamVj
dFN0b3JlRGF0YUlkKSk7CisgICAgICAgIGlmICghY2FsbGJhY2suY2FsbGJhY2soKnJlY29yZEhh
bmRsZSwgdmFsdWUpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJl
dHVybiB0cnVlOwogfQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxT
dHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9y
PGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6Omdl
dEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3Rv
cjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQog
ewogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCAiU0VMRUNUIGlkLCBuYW1lLCBrZXlQ
YXRoLCBpc1VuaXF1ZSBGUk9NIEluZGV4ZXMgV0hFUkUgb2JqZWN0U3RvcmVJZCA9ID8iKTsKICAg
ICBib29sIG9rID0gcXVlcnkucHJlcGFyZSgpID09IFNRTFJlc3VsdE9rOwpAQCAtNTQzLDcgKzU0
OSw3IEBAIHZvaWQgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBmCiAgICAgfQogfQogCi1ib29sIElEQlNRTGl0
ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRf
dCYgaW5kZXhJZCkKK2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQp
CiB7CiAgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJJTlNFUlQgSU5UTyBJbmRleGVz
IChvYmplY3RTdG9yZUlkLCBuYW1lLCBrZXlQYXRoLCBpc1VuaXF1ZSkgVkFMVUVTICg/LCA/LCA/
LCA/KSIpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCkBAIC01NjEs
MzYgKzU2Nyw0MSBAQCBib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbQogICAgIHJldHVybiB0cnVlOwog
fQogCi12b2lkIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCBpbmRl
eElkKQordm9pZCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCiB7CiAgICAg
ZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4ZXMgV0hFUkUgaWQgPSA/IiwgaW5kZXhJ
ZCk7CiAgICAgZG9EZWxldGUobV9kYiwgIkRFTEVURSBGUk9NIEluZGV4RGF0YSBXSEVSRSBpbmRl
eElkID0gPyIsIGluZGV4SWQpOwogfQogCi1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGlu
dDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6cHV0
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBPYmplY3RTdG9y
ZVJlY29yZEhhbmRsZSYgcmVjb3JkSGFuZGxlKQogeworICAgIGNvbnN0IFNRTGl0ZVJlY29yZEhh
bmRsZSYgc3FsaXRlUmVjb3JkSGFuZGxlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU1FMaXRlUmVjb3Jk
SGFuZGxlJj4ocmVjb3JkSGFuZGxlKTsKKwogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2Ri
LCAiSU5TRVJUIElOVE8gSW5kZXhEYXRhIChrZXlTdHJpbmcsIGtleURhdGUsIGtleU51bWJlciwg
aW5kZXhJZCwgb2JqZWN0U3RvcmVEYXRhSWQpIFZBTFVFUyAoPywgPywgPywgPywgPykiKTsKICAg
ICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQogICAgICAgICByZXR1cm4gZmFs
c2U7CiAKICAgICBiaW5kS2V5VG9RdWVyeVdpdGhOdWxscyhxdWVyeSwgMSwga2V5KTsKICAgICBx
dWVyeS5iaW5kSW50NjQoNCwgaW5kZXhJZCk7Ci0gICAgcXVlcnkuYmluZEludDY0KDUsIG9iamVj
dFN0b3JlRGF0YUlkKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoNSwgc3FsaXRlUmVjb3JkSGFuZGxl
LmlkKCkpOwogCiAgICAgcmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwogfQog
Ci1ib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGlu
dDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpCitib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6ZGVs
ZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSGFuZGxlJiBy
ZWNvcmRIYW5kbGUpCiB7Ci0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGIsICJERUxFVEUg
RlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVEYXRhSWQgPSA/Iik7CisgICAgY29uc3Qg
U1FMaXRlUmVjb3JkSGFuZGxlJiBzcWxpdGVSZWNvcmRIYW5kbGUgPSBzdGF0aWNfY2FzdDxjb25z
dCBTUUxpdGVSZWNvcmRIYW5kbGUmPihyZWNvcmRIYW5kbGUpOworCisgICAgU1FMaXRlU3RhdGVt
ZW50IHF1ZXJ5KG1fZGIsICJERUxFVEUgRlJPTSBJbmRleERhdGEgV0hFUkUgb2JqZWN0U3RvcmVE
YXRhSWQgPSA/IEFORCBpbmRleElkID0gPyIpOwogICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2spCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHF1ZXJ5LmJpbmRJbnQ2
NCgxLCBvYmplY3RTdG9yZURhdGFJZCk7CisgICAgcXVlcnkuYmluZEludDY0KDEsIHNxbGl0ZVJl
Y29yZEhhbmRsZS5pZCgpKTsKKyAgICBxdWVyeS5iaW5kSW50NjQoMiwgaW5kZXhJZCk7CiAgICAg
cmV0dXJuIHF1ZXJ5LnN0ZXAoKSA9PSBTUUxSZXN1bHREb25lOwogfQogCi1TdHJpbmcgSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYga2V5KQorU3RyaW5nIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0Vmlh
SW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7CiAgICAgU3RyaW5nIHNxbCA9IFN0cmluZygi
U0VMRUNUICIpCiAgICAgICAgICAgICAgICAgICsgIk9iamVjdFN0b3JlRGF0YS52YWx1ZSAiCkBA
IC02MjksNyArNjQwLDcgQEAgc3RhdGljIFBhc3NSZWZQdHI8SURCS2V5PiBrZXlGcm9tUXVlcnko
U1FMaXRlU3RhdGVtZW50JiBxdWVyeSwgaW50IGJhc2VDb2x1bW4pCiAgICAgcmV0dXJuIElEQktl
eTo6Y3JlYXRlTnVsbCgpOwogfQogCi1QYXNzUmVmUHRyPElEQktleT4gSURCU1FMaXRlQmFja2lu
Z1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJL
ZXkmIGtleSkKK1Bhc3NSZWZQdHI8SURCS2V5PiBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmdldFBy
aW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKICAgICBTdHJpbmcgc3Fs
ID0gU3RyaW5nKCJTRUxFQ1QgIikKICAgICAgICAgICAgICAgICAgKyAiT2JqZWN0U3RvcmVEYXRh
LmtleVN0cmluZywgT2JqZWN0U3RvcmVEYXRhLmtleURhdGUsIE9iamVjdFN0b3JlRGF0YS5rZXlO
dW1iZXIgIgpAQCAtNjUxLDcgKzY2Miw3IEBAIFBhc3NSZWZQdHI8SURCS2V5PiBJREJTUUxpdGVC
YWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90IGluZGV4SWQsCiAgICAg
cmV0dXJuIGZvdW5kS2V5LnJlbGVhc2UoKTsKIH0KIAotYm9vbCBJREJTUUxpdGVCYWNraW5nU3Rv
cmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkK
K2Jvb2wgSURCU1FMaXRlQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElE
QktleSYga2V5KQogewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBpZCBGUk9NIElu
ZGV4RGF0YSBXSEVSRSBpbmRleElkID0gPyBBTkQgIikgKyB3aGVyZVN5bnRheEZvcktleShrZXkp
OwogICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBzcWwpOwpAQCAtNjgyLDcgKzY5Myw3
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSB7IHJldHVy
biBtX2N1cnJlbnRLZXk7IH0KICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5
S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUo
KSA9IDA7Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgPSAwOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSGFu
ZGxlPiBvYmplY3RTdG9yZVJlY29yZEhhbmRsZSgpID0gMDsKICAgICB2aXJ0dWFsIGludDY0X3Qg
aW5kZXhEYXRhSWQoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgbG9hZEN1cnJlbnRSb3coKSA9
IDA7CkBAIC03NDEsNyArNzUyLDcgQEAgcHVibGljOgogCiAgICAgLy8gQ3Vyc29ySW1wbENvbW1v
bi4KICAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fY3VycmVudFZhbHVlOyB9
Ci0gICAgdmlydHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyByZXR1cm4gbV9jdXJy
ZW50SWQ7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RT
dG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IHJldHVybiBhZG9w
dFJlZihuZXcgU1FMaXRlUmVjb3JkSGFuZGxlKG1fY3VycmVudElkKSk7IH0KICAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsg
fQogICAgIHZpcnR1YWwgdm9pZCBsb2FkQ3VycmVudFJvdygpOwogICAgIHZpcnR1YWwgYm9vbCBj
dXJyZW50Um93RXhpc3RzKCk7CkBAIC03NzksNyArNzkwLDcgQEAgcHVibGljOgogICAgIC8vIEN1
cnNvckltcGxDb21tb24KICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5
KCkgeyByZXR1cm4gbV9jdXJyZW50UHJpbWFyeUtleTsgfQogICAgIHZpcnR1YWwgU3RyaW5nIHZh
bHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmly
dHVhbCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
cmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmpl
Y3RTdG9yZVJlY29yZEhhbmRsZT4gb2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUoKSB7IEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJ
ZCgpIHsgcmV0dXJuIG1fY3VycmVudElkOyB9CiAgICAgdmlydHVhbCB2b2lkIGxvYWRDdXJyZW50
Um93KCk7CiAgICAgdmlydHVhbCBib29sIGN1cnJlbnRSb3dFeGlzdHMoKTsKQEAgLTgxNyw3ICs4
MjgsNyBAQCBwdWJsaWM6CiAgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgogICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRQcmltYXJ5S2V5
OyB9CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsg
fQotICAgIHZpcnR1YWwgaW50NjRfdCBvYmplY3RTdG9yZURhdGFJZCgpIHsgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+IG9iamVjdFN0b3JlUmVjb3JkSGFuZGxlKCkg
eyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGludDY0X3Qg
aW5kZXhEYXRhSWQoKSB7IHJldHVybiBtX2N1cnJlbnRJZDsgfQogICAgIHZpcnR1YWwgdm9pZCBs
b2FkQ3VycmVudFJvdygpOwogICAgIHZpcnR1YWwgYm9vbCBjdXJyZW50Um93RXhpc3RzKCk7CkBA
IC04NDksNyArODYwLDcgQEAgYm9vbCBJbmRleEN1cnNvckltcGw6OmN1cnJlbnRSb3dFeGlzdHMo
KQogCiB9IC8vIG5hbWVzcGFjZQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
PiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rp
b24gZGlyZWN0aW9uKQorUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vy
c29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQogewogICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdl
ICYmIHJhbmdlLT5sb3dlcigpOwogICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdl
LT51cHBlcigpOwpAQCAtODg2LDcgKzg5Nyw3IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yCiAg
ICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7CiB9CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVj
dGlvbiBkaXJlY3Rpb24pCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJT
UUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5n
ZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICAgICBTdHJpbmcg
c3FsID0gU3RyaW5nKCJTRUxFQ1QgSW5kZXhEYXRhLmlkLCBJbmRleERhdGEua2V5U3RyaW5nLCBJ
bmRleERhdGEua2V5RGF0ZSwgSW5kZXhEYXRhLmtleU51bWJlciwgIikKICAgICAgICAgICAgICAg
ICAgKyAoIk9iamVjdFN0b3JlRGF0YS5rZXlTdHJpbmcsIE9iamVjdFN0b3JlRGF0YS5rZXlEYXRl
LCBPYmplY3RTdG9yZURhdGEua2V5TnVtYmVyICIpCkBAIC05MjYsNyArOTM3LDcgQEAgUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVu
SW5kZXhLZXlDdXJzb3IoaW4KICAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKIH0KIAotUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpv
cGVuSW5kZXhDdXJzb3IoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2Us
IElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQog
ewogICAgIFN0cmluZyBzcWwgPSBTdHJpbmcoIlNFTEVDVCBJbmRleERhdGEuaWQsIEluZGV4RGF0
YS5rZXlTdHJpbmcsIEluZGV4RGF0YS5rZXlEYXRlLCBJbmRleERhdGEua2V5TnVtYmVyLCAiKQog
ICAgICAgICAgICAgICAgICArICgiT2JqZWN0U3RvcmVEYXRhLnZhbHVlLCBPYmplY3RTdG9yZURh
dGEua2V5U3RyaW5nLCBPYmplY3RTdG9yZURhdGEua2V5RGF0ZSwgT2JqZWN0U3RvcmVEYXRhLmtl
eU51bWJlciAiKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVC
YWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0
b3JlLmgKaW5kZXggZmUwYzZjMTc1MTZkZTllNDBmYTk3ODdiMWNlNWYwZTYzMjBiNTliNy4uMDY1
NDg5NTdhZGNlNjViZWZkMDk3NTY2NjMxOTU1MDBmMTNhZWViMCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCkBAIC00MSwyOSArNDEsMjkgQEAg
cHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBp
bnZhbGlkUm93SWQpOwogCiAgICAgdmlydHVhbCB2b2lkIGdldE9iamVjdFN0b3JlcyhpbnQ2NF90
IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBm
b3VuZEF1dG9JbmNyZW1lbnRGbGFncyk7Ci0gICAgdmlydHVhbCBib29sIGNyZWF0ZU9iamVjdFN0
b3JlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9J
bmNyZW1lbnQsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9y
ZUlkKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RT
dG9yZUlkKTsKLSAgICB2aXJ0dWFsIFN0cmluZyBnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYpOwotICAgIHZpcnR1YWwgYm9vbCBwdXRPYmpl
Y3RTdG9yZVJlY29yZChpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIGNvbnN0
IFN0cmluZyYgdmFsdWUsIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCk7Ci0gICAg
dmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICB2aXJ0dWFsIGRvdWJsZSBuZXh0
QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAgIHZpcnR1YWwg
Ym9vbCBrZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiwgaW50NjRfdCYgZm91bmRPYmplY3RTdG9yZURhdGFJZCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgZm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2Jq
ZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYpOwotCi0gICAgdmlydHVhbCB2b2lkIGdldEluZGV4ZXMo
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rv
cjxib29sPiYgZm91bmRVbmlxdWVGbGFncyk7Ci0gICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4
KGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpOwotICAgIHZpcnR1YWwg
dm9pZCBkZWxldGVJbmRleChpbnQ2NF90IGluZGV4SWQpOwotICAgIHZpcnR1YWwgYm9vbCBwdXRJ
bmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmLCBpbnQ2NF90
IG9iamVjdFN0b3JlRGF0YUlkKTsKLSAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9y
UmVjb3JkKGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhSWQpOwotICAgIHZpcnR1YWwgU3RyaW5nIGdl
dE9iamVjdFZpYUluZGV4KGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5Jik7Ci0gICAgdmly
dHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgSURCS2V5Jik7Ci0gICAgdmlydHVhbCBib29sIGtleUV4aXN0c0luSW5kZXgo
aW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxDdXJzb3I+IG9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNv
bnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwotICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxDdXJzb3I+IG9wZW5JbmRleEtleUN1cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwotICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxDdXJzb3I+IG9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVP
YmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QmIGFzc2lnbmVkT2Jq
ZWN0U3RvcmVJZCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICB2aXJ0dWFsIFN0cmluZyBn
ZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBib29sIHB1dE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJL
ZXkmLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBSZWZQdHI8T2JqZWN0U3RvcmVSZWNvcmRIYW5kbGU+
Jik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVPYmplY3RT
dG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBuZXh0QXV0
b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCk7CisgICAgdmlydHVhbCBib29sIGtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYsIFJlZlB0cjxPYmpl
Y3RTdG9yZVJlY29yZEhhbmRsZT4mIGZvdW5kUmVjb3JkSGFuZGxlKTsKKworICAgIHZpcnR1YWwg
Ym9vbCBmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKTsKKworICAgIHZpcnR1
YWwgdm9pZCBnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1l
cywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlx
dWVGbGFncyk7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmlu
ZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCk7CisgICAgdmlydHVh
bCB2b2lkIGRlbGV0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQpOworICAgIHZpcnR1YWwgYm9vbCBwdXRJbmRleERhdGFGb3JS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRIYW5kbGUmKTsK
KyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IE9iamVj
dFN0b3JlUmVjb3JkSGFuZGxlJik7CisgICAgdmlydHVhbCBTdHJpbmcgZ2V0T2JqZWN0VmlhSW5k
ZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgSURCS2V5Jik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gZ2V0
UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworICAgIHZpcnR1YWwgYm9vbCBr
ZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYpOworCisgICAgdmlydHVhbCBQYXNzUmVm
UHRyPEN1cnNvcj4gb3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0
aW9uKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Q3Vyc29yPiBvcGVuSW5kZXhLZXlDdXJzb3Io
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbik7CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPEN1cnNvcj4gb3BlbkluZGV4Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdl
KiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pOwogCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPFRyYW5z
YWN0aW9uPiBjcmVhdGVUcmFuc2FjdGlvbigpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmlu
ZGV4IDE5MGJmZWU2OGVjMThiNWZkMzNkODliYzY2M2I3YzA3OGVkM2U3MWEuLjQ3MmI2MjNhNjE2
NjRlOWM0MjI0YmRlZGMxMzI0ZjA2YTJjZTYxZDggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CkBAIC0xLDMgKzEsMTQgQEAKKzIwMTEtMDQtMDEgIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBMZXZlbERCIGJhY2tlbmQgZm9yIEluZGV4ZWREQgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTczNzIKKworICAgICAgICAqIGZlYXR1cmVzLmd5cGk6
CisgICAgICAgICogcHVibGljL1dlYklEQkZhY3RvcnkuaDoKKyAgICAgICAgKFdlYktpdDo6V2Vi
SURCRmFjdG9yeTo6b3Blbik6CisKIDIwMTEtMDMtMzEgIFZpY3RvcmlhIEtpcnN0ICA8dnJrQGdv
b2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBDYXJsc29uLgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBpIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9mZWF0dXJlcy5neXBpCmluZGV4IDczNTRlYjhlOGMxOTljNDg4NmRjYjI3YmFkMDUw
Yjg5NGQwNWZhMzQuLjAwNjE1YjQzN2E4ZDdiZDAzMTIxOWYyMzRkOGZkOTllZTQzYjQ0ODQgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQorKysgYi9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAg
ICAgJ0VOQUJMRV9JTlBVVF9TUEVFQ0g9MScsCiAgICAgICAgICdFTkFCTEVfSkFWQVNDUklQVF9E
RUJVR0dFUj0xJywKICAgICAgICAgJ0VOQUJMRV9KU0NfTVVMVElQTEVfVEhSRUFEUz0wJywKKyAg
ICAgICAgJ0VOQUJMRV9MRVZFTERCPTAnLAogICAgICAgICAnRU5BQkxFX0xJTktfUFJFRkVUQ0g9
MScsCiAgICAgICAgICdFTkFCTEVfTUFUSE1MPTAnLAogICAgICAgICAnRU5BQkxFX01FRElBX1NU
QVRJU1RJQ1M9MScsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9X
ZWJJREJGYWN0b3J5LmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJREJGYWN0
b3J5LmgKaW5kZXggMjk0MTRlODA1ZGFhYzdmMzc1OWNmYWE3YzgzY2JlNWY5MzIwY2EwMC4uNzFi
Mjk0MTgzZjEzNTllYzc1NzY5NzFiNWMyNTY1ZmE0YzczNGNmNSAxMDA3NTUKLS0tIGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSURCRmFjdG9yeS5oCisrKyBiL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vcHVibGljL1dlYklEQkZhY3RvcnkuaApAQCAtNTcsMTEgKzU3LDcgQEAgcHVi
bGljOgogICAgIH07CiAKICAgICAvLyBUaGUgV2ViS2l0IGltcGxlbWVudGF0aW9uIG9mIG9wZW4g
aWdub3JlcyB0aGUgV2ViRnJhbWUqIHBhcmFtZXRlci4KLSAgICAvLyBGSVhNRTogQXNzZXJ0IG5v
dCByZWFjaGVkIHdoZW4gQ2hyb21pdW0gc2lkZSBpcyB1cGRhdGVkLgotICAgIHZpcnR1YWwgdm9p
ZCBvcGVuKGNvbnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJhY2tzKiBjYWxsYmFja3Ms
IGNvbnN0IFdlYlNlY3VyaXR5T3JpZ2luJiBvcmlnaW4sIFdlYkZyYW1lKiBmcmFtZSwgY29uc3Qg
V2ViU3RyaW5nJiBkYXRhRGlyLCB1bnNpZ25lZCBsb25nIGxvbmcgbWF4aW11bVNpemUsIEJhY2tp
bmdTdG9yZVR5cGUpIHsgb3BlbihuYW1lLCBjYWxsYmFja3MsIG9yaWdpbiwgZnJhbWUsIGRhdGFE
aXIsIG1heGltdW1TaXplKTsgfQotCi0gICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHdoZW4gQ2hy
b21pdW0gc2lkZSBpcyB1cGRhdGVkLgotICAgIHZpcnR1YWwgdm9pZCBvcGVuKGNvbnN0IFdlYlN0
cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJhY2tzKiBjYWxsYmFja3MsIGNvbnN0IFdlYlNlY3VyaXR5
T3JpZ2luJiBvcmlnaW4sIFdlYkZyYW1lKiBmcmFtZSwgY29uc3QgV2ViU3RyaW5nJiBkYXRhRGly
LCB1bnNpZ25lZCBsb25nIGxvbmcgbWF4aW11bVNpemUpIHsgb3BlbihuYW1lLCBjYWxsYmFja3Ms
IG9yaWdpbiwgZnJhbWUsIGRhdGFEaXIsIG1heGltdW1TaXplLCBEZWZhdWx0QmFja2luZ1N0b3Jl
KTsgfQorICAgIHZpcnR1YWwgdm9pZCBvcGVuKGNvbnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURC
Q2FsbGJhY2tzKiwgY29uc3QgV2ViU2VjdXJpdHlPcmlnaW4mLCBXZWJGcmFtZSosIGNvbnN0IFdl
YlN0cmluZyYgZGF0YURpciwgdW5zaWduZWQgbG9uZyBsb25nIG1heGltdW1TaXplLCBCYWNraW5n
U3RvcmVUeXBlKSB7IFdFQktJVF9BU1NFUlRfTk9UX1JFQUNIRUQoKTsgfQogCiAgICAgdmlydHVh
bCB2b2lkIGRlbGV0ZURhdGFiYXNlKGNvbnN0IFdlYlN0cmluZyYgbmFtZSwgV2ViSURCQ2FsbGJh
Y2tzKiwgY29uc3QgV2ViU2VjdXJpdHlPcmlnaW4mLCBXZWJGcmFtZSosIGNvbnN0IFdlYlN0cmlu
ZyYgZGF0YURpcikgeyBXRUJLSVRfQVNTRVJUX05PVF9SRUFDSEVEKCk7IH0KIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>89206</attachid>
            <date>2011-04-12 08:35:27 -0700</date>
            <delta_ts>2011-04-13 11:56:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110412163525.patch</filename>
            <type>text/plain</type>
            <size>97640</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBiNWY2NmRlZjk2ZjQyYjA5NDRkOWEwYmM5OGM0NWRiMTE5NGEzMTIxLi4y
ZjhlNjA4MWUwOTEyNGQ3NjdmMjdjNmJmYWFiZThhYmI5OTQyMDYwIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTMyIEBACisyMDExLTA0LTEyICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgT25seSBhdmFpbGFibGUgYmVoaW5k
IGEgcnVuLXRpbWUgZmxhZy4gQ292ZXJlZCBieSBleGlzdGluZyBsYXlvdXQgdGVzdHMuCisKKyAg
ICAgICAgKiBzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6ZW5jb2RlQnl0ZSk6CisgICAgICAgIChXZWJDb3JlOjptYXhJREJLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6bWluSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6Cisg
ICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFy
SW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZVZhckludCk6CisgICAgICAgIChXZWJDb3Jl
OjplbmNvZGVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dpdGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVj
b2RlU3RyaW5nV2l0aExlbik6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAg
ICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91YmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUlE
QktleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJREJLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6ZXh0cmFjdEVuY29kZWRJREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZUVuY29k
ZWRJREJLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvdW50Tm9uWmVyb0J5dGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRh
dGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZUZyZWVMaXN0
S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1l
S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFtZUtl
eTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1lS2V5
OjpkYXRhYmFzZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5h
bWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU1l
dGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6bWV0YURhdGFUeXBlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29t
cGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmVu
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5Ojpp
bmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6
bWV0YURhdGFUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVG
cmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQpOgor
ICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5Ojpj
b21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1lc0tl
eTo6b2JqZWN0U3RvcmVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhO
YW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1l
c0tleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tl
eTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6
OmluZGV4TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0
YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVE
YXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9y
ZURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZURhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlz
dHNFbnRyeUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3Rz
RW50cnlLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0Vu
dHJ5S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50
cnlLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFL
ZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjplbmNv
ZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmRhdGFi
YXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Om9iamVj
dFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Omlu
ZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OnVzZXJL
ZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6Q29tcGFyZUluZGV4S2V5
cyk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OlJlYWxDb21wYXJl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6TmFtZSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydGVzdFNlcGFyYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydFN1
Y2Nlc3Nvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0TmV3RGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3Jlcyk6CisgICAgICAg
IChXZWJDb3JlOjpnZXROZXdPYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OmRlbGV0ZVJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OmRlbGV0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld1Zl
cnNpb25OdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcik6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3Jl
bWVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpr
ZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld0luZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
ZGVsZXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRHcmVhdGVzdEtl
eUxlc3NUaGFuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4RGF0YUZvclJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjp2ZXJzaW9u
RXhpc3RzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFBy
aW1hcnlLZXlWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRMYXN0SW5kZXhL
ZXlFcXVhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKToKKwogMjAxMS0wNC0wNiAgUGhp
bGlwcGUgTm9ybWFuZCAgPHBub3JtYW5kQGlnYWxpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTWFydGluIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZS5jcHAKaW5kZXggYzA2ZWEwMDQyMjE1NTYxNTg0NjZjM2JkMjYwZDU2
ZjIzMGJkMzdhMC4uZjhhMGUzOGVjNWQwZDAzMWRiYjIyMmExNDE4ZTBmZTIwZWZlMTYxYSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3Bw
CkBAIC0yOSw4ICsyOSw4OSBAQAogI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogI2lmIEVO
QUJMRShMRVZFTERCKQogCisjaW5jbHVkZSAiQXNzZXJ0aW9ucy5oIgorI2luY2x1ZGUgIkZpbGVT
eXN0ZW0uaCIKICNpbmNsdWRlICJJREJGYWN0b3J5QmFja2VuZEltcGwuaCIKKyNpbmNsdWRlICJJ
REJLZXlSYW5nZS5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSA8bGV2
ZWxkYi9jb21wYXJhdG9yLmg+CiAjaW5jbHVkZSA8bGV2ZWxkYi9kYi5oPgorI2luY2x1ZGUgPGxl
dmVsZGIvaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL3NsaWNlLmg+CisjaW5jbHVkZSA8
bGV2ZWxkYi93cml0ZV9iYXRjaC5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJp
bmc+CisKKyNpZm5kZWYgSU5UNjRfTUFYCisvLyBGSVhNRTogRG8gdGhpcyBtb3JlIHByb3Blcmx5
LgorI2RlZmluZSBJTlQ2NF9NQVggMHg3ZmZmZmZmZmZmZmZmZmZmTEwKKyNlbmRpZgorI2lmbmRl
ZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYIDB4N2ZmZmZmZmZMCisjZW5kaWYKKworLy8g
TGV2ZWxEQiBzdG9yZXMga2V5L3ZhbHVlIHBhaXJzLiBLZXlzIGFuZCB2YWx1ZXMgYXJlIHN0cmlu
Z3Mgb2YgYnl0ZXMsIG5vcm1hbGx5IG9mIHR5cGUgc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIGtl
eXMgaW4gdGhlIGJhY2tpbmcgc3RvcmUgYXJlIHZhcmlhYmxlLWxlbmd0aCB0dXBsZXMgd2l0aCBk
aWZmZXJlbnQgdHlwZXMKKy8vIG9mIGZpZWxkcy4gRWFjaCBrZXkgaW4gdGhlIGJhY2tpbmcgc3Rv
cmUgc3RhcnRzIHdpdGggYSB0ZXJuYXJ5IHByZWZpeDogKGRhdGFiYXNlIGlkLCBvYmplY3Qgc3Rv
cmUgaWQsIGluZGV4IGlkKS4gRm9yIGVhY2gsIDAgaXMgcmVzZXJ2ZWQgZm9yIG1ldGEtZGF0YS4K
Ky8vCisvLyBFYWNoIGtleSB0eXBlIGhhcyBhIGNsYXNzIChpbiBzcXVhcmUgYnJhY2tldHMgYmVs
b3cpIHdoaWNoIGtub3dzIGhvdyB0byBlbmNvZGUsIGRlY29kZSwgYW5kIGNvbXBhcmUgdGhhdCBr
ZXkgdHlwZS4KKy8vCisvLyBHbG9iYWwgbWV0YS1kYXRhIGhhdmUga2V5cyB3aXRoIHByZWZpeCAo
MCwwLDApLCBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZToKKy8vCisvLyAgICAgPDAsIDAsIDAsIDA+
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IEluZGV4ZWREQi9M
ZXZlbERCIHNjaGVtYSB2ZXJzaW9uICgwIGZvciBub3cpIFtTY2hlbWFWZXJzaW9uS2V5XQorLy8g
ICAgIDwwLCAwLCAwLCAxPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICA9PiBUaGUgbWF4aW11bSBkYXRhYmFzZSBpZCBldmVyIGFsbG9jYXRlZCBbTWF4RGF0YWJhc2VJ
ZEtleV0KKy8vICAgICA8MCwgMCwgMCwgMTAwLCBkYXRhYmFzZSBpZD4gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgPT4gRXhpc3RlbmNlIGltcGxpZXMgdGhlIGRhdGFiYXNlIGlkIGlzIGluIHRo
ZSBmcmVlIGxpc3QgW0RhdGFiYXNlRnJlZUxpc3RLZXldCisvLyAgICAgPDAsIDAsIDAsIDIwMSwg
dXRmMTYgb3JpZ2luIG5hbWUsIHV0ZjE2IGRhdGFiYXNlIG5hbWU+ID0+IERhdGFiYXNlIGlkIFtE
YXRhYmFzZU5hbWVLZXldCisvLworLy8gRGF0YWJhc2UgbWV0YS1kYXRhOgorLy8KKy8vICAgICA8
ZGF0YWJhc2UgaWQsIDAsIDAsIDA+ID0+IHV0ZjE2IG9yaWdpbiBuYW1lIFtEYXRhYmFzZU1ldGFE
YXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMT4gPT4gdXRmMTYgZGF0YWJhc2Ug
bmFtZSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDI+
ID0+IHV0ZjE2IHVzZXIgdmVyc2lvbiBkYXRhIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQorLy8gICAg
IDxkYXRhYmFzZSBpZCwgMCwgMCwgMz4gPT4gbWF4aW11bSBvYmplY3Qgc3RvcmUgaWQgZXZlciBh
bGxvY2F0ZWQgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEt
ZGF0YToKKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlk
LCAwPiA9PiB1dGYxNiBvYmplY3Qgc3RvcmUgbmFtZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0K
Ky8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0
ZjE2IGtleSBwYXRoIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMj4gPT4gaGFzIGF1dG8gaW5jcmVtZW50IFtP
YmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9i
amVjdCBzdG9yZSBpZCwgMz4gPT4gaXMgZXZpY3RhYmxlIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5
XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgND4gPT4g
bGFzdCAidmVyc2lvbiIgbnVtYmVyIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxk
YXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRl
eCBpZCBldmVyIGFsbG9jYXRlZCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vCisvLyBJbmRl
eCBtZXRhLWRhdGE6CisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qg
c3RvcmUgaWQsIGluZGV4IGlkLCAwPiA9PiB1dGYxNiBpbmRleCBuYW1lIFtJbmRleE1ldGFEYXRh
S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGlu
ZGV4IGlkLCAxPiA9PiBhcmUgaW5kZXgga2V5cyB1bmlxdWUgW0luZGV4TWV0YURhdGFLZXldCisv
LyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQs
IDI+ID0+IHV0ZjE2IGtleSBwYXRoIFtJbmRleE1ldGFEYXRhS2V5XQorLy8KKy8vIE90aGVyIG9i
amVjdCBzdG9yZSBhbmQgaW5kZXggbWV0YS1kYXRhOgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQs
IDAsIDAsIDE1MCwgb2JqZWN0IHN0b3JlIGlkPiAgICAgICAgICAgICAgICAgICA9PiBleGlzdGVu
Y2UgaW1wbGllcyB0aGUgb2JqZWN0IHN0b3JlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW09iamVj
dFN0b3JlRnJlZUxpc3RLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTEsIG9iamVj
dCBzdG9yZSBpZCwgaW5kZXggaWQ+ICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIGlu
ZGV4IGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0luZGV4RnJlZUxpc3RLZXldCisvLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCAyMDAsIHV0ZjE2IG9iamVjdCBzdG9yZSBuYW1lPiAgICAgICAgICAg
PT4gb2JqZWN0IHN0b3JlIGlkIFtPYmplY3RTdG9yZU5hbWVzS2V5XQorLy8gICAgIDxkYXRhYmFz
ZSBpZCwgMCwgMCwgMjAxLCBvYmplY3Qgc3RvcmUgaWQsIHV0ZjE2IGluZGV4IG5hbWU+ID0+IGlu
ZGV4IGlkIFtJbmRleE5hbWVzS2V5XQorLy8KKy8vIE9iamVjdCBzdG9yZSBkYXRhOgorLy8KKy8v
ICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMSwgdXNlciBrZXk+ID0+ICJ2ZXJz
aW9uIiwgc2VyaWFsaXplZCBzY3JpcHQgdmFsdWUgW09iamVjdFN0b3JlRGF0YUtleV0KKy8vCisv
LyAiRXhpc3RzIiBlbnRyeToKKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUg
aWQsIDIsIHVzZXIga2V5PiA9PiAidmVyc2lvbiIgW0V4aXN0c0VudHJ5S2V5XQorLy8KKy8vIElu
ZGV4IGRhdGE6CisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRl
eCBpZCwgdXNlciBrZXksIHNlcXVlbmNlIG51bWJlcj4gPT4gInZlcnNpb24iLCB1c2VyIGtleSBb
SW5kZXhEYXRhS2V5XQorLy8KKy8vICAgICAoVGhlIHNlcXVlbmNlIG51bWJlciBpcyB1c2VkIHRv
IGFsbG93IHR3byBlbnRyaWVzIHdpdGggdGhlIHNhbWUgdXNlciBrZXkKKy8vICAgICBpbiBub24t
dW5pcXVlIGluZGV4ZXMuIFRoZSAidmVyc2lvbiIgZmllbGQgaXMgdXNlZCB0byB3ZWVkIG91dCBz
dGFsZQorLy8gICAgIGluZGV4IGRhdGEuIFdoZW5ldmVyIG5ldyBvYmplY3Qgc3RvcmUgZGF0YSBp
cyBpbnNlcnRlZCwgaXQgZ2V0cyBhIG5ldworLy8gICAgICJ2ZXJzaW9uIiBudW1iZXIsIGFuZCBu
ZXcgaW5kZXggZGF0YSBpcyB3cml0dGVuIHdpdGggdGhpcyBudW1iZXIuIFdoZW4KKy8vICAgICB0
aGUgaW5kZXggaXMgdXNlZCBmb3IgbG9vay11cHMsIGVudHJpZXMgYXJlIHZhbGlkYXRlZCBhZ2Fp
bnN0IHRoZQorLy8gICAgICJleGlzdHMiIGVudHJpZXMsIGFuZCByZWNvcmRzIHdpdGggb2xkICJ2
ZXJzaW9uIiBudW1iZXJzIGFyZSBnYXJiYWdlCisvLyAgICAgY29sbGVjdGVkLikKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCkBAIC00NywxNTcgKzEyOCwyMzc1IEBAIElEQkxldmVsREJCYWNraW5n
U3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0b3JlKCkKICAgICBtX2ZhY3RvcnktPnJlbW92ZUlE
QkJhY2tpbmdTdG9yZShtX2lkZW50aWZpZXIpOwogfQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiosIGNvbnN0
IFN0cmluZyYsIGludDY0X3QsIGNvbnN0IFN0cmluZyYsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCop
CitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyIGMpCiB7Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBJREJMZXZlbERCQmFja2luZ1N0b3JlKCIiLCAwLCAwKSk7CisgICAgcmV0dXJu
IHN0ZDo6c3RyaW5nKDEsIGMpOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmV4
dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYsIFN0cmluZyYsIGludDY0X3Qm
KQorc3RhdGljIHN0ZDo6c3RyaW5nIG1heElEQktleSgpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVy
biBlbmNvZGVCeXRlKDUpOyAvLyBOdWxsIHR5cGUuCiB9CiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBt
aW5JREJLZXkoKQoreworICAgIHJldHVybiBlbmNvZGVCeXRlKDQwKTsgLy8gTWluIHR5cGUuCit9
CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6c2V0SURCRGF0YWJhc2VNZXRhRGF0YShj
b25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBpbnQ2NF90JiwgYm9vbCkKK3N0YXRpYyBzdGQ6
OnN0cmluZyBlbmNvZGVJbnQoaW50NjRfdCBuKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBBU1NFUlQobiA+
PSAwKTsKKyAgICBzdGQ6OnN0cmluZyByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRp
b24uCisKKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG47CisgICAgICAgIHJl
dC5hcHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgICAgICBuID4+PSA4OworICAg
IH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCwgVmVjdG9yPGludDY0X3Q+JiwgVmVj
dG9yPFN0cmluZz4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3Rvcjxib29sPiYpCitzdGF0aWMgaW50
NjRfdCBkZWNvZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkKIHsKLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICBBU1NFUlQo
YmVnaW4gPD0gZW5kKTsKKyAgICBpbnQ2NF90IHJldCA9IDA7CisKKyAgICB3aGlsZSAoYmVnaW4g
PCBlbmQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKmJlZ2luKys7CisgICAgICAgIHJl
dCA9IChyZXQgPDwgOCkgfCBjOworICAgIH0KKworICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCwgY29uc3Qg
U3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50NjRfdCYpCitzdGF0aWMgc3RkOjpzdHJp
bmcgZW5jb2RlVmFySW50KGludDY0X3QgbikKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
Ly8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcg
cmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZG8geworICAgICAg
ICB1bnNpZ25lZCBjaGFyIGMgPSBuICYgMHg3ZjsKKyAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAg
aWYgKG4pCisgICAgICAgICAgICBjIHw9IDEyODsKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBzdGF0
aWNfY2FzdDxjaGFyPihjKSk7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1cm4gcmV0Owog
fQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0
X3QsIGludDY0X3QpCitzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlVmFySW50KGNvbnN0IGNoYXIg
KnAsIGNvbnN0IGNoYXIqIGxpbWl0LCBpbnQ2NF90KiBmb3VuZEludCkKIHsKLSAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICBBU1NFUlQobGltaXQgPj0g
cCk7CisgICAgKmZvdW5kSW50ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHAgPj0gbGlt
aXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAqZm91bmRJbnQgPSAoKmZvdW5k
SW50IDw8IDcpIHwgKCpwICYgMHg3Zik7CisgICAgfSB3aGlsZSAoKnArKyAmIDEyOCk7CisgICAg
cmV0dXJuIHA7CiB9CiAKLVN0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RT
dG9yZVJlY29yZChpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmKQorc3RhdGljIHN0ZDo6
c3RyaW5nIGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmIHMpCiB7Ci0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIFN0cmluZygpOworICAg
IHN0ZDo6c3RyaW5nIHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgVUNo
YXIgdSA9IHNbaV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSB1ID4+IDg7CisgICAgICAg
IHVuc2lnbmVkIGNoYXIgbG8gPSB1OworICAgICAgICByZXQuYXBwZW5kKDEsIGhpKTsKKyAgICAg
ICAgcmV0LmFwcGVuZCgxLCBsbyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKIH0KIAotYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90LCBp
bnQ2NF90LCBjb25zdCBJREJLZXkmLCBjb25zdCBTdHJpbmcmLCBPYmplY3RTdG9yZVJlY29yZElk
ZW50aWZpZXIqKQorc3RhdGljIFN0cmluZyBkZWNvZGVTdHJpbmcoY29uc3QgY2hhciogcCwgY29u
c3QgY2hhciogZW5kKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1w
bGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBBU1NFUlQoZW5kID49IHApOworICAgIEFT
U0VSVCghKChlbmQgLSBwKSAlIDIpKTsKKworICAgIHNpemVfdCBsZW4gPSAoZW5kIC0gcCkgLyAy
OworICAgIFZlY3RvcjxVQ2hhcj4gdmVjdG9yKGxlbik7CisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSAqcCsrOworICAg
ICAgICB1bnNpZ25lZCBjaGFyIGxvID0gKnArKzsKKworICAgICAgICB2ZWN0b3JbaV0gPSAoaGkg
PDwgOCkgfCBsbzsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nOjphZG9wdCh2ZWN0b3IpOwog
fQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRf
dCwgaW50NjRfdCkKK3N0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVTdHJpbmdXaXRoTGVuKGNvbnN0
IFN0cmluZyYgcykKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxl
bWVudC4KKyAgICBzdGQ6OnN0cmluZyByZXQgPSBlbmNvZGVWYXJJbnQocy5sZW5ndGgoKSk7Cisg
ICAgcmV0ICs9IGVuY29kZVN0cmluZyhzKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1QYXNzUmVm
UHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcigpCitzdGF0aWMg
Y29uc3QgY2hhciogZGVjb2RlU3RyaW5nV2l0aExlbihjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFy
KiBsaW1pdCwgU3RyaW5nKiBmb3VuZFN0cmluZykKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQobGltaXQg
Pj0gcCk7CisgICAgaW50NjRfdCBsZW47CisgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwg
Jmxlbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocCArIGxlbiAq
IDIgPiBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAqZm91bmRTdHJpbmcgPSBkZWNv
ZGVTdHJpbmcocCwgcCArIGxlbiAqIDIpOworICAgIHAgKz0gbGVuICogMjsKKyAgICByZXR1cm4g
cDsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJl
Y29yZChpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIq
KQorc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZURvdWJsZShkb3VibGUgeCkKIHsKLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICBzdGQ6OnN0cmluZyBy
ZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisgICAgY2hhciogcCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ4KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVv
Zih4KTsgKytpKQorICAgICAgICByZXQuYXBwZW5kKDEsIHBbaV0pOworICAgIHJldHVybiByZXQ7
CiB9CiAKLWRvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51
bWJlcihpbnQ2NF90LCBpbnQ2NF90KQorc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZURvdWJsZShj
b25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgZG91YmxlKiBkKQogewotICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIGlmIChwICsgc2l6ZW9m
KCpkKSA+IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNoYXIqIHggPSByZWludGVy
cHJldF9jYXN0PGNoYXIqPihkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZigq
ZCk7ICsraSkKKyAgICAgICAgKngrKyA9ICpwKys7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRp
YyBzdGQ6OnN0cmluZyBlbmNvZGVJREJLZXkoY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgc3Rk
OjpzdHJpbmcgcmV0OworCisgICAgc3dpdGNoIChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJL
ZXk6Ok51bGxUeXBlOgorICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZSg1KTsKKyAgICBjYXNlIElE
QktleTo6U3RyaW5nVHlwZToKKyAgICAgICAgcmV0ID0gZW5jb2RlQnl0ZSgxMCk7CisgICAgICAg
IHJldCArPSBlbmNvZGVTdHJpbmdXaXRoTGVuKGtleS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgY2FzZSBJREJLZXk6OkRhdGVUeXBlOgorICAgICAgICByZXQgPSBlbmNvZGVC
eXRlKDIwKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZURvdWJsZShrZXkuZGF0ZSgpKTsKKyAgICAg
ICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToKKyAgICAgICAgcmV0
ID0gZW5jb2RlQnl0ZSgzMCk7CisgICAgICAgIHJldCArPSBlbmNvZGVEb3VibGUoa2V5Lm51bWJl
cigpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFy
KiBkZWNvZGVJREJLZXkoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIFJlZlB0cjxJ
REJLZXk+KiBmb3VuZEtleSkKK3sKKyAgICBBU1NFUlQobGltaXQgPj0gcCk7CisgICAgaWYgKHAg
Pj0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgY2hhciB0eXBlID0g
KnArKzsKKyAgICBTdHJpbmcgczsKKyAgICBkb3VibGUgZDsKKworICAgIHN3aXRjaCAodHlwZSkg
eworICAgIGNhc2UgNToKKyAgICAgICAgLy8gTnVsbC4KKyAgICAgICAgKmZvdW5kS2V5ID0gSURC
S2V5OjpjcmVhdGVOdWxsKCk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2UgMTA6CisgICAg
ICAgIC8vIFN0cmluZy4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQs
ICZzKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICpm
b3VuZEtleSA9IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOworICAgICAgICByZXR1cm4gcDsKKyAg
ICBjYXNlIDIwOgorICAgICAgICAvLyBEYXRlLgorICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAs
IGxpbWl0LCAmZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICAqZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7CisgICAgICAgIHJldHVybiBw
OworICAgIGNhc2UgMzA6CisgICAgICAgIC8vIE51bWJlci4KKyAgICAgICAgcCA9IGRlY29kZURv
dWJsZShwLCBsaW1pdCwgJmQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgKmZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdW1iZXIoZCk7CisgICAgICAg
IHJldHVybiBwOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBleHRyYWN0
RW5jb2RlZElEQktleShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIHN0ZDo6
c3RyaW5nKiByZXN1bHQpCit7CisgICAgY29uc3QgY2hhciogcCA9IHN0YXJ0OworICAgIGlmIChw
ID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9
ICpwKys7CisKKyAgICBpbnQ2NF90IHN0cmluZ0xlbjsKKworICAgIHN3aXRjaCAodHlwZSkgewor
ICAgIGNhc2UgNToKKyAgICBjYXNlIDQwOgorICAgICAgICAqcmVzdWx0ID0gZW5jb2RlQnl0ZSh0
eXBlKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAxMDoKKyAgICAgICAgLy8gU3RyaW5n
LgorICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCAmc3RyaW5nTGVuKTsKKyAgICAg
ICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwICsgc3RyaW5n
TGVuICogMiA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICpyZXN1bHQg
PSBzdGQ6OnN0cmluZyhzdGFydCwgcCArIHN0cmluZ0xlbiAqIDIpOworICAgICAgICByZXR1cm4g
cCArIHN0cmluZ0xlbiAqIDI7CisgICAgY2FzZSAyMDoKKyAgICBjYXNlIDMwOgorICAgICAgICAv
LyBEYXRlIG9yIG51bWJlci4KKyAgICAgICAgaWYgKHAgKyBzaXplb2YoZG91YmxlKSA+IGxpbWl0
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICpyZXN1bHQgPSBzdGQ6OnN0cmluZyhz
dGFydCwgcCArIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgcmV0dXJuIHAgKyBzaXplb2YoZG91
YmxlKTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9
CisKK3N0YXRpYyBpbnQgY29tcGFyZUVuY29kZWRJREJLZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBr
ZXlBLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5QikKK3sKKyAgICBBU1NFUlQoa2V5QS5sZW5ndGgo
KSA+PSAxKTsKKyAgICBBU1NFUlQoa2V5Qi5sZW5ndGgoKSA+PSAxKTsKKworICAgIGNvbnN0IGNo
YXIqIHAgPSBrZXlBLmNfc3RyKCk7CisgICAgY29uc3QgY2hhciogbGltaXRBID0gcCArIGtleUEu
bGVuZ3RoKCk7CisgICAgY29uc3QgY2hhciogcSA9IGtleUIuY19zdHIoKTsKKyAgICBjb25zdCBj
aGFyKiBsaW1pdEIgPSBxICsga2V5Qi5sZW5ndGgoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgdHlw
ZUEgPSAqcCsrOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUIgPSAqcSsrOworCisgICAgU3RyaW5n
IHMsIHQ7CisgICAgZG91YmxlIGQsIGU7CisKKyAgICBpZiAoaW50IHggPSB0eXBlQiAtIHR5cGVB
KSAvLyBGSVhNRTogTm90ZSB0aGUgc3VidGxlbmVzcyEKKyAgICAgICAgcmV0dXJuIHg7CisKKyAg
ICBzd2l0Y2ggKHR5cGVBKSB7CisgICAgY2FzZSA1OgorICAgIGNhc2UgNDA6CisgICAgICAgIC8v
IE51bGwgdHlwZSBvciBtYXggdHlwZTsgbm8gcGF5bG9hZCB0byBjb21wYXJlLgorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBjYXNlIDEwOgorICAgICAgICAvLyBTdHJpbmcgdHlwZS4KKyAgICAgICAg
cCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXRBLCAmcyk7IC8vIEZJWE1FOiBDb21wYXJl
IHdpdGhvdXQgYWN0dWFsbHkgZGVjb2RpbmcgdGhlIFN0cmluZyEKKyAgICAgICAgQVNTRVJUKHAp
OworICAgICAgICBxID0gZGVjb2RlU3RyaW5nV2l0aExlbihxLCBsaW1pdEIsICZ0KTsKKyAgICAg
ICAgQVNTRVJUKHEpOworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShzLCB0KTsKKyAg
ICBjYXNlIDIwOgorICAgIGNhc2UgMzA6CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAg
ICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0QSwgJmQpOworICAgICAgICBBU1NFUlQocCk7
CisgICAgICAgIHEgPSBkZWNvZGVEb3VibGUocSwgbGltaXRCLCAmZSk7CisgICAgICAgIEFTU0VS
VChxKTsKKyAgICAgICAgaWYgKGQgPCBlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAg
ICBpZiAoZCA+IGUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90
LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmLCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqKQor
c3RhdGljIGludCBjb3VudE5vblplcm9CeXRlcyhpbnQ2NF90IG4pCit7CisgICAgaW50IGMgPSAx
OworICAgIHdoaWxlIChuID4+PSA4KQorICAgICAgICBjKys7CisgICAgcmV0dXJuIGM7Cit9CisK
K3N0YXRpYyBib29sIGdldEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBr
ZXksIGludDY0X3QqIGZvdW5kSW50KQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBs
ZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxk
Yjo6U2xpY2Uoa2V5KSwgJnJlc3VsdCk7CisKKyAgICBpZiAocy5Jc05vdEZvdW5kKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBBU1NFUlQocy5vaygpKTsKKyAgICBpZiAoIXMub2soKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgKmZvdW5kSW50ID0gZGVjb2RlSW50KHJlc3Vs
dC5jX3N0cigpLCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0
ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpCit7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMg
PSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBrZXksIGVuY29kZUludCh2YWx1ZSkp
OworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3N0YXRpYyBib29sIGdldFN0cmluZyhsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0
ZDo6c3RyaW5nJiBrZXksIFN0cmluZyogZm91bmRTdHJpbmcpCit7CisgICAgc3RkOjpzdHJpbmcg
cmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkdldChsZXZlbGRiOjpSZWFkT3B0
aW9ucygpLCBsZXZlbGRiOjpTbGljZShrZXkpLCAmcmVzdWx0KTsKKworICAgIGlmIChzLklzTm90
Rm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChzLm9rKCkpOworICAg
IGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAqZm91bmRTdHJpbmcg
PSBkZWNvZGVTdHJpbmcocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxl
bmd0aCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcHV0U3RyaW5nKGxl
dmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
KQoreworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlv
bnMoKSwga2V5LCBlbmNvZGVTdHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworY2xh
c3MgS2V5UHJlZml4IHsKK3B1YmxpYzoKKyAgICBLZXlQcmVmaXgoKSB7fQorCisgICAgS2V5UHJl
Zml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQpCisgICAgICAgIDogbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9v
YmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQp
CisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBLZXlQcmVmaXgqIHJlc3VsdCkKKyAgICB7Cisg
ICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAg
ICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKnN0YXJ0Kys7CisKKyAgICAgICAgaW50IGRh
dGFiYXNlSWRCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDUpICYgMHg3KSArIDE7CisgICAgICAgIGlu
dCBvYmplY3RTdG9yZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiAyKSAmIDB4NykgKyAxOworICAg
ICAgICBpbnQgaW5kZXhJZEJ5dGVzID0gKGZpcnN0Qnl0ZSAmIDB4MykgKyAxOworCisgICAgICAg
IGlmIChzdGFydCArIGRhdGFiYXNlSWRCeXRlcyArIG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4
SWRCeXRlcyA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmVzdWx0
LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVz
KTsKKyAgICAgICAgc3RhcnQgKz0gZGF0YWJhc2VJZEJ5dGVzOworICAgICAgICByZXN1bHQtPm1f
b2JqZWN0U3RvcmVJZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0
ZXMpOworICAgICAgICBzdGFydCArPSBvYmplY3RTdG9yZUlkQnl0ZXM7CisgICAgICAgIHJlc3Vs
dC0+bV9pbmRleElkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGluZGV4SWRCeXRlcyk7Cisg
ICAgICAgIHN0YXJ0ICs9IGluZGV4SWRCeXRlczsKKworICAgICAgICByZXR1cm4gc3RhcnQ7Cisg
ICAgfQorCisgICAgc3RkOjpzdHJpbmcgZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlu
dCBkYXRhYmFzZUlkQnl0ZXMgPSBjb3VudE5vblplcm9CeXRlcyhtX2RhdGFiYXNlSWQpOworICAg
ICAgICBpbnQgb2JqZWN0U3RvcmVJZEJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMobV9vYmplY3RT
dG9yZUlkKTsKKyAgICAgICAgaW50IGluZGV4SWRCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKG1f
aW5kZXhJZCk7CisKKyAgICAgICAgQVNTRVJUKGRhdGFiYXNlSWRCeXRlcyA8PSA4KTsKKyAgICAg
ICAgQVNTRVJUKG9iamVjdFN0b3JlSWRCeXRlcyA8PSA4KTsKKyAgICAgICAgQVNTRVJUKGluZGV4
SWRCeXRlcyA8PSA0KTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICBzLnJlc2Vy
dmUoMSArIGRhdGFiYXNlSWRCeXRlcyArIG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRl
cyk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAoZGF0YWJhc2VJZEJ5dGVz
IC0gMSkgPDwgNSB8IChvYmplY3RTdG9yZUlkQnl0ZXMgLSAxKSA8PCAyIHwgKGluZGV4SWRCeXRl
cyAtIDEpOworICAgICAgICBzICs9IGZpcnN0Qnl0ZTsKKyAgICAgICAgcyArPSBlbmNvZGVJbnQo
bV9kYXRhYmFzZUlkKTsKKyAgICAgICAgcyArPSBlbmNvZGVJbnQobV9vYmplY3RTdG9yZUlkKTsK
KyAgICAgICAgcyArPSBlbmNvZGVJbnQobV9pbmRleElkKTsKKworICAgICAgICByZXR1cm4gczsK
KyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBLZXlQcmVmaXgmIG90aGVyKSBjb25zdAor
ICAgIHsKKyAgICAgICAgaWYgKG1fZGF0YWJhc2VJZCAhPSBvdGhlci5tX2RhdGFiYXNlSWQpCisg
ICAgICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkIC0gb3RoZXIubV9kYXRhYmFzZUlkOworICAg
ICAgICBpZiAobV9vYmplY3RTdG9yZUlkICE9IG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAg
ICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQ7Cisg
ICAgICAgIGlmIChtX2luZGV4SWQgIT0gb3RoZXIubV9pbmRleElkKQorICAgICAgICAgICAgcmV0
dXJuIG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga0dsb2JhbE1ldGFEYXRhLAorICAgICAgICBr
RGF0YWJhc2VNZXRhRGF0YSwKKyAgICAgICAga09iamVjdFN0b3JlRGF0YSwKKyAgICAgICAga0V4
aXN0c0VudHJ5LAorICAgICAgICBrSW5kZXhEYXRhLAorICAgICAgICBrSW52YWxpZFR5cGUKKyAg
ICB9OworCisgICAgVHlwZSB0eXBlKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghbV9kYXRh
YmFzZUlkKQorICAgICAgICAgICAgcmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKKyAgICAgICAgaWYg
KCFtX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4ga0RhdGFiYXNlTWV0YURhdGE7
CisgICAgICAgIGlmIChtX2luZGV4SWQgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0
U3RvcmVEYXRhOworICAgICAgICBpZiAobV9pbmRleElkID09IDIpCisgICAgICAgICAgICByZXR1
cm4ga0V4aXN0c0VudHJ5OworICAgICAgICBpZiAobV9pbmRleElkID49IDMwKQorICAgICAgICAg
ICAgcmV0dXJuIGtJbmRleERhdGE7CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBrSW52YWxpZFR5cGU7CisgICAgfQorCisgICAgaW50NjRfdCBtX2RhdGFi
YXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4
SWQ7Cit9OworCitjbGFzcyBTY2hlbWFWZXJzaW9uS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
c3RkOjpzdHJpbmcgZW5jb2RlKCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwg
MCwgMCk7CisgICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtUeXBl
Qnl0ZSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRl
ID0gMDsKK307CisKK2NsYXNzIE1heERhdGFiYXNlSWRLZXkgeworcHVibGljOgorICAgIHN0YXRp
YyBzdGQ6OnN0cmluZyBlbmNvZGUoKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgw
LCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5
cGVCeXRlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVHlwZUJ5
dGUgPSAxOworfTsKKworY2xhc3MgRGF0YWJhc2VGcmVlTGlzdEtleSB7CitwdWJsaWM6CisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIERhdGFiYXNlRnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVBy
ZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBLZXlQcmVmaXg6OmRlY29kZShz
dGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNT
RVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9p
bmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVCh0
eXBlQnl0ZSA9PSBrVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCAmcmVz
dWx0LT5tX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgw
LCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5
cGVCeXRlKSArIGVuY29kZVZhckludChkYXRhYmFzZUlkKTsKKyAgICB9CisKKyAgICBpbnQ2NF90
IGRhdGFiYXNlSWQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlSWQ7IH0KKworICAgIGludCBj
b21wYXJlKGNvbnN0IERhdGFiYXNlRnJlZUxpc3RLZXkmIG90aGVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICB9CisK
KyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVHlwZUJ5dGUgPSAxMDA7CisKK3ByaXZh
dGU6CisgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Cit9OworCitjbGFzcyBEYXRhYmFzZU5hbWVL
ZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciog
c3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCkKKyAgICB7
CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQ
cmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisg
ICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFzZUlk
KTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNT
RVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7Cisg
ICAgICAgIEFTU0VSVCh0eXBlQnl0ZSA9PSBrVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0
aExlbihwLCBsaW1pdCwgJnJlc3VsdC0+bV9vcmlnaW4pOworICAgICAgICBpZiAoIXApCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW4ocCwg
bGltaXQsICZyZXN1bHQtPm1fZGF0YWJhc2VOYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3Rk
OjpzdHJpbmcgZW5jb2RlKGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBTdHJpbmcmIGRhdGFi
YXNlTmFtZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7CisgICAg
ICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtUeXBlQnl0ZSkgKyBlbmNv
ZGVTdHJpbmdXaXRoTGVuKG9yaWdpbikgKyBlbmNvZGVTdHJpbmdXaXRoTGVuKGRhdGFiYXNlTmFt
ZSk7CisgICAgfQorCisgICAgU3RyaW5nIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2lu
OyB9CisgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VO
YW1lOyB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBEYXRhYmFzZU5hbWVLZXkmIG90aGVyKQor
ICAgIHsKKyAgICAgICAgaWYgKGludCB4ID0gY29kZVBvaW50Q29tcGFyZShtX29yaWdpbiwgb3Ro
ZXIubV9vcmlnaW4pKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVybiBjb2Rl
UG9pbnRDb21wYXJlKG1fZGF0YWJhc2VOYW1lLCBvdGhlci5tX2RhdGFiYXNlTmFtZSk7CisgICAg
fQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMjAxOworCitw
cml2YXRlOgorICAgIFN0cmluZyBtX29yaWdpbjsgLy8gRklYTUU6IFN0b3JlIGVuY29kZWQgc3Ry
aW5ncywgb3IganVzdCBwb2ludGVycy4KKyAgICBTdHJpbmcgbV9kYXRhYmFzZU5hbWU7Cit9Owor
CitjbGFzcyBEYXRhYmFzZU1ldGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBlbnVtIE1ldGFEYXRh
VHlwZSB7CisgICAgICAgIGtPcmlnaW5OYW1lID0gMCwKKyAgICAgICAga0RhdGFiYXNlTmFtZSA9
IDEsCisgICAgICAgIGtVc2VyVmVyc2lvbiA9IDIsCisgICAgICAgIGtNYXhPYmplY3RTdG9yZUlk
ID0gMworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgTWV0YURhdGFUeXBlIG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgICAgIEtleVBy
ZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBwcmVmaXguZW5j
b2RlKCkgKyBlbmNvZGVCeXRlKG1ldGFEYXRhVHlwZSk7CisgICAgfQorfTsKKworY2xhc3MgT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTWV0
YURhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAg
ICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVm
aXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNT
RVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVj
dFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBp
ZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBj
aGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVCeXRlID09IGtUeXBlQnl0
ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7
CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQo
cmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCAm
cmVzdWx0LT5tX21ldGFEYXRhVHlwZSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5n
IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBtZXRhRGF0YVR5cGUpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNl
SWQsIDAsIDApOworICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShr
VHlwZUJ5dGUpICsgZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpICsgZW5jb2RlVmFySW50KG1l
dGFEYXRhVHlwZSk7CisgICAgfQorCisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3Qg
eyByZXR1cm4gbV9vYmplY3RTdG9yZUlkOyB9CisgICAgaW50NjRfdCBtZXRhRGF0YVR5cGUoKSBj
b25zdCB7IHJldHVybiBtX21ldGFEYXRhVHlwZTsgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3Qg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleSYgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoaW50IHgg
PSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICBy
ZXR1cm4geDsgLy8gRklYTUU6IElzIHRoaXMgY2FzdCBzYWZlPyBJLmUuLCB3aWxsIGl0IHByZXNl
cnZlIHRoZSBzaWduPworICAgICAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21l
dGFEYXRhVHlwZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVHlw
ZUJ5dGUgPSA1MDsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAg
ICBpbnQ2NF90IG1fbWV0YURhdGFUeXBlOyAvLyBGSVhNRTogTWFrZSB0aGlzIGEgYnl0ZS4KK307
CisKK2NsYXNzIEluZGV4TWV0YURhdGFLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE1l
dGFEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFT
U0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmpl
Y3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAg
aWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQg
Y2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVCh0eXBlQnl0ZSA9PSBrVHlwZUJ5
dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlSWQp
OworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRl
Y29kZVZhckludChwLCBsaW1pdCwgJnJlc3VsdC0+bV9pbmRleElkKTsKKyAgICAgICAgaWYgKCFw
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUgPSAqcCsrOwor
ICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4
IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUo
KSArIGVuY29kZUJ5dGUoa1R5cGVCeXRlKSArIGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSAr
IGVuY29kZVZhckludChpbmRleElkKSArIGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKTsKKyAgICB9
CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcikKKyAgICB7
CisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3Rv
cmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBpZiAoaW50IHggPSBtX2luZGV4
SWQgLSBvdGhlci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0
dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7CisgICAgfQorCisgICAg
aW50NjRfdCBpbmRleElkKCkgY29uc3QgeyByZXR1cm4gbV9pbmRleElkOyB9CisgICAgdW5zaWdu
ZWQgY2hhciBtZXRhRGF0YVR5cGUoKSBjb25zdCB7IHJldHVybiBtX21ldGFEYXRhVHlwZTsgfQor
CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMTAwOworCitwcml2
YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElk
OworICAgIHVuc2lnbmVkIGNoYXIgbV9tZXRhRGF0YVR5cGU7Cit9OworCitjbGFzcyBPYmplY3RT
dG9yZUZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlz
dEtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAg
Y29uc3QgY2hhciAqcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7
CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQo
cHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChw
ID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
dHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlQodHlwZUJ5dGUgPT0ga1R5cGVCeXRlKTsK
KyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
cmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgJnJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZp
eChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVu
Y29kZUJ5dGUoa1R5cGVCeXRlKSArIGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKTsKKyAgICB9
CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdCB7IHJldHVybiBtX29iamVjdFN0
b3JlSWQ7IH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlRnJlZUxpc3RLZXkm
IG90aGVyKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IEl0IG1heSBzZWVtIHN0cmFuZ2UgdGhh
dCB3ZSdyZSBub3QgY29tcGFyaW5nIGRhdGFiYXNlIGlkJ3MsCisgICAgICAgIC8vIGJ1dCB0aGF0
IGNvbXBhcmlzb24gd2lsbCBoYXZlIGJlZW4gbWFkZSBlYXJsaWVyLgorICAgICAgICAvLyBXZSBz
aG91bGQgcHJvYmFibHkgbWFrZSB0aGlzIG1vcmUgY2xlYXIsIHRob3VnaC4uLgorICAgICAgICBy
ZXR1cm4gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOworICAgIH0KKwor
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUeXBlQnl0ZSA9IDE1MDsKKworcHJpdmF0
ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKK307CisKK2NsYXNzIEluZGV4RnJlZUxp
c3RLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpCisg
ICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0g
S2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFw
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFz
ZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAg
QVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7
CisgICAgICAgIEFTU0VSVCh0eXBlQnl0ZSA9PSBrVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9
PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGxpbWl0LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1p
dCwgJnJlc3VsdC0+bV9pbmRleElkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcg
ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAs
IDApOworICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5
dGUpICsgZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpICsgZW5jb2RlVmFySW50KGluZGV4SWQp
OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVy
KQorICAgIHsKKyAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9v
YmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVybiBtX2lu
ZGV4SWQgLSBvdGhlci5tX2luZGV4SWQ7CisgICAgfQorCisgICAgaW50NjRfdCBvYmplY3RTdG9y
ZUlkKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RTdG9yZUlkOyB9CisgICAgaW50NjRfdCBpbmRl
eElkKCkgY29uc3QgeyByZXR1cm4gbV9pbmRleElkOyB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgY2hhciBrVHlwZUJ5dGUgPSAxNTE7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29i
amVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7Cit9OworCitjbGFzcyBPYmplY3RT
dG9yZU5hbWVzS2V5IHsKK3B1YmxpYzoKKyAgICAvLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMg
dG8gbG9vayB1cCBvYmplY3Qgc3RvcmUgaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAgIC8vIGlz
IGtlcHQgaW4gdGhlIElEQkRhdGFiYXNlQmFja2VuZEltcGwuIENhbiB0aGUgbWFwcGluZyBiZWNv
bWUgdW5yZWxpYWJsZT8KKyAgICAvLyBDYW4gd2UgcmVtb3ZlIHRoaXM/CisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9i
amVjdFN0b3JlTmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVm
aXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGlt
aXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZp
eC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwor
ICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1
bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVCeXRlID09
IGtUeXBlQnl0ZSk7CisgICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0
LCAmcmVzdWx0LT5tX29iamVjdFN0b3JlTmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6
c3RyaW5nIGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgb2JqZWN0U3Rv
cmVOYW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAw
KTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5cGVCeXRl
KSArIGVuY29kZVN0cmluZ1dpdGhMZW4ob2JqZWN0U3RvcmVOYW1lKTsKKyAgICB9CisKKyAgICBp
bnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU5hbWVzS2V5JiBvdGhlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKG1fb2JqZWN0U3RvcmVOYW1lLCBvdGhlci5tX29i
amVjdFN0b3JlTmFtZSk7CisgICAgfQorCisgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSgpIGNv
bnN0IHsgcmV0dXJuIG1fb2JqZWN0U3RvcmVOYW1lOyB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgY2hhciBrVHlwZUJ5dGUgPSAyMDA7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fb2Jq
ZWN0U3RvcmVOYW1lOyAvLyBGSVhNRTogU3RvcmUgdGhlIGVuY29kZWQgc3RyaW5nLCBvciBqdXN0
IHBvaW50ZXJzIHRvIGl0LgorfTsKKworY2xhc3MgSW5kZXhOYW1lc0tleSB7CitwdWJsaWM6Cisg
ICAgLy8gRklYTUU6IFdlIG5ldmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgaW5kZXggaWRzLCBiZWNh
dXNlIGEgbWFwcGluZworICAgIC8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCisgICAgc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGlt
aXQsIEluZGV4TmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVm
aXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGlt
aXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZp
eC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwor
ICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1
bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVCeXRlID09
IGtUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsICZyZXN1bHQtPm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBsaW1pdCwgJnJlc3VsdC0+bV9pbmRleE5h
bWUpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgaW5kZXhOYW1lKQor
ICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAg
ICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5cGVCeXRlKSArIGVuY29k
ZVZhckludChvYmplY3RTdG9yZUlkKSArIGVuY29kZVN0cmluZ1dpdGhMZW4oaW5kZXhOYW1lKTsK
KyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE5hbWVzS2V5JiBvdGhlcikKKyAg
ICB7CisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0
U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50
Q29tcGFyZShtX2luZGV4TmFtZSwgb3RoZXIubV9pbmRleE5hbWUpOworICAgIH0KKworICAgIFN0
cmluZyBpbmRleE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4TmFtZTsgfQorCisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMjAxOworCitwcml2YXRlOgorICAg
IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIFN0cmluZyBtX2luZGV4TmFtZTsKK307CisK
K2NsYXNzIE9iamVjdFN0b3JlRGF0YUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNo
YXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9y
ZURhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAg
ICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgZW5kLCAmcHJlZml4
KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VS
VChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0
b3JlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4
TnVtYmVyKTsKKyAgICAgICAgaWYgKHAgPT0gZW5kKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1fZW5j
b2RlZFVzZXJLZXkpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IHN0ZDo6c3RyaW5n
IGVuY29kZWRVc2VyS2V5KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgcmV0dXJu
IHByZWZpeC5lbmNvZGUoKSArIGVuY29kZWRVc2VyS2V5OworICAgIH0KKworICAgIHN0YXRpYyBz
dGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleSYgdXNlcktleSkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsKKyAgICB9
CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZURhdGFLZXkmIG90aGVyKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5
LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPElEQktl
eT4gdXNlcktleSgpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXk7Cisg
ICAgICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmNfc3RyKCksIG1fZW5jb2RlZFVz
ZXJLZXkuY19zdHIoKSArIG1fZW5jb2RlZFVzZXJLZXkubGVuZ3RoKCksICZrZXkpOworICAgICAg
ICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTcGVjaWFs
SW5kZXhOdW1iZXIgPSAxOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1fZW5jb2RlZFVz
ZXJLZXk7Cit9OworCitjbGFzcyBFeGlzdHNFbnRyeUtleSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBF
eGlzdHNFbnRyeUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsK
KyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZw
cmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
QVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2Jq
ZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IGtTcGVjaWFs
SW5kZXhOdW1iZXIpOworICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+
bV9lbmNvZGVkVXNlcktleSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qgc3RkOjpz
dHJpbmcmIGVuY29kZWRLZXkpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgICAgICByZXR1
cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlZEtleTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3Rk
OjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmIHVzZXJLZXkpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSk7CisgICAgfQor
CisgICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkmIG90aGVyKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhl
ci5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPElEQktleT4gdXNl
cktleSgpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXk7CisgICAgICAg
IGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmNfc3RyKCksIG1fZW5jb2RlZFVzZXJLZXku
Y19zdHIoKSArIG1fZW5jb2RlZFVzZXJLZXkubGVuZ3RoKCksICZrZXkpOworICAgICAgICByZXR1
cm4ga2V5OworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTcGVjaWFsSW5kZXhO
dW1iZXIgPSAyOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1fZW5jb2RlZFVzZXJLZXk7
Cit9OworCitjbGFzcyBJbmRleERhdGFLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERh
dGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAg
IGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgp
OworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJU
KHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID49IDMwKTsKKyAgICAgICAg
cmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBwcmVmaXgubV9kYXRhYmFzZUlkOworICAgICAgICByZXN1
bHQtPm1fb2JqZWN0U3RvcmVJZCA9IHByZWZpeC5tX29iamVjdFN0b3JlSWQ7CisgICAgICAgIHJl
c3VsdC0+bV9pbmRleElkID0gcHJlZml4Lm1faW5kZXhJZDsKKyAgICAgICAgcCA9IGV4dHJhY3RF
bmNvZGVkSURCS2V5KHAsIGxpbWl0LCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICAg
ICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwID09IGxpbWl0
KSB7CisgICAgICAgICAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIgPSAtMTsgLy8gRklYTUU6
IFdlIHNob3VsZCBjaGFuZ2UgaXQgc28gdGhhdCBhbGwga2V5cyBoYXZlIGEgc2VxdWVuY2UgbnVt
YmVyLiBTaG91bGRuJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLgorICAgICAgICAgICAgcmV0
dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwg
JnJlc3VsdC0+bV9zZXF1ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3Ry
aW5nIGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFVzZXJLZXksIGludDY0X3Qg
c2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOworICAgICAgICByZXR1cm4gcHJlZml4LmVuY29k
ZSgpICsgZW5jb2RlZFVzZXJLZXkgKyBlbmNvZGVWYXJJbnQoc2VxdWVuY2VOdW1iZXIpOworICAg
IH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiB1c2Vy
S2V5LCBpbnQ2NF90IHNlcXVlbmNlTnVtYmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBlbmNvZGVJREJLZXkodXNlcktl
eSksIHNlcXVlbmNlTnVtYmVyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5j
b2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQz
Ml9NQVgsIG1heElEQktleSgpLCBJTlQ2NF9NQVgpOworICAgIH0KKworICAgIGludCBjb21wYXJl
KGNvbnN0IEluZGV4RGF0YUtleSYgb3RoZXIsIGJvb2wgaWdub3JlU2VxdWVuY2VOdW1iZXIpCisg
ICAgeworICAgICAgICBpZiAoaW50IHggPSBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVk
VXNlcktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktleSkpCisgICAgICAgICAgICByZXR1cm4geDsK
KyAgICAgICAgaWYgKGlnbm9yZVNlcXVlbmNlTnVtYmVyKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIHJldHVybiBtX3NlcXVlbmNlTnVtYmVyIC0gb3RoZXIubV9zZXF1ZW5jZU51bWJl
cjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBjb25zdCB7IHJldHVybiBtX2Rh
dGFiYXNlSWQ7IH0KKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdCB7IHJldHVybiBt
X29iamVjdFN0b3JlSWQ7IH0KKyAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdCB7IHJldHVybiBt
X2luZGV4SWQ7IH0KKworICAgIFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3QKKyAg
ICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2RlSURCS2V5KG1f
ZW5jb2RlZFVzZXJLZXkuY19zdHIoKSwgbV9lbmNvZGVkVXNlcktleS5jX3N0cigpICsgbV9lbmNv
ZGVkVXNlcktleS5sZW5ndGgoKSwgJmtleSk7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQor
Citwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGludDY0X3QgbV9vYmpl
Y3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworICAgIHN0ZDo6c3RyaW5nIG1fZW5j
b2RlZFVzZXJLZXk7CisgICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVyOworfTsKKworY2xhc3Mg
Q29tcGFyYXRvciA6IHB1YmxpYyBsZXZlbGRiOjpDb21wYXJhdG9yIHsKK3B1YmxpYzoKKyAgICB2
aXJ0dWFsIGludCBDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRi
OjpTbGljZSYgYikgY29uc3QKKyAgICB7CisgICAgICAgIGludCB5ID0gUmVhbENvbXBhcmUoYSwg
Yik7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworICAgIGludCBDb21wYXJlSW5kZXhLZXlz
KGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QK
KyAgICB7CisgICAgICAgIGludCB5ID0gUmVhbENvbXBhcmUoYSwgYiwgdHJ1ZSk7CisgICAgICAg
IHJldHVybiB5OworICAgIH0KKworICAgIGludCBSZWFsQ29tcGFyZShjb25zdCBsZXZlbGRiOjpT
bGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzID0gZmFsc2Up
IGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBwdHJBID0gYS5kYXRhKCk7CisgICAg
ICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBiLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hhciogZW5k
QSA9IHB0ckEgKyBhLnNpemUoKTsKKyAgICAgICAgY29uc3QgY2hhciogZW5kQiA9IHB0ckIgKyBi
LnNpemUoKTsKKworICAgICAgICBLZXlQcmVmaXggcHJlZml4QTsKKyAgICAgICAgS2V5UHJlZml4
IHByZWZpeEI7CisKKyAgICAgICAgcHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckEsIGVuZEEs
ICZwcmVmaXhBKTsKKyAgICAgICAgcHRyQiA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckIsIGVuZEIs
ICZwcmVmaXhCKTsKKyAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICBBU1NFUlQocHRyQik7
CisKKyAgICAgICAgaWYgKGludCB4ID0gcHJlZml4QS5jb21wYXJlKHByZWZpeEIpKQorICAgICAg
ICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZp
eDo6a0dsb2JhbE1ldGFEYXRhKSB7CisgICAgICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsK
KyAgICAgICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAgICAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5
cGVCeXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAt
IHR5cGVCeXRlQikKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICAgICAgaWYg
KHR5cGVCeXRlQSA8PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
aWYgKHR5cGVCeXRlQSA9PSBEYXRhYmFzZUZyZWVMaXN0S2V5OjprVHlwZUJ5dGUpIHsKKyAgICAg
ICAgICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5IGRhdGFiYXNlRnJlZUxpc3RLZXlBOworICAg
ICAgICAgICAgICAgIERhdGFiYXNlRnJlZUxpc3RLZXkgZGF0YWJhc2VGcmVlTGlzdEtleUI7CisK
KyAgICAgICAgICAgICAgICBwdHJBID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKGEuZGF0
YSgpLCBlbmRBLCAmZGF0YWJhc2VGcmVlTGlzdEtleUEpOworICAgICAgICAgICAgICAgIHB0ckIg
PSBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZkYXRhYmFzZUZy
ZWVMaXN0S2V5Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAg
ICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZUZyZWVM
aXN0S2V5QS5jb21wYXJlKGRhdGFiYXNlRnJlZUxpc3RLZXlCKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gRGF0YWJhc2VOYW1lS2V5OjprVHlwZUJ5dGUpIHsK
KyAgICAgICAgICAgICAgICBEYXRhYmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5QTsKKyAgICAg
ICAgICAgICAgICBEYXRhYmFzZU5hbWVLZXkgZGF0YWJhc2VOYW1lS2V5QjsKKworICAgICAgICAg
ICAgICAgIHB0ckEgPSBEYXRhYmFzZU5hbWVLZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJmRh
dGFiYXNlTmFtZUtleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBEYXRhYmFzZU5hbWVLZXk6
OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJmRhdGFiYXNlTmFtZUtleUIpOworICAgICAgICAgICAg
ICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZGF0YWJhc2VOYW1lS2V5QS5jb21wYXJlKGRhdGFiYXNlTmFtZUtl
eUIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZWZpeEEudHlw
ZSgpID09IEtleVByZWZpeDo6a0RhdGFiYXNlTWV0YURhdGEpIHsKKyAgICAgICAgICAgIEFTU0VS
VChwdHJBICE9IGVuZEEpOworICAgICAgICAgICAgQVNTRVJUKHB0ckIgIT0gZW5kQik7CisKKyAg
ICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckErKzsKKyAgICAgICAgICAg
IHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVCID0gKnB0ckIrKzsKKworICAgICAgICAgICAgaWYgKGlu
dCB4ID0gdHlwZUJ5dGVBIC0gdHlwZUJ5dGVCKQorICAgICAgICAgICAgICAgIHJldHVybiB4Owor
CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBIDw9IDMpCisgICAgICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
OmtUeXBlQnl0ZSkgeworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0
YURhdGFLZXlBOworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURh
dGFLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJm1ldGFEYXRhS2V5QSk7CisgICAgICAgICAgICAgICAg
cHRyQiA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJm1l
dGFEYXRhS2V5Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAg
ICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUtleUEu
Y29tcGFyZShtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5
cGVCeXRlQSA9PSBJbmRleE1ldGFEYXRhS2V5OjprVHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAg
ICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5QTsKKyAgICAgICAgICAgICAgICBJbmRleE1l
dGFEYXRhS2V5IG1ldGFEYXRhS2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEgPSBJbmRleE1l
dGFEYXRhS2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZtZXRhRGF0YUtleUEpOworICAgICAg
ICAgICAgICAgIHB0ckIgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIs
ICZtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFL
ZXlBLmNvbXBhcmUobWV0YURhdGFLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICh0eXBlQnl0ZUEgPT0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6a1R5cGVCeXRlKSB7CisgICAg
ICAgICAgICAgICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSBmcmVlTGlzdEVudHJ5S2V5QTsKKyAg
ICAgICAgICAgICAgICBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0RW50cnlLZXlCOwor
CisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZShh
LmRhdGEoKSwgZW5kQSwgJmZyZWVMaXN0RW50cnlLZXlBKTsKKyAgICAgICAgICAgICAgICBwdHJC
ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZnJlZUxp
c3RFbnRyeUtleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJlZUxpc3RFbnRy
eUtleUEuY29tcGFyZShmcmVlTGlzdEVudHJ5S2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAodHlwZUJ5dGVBID09IEluZGV4RnJlZUxpc3RLZXk6OmtUeXBlQnl0ZSkgeworICAg
ICAgICAgICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUE7CisgICAgICAg
ICAgICAgICAgSW5kZXhGcmVlTGlzdEtleSBmcmVlTGlzdEVudHJ5S2V5QjsKKworICAgICAgICAg
ICAgICAgIHB0ckEgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZm
cmVlTGlzdEVudHJ5S2V5QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IEluZGV4RnJlZUxpc3RL
ZXk6OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJmZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZyZWVMaXN0RW50cnlLZXlBLmNvbXBhcmUoZnJlZUxpc3RF
bnRyeUtleUIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBP
YmplY3RTdG9yZU5hbWVzS2V5OjprVHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RT
dG9yZU5hbWVzS2V5IG9iamVjdFN0b3JlTmFtZXNLZXlBOworICAgICAgICAgICAgICAgIE9iamVj
dFN0b3JlTmFtZXNLZXkgb2JqZWN0U3RvcmVOYW1lc0tleUI7CisKKyAgICAgICAgICAgICAgICBw
dHJBID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmb2JqZWN0
U3RvcmVOYW1lc0tleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9yZU5hbWVz
S2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZvYmplY3RTdG9yZU5hbWVzS2V5Qik7CisgICAg
ICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsK
KworICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RTdG9yZU5hbWVzS2V5QS5jb21wYXJlKG9i
amVjdFN0b3JlTmFtZXNLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBl
Qnl0ZUEgPT0gSW5kZXhOYW1lc0tleTo6a1R5cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgSW5k
ZXhOYW1lc0tleSBpbmRleE5hbWVzS2V5QTsKKyAgICAgICAgICAgICAgICBJbmRleE5hbWVzS2V5
IGluZGV4TmFtZXNLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IEluZGV4TmFtZXNLZXk6
OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJmluZGV4TmFtZXNLZXlBKTsKKyAgICAgICAgICAgICAg
ICBwdHJCID0gSW5kZXhOYW1lc0tleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmaW5kZXhOYW1l
c0tleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBB
U1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhOYW1lc0tleUEuY29t
cGFyZShpbmRleE5hbWVzS2V5Qik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprT2JqZWN0U3RvcmVEYXRhKSB7
CisgICAgICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAgICAg
ICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3Rpbmcg
dXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAg
ICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVEYXRhS2V5QTsKKyAgICAgICAg
ICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXlCOworCisgICAgICAgICAg
ICBwdHJBID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZvYmpl
Y3RTdG9yZURhdGFLZXlBKTsKKyAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9yZURhdGFLZXk6
OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJm9iamVjdFN0b3JlRGF0YUtleUIpOworICAgICAgICAg
ICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAg
ICByZXR1cm4gb2JqZWN0U3RvcmVEYXRhS2V5QS5jb21wYXJlKG9iamVjdFN0b3JlRGF0YUtleUIp
OworICAgICAgICB9CisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtF
eGlzdHNFbnRyeSkgeworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09IGVu
ZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAocHRyQSA9PSBl
bmRBKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChwdHJCID09
IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Yg
bm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlz
IHdheS4KKworICAgICAgICAgICAgRXhpc3RzRW50cnlLZXkgZXhpc3RzRW50cnlLZXlBOworICAg
ICAgICAgICAgRXhpc3RzRW50cnlLZXkgZXhpc3RzRW50cnlLZXlCOworCisgICAgICAgICAgICBw
dHJBID0gRXhpc3RzRW50cnlLZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJmV4aXN0c0VudHJ5
S2V5QSk7CisgICAgICAgICAgICBwdHJCID0gRXhpc3RzRW50cnlLZXk6OmRlY29kZShiLmRhdGEo
KSwgZW5kQiwgJmV4aXN0c0VudHJ5S2V5Qik7CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7Cisg
ICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgIHJldHVybiBleGlzdHNFbnRy
eUtleUEuY29tcGFyZShleGlzdHNFbnRyeUtleUIpOworICAgICAgICB9CisgICAgICAgIGlmIChw
cmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtJbmRleERhdGEpIHsKKyAgICAgICAgICAgIGlm
IChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
LTE7CisgICAgICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVy
biAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxk
IG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAgICAgICAgIEluZGV4RGF0
YUtleSBpbmRleERhdGFLZXlBOworICAgICAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtl
eUI7CisKKyAgICAgICAgICAgIHB0ckEgPSBJbmRleERhdGFLZXk6OmRlY29kZShhLmRhdGEoKSwg
ZW5kQSwgJmluZGV4RGF0YUtleUEpOworICAgICAgICAgICAgcHRyQiA9IEluZGV4RGF0YUtleTo6
ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmaW5kZXhEYXRhS2V5Qik7CisgICAgICAgICAgICBBU1NF
UlQocHRyQSk7CisgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgIGJvb2wg
aWdub3JlU2VxdWVuY2VOdW1iZXIgPSBpbmRleEtleXM7CisgICAgICAgICAgICByZXR1cm4gaW5k
ZXhEYXRhS2V5QS5jb21wYXJlKGluZGV4RGF0YUtleUIsIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsK
KyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3QgeyByZXR1cm4gImlk
Yl9jbXAxIjsgfQorICAgIHZvaWQgRmluZFNob3J0ZXN0U2VwYXJhdG9yKHN0ZDo6c3RyaW5nKiwg
Y29uc3QgbGV2ZWxkYjo6U2xpY2UmKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50
dWFsbHkuCisgICAgdm9pZCBGaW5kU2hvcnRTdWNjZXNzb3Ioc3RkOjpzdHJpbmcqKSBjb25zdCB7
fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCit9IGNvbXBhcmF0b3I7Cit9CisKK3N0
YXRpYyBib29sIHNldFVwTWV0YWRhdGEobGV2ZWxkYjo6REIqIGRiKQogewotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAg
ICBjb25zdCBzdGQ6OnN0cmluZyBtZXRhRGF0YUtleSA9IFNjaGVtYVZlcnNpb25LZXk6OmVuY29k
ZSgpOworCisgICAgaW50NjRfdCBzY2hlbWFWZXJzaW9uOworICAgIGlmICghZ2V0SW50KGRiLCBt
ZXRhRGF0YUtleSwgJnNjaGVtYVZlcnNpb24pKSB7CisgICAgICAgIHNjaGVtYVZlcnNpb24gPSAw
OworICAgICAgICBpZiAoIXB1dEludChkYiwgbWV0YURhdGFLZXksIHNjaGVtYVZlcnNpb24pKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEZJWE1FOiBFdmVudHVh
bGx5LCB3ZSdsbCBuZWVkIHRvIGJlIGFibGUgdG8gdHJhbnNpdGlvbiBiZXR3ZWVuIHNjaGVtYXMu
CisgICAgaWYgKHNjaGVtYVZlcnNpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRG9uJ3Qg
a25vdyB3aGF0IHRvIGRvIHdpdGggdGhpcyB2ZXJzaW9uLgorCisgICAgcmV0dXJuIHRydWU7CiB9
CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QsIGludDY0X3QsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2smKQorUGFzc1JlZlB0
cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlP
cmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlQXJnLCBpbnQ2NF90
IG1heGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFj
a2VuZEltcGwqIGZhY3RvcnkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1F
OiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIFN0cmluZyBwYXRoQmFzZSA9IHBh
dGhCYXNlQXJnOworCisgICAgaWYgKHBhdGhCYXNlLmlzRW1wdHkoKSkgeworICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IFdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZSBm
b3IgaW5jb2duaXRvIGFuZCBEdW1wUmVuZGVyVHJlZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorCisgICAgaWYgKCFtYWtlQWxsRGlyZWN0b3JpZXMocGF0aEJhc2UpKSB7CisgICAgICAgIExP
R19FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSBJbmRleGVkREIgZGF0YWJhc2UgcGF0aCAlcyIsIHBh
dGhCYXNlLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8g
RklYTUU6IFdlIHNob3VsZCBldmVudHVhbGx5IHVzZSB0aGUgc2FtZSBMZXZlbERCIGRhdGFiYXNl
IGZvciBhbGwgb3JpZ2lucy4KKyAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBv
bmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5p
bmRleGVkZGIubGV2ZWxkYiIpOworCisgICAgbGV2ZWxkYjo6REIqIGRiOworICAgIGxldmVsZGI6
Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXBhcmF0b3IgPSAmY29tcGFyYXRvcjsK
KyAgICBvcHRpb25zLmNyZWF0ZV9pZl9taXNzaW5nID0gdHJ1ZTsKKyAgICBsZXZlbGRiOjpTdGF0
dXMgc3RhdHVzID0gbGV2ZWxkYjo6REI6Ok9wZW4ob3B0aW9ucywgcGF0aC51dGY4KCkuZGF0YSgp
LCAmZGIpOworCisgICAgaWYgKCFzdGF0dXMub2soKSkgeworICAgICAgICAvLyBGSVhNRTogSWYg
dGhlIGNvbXBhcmF0b3IgbmFtZSBjaGFuZ2VzLCB3ZSBuZWVkIGEgdHJhbnNpdGlvbmluZyBzdHJh
dGVneS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUmVmUHRyPElEQkxldmVsREJC
YWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZShmaWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CisKKyAgICBpZiAoIXNldFVwTWV0
YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gYmFja2luZ1N0b3JlLnJlbGVhc2UoKTsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3QsIGludDY0X3QsIFZlY3RvcjxpbnQ2NF90PiYs
IFZlY3RvcjxTdHJpbmc+JiwgVmVjdG9yPFN0cmluZz4mLCBWZWN0b3I8Ym9vbD4mKQorYm9vbCBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBT
dHJpbmcmIG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3VuZElkKQogewot
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIGNvbnN0
IHN0ZDo6c3RyaW5nIGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwg
bmFtZSk7CisKKyAgICBib29sIG9rID0gZ2V0SW50KG1fZGIuZ2V0KCksIGtleSwgJmZvdW5kSWQp
OworICAgIGlmICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG9rID0gZ2V0U3Ry
aW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShmb3VuZElkLCBEYXRh
YmFzZU1ldGFEYXRhS2V5OjprVXNlclZlcnNpb24pLCAmZm91bmRWZXJzaW9uKTsKKyAgICBpZiAo
IW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3Rh
dGljIGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChsZXZlbGRiOjpEQiogZGIpCit7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgZnJlZUxpc3RTdGFydEtleSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVu
Y29kZSgwKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmcmVlTGlzdFN0b3BLZXkgPSBEYXRhYmFz
ZUZyZWVMaXN0S2V5OjplbmNvZGUoSU5UNjRfTUFYKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJ
dGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAg
ICBmb3IgKGl0LT5TZWVrKGZyZWVMaXN0U3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJh
dG9yLkNvbXBhcmUoaXQtPmtleSgpLCBmcmVlTGlzdFN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkg
eworICAgICAgICBjb25zdCBjaGFyICpwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29u
c3QgY2hhciAqbGltaXQgPSBwICsgaXQtPmtleSgpLnNpemUoKTsKKworICAgICAgICBEYXRhYmFz
ZUZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5OworICAgICAgICBwID0gRGF0YWJhc2VGcmVlTGlzdEtl
eTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxpc3RLZXkpOworICAgICAgICBBU1NFUlQocCk7CisK
KyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICBy
ZXR1cm4gZnJlZUxpc3RLZXkuZGF0YWJhc2VJZCgpOworICAgIH0KKworICAgIC8vIElmIHdlIGdv
dCBoZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0LgorICAgIGludDY0X3QgbWF4RGF0YWJhc2VJ
ZDsKKyAgICBpZiAoIWdldEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksICZtYXhE
YXRhYmFzZUlkKSkKKyAgICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBpbnQ2NF90IGRh
dGFiYXNlSWQgPSBtYXhEYXRhYmFzZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBN
YXhEYXRhYmFzZUlkS2V5OjplbmNvZGUoKSwgZGF0YWJhc2VJZCk7CisgICAgaWYgKCFvaykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGRhdGFiYXNlSWQ7CisKK30KKworYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBp
bnZhbGlkUm93SWQpCit7CisgICAgaWYgKGludmFsaWRSb3dJZCkgeworICAgICAgICByb3dJZCA9
IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSk7CisKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmcga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKKyAg
ICAgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCByb3dJZCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0
YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprVXNl
clZlcnNpb24pLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJu
IHRydWU7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50
NjRfdCwgaW50NjRfdCwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50NjRf
dCYpCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2NF90
IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBm
b3VuZEF1dG9JbmNyZW1lbnRGbGFncykKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8g
RklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3Qgc3RkOjpzdHJp
bmcgc3RhcnRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
MSwgMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBJTlQ2NF9NQVgsIDApOworCisgICAgT3duUHRyPGxl
dmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9u
cygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBh
cmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAg
ICAgICBjb25zdCBjaGFyICpwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hh
ciAqbGltaXQgPSBwICsgaXQtPmtleSgpLnNpemUoKTsKKworICAgICAgICBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5IG1ldGFEYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisK
KyAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gbWV0YURhdGFLZXkub2JqZWN0U3RvcmVJ
ZCgpOworCisgICAgICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQt
PnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkp
OworCisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiaXQgbm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcga2V5UGF0aCA9IGRlY29kZVN0cmluZyhpdC0+
dmFsdWUoKS5kYXRhKCksIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSk7
CisKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgICAgIGJvb2wgYXV0b0luY3JlbWVudCA9ICppdC0+dmFsdWUoKS5k
YXRhKCk7CisKKyAgICAgICAgaXQtPk5leHQoKTsgLy8gSXMgZXZpY2F0YmxlLgorICAgICAgICBp
ZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxu
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdC0+TmV4dCgp
OyAvLyBMYXN0IHZlcnNpb24uCisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAg
ICAgIExPR19FUlJPUigiaXQgbm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIGl0LT5OZXh0KCk7IC8vIE1heGl1bSBpbmRleCBpZCBhbGxvY2F0
ZWQuCisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
aXQgbm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIGZvdW5kSWRzLmFwcGVuZChvYmplY3RTdG9yZUlkKTsKKyAgICAgICAgZm91bmROYW1lcy5h
cHBlbmQob2JqZWN0U3RvcmVOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5
UGF0aCk7CisgICAgICAgIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzLmFwcGVuZChhdXRvSW5jcmVt
ZW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld09iamVjdFN0b3JlSWQobGV2
ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAgY29uc3Qgc3RkOjpzdHJp
bmcgZnJlZUxpc3RTdGFydEtleSA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCAwKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmcmVlTGlzdFN0b3BLZXkgPSBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYKTsKKworICAg
IE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJl
YWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKGZyZWVMaXN0U3RhcnRLZXkpOyBpdC0+
VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBmcmVlTGlzdFN0b3BLZXkp
IDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmRh
dGEoKTsKKyAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBwICsgaXQtPmtleSgpLnNpemUoKTsK
KworICAgICAgICBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5OworICAgICAgICBw
ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxpc3RLZXkp
OworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+
RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NF
UlQocy5vaygpKTsKKworICAgICAgICByZXR1cm4gZnJlZUxpc3RLZXkub2JqZWN0U3RvcmVJZCgp
OworICAgIH0KKworICAgIGludDY0X3QgbWF4T2JqZWN0U3RvcmVJZDsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBtYXhPYmplY3RTdG9yZUlkS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OmtNYXhPYmplY3RTdG9yZUlkKTsKKyAg
ICBpZiAoIWdldEludChkYiwgbWF4T2JqZWN0U3RvcmVJZEtleSwgJm1heE9iamVjdFN0b3JlSWQp
KQorICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKKworICAgIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCA9IG1heE9iamVjdFN0b3JlSWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1h
eE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAgIGlmICghb2spCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBvYmplY3RTdG9yZUlkOworfQorCitib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJ
ZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0lu
Y3JlbWVudCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQoreworICAgIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCA9IGdldE5ld09iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJ
ZCk7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApOworICAgIGNvbnN0IHN0
ZDo6c3RyaW5nIGtleVBhdGhLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYXV0b0lu
Y3JlbWVudEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCAyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBldmljdGFibGVLZXkgPSBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
Myk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGFzdFZlcnNpb25LZXkgPSBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBjb25zdCBzdGQ6OnN0cmlu
ZyBuYW1lc0tleSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBuYW1l
KTsKKworICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbmFtZUtleSwgbmFtZSk7
CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgbmFtZSIp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9k
Yi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0aCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBM
T0dfRVJST1IoImZhaWxlZCB0byBzZXQga2V5IHBhdGgiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIGF1dG9JbmNyZW1lbnRLZXks
IGF1dG9JbmNyZW1lbnQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWls
ZWQgdG8gc2V0IGF1dG8gaW5jcmVtZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBldmljdGFibGVLZXksIGZhbHNlKTsKKyAg
ICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBldmljdGFibGUi
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIu
Z2V0KCksIGxhc3RWZXJzaW9uS2V5LCAxKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19F
UlJPUigiZmFpbGVkIHRvIHNldCBsYXN0IHZlcnNpb24gbnVtYmVyIik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBtYXhJbmRleElk
S2V5LCAzMCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBz
ZXQgbWF4IGluZGV4IGlkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBv
ayA9IHB1dEludChtX2RiLmdldCgpLCBuYW1lc0tleSwgb2JqZWN0U3RvcmVJZCk7CisgICAgaWYg
KCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgb2JqZWN0IHN0b3JlIGlk
Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhc3NpZ25lZE9iamVjdFN0
b3JlSWQgPSBvYmplY3RTdG9yZUlkOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBi
b29sIGRlbGV0ZVJhbmdlKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGJlZ2lu
LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5kKQoreworICAgIC8vIEZJWE1FOiBMZXZlbERCIG1heSBi
ZSBhYmxlIHRvIHByb3ZpZGUgYSBidWxrIG9wZXJhdGlvbiB0aGF0IHdlIGNhbiBkbyBmaXJzdC4K
KworICAgIGxldmVsZGI6OldyaXRlQmF0Y2ggYmF0Y2g7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6
SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7Cisg
ICAgZm9yIChpdC0+U2VlayhiZWdpbik7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFy
ZShpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+TmV4dCgpKQorICAgICAgICBiYXRjaC5EZWxldGUo
aXQtPmtleSgpKTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPldyaXRlKGxldmVsZGI6
OldyaXRlT3B0aW9ucygpLCAmYmF0Y2gpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCkKK3sKKyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lOworICAgIGdldFN0cmlu
ZyhtX2RiLmdldCgpLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgMCksICZvYmplY3RTdG9yZU5hbWUpOworCisgICAgbV9kYi0+RGVsZXRl
KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCkpOworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRi
OjpXcml0ZU9wdGlvbnMoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIDEpKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVP
cHRpb25zKCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAyKSk7CisgICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygp
LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMykpOworICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDQpKTsK
KyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KSk7CisKKyAgICBw
dXRTdHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQpLCAiIik7CisgICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6Oldy
aXRlT3B0aW9ucygpLCBPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVOYW1lKSk7CisKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIEluZGV4
RnJlZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgSW5kZXhG
cmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01BWCkp
KQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisgICAgaWYgKCFkZWxl
dGVSYW5nZShtX2RiLmdldCgpLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgMCwgMCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgsIDApKSkKKyAgICAgICAgcmV0dXJuOyAvLyBGSVhN
RTogUmVwb3J0IGVycm9yLgorCisgICAgY2xlYXJPYmplY3RTdG9yZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkKTsKK30KKworU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBsZXZlbGRiS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5
KTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBtX2Ri
LT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYktleSwgJmRhdGEpOworICAgIGlm
ICghcy5vaygpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBpbnQ2NF90IHZlcnNp
b247CisgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmNfc3RyKCksIGRhdGEu
Y19zdHIoKSArIGRhdGEubGVuZ3RoKCksICZ2ZXJzaW9uKTsKKyAgICBpZiAoIXApCisgICAgICAg
IHJldHVybiBTdHJpbmcoKTsKKyAgICAodm9pZCkgdmVyc2lvbjsKKworICAgIHJldHVybiBkZWNv
ZGVTdHJpbmcocCwgZGF0YS5jX3N0cigpICsgZGF0YS5sZW5ndGgoKSk7Cit9CisKK25hbWVzcGFj
ZSB7CitjbGFzcyBMZXZlbERCUmVjb3JkSWRlbnRpZmllciA6IHB1YmxpYyBJREJCYWNraW5nU3Rv
cmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciB7CitwdWJsaWM6CisgICAgc3RhdGljIFBh
c3NSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+IGNyZWF0ZShjb25zdCBzdGQ6OnN0cmlu
ZyYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSB7IHJldHVybiBhZG9wdFJlZihuZXcgTGV2
ZWxEQlJlY29yZElkZW50aWZpZXIocHJpbWFyeUtleSwgdmVyc2lvbikpOyB9CisgICAgc3RhdGlj
IFBhc3NSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+IGNyZWF0ZSgpIHsgcmV0dXJuIGFk
b3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSWRlbnRpZmllcigpKTsgfQorCisgICAgdmlydHVhbCBi
b29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlLZXkuZW1wdHkoKTsgfQorICAg
IHN0ZDo6c3RyaW5nIHByaW1hcnlLZXkoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0K
KyAgICB2b2lkIHNldFByaW1hcnlLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHByaW1hcnlLZXkpIHsg
bV9wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsgfQorICAgIGludDY0X3QgdmVyc2lvbigpIGNvbnN0
IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorICAgIHZvaWQgc2V0VmVyc2lvbihpbnQ2NF90IHZlcnNp
b24pIHsgbV92ZXJzaW9uID0gdmVyc2lvbjsgfQorCitwcml2YXRlOgorICAgIExldmVsREJSZWNv
cmRJZGVudGlmaWVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNp
b24pIDogbV9wcmltYXJ5S2V5KHByaW1hcnlLZXkpLCBtX3ZlcnNpb24odmVyc2lvbikgeyBBU1NF
UlQoIXByaW1hcnlLZXkuZW1wdHkoKSk7IH0KKyAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmllcigp
IDogbV9wcmltYXJ5S2V5KCksIG1fdmVyc2lvbigtMSkge30KKworICAgIHN0ZDo6c3RyaW5nIG1f
cHJpbWFyeUtleTsgLy8gRklYTUU6IE1ha2UgaXQgbW9yZSBjbGVhciB0aGF0IHRoaXMgaXMgdGhl
ICplbmNvZGVkKiB2ZXJzaW9uIG9mIHRoZSBrZXkuCisgICAgaW50NjRfdCBtX3ZlcnNpb247Cit9
OworfQorCitzdGF0aWMgaW50NjRfdCBnZXROZXdWZXJzaW9uTnVtYmVyKGxldmVsZGI6OkRCKiBk
YiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgbGFzdFZlcnNpb25LZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7CisKKyAgICBpbnQ2NF90IGxhc3RW
ZXJzaW9uOworICAgIGlmICghZ2V0SW50KGRiLCBsYXN0VmVyc2lvbktleSwgJmxhc3RWZXJzaW9u
KSkKKyAgICAgICAgbGFzdFZlcnNpb24gPSAwOworCisgICAgQVNTRVJUKGxhc3RWZXJzaW9uID49
IDApOworCisgICAgaW50NjRfdCB2ZXJzaW9uID0gbGFzdFZlcnNpb24gKyAxOworICAgIGJvb2wg
b2sgPSBwdXRJbnQoZGIsIGxhc3RWZXJzaW9uS2V5LCB2ZXJzaW9uKTsKKyAgICBBU1NFUlQob2sp
OworCisgICAgLy8gRklYTUU6IEhhdmUgYSB0aGluayBhYm91dCB3aGF0IGhhcHBlbnMgd2hlbiB0
aGlzIHdyYXBzIGFyb3VuZC4gSXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSwgSSB0aGluay4KKwor
ICAgIHJldHVybiB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1
dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgT2JqZWN0U3RvcmVS
ZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVudGlmaWVyKQoreworICAgIGludDY0X3QgdmVyc2lv
biA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVkYXRhS2V5ID0gT2JqZWN0
U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsKKyAg
ICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwg
b2JqZWN0U3RvcmVkYXRhS2V5LCBlbmNvZGVWYXJJbnQodmVyc2lvbikgKyBlbmNvZGVTdHJpbmco
dmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Y29uc3Qgc3RkOjpzdHJpbmcgZXhpc3RzRW50cnlLZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgcyA9IG1fZGItPlB1dChsZXZl
bGRiOjpXcml0ZU9wdGlvbnMoKSwgZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJzaW9uKSk7
CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExldmVsREJS
ZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PExl
dmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3JkSWRlbnRpZmllcik7CisgICAgbGV2ZWxEQlJl
Y29yZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURCS2V5KGtleSkpOworICAgIGxl
dmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNpb24pOworICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0U3RvcmUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMCkuZW5jb2RlKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IEtleVByZWZp
eChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7CisKKyAgICBkZWxl
dGVSYW5nZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7Cit9CisKK1Bhc3NSZWZQdHI8
SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKCkKK3sKKyAgICByZXR1
cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZSgpOworfQorCit2b2lkIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXIqIHJlY29yZElkZW50aWZpZXIpCit7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZp
ZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJl
Y29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmlu
ZyBrZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKKyAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwga2V5KTsK
K30KKworZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVt
YmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNv
bnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+
IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKworICAgIGlu
dCBtYXhOdW1lcmljS2V5ID0gMDsKKworICAgIC8vIEZJWE1FOiBCZSBtb3JlIGVmZmljaWVudDog
c2VlayB0byBzb21ldGhpbmcgYWZ0ZXIgdGhlIG9iamVjdCBzdG9yZSBkYXRhLCB0aGVuIHJldmVy
c2UuCisKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFy
YXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAg
ICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFy
ICpsaW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgpOworCisgICAgICAgIE9iamVjdFN0b3JlRGF0
YUtleSBkYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwg
bGltaXQsICZkYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGlmIChkYXRh
S2V5LnVzZXJLZXkoKS0+dHlwZSgpID09IElEQktleTo6TnVtYmVyVHlwZSkgeworICAgICAgICAg
ICAgaW50NjRfdCBuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZGF0YUtleS51c2VyS2V5KCktPm51
bWJlcigpKTsKKyAgICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAgICAgICAg
ICAgICBtYXhOdW1lcmljS2V5ID0gbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBt
YXhOdW1lcmljS2V5ICsgMTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlF
eGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJLZXkmIGtleSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiBmb3Vu
ZFJlY29yZElkZW50aWZpZXIpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxkYktleSA9
IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtl
eSk7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9k
Yi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxldmVsZGJLZXksICZkYXRhKTsKKyAgICBp
ZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCB2ZXJzaW9u
OworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0cigpICsgZGF0
YS5sZW5ndGgoKSwgJnZlcnNpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMZXZl
bERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2Fz
dDxMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+KGZvdW5kUmVjb3JkSWRlbnRpZmllcik7CisgICAg
bGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURCS2V5KGtleSkp
OworICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNpb24pOworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVhY2hP
YmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgT2JqZWN0U3RvcmVSZWNvcmRDYWxsYmFjayYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3Rk
OjpzdHJpbmcgc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3Rv
cEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIG1heElEQktleSgpKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9k
Yi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNl
ZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgp
LCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGl0
LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxpbWl0ID0gcCArIGl0LT5rZXko
KS5zaXplKCk7CisgICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBkYXRhS2V5OworICAgICAgICBw
ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZkYXRhS2V5KTsKKyAgICAg
ICAgQVNTRVJUKHApOworCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkgPSBkYXRh
S2V5LnVzZXJLZXkoKTsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0
IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5k
YXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCksICZ2ZXJzaW9uKTsKKyAgICAgICAgaWYgKCFxKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlZlB0cjxMZXZlbERCUmVjb3Jk
SWRlbnRpZmllcj4gcmkgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29kZUlE
QktleSgqcHJpbWFyeUtleSksIHZlcnNpb24pOworICAgICAgICBTdHJpbmcgaWRiVmFsdWUgPSBk
ZWNvZGVTdHJpbmcocSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsK
KworICAgICAgICBjYWxsYmFjay5jYWxsYmFjayhyaS5nZXQoKSwgaWRiVmFsdWUpOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dEluZGV4ZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFZlY3Rv
cjxpbnQ2NF90PiYgZm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8
U3RyaW5nPiYgZm91bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZFVuaXF1ZUZsYWdzKQor
eworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDAsIDApOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIHN0b3BLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCArIDEsIDAsIDApOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdCht
X2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+
U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5
KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0g
aXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBwICsgaXQtPmtl
eSgpLnNpemUoKTsKKworICAgICAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OworICAg
ICAgICBwID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURhdGFLZXkp
OworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaW50NjRfdCBpbmRleElkID0gbWV0YURh
dGFLZXkuaW5kZXhJZCgpOworICAgICAgICBBU1NFUlQoIW1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlw
ZSgpKTsKKworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1
ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKyAg
ICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOwor
ICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVl
KCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisg
ICAgICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElkKTsKKyAgICAgICAgZm91bmROYW1lcy5hcHBl
bmQoaW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7Cisg
ICAgICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKGluZGV4VW5pcXVlKTsKKyAgICB9Cit9CisK
K3N0YXRpYyBpbnQ2NF90IGdldE5ld0luZGV4SWQobGV2ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmlu
ZyBzdGFydEtleSA9IEluZGV4RnJlZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAwKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5ID0gSW5kZXhGcmVlTGlz
dEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01BWCk7CisKKyAg
ICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpS
ZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgp
ICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQo
KSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAg
Y29uc3QgY2hhciogbGltaXQgPSBwICsgaXQtPmtleSgpLnNpemUoKTsKKworICAgICAgICBJbmRl
eEZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5OworICAgICAgICBwID0gSW5kZXhGcmVlTGlzdEtleTo6
ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxpc3RLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAg
ICAgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9u
cygpLCBpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlQocy5vaygpKTsKKworICAgICAgICBBU1NF
UlQoZnJlZUxpc3RLZXkuaW5kZXhJZCgpID49IDMwKTsKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0
S2V5LmluZGV4SWQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1heEluZGV4SWQ7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBpZiAoIWdldEludChkYiwg
bWF4SW5kZXhJZEtleSwgJm1heEluZGV4SWQpKQorICAgICAgICBtYXhJbmRleElkID0gMzA7IC8v
IEZJWE1FOiBXZSBzaG91bGQgbWFrZSB0aGlzLCB0aGUgbWluaW11bSBpbmRleCBpZCwgYSBzeW1i
b2xpYyBjb25zdGFudC4KKworICAgIGludDY0X3QgaW5kZXhJZCA9IG1heEluZGV4SWQgKyAxOwor
ICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1heEluZGV4SWRLZXksIGluZGV4SWQpOworICAgIGlm
ICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBpbmRleElkOworfQor
Citib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJZCkKK3sKKyAgICBp
bmRleElkID0gZ2V0TmV3SW5kZXhJZChtX2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVLZXkgPSBJbmRleE1ldGFEYXRhS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCk7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgdW5pcXVlS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDEpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
IGtleVBhdGhLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwgMik7CisKKyAgICBib29sIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0
KCksIG5hbWVLZXksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJm
YWlsZWQgdG8gc2V0IGluZGV4IG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIHVuaXF1ZUtleSwgaXNVbmlxdWUpOworICAg
IGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGlzX3VuaXF1ZSIp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRTdHJpbmcobV9k
Yi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0aCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBM
T0dfRVJST1IoImZhaWxlZCB0byBzZXQga2V5IHBhdGgiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmRlbGV0ZUluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3QpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQgYW5kIGFkZCBsYXlvdXQgdGVzdC4KKyAgICBy
ZXR1cm47Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9y
UmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50
aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCit7CisgICAgQVNTRVJUKGluZGV4SWQgPj0gMzApOwor
ICAgIGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmll
ciA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3JkSWRl
bnRpZmllcik7CisKKyAgICBjb25zdCBpbnQ2NF90IGdsb2JhbFNlcXVlbmNlTnVtYmVyID0gZ2V0
TmV3VmVyc2lvbk51bWJlcihtX2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKTsK
KyAgICBjb25zdCBzdGQ6OnN0cmluZyBpbmRleERhdGFLZXkgPSBJbmRleERhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGdsb2JhbFNlcXVlbmNl
TnVtYmVyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkYXRhID0gZW5jb2RlVmFySW50KGxldmVs
REJSZWNvcmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpICsgbGV2ZWxEQlJlY29yZElkZW50aWZpZXIt
PnByaW1hcnlLZXkoKTsKKworICAgIHJldHVybiBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRp
b25zKCksIGluZGV4RGF0YUtleSwgZGF0YSkub2soKTsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCwgaW50NjRfdCwgaW50NjRf
dCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikKK3N0
YXRpYyBib29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qg
c3RkOjpzdHJpbmcmIHRhcmdldCwgc3RkOjpzdHJpbmcqIGZvdW5kS2V5KQogewotICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsK
KyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRi
OjpSZWFkT3B0aW9ucygpKSk7CisgICAgaXQtPlNlZWsodGFyZ2V0KTsKKworICAgIGlmICghaXQt
PlZhbGlkKCkpIHsKKyAgICAgICAgaXQtPlNlZWtUb0xhc3QoKTsKKyAgICAgICAgaWYgKCFpdC0+
VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAo
Y29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSA+PSAwKSB7Cisg
ICAgICAgIGl0LT5QcmV2KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmZvdW5kS2V5ID0gaXQtPmtleSgpLlRvU3Ry
aW5nKCk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNv
bnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzbid0IG5lZWRlZCBzaW5jZSB3ZSBpbnZhbGlkYXRlIGluZGV4IGRhdGEgdmlh
IHRoZSB2ZXJzaW9uIG51bWJlciBtZWNoYW5pc20uCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLVN0
cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90LCBp
bnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmKQorU3RyaW5nIElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmdldE9iamVjdFZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBTdHJp
bmcoKTsKKyAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5ID0gZ2V0UHJpbWFyeUtleVZpYUlu
ZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSk7CisgICAgaWYgKCFw
cmltYXJ5S2V5KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICByZXR1cm4gZ2V0T2Jq
ZWN0U3RvcmVSZWNvcmQoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnByaW1hcnlLZXkpOwog
fQogCi1QYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFy
eUtleVZpYUluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleSYpCitz
dGF0aWMgYm9vbCB2ZXJzaW9uRXhpc3RzKGxldmVsZGI6OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgdmVyc2lvbiwgY29uc3Qgc3RkOjpz
dHJpbmcmIGVuY29kZWRQcmltYXJ5S2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAv
LyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
IGtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
ZW5jb2RlZFByaW1hcnlLZXkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwga2V5LCAmZGF0YSk7
CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBk
ZWNvZGVJbnQoZGF0YS5jX3N0cigpLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKSA9PSB2
ZXJzaW9uOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5k
ZXgoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5JikKK1Bhc3NSZWZQdHI8
SURCS2V5PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1F
OiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxl
dmVsZGJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkLCBrZXksIDApOworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9k
Yi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVrKGxl
dmVsZGJLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjb21wYXJhdG9yLkNvbXBhcmVJbmRl
eEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gMDsK
KworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNv
ZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFs
dWUoKS5zaXplKCksICZ2ZXJzaW9uKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRQcmltYXJ5S2V5ID0gc3RkOjpzdHJp
bmcocCwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKworICAgICAg
ICBpZiAoIXZlcnNpb25FeGlzdHMobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgdmVyc2lvbiwgZW5jb2RlZFByaW1hcnlLZXkpKSB7CisgICAgICAgICAgICAvLyBEZWxldGUg
c3RhbGUgaW5kZXggZGF0YSBlbnRyeSBhbmQgY29udGludWUuCisgICAgICAgICAgICBtX2RiLT5E
ZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAgICAgICBp
dC0+TmV4dCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBS
ZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OworICAgICAgICBkZWNvZGVJREJLZXkoZW5jb2RlZFBy
aW1hcnlLZXkuY19zdHIoKSwgZW5jb2RlZFByaW1hcnlLZXkuY19zdHIoKSArIGVuY29kZWRQcmlt
YXJ5S2V5Lmxlbmd0aCgpLCAmcHJpbWFyeUtleSk7CisgICAgICAgIHJldHVybiBwcmltYXJ5S2V5
LnJlbGVhc2UoKTsKKyAgICB9CiB9CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihpbnQ2NF90
LCBpbnQ2NF90LCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKQorYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50
LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsREJLZXkgPSBJbmRl
eERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXks
IDApOworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3Io
bGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisg
ICAgaXQtPlNlZWsobGV2ZWxEQktleSk7CisgICAgaWYgKGl0LT5WYWxpZCgpICYmICFjb21wYXJh
dG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLlRvU3RyaW5nKCksIGxldmVsREJLZXkpKQor
ICAgICAgICBmb3VuZCA9IHRydWU7CisKKyAgICByZXR1cm4gZm91bmQ7CiB9CiAKLVBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEtleUN1cnNvcihpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXlSYW5n
ZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKQorbmFtZXNwYWNlIHsKK2NsYXNzIEN1cnNvckltcGxD
b21tb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgeworcHVibGljOgorICAgIC8v
IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCisgICAgdmlydHVhbCBib29sIGNvbnRpbnVlRnVuY3Rp
b24oY29uc3QgSURCS2V5Kik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4ga2V5KCkg
eyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4g
cHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgU3RyaW5n
IHZhbHVlKCkgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9i
amVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkg
PSAwOyAvLyBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIGlzIGFjdHVhbGx5IHVzZWQsIHNvIGRy
b3AgaXQuCisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgPSAwOworCisgICAgdmly
dHVhbCBib29sIGxvYWRDdXJyZW50Um93KCkgPSAwOworICAgIGJvb2wgZmlyc3RTZWVrKCk7CisK
K3Byb3RlY3RlZDoKKyAgICBDdXJzb3JJbXBsQ29tbW9uKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qg
c3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGln
aEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IG1fZGIoZGIpCisg
ICAgICAgICwgbV9sb3dLZXkobG93S2V5KQorICAgICAgICAsIG1fbG93T3Blbihsb3dPcGVuKQor
ICAgICAgICAsIG1faGlnaEtleShoaWdoS2V5KQorICAgICAgICAsIG1faGlnaE9wZW4oaGlnaE9w
ZW4pCisgICAgICAgICwgbV9mb3J3YXJkKGZvcndhcmQpCisgICAgeworICAgIH0KKyAgICB2aXJ0
dWFsIH5DdXJzb3JJbXBsQ29tbW9uKCkge30KKworICAgIGxldmVsZGI6OkRCKiBtX2RiOworICAg
IE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gbV9pdGVyYXRvcjsKKyAgICBzdGQ6OnN0cmluZyBt
X2xvd0tleTsKKyAgICBib29sIG1fbG93T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBtX2hpZ2hLZXk7
CisgICAgYm9vbCBtX2hpZ2hPcGVuOworICAgIGJvb2wgbV9mb3J3YXJkOworICAgIFJlZlB0cjxJ
REJLZXk+IG1fY3VycmVudEtleTsKK307CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6Zmlyc3RT
ZWVrKCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4K
LSAgICByZXR1cm4gMDsKKyAgICBtX2l0ZXJhdG9yID0gbV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxk
Yjo6UmVhZE9wdGlvbnMoKSk7CisKKyAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICBtX2l0ZXJh
dG9yLT5TZWVrKG1fbG93S2V5KTsKKyAgICBlbHNlCisgICAgICAgIG1faXRlcmF0b3ItPlNlZWso
bV9oaWdoS2V5KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5W
YWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX2Zvcndh
cmQgJiYgbV9oaWdoT3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRv
ci0+a2V5KCksIG1faGlnaEtleSkgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgaWYgKG1fZm9yd2FyZCAmJiAhbV9oaWdoT3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJ
bmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPiAwKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2xvd09wZW4gJiYgY29t
cGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0g
MCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYg
IW1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5
KCksIG1fbG93S2V5KSA8IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
aWYgKG1fZm9yd2FyZCAmJiBtX2xvd09wZW4pIHsKKyAgICAgICAgICAgIC8vIGxvd0tleSBub3Qg
aW5jbHVkZWQgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFy
ZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApIHsKKyAgICAgICAg
ICAgICAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7CisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgbV9oaWdo
T3BlbikgeworICAgICAgICAgICAgLy8gaGlnaEtleSBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdl
LgorICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+
UHJldigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKSB7CisgICAgICAgICAgICBpZiAo
bV9mb3J3YXJkKQorICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7CisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH0K
IAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElE
QktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pCitib29sIEN1cnNvckltcGxDb21tb246
OmNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURCS2V5KiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgLy8gRklY
TUU6IFRoaXMgc2hhcmVzIGEgbG90IG9mIGNvZGUgd2l0aCBmaXJzdFNlZWsuCisKKyAgICBmb3Ig
KDs7KSB7CisgICAgICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgICAgICBtX2l0ZXJhdG9yLT5O
ZXh0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsKKwor
ICAgICAgICBpZiAoIW1faXRlcmF0b3ItPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJhc2g7CisgICAgICAgIGlmIChtX2RiLT5HZXQo
bGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCksICZ0cmFzaCkuSXNOb3RG
b3VuZCgpKQorICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQg
JiYgbV9oaWdoT3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+
a2V5KCksIG1faGlnaEtleSkgPj0gMCkgLy8gaGlnaCBrZXkgbm90IGluY2x1ZGVkIGluIHJhbmdl
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1f
aGlnaE9wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgp
LCBtX2hpZ2hLZXkpID4gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYg
KCFtX2ZvcndhcmQgJiYgbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApIC8vIGxvdyBrZXkgbm90IGluY2x1ZGVk
IGluIHJhbmdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3
YXJkICYmICFtX2xvd09wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0
b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChtX2ZvcndhcmQpIHsKKyAgICAgICAg
ICAgICAgICBpZiAobV9jdXJyZW50S2V5LT5pc0xlc3NUaGFuKGtleSkpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBp
ZiAoa2V5LT5pc0xlc3NUaGFuKG1fY3VycmVudEtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRklY
TUU6IE9iZXkgdGhlIHVuaXF1ZW5lc3MgY29uc3RyYWludCAoYW5kIHRlc3QgZm9yIGl0ISkKKwor
ICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgT2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3JlYXRlKGxldmVs
ZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25z
dCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUN1cnNvckltcGwoZGIs
IGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpKTsKKyAgICB9CisK
KyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJl
dHVybiBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVu
dGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsg
fQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIE9i
amVjdFN0b3JlQ3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBs
b3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGln
aE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dL
ZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisK
KyAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cit9OworCitib29sIE9iamVjdFN0b3JlQ3Vyc29y
SW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9y
LT5rZXkoKS5kYXRhKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBwICsgbV9pdGVyYXRv
ci0+a2V5KCkuc2l6ZSgpOworCisgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVjdFN0b3JlRGF0
YUtleTsKKyAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwga2V5TGltaXQsICZv
YmplY3RTdG9yZURhdGFLZXkpOworICAgIEFTU0VSVChwKTsKKyAgICBpZiAoIXApCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtleS51
c2VyS2V5KCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogcSA9IGRl
Y29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwgbV9pdGVyYXRvci0+dmFsdWUo
KS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNpemUoKSwgJnZlcnNpb24pOworICAgIEFT
U0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGF0aWNf
Y2FzdDx2b2lkPih2ZXJzaW9uKTsKKworICAgIG1fY3VycmVudFZhbHVlID0gZGVjb2RlU3RyaW5n
KHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXpl
KCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4S2V5Q3Vyc29ySW1wbCA6
IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0
cjxJbmRleEtleUN1cnNvckltcGw+IGNyZWF0ZShsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6
c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXks
IGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXks
IGhpZ2hPcGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgor
ICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJu
IFN0cmluZygpOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgp
IHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNr
aW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJ
ZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0
dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4g
MDsgfQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAg
IEluZGV4S2V5Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBs
b3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGln
aE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dL
ZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisK
KyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cit9OworCitib29sIEluZGV4S2V5Q3Vy
c29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJh
dG9yLT5rZXkoKS5kYXRhKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBwICsgbV9pdGVy
YXRvci0+a2V5KCkuc2l6ZSgpOworICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7CisgICAg
cCA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHAsIGtleUxpbWl0LCAmaW5kZXhEYXRhS2V5KTsKKwor
ICAgIG1fY3VycmVudEtleSA9IGluZGV4RGF0YUtleS51c2VyS2V5KCk7CisKKyAgICBpbnQ2NF90
IHZlcnNpb247CisgICAgY29uc3QgY2hhciogcSA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52
YWx1ZSgpLmRhdGEoKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52
YWx1ZSgpLnNpemUoKSwgJnZlcnNpb24pOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAodm9pZCkgdmVyc2lvbjsgLy8gRklYTUU6IFdlIHNo
b3VsZCBwcnVuZSBlbnRyaWVzIHdpdGggb2xkIHZlcnNpb24sIGJ1dCBJIHRoaW5rIGtleUV4aXN0
c0luT2JqZWN0U3RvcmUgdGFrZXMgY2FyZSBvZiBpdC4KKyAgICBxID0gZGVjb2RlSURCS2V5KHEs
IG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCks
ICZtX3ByaW1hcnlLZXkpOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEN1cnNvcklt
cGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjcmVhdGUobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6
OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5
LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgeworICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IEluZGV4Q3Vyc29ySW1wbChkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBo
aWdoT3BlbiwgZm9yd2FyZCkpOworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAg
ICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9
CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNv
cmRJZGVudGlmaWVyPiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgp
IHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgYm9vbCBsb2FkQ3VycmVu
dFJvdygpOworCitwcml2YXRlOgorICAgIEluZGV4Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIs
IGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJp
bmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJz
b3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3
YXJkKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cisg
ICAgU3RyaW5nIG1fdmFsdWU7CisgICAgc3RkOjpzdHJpbmcgbV9wcmltYXJ5TGV2ZWxEQktleTsK
K307CisKK2Jvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29u
c3QgY2hhciAqcCA9IG1faXRlcmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyICps
aW1pdCA9IHAgKyBtX2l0ZXJhdG9yLT5rZXkoKS5zaXplKCk7CisKKyAgICBJbmRleERhdGFLZXkg
aW5kZXhEYXRhS2V5OworICAgIHAgPSBJbmRleERhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmlu
ZGV4RGF0YUtleSk7CisKKyAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgp
OworCisgICAgY29uc3QgY2hhciAqcSA9IG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpOworICAg
IGNvbnN0IGNoYXIgKnZhbHVlTGltaXQgPSBxICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCk7
CisKKyAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgcSA9IGRlY29kZVZhckludChx
LCB2YWx1ZUxpbWl0LCAmaW5kZXhEYXRhVmVyc2lvbik7CisgICAgQVNTRVJUKHEpOworICAgIGlm
ICghcSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHEgPSBkZWNvZGVJREJLZXkocSwgdmFs
dWVMaW1pdCwgJm1fcHJpbWFyeUtleSk7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtl
eS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgc3RkOjpzdHJpbmcgcmVz
dWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRp
b25zKCksIG1fcHJpbWFyeUxldmVsREJLZXksICZyZXN1bHQpOworICAgIGlmICghcy5vaygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNp
b247CisgICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuY19zdHIoKSwgcmVz
dWx0LmNfc3RyKCkgKyByZXN1bHQubGVuZ3RoKCksICZvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsK
KyAgICBBU1NFUlQodCk7CisgICAgaWYgKCF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAg
ICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5
KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29k
ZVN0cmluZyh0LCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK30KKworc3RhdGljIGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8obGV2
ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyogZm91
bmRLZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVrKHRhcmdldCk7CisKKyAg
ICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAo
aXQtPlZhbGlkKCkgJiYgIWNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRh
cmdldCkpIHsKKyAgICAgICAgKmZvdW5kS2V5ID0gaXQtPmtleSgpLlRvU3RyaW5nKCk7CisgICAg
ICAgIGl0LT5OZXh0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5P
YmplY3RTdG9yZUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rp
b24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7Cisg
ICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBm
b3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRp
cmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVy
T3BlbjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93
ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICAgICAgbG93ZXJP
cGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0
S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgKnJhbmdlLT5sb3dlcigpKTsKKyAgICAgICAgbG93ZXJPcGVuID0gcmFuZ2UtPmxvd2VyT3Bl
bigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3VuZCkgeworICAgICAgICBzdG9wS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWF4
SURCS2V5KCkpOworICAgICAgICB1cHBlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisK
KyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisg
ICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BL
ZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVw
cGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtl
eSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
ICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4o
KTsKKyAgICB9CisKKyAgICBSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJbXBsPiBjdXJzb3IgPSBP
YmplY3RTdG9yZUN1cnNvckltcGw6OmNyZWF0ZShtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJP
cGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpOworICAgIGlmICghY3Vyc29yLT5maXJz
dFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5n
ZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdl
ICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURC
Q3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhU
KTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CisgICAgc3RkOjpzdHJpbmcgc3Rh
cnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgc3RhcnRL
ZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBtaW5JREJLZXkoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IGZhbHNlOyAvLyBJbmNs
dWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSwg
MCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAg
ICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1heElEQktleSgpLCAwKTsK
KyAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorCisgICAgICAgIGlmICgh
Zm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYg
KCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCAmc3RvcEtleSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxz
ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPnVw
cGVyKCksIDApOworICAgICAgICBpZiAoIWZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1fZGIuZ2V0
KCksIHN0b3BLZXksICZzdG9wS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUg
c2V0IG9mIG5vbi11bmlxdWUga2V5cy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxJ
bmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9IEluZGV4S2V5Q3Vyc29ySW1wbDo6Y3JlYXRlKG1f
ZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2Fy
ZCk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24p
Cit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAg
Ym9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3
YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVj
dGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3Bl
bjsKKyAgICBzdGQ6OnN0cmluZyBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93ZXJC
b3VuZCkgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1pbklEQktleSgpLCAwKTsKKyAgICAgICAgbG93
ZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0
S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgKnJhbmdlLT5sb3dlcigpLCAwKTsKKyAgICAgICAgbG93ZXJPcGVuID0gcmFuZ2UtPmxv
d2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3VuZCkgeworICAgICAgICBzdG9w
S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgbWF4SURCS2V5KCksIDApOworICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsgLy8gSW5j
bHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBl
eGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIuZ2V0
KCksIHN0b3BLZXksICZzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsICpyYW5nZS0+dXBwZXIoKSwgMCk7CisgICAgICAgIGlmICghZmluZExhc3RJ
bmRleEtleUVxdWFsVG8obV9kYi5nZXQoKSwgc3RvcEtleSwgJnN0b3BLZXkpKSAvLyBTZWVrIHRv
IHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7
CisgICAgfQorCisgICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhDdXJz
b3JJbXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwg
dXBwZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK25hbWVz
cGFjZSB7CitjbGFzcyBEdW1teVRyYW5zYWN0aW9uIDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb24geworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBiZWdpbigpIHt9CisgICAg
dmlydHVhbCB2b2lkIGNvbW1pdCgpIHt9CisgICAgdmlydHVhbCB2b2lkIHJvbGxiYWNrKCkge30K
K307CiB9CiAKIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4gSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQogewotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIC8vIEZJ
WE1FOiBXZSBuZWVkIHRvIGltcGxlbWVudCBhIHRyYW5zYWN0aW9uIGFic3RyYWN0aW9uIHRoYXQg
YWxsb3dzIGZvciByb2xsLWJhY2tzLCBhbmQgd3JpdGUgdGVzdHMgZm9yIGl0LgorICAgIHJldHVy
biBhZG9wdFJlZihuZXcgRHVtbXlUcmFuc2FjdGlvbigpKTsKIH0KIAorLy8gRklYTUU6IGRlbGV0
ZURhdGFiYXNlIHNob3VsZCBiZSBwYXJ0IG9mIElEQkJhY2tpbmdTdG9yZS4KKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCmluZGV4IGEwMDU0ODNmZTg4ZmZjNTMyNjJmZTdlNzU5ZjA0ODBiNThkYjU5OWEu
LmFiY2M3OWQxNDBkNmE2ZWIyMTU3OGRiZTBmNDg4NmE3M2RiNmQ0ZjkgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21p
dW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDQtMTIgIEhhbnMgV2VubmJvcmcg
IDxoYW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBMZXZlbERCIGJhY2tlbmQgZm9yIEluZGV4ZWREQgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTczNzIKKworICAgICAgICAqIGZl
YXR1cmVzLmd5cGk6CisgICAgICAgIFR1cm4gb24gRU5BQkxFX0xFVkVMREIgc28gdGhhdCBpdCBn
ZXRzIGNvbXBpbGVkIHVwc3RyZWFtIGFzIHdlbGwuCisKIDIwMTEtMDQtMTEgIEpvaG4gQmF0ZXMg
IDxqYmF0ZXNAZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5uZXRoIFJ1c3Nl
bGwuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkgYi9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkKaW5kZXggMDA2MTViNDM3YThkN2Jk
MDMxMjE5ZjIzNGQ4ZmQ5OWVlNDNiNDQ4NC4uNmY2MmE4NzQ2ZDE2YTlmZGIyMDExMzA0N2UyOTlm
ZGI3MmNlZDNkNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5n
eXBpCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQpAQCAtNjUsNyAr
NjUsNyBAQAogICAgICAgICAnRU5BQkxFX0lOUFVUX1NQRUVDSD0xJywKICAgICAgICAgJ0VOQUJM
RV9KQVZBU0NSSVBUX0RFQlVHR0VSPTEnLAogICAgICAgICAnRU5BQkxFX0pTQ19NVUxUSVBMRV9U
SFJFQURTPTAnLAotICAgICAgICAnRU5BQkxFX0xFVkVMREI9MCcsCisgICAgICAgICdFTkFCTEVf
TEVWRUxEQj0xJywKICAgICAgICAgJ0VOQUJMRV9MSU5LX1BSRUZFVENIPTEnLAogICAgICAgICAn
RU5BQkxFX01BVEhNTD0wJywKICAgICAgICAgJ0VOQUJMRV9NRURJQV9TVEFUSVNUSUNTPTEnLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>89423</attachid>
            <date>2011-04-13 11:56:17 -0700</date>
            <delta_ts>2011-04-14 06:31:50 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110413195615.patch</filename>
            <type>text/plain</type>
            <size>99143</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxMWIxOTAyYTIyOTdiMWY3MTQ5MjU5YTM0ZDM0ODljNzg2NTA2NDFjLi40
NTMxZmIyY2FiMzBiNGRmZGM3MTVmMDBjZWFiNGU0OGI2MmM4YWI3IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTMyIEBACisyMDExLTA0LTEyICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgT25seSBhdmFpbGFibGUgYmVoaW5k
IGEgcnVuLXRpbWUgZmxhZy4gQ292ZXJlZCBieSBleGlzdGluZyBsYXlvdXQgdGVzdHMuCisKKyAg
ICAgICAgKiBzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6ZW5jb2RlQnl0ZSk6CisgICAgICAgIChXZWJDb3JlOjptYXhJREJLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6bWluSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6Cisg
ICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFy
SW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZVZhckludCk6CisgICAgICAgIChXZWJDb3Jl
OjplbmNvZGVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dpdGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVj
b2RlU3RyaW5nV2l0aExlbik6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAg
ICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91YmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUlE
QktleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJREJLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6ZXh0cmFjdEVuY29kZWRJREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZUVuY29k
ZWRJREJLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvdW50Tm9uWmVyb0J5dGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRh
dGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZUZyZWVMaXN0
S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1l
S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFtZUtl
eTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1lS2V5
OjpkYXRhYmFzZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5h
bWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU1l
dGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6bWV0YURhdGFUeXBlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29t
cGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmVu
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5Ojpp
bmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6
bWV0YURhdGFUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVG
cmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQpOgor
ICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5Ojpj
b21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1lc0tl
eTo6b2JqZWN0U3RvcmVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhO
YW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1l
c0tleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tl
eTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6
OmluZGV4TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0
YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVE
YXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9y
ZURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZURhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlz
dHNFbnRyeUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3Rz
RW50cnlLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0Vu
dHJ5S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50
cnlLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFL
ZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjplbmNv
ZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmRhdGFi
YXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Om9iamVj
dFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Omlu
ZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OnVzZXJL
ZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6Q29tcGFyZUluZGV4S2V5
cyk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OlJlYWxDb21wYXJl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6TmFtZSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydGVzdFNlcGFyYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydFN1
Y2Nlc3Nvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0TmV3RGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3Jlcyk6CisgICAgICAg
IChXZWJDb3JlOjpnZXROZXdPYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OmRlbGV0ZVJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OmRlbGV0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld1Zl
cnNpb25OdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcik6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3Jl
bWVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpr
ZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld0luZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
ZGVsZXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRHcmVhdGVzdEtl
eUxlc3NUaGFuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4RGF0YUZvclJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjp2ZXJzaW9u
RXhpc3RzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFBy
aW1hcnlLZXlWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRMYXN0SW5kZXhL
ZXlFcXVhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKToKKwogMjAxMS0wNC0wNiAgUGF2
ZWwgUG9kaXZpbG92ICA8cG9kaXZpbG92QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBQYXZlbCBGZWxkbWFuLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZS5jcHAKaW5kZXggYzA2ZWEwMDQyMjE1NTYxNTg0NjZjM2JkMjYwZDU2
ZjIzMGJkMzdhMC4uYzA4NjZhOWQ3MTA3NTBkNDBjODc4MmZmYzAxNmNiYmY3YzIyN2ZmZSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3Bw
CkBAIC0yOSw4ICsyOSwxMDYgQEAKICNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICNpZiBF
TkFCTEUoTEVWRUxEQikKIAorI2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKKyNpbmNsdWRlICJGaWxl
U3lzdGVtLmgiCiAjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgiCisjaW5jbHVkZSAi
SURCS2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgPGxl
dmVsZGIvY29tcGFyYXRvci5oPgogI2luY2x1ZGUgPGxldmVsZGIvZGIuaD4KKyNpbmNsdWRlIDxs
ZXZlbGRiL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9zbGljZS5oPgorI2luY2x1ZGUg
PGxldmVsZGIvd3JpdGVfYmF0Y2guaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZm5kZWYgSU5U
NjRfTUFYCisvLyBGSVhNRTogRG8gdGhpcyBtb3JlIHByb3Blcmx5LgorI2RlZmluZSBJTlQ2NF9N
QVggMHg3ZmZmZmZmZmZmZmZmZmZmTEwKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZp
bmUgSU5UMzJfTUFYIDB4N2ZmZmZmZmZMCisjZW5kaWYKKworLy8gTGV2ZWxEQiBzdG9yZXMga2V5
L3ZhbHVlIHBhaXJzLiBLZXlzIGFuZCB2YWx1ZXMgYXJlIHN0cmluZ3Mgb2YgYnl0ZXMsIG5vcm1h
bGx5IG9mIHR5cGUgc3RkOjpzdHJpbmcuCisvLyBUaGUgc3RkOjpzdHJpbmdzIGRvbid0IGhhdmUg
YW55IHBhcnRpY3VsYXIgZW5jb2RpbmcsIGFuZCBhcmVuJ3QgbnVsbCB0ZXJtaW5hdGVkLgorLy8K
Ky8vIFRoZSBrZXlzIGluIHRoZSBiYWNraW5nIHN0b3JlIGFyZSB2YXJpYWJsZS1sZW5ndGggdHVw
bGVzIHdpdGggZGlmZmVyZW50IHR5cGVzCisvLyBvZiBmaWVsZHMuIEVhY2gga2V5IGluIHRoZSBi
YWNraW5nIHN0b3JlIHN0YXJ0cyB3aXRoIGEgdGVybmFyeSBwcmVmaXg6IChkYXRhYmFzZSBpZCwg
b2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCkuIEZvciBlYWNoLCAwIGlzIHJlc2VydmVkIGZvciBt
ZXRhLWRhdGEuCisvLyBUaGUgcHJlZml4IG1ha2VzIHN1cmUgdGhhdCBkYXRhIGZvciBhIHNwZWNp
ZmljIGRhdGFiYXNlLCBvYmplY3Qgc3RvcmUsIGFuZCBpbmRleCBhcmUgZ3JvdXBlZCB0b2dldGhl
ci4gVGhlIGxvY2FsaXR5IGlzIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2UuCisvLworLy8gRWFj
aCBrZXkgdHlwZSBoYXMgYSBjbGFzcyAoaW4gc3F1YXJlIGJyYWNrZXRzIGJlbG93KSB3aGljaCBr
bm93cyBob3cgdG8gZW5jb2RlLCBkZWNvZGUsIGFuZCBjb21wYXJlIHRoYXQga2V5IHR5cGUuCisv
LworLy8gR2xvYmFsIG1ldGEtZGF0YSBoYXZlIGtleXMgd2l0aCBwcmVmaXggKDAsMCwwKSwgZm9s
bG93ZWQgYnkgYSB0eXBlIGJ5dGU6CisvLworLy8gICAgIDwwLCAwLCAwLCAwPiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBJbmRleGVkREIvTGV2ZWxEQiBzY2hl
bWEgdmVyc2lvbiAoMCBmb3Igbm93KSBbU2NoZW1hVmVyc2lvbktleV0KKy8vICAgICA8MCwgMCwg
MCwgMT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gVGhlIG1h
eGltdW0gZGF0YWJhc2UgaWQgZXZlciBhbGxvY2F0ZWQgW01heERhdGFiYXNlSWRLZXldCisvLyAg
ICAgPDAsIDAsIDAsIDEwMCwgZGF0YWJhc2UgaWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ID0+IEV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBkYXRhYmFzZSBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0
IFtEYXRhYmFzZUZyZWVMaXN0S2V5XQorLy8gICAgIDwwLCAwLCAwLCAyMDEsIHV0ZjE2IG9yaWdp
biBuYW1lLCB1dGYxNiBkYXRhYmFzZSBuYW1lPiA9PiBEYXRhYmFzZSBpZCBbRGF0YWJhc2VOYW1l
S2V5XQorLy8KKy8vCisvLyBEYXRhYmFzZSBtZXRhLWRhdGE6CisvLworLy8gICAgIEFnYWluLCB0
aGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLgorLy8KKy8vICAgICA8ZGF0YWJh
c2UgaWQsIDAsIDAsIDA+ID0+IHV0ZjE2IG9yaWdpbiBuYW1lIFtEYXRhYmFzZU1ldGFEYXRhS2V5
XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMT4gPT4gdXRmMTYgZGF0YWJhc2UgbmFtZSBb
RGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDI+ID0+IHV0
ZjE2IHVzZXIgdmVyc2lvbiBkYXRhIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRh
YmFzZSBpZCwgMCwgMCwgMz4gPT4gbWF4aW11bSBvYmplY3Qgc3RvcmUgaWQgZXZlciBhbGxvY2F0
ZWQgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEtZGF0YToK
Ky8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiBh
IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLCBhbmQgdGhlbiBhbm90aGVyIHZhcmlhYmxlLWxlbmd0
aCBpbnRlZ2VyIChGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBieXRlKS4KKy8vCisvLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAwPiA9PiB1dGYxNiBvYmplY3Qg
c3RvcmUgbmFtZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQs
IDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0ZjE2IGtleSBwYXRoIFtPYmplY3RT
dG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBz
dG9yZSBpZCwgMj4gPT4gaGFzIGF1dG8gaW5jcmVtZW50IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5
XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMz4gPT4g
aXMgZXZpY3RhYmxlIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgND4gPT4gbGFzdCAidmVyc2lvbiIgbnVtYmVy
IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAs
IG9iamVjdCBzdG9yZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9jYXRlZCBb
T2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vCisvLyBJbmRleCBtZXRhLWRhdGE6CisvLworLy8g
ICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4gdHdvIHZhcmlh
YmxlLWxlbmd0aCBpbnRlZ2VycywgYW5kIHRoZW4gYW5vdGhlciB0eXBlIGJ5dGUuCisvLworLy8g
ICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAw
PiA9PiB1dGYxNiBpbmRleCBuYW1lIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFz
ZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAxPiA9PiBhcmUgaW5k
ZXgga2V5cyB1bmlxdWUgW0luZGV4TWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAw
LCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDI+ID0+IHV0ZjE2IGtleSBwYXRo
IFtJbmRleE1ldGFEYXRhS2V5XQorLy8KKy8vIE90aGVyIG9iamVjdCBzdG9yZSBhbmQgaW5kZXgg
bWV0YS1kYXRhOgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBi
eXRlLiBUaGUgb2JqZWN0IHN0b3JlIGFuZCBpbmRleCBpZCBhcmUgdmFyaWFibGUgbGVuZ3RoIGlu
dGVnZXJzLCB0aGUgdXRmMTYgc3RyaW5ncyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MuCisv
LworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTUwLCBvYmplY3Qgc3RvcmUgaWQ+ICAgICAg
ICAgICAgICAgICAgID0+IGV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBvYmplY3Qgc3RvcmUgaWQgaXMg
aW4gdGhlIGZyZWUgbGlzdCBbT2JqZWN0U3RvcmVGcmVlTGlzdEtleV0KKy8vICAgICA8ZGF0YWJh
c2UgaWQsIDAsIDAsIDE1MSwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZD4gICAgICAgICA9PiBl
eGlzdGVuY2UgaW1wbGllcyB0aGUgaW5kZXggaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbSW5kZXhG
cmVlTGlzdEtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMCwgdXRmMTYgb2JqZWN0
IHN0b3JlIG5hbWU+ICAgICAgICAgICA9PiBvYmplY3Qgc3RvcmUgaWQgW09iamVjdFN0b3JlTmFt
ZXNLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyMDEsIG9iamVjdCBzdG9yZSBpZCwg
dXRmMTYgaW5kZXggbmFtZT4gPT4gaW5kZXggaWQgW0luZGV4TmFtZXNLZXldCisvLworLy8gT2Jq
ZWN0IHN0b3JlIGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0
eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4KKy8vCisvLyAgICAg
PGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDEsIHVzZXIga2V5PiA9PiAidmVyc2lvbiIs
IHNlcmlhbGl6ZWQgc2NyaXB0IHZhbHVlIFtPYmplY3RTdG9yZURhdGFLZXldCisvLworLy8gIkV4
aXN0cyIgZW50cnk6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBl
IGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4KKy8vCisvLyAgICAgPGRh
dGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDIsIHVzZXIga2V5PiA9PiAidmVyc2lvbiIgW0V4
aXN0c0VudHJ5S2V5XQorLy8KKy8vIEluZGV4IGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXgg
aXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElE
QktleS4gVGhlIHNlcXVlbmNlIG51bWJlciBpcyBhIHZhcmlhYmxlIGxlbmd0aCBpbnRlZ2VyLgor
Ly8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIHVzZXIg
a2V5LCBzZXF1ZW5jZSBudW1iZXI+ID0+ICJ2ZXJzaW9uIiwgdXNlciBrZXkgW0luZGV4RGF0YUtl
eV0KKy8vCisvLyAgICAgKFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgdXNlZCB0byBhbGxvdyB0d28g
ZW50cmllcyB3aXRoIHRoZSBzYW1lIHVzZXIga2V5CisvLyAgICAgaW4gbm9uLXVuaXF1ZSBpbmRl
eGVzLiBUaGUgInZlcnNpb24iIGZpZWxkIGlzIHVzZWQgdG8gd2VlZCBvdXQgc3RhbGUKKy8vICAg
ICBpbmRleCBkYXRhLiBXaGVuZXZlciBuZXcgb2JqZWN0IHN0b3JlIGRhdGEgaXMgaW5zZXJ0ZWQs
IGl0IGdldHMgYSBuZXcKKy8vICAgICAidmVyc2lvbiIgbnVtYmVyLCBhbmQgbmV3IGluZGV4IGRh
dGEgaXMgd3JpdHRlbiB3aXRoIHRoaXMgbnVtYmVyLiBXaGVuCisvLyAgICAgdGhlIGluZGV4IGlz
IHVzZWQgZm9yIGxvb2stdXBzLCBlbnRyaWVzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUKKy8v
ICAgICAiZXhpc3RzIiBlbnRyaWVzLCBhbmQgcmVjb3JkcyB3aXRoIG9sZCAidmVyc2lvbiIgbnVt
YmVycyBhcmUgZGVsZXRlZAorLy8gICAgIHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQgaW4gZ2V0
UHJpbWFyeUtleVZpYUluZGV4LAorLy8gICAgIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRS
b3csIGFuZCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KS4KIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCkBAIC00NywxNTcgKzE0NSwyMzk3IEBAIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6On5JREJMZXZlbERCQmFja2luZ1N0b3JlKCkKICAgICBtX2ZhY3RvcnktPnJlbW92ZUlEQkJh
Y2tpbmdTdG9yZShtX2lkZW50aWZpZXIpOwogfQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0
cmluZyYsIGludDY0X3QsIGNvbnN0IFN0cmluZyYsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCopCitz
dGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyIGMpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBJREJMZXZlbERCQmFja2luZ1N0b3JlKCIiLCAwLCAwKSk7CisgICAgcmV0dXJuIHN0
ZDo6c3RyaW5nKDEsIGMpOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmV4dHJh
Y3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYsIFN0cmluZyYsIGludDY0X3QmKQor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bGxUeXBlQnl0ZSA9IDA7CitzdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5U3RyaW5nVHlwZUJ5dGUgPSAxOworc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleURhdGVUeXBlQnl0ZSA9IDI7CitzdGF0aWMgY29u
c3QgdW5zaWduZWQgY2hhciBrSURCS2V5TnVtYmVyVHlwZUJ5dGUgPSAzOworc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGNoYXIga0lEQktleU1pbktleVR5cGVCeXRlID0gNDsKKworc3RhdGljIHN0ZDo6
c3RyaW5nIG1heElEQktleSgpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1F
OiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBlbmNvZGVCeXRlKGtJ
REJLZXlOdWxsVHlwZUJ5dGUpOwogfQogCitzdGF0aWMgc3RkOjpzdHJpbmcgbWluSURCS2V5KCkK
K3sKKyAgICByZXR1cm4gZW5jb2RlQnl0ZShrSURCS2V5TWluS2V5VHlwZUJ5dGUpOworfQogCi1i
b29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3Qg
U3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgaW50NjRfdCYsIGJvb2wpCitzdGF0aWMgc3RkOjpzdHJp
bmcgZW5jb2RlSW50KGludDY0X3QgbikKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8g
RklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKG4gPj0gMCk7
CisgICAgc3RkOjpzdHJpbmcgcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgor
CisgICAgZG8geworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBuOworICAgICAgICByZXQuYXBw
ZW5kKDEsIHN0YXRpY19jYXN0PGNoYXI+KGMpKTsKKyAgICAgICAgbiA+Pj0gODsKKyAgICB9IHdo
aWxlIChuKTsKKworICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QsIFZlY3RvcjxpbnQ2NF90PiYsIFZlY3RvcjxT
dHJpbmc+JiwgVmVjdG9yPFN0cmluZz4mLCBWZWN0b3I8Ym9vbD4mKQorc3RhdGljIGludDY0X3Qg
ZGVjb2RlSW50KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgQVNTRVJUKGJlZ2lu
IDw9IGVuZCk7CisgICAgaW50NjRfdCByZXQgPSAwOworCisgICAgd2hpbGUgKGJlZ2luIDwgZW5k
KSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICpiZWdpbisrOworICAgICAgICByZXQgPSAo
cmV0IDw8IDgpIHwgYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OwogfQogCi1ib29sIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QsIGNvbnN0IFN0cmlu
ZyYsIGNvbnN0IFN0cmluZyYsIGJvb2wsIGludDY0X3QmKQorc3RhdGljIHN0ZDo6c3RyaW5nIGVu
Y29kZVZhckludChpbnQ2NF90IG4pCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJ
WE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHJldDsg
Ly8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKworICAgIGRvIHsKKyAgICAgICAgdW5z
aWduZWQgY2hhciBjID0gbiAmIDB4N2Y7CisgICAgICAgIG4gPj49IDc7CisgICAgICAgIGlmIChu
KQorICAgICAgICAgICAgYyB8PSAxMjg7CisgICAgICAgIHJldC5hcHBlbmQoMSwgc3RhdGljX2Nh
c3Q8Y2hhcj4oYykpOworICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKIH0KIAot
dm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90LCBp
bnQ2NF90KQorc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBj
b25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQpCiB7Ci0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgQVNTRVJUKGxpbWl0ID49IHApOwor
ICAgIGZvdW5kSW50ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHAgPj0gbGltaXQpCisg
ICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBmb3VuZEludCA9IChmb3VuZEludCA8PCA3
KSB8ICgqcCAmIDB4N2YpOworICAgIH0gd2hpbGUgKCpwKysgJiAxMjgpOworICAgIHJldHVybiBw
OwogfQogCi1TdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNv
cmQoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5JikKK3N0YXRpYyBzdGQ6OnN0cmluZyBl
bmNvZGVTdHJpbmcoY29uc3QgU3RyaW5nJiBzKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBzdGQ6OnN0
cmluZyByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFVDaGFyIHUgPSBz
W2ldOworICAgICAgICB1bnNpZ25lZCBjaGFyIGhpID0gdSA+PiA4OworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGxvID0gdTsKKyAgICAgICAgcmV0LmFwcGVuZCgxLCBoaSk7CisgICAgICAgIHJldC5h
cHBlbmQoMSwgbG8pOworICAgIH0KKworICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCwgaW50NjRfdCwg
Y29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KikKK3N0YXRpYyBTdHJpbmcgZGVjb2RlU3RyaW5nKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIq
IGVuZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4K
LSAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKGVuZCA+PSBwKTsKKyAgICBBU1NFUlQoISgo
ZW5kIC0gcCkgJSAyKSk7CisKKyAgICBzaXplX3QgbGVuID0gKGVuZCAtIHApIC8gMjsKKyAgICBW
ZWN0b3I8VUNoYXI+IHZlY3RvcihsZW4pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBs
ZW47ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGhpID0gKnArKzsKKyAgICAgICAgdW5z
aWduZWQgY2hhciBsbyA9ICpwKys7CisKKyAgICAgICAgdmVjdG9yW2ldID0gKGhpIDw8IDgpIHwg
bG87CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQodmVjdG9yKTsKIH0KIAotdm9p
ZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QsIGludDY0
X3QpCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3RyaW5nV2l0aExlbihjb25zdCBTdHJpbmcm
IHMpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisg
ICAgc3RkOjpzdHJpbmcgcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkpOworICAgIHJldCAr
PSBlbmNvZGVTdHJpbmcocyk7CisgICAgcmV0dXJuIHJldDsKIH0KIAotUGFzc1JlZlB0cjxJREJC
YWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y3JlYXRlSW52YWxpZFJlY29yZElkZW50aWZpZXIoKQorc3RhdGljIGNvbnN0IGNo
YXIqIGRlY29kZVN0cmluZ1dpdGhMZW4oY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQs
IFN0cmluZyYgZm91bmRTdHJpbmcpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOworICAgIGlu
dDY0X3QgbGVuOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbik7CisgICAgaWYg
KCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocCArIGxlbiAqIDIgPiBsaW1pdCkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3VuZFN0cmluZyA9IGRlY29kZVN0cmluZyhwLCBwICsg
bGVuICogMik7CisgICAgcCArPSBsZW4gKiAyOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMg
c3RkOjpzdHJpbmcgZW5jb2RlRG91YmxlKGRvdWJsZSB4KQoreworICAgIGNvbnN0IGNoYXIqIHAg
PSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHAs
IHNpemVvZih4KSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVEb3VibGUoY29uc3Qg
Y2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRvdWJsZSogZCkKK3sKKyAgICBpZiAocCArIHNp
emVvZigqZCkgPiBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjaGFyKiB4ID0gcmVp
bnRlcnByZXRfY2FzdDxjaGFyKj4oZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXpl
b2YoKmQpOyArK2kpCisgICAgICAgICp4KysgPSAqcCsrOworICAgIHJldHVybiBwOworfQorCitz
dGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlSURCS2V5KGNvbnN0IElEQktleSYga2V5KQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIHN0ZDo6c3Ry
aW5nIHJldDsKKworICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpO
dWxsVHlwZToKKyAgICAgICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0ZSk7
CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUo
a0lEQktleVN0cmluZ1R5cGVCeXRlKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZVN0cmluZ1dpdGhM
ZW4oa2V5LnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6
RGF0ZVR5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7
CisgICAgICAgIHJldCArPSBlbmNvZGVEb3VibGUoa2V5LmRhdGUoKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHJldCA9IGVuY29k
ZUJ5dGUoa0lEQktleU51bWJlclR5cGVCeXRlKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZURvdWJs
ZShrZXkubnVtYmVyKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCitzdGF0aWMg
Y29uc3QgY2hhciogZGVjb2RlSURCS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0
LCBSZWZQdHI8SURCS2V5PiYgZm91bmRLZXkpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOwor
ICAgIGlmIChwID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGNo
YXIgdHlwZSA9ICpwKys7CisgICAgU3RyaW5nIHM7CisgICAgZG91YmxlIGQ7CisKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgICAgIC8vIE51
bGwuCisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdWxsKCk7CisgICAgICAgIHJl
dHVybiBwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBTdHJp
bmcuCisgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCBzKTsKKyAgICAg
ICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURC
S2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Uga0lEQktl
eURhdGVUeXBlQnl0ZToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29kZURvdWJs
ZShwLCBsaW1pdCwgJmQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7CisgICAgICAgIHJldHVy
biBwOworICAgIGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBOdW1iZXIu
CisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAgaWYgKCFw
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVh
dGVOdW1iZXIoZCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwogICAgIHJldHVybiAwOwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVj
dFN0b3JlUmVjb3JkSWRlbnRpZmllciopCitzdGF0aWMgY29uc3QgY2hhciogZXh0cmFjdEVuY29k
ZWRJREJLZXkoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBzdGQ6OnN0cmlu
ZyogcmVzdWx0KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVt
ZW50LgorICAgIGNvbnN0IGNoYXIqIHAgPSBzdGFydDsKKyAgICBpZiAocCA+PSBsaW1pdCkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOworCisgICAg
aW50NjRfdCBzdHJpbmdMZW47CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtJREJL
ZXlOdWxsVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TWluS2V5VHlwZUJ5dGU6CisgICAgICAg
ICpyZXN1bHQgPSBlbmNvZGVCeXRlKHR5cGUpOworICAgICAgICByZXR1cm4gcDsKKyAgICBjYXNl
IGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgLy8gU3RyaW5nLgorICAgICAgICBwID0g
ZGVjb2RlVmFySW50KHAsIGxpbWl0LCBzdHJpbmdMZW4pOworICAgICAgICBpZiAoIXApCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHAgKyBzdHJpbmdMZW4gKiAyID4gbGltaXQp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnJlc3VsdCA9IHN0ZDo6c3RyaW5nKHN0
YXJ0LCBwICsgc3RyaW5nTGVuICogMik7CisgICAgICAgIHJldHVybiBwICsgc3RyaW5nTGVuICog
MjsKKyAgICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TnVtYmVy
VHlwZUJ5dGU6CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAgICAgICBpZiAocCArIHNp
emVvZihkb3VibGUpID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnJl
c3VsdCA9IHN0ZDo6c3RyaW5nKHN0YXJ0LCBwICsgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICBy
ZXR1cm4gcCArIHNpemVvZihkb3VibGUpOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4gMDsKIH0KIAotZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5l
eHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QsIGludDY0X3QpCitzdGF0aWMgaW50IGNvbXBh
cmVFbmNvZGVkSURCS2V5cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5QSwgY29uc3Qgc3RkOjpzdHJp
bmcmIGtleUIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1l
bnQuCisgICAgQVNTRVJUKGtleUEubGVuZ3RoKCkgPj0gMSk7CisgICAgQVNTRVJUKGtleUIubGVu
Z3RoKCkgPj0gMSk7CisKKyAgICBjb25zdCBjaGFyKiBwID0ga2V5QS5jX3N0cigpOworICAgIGNv
bnN0IGNoYXIqIGxpbWl0QSA9IHAgKyBrZXlBLmxlbmd0aCgpOworICAgIGNvbnN0IGNoYXIqIHEg
PSBrZXlCLmNfc3RyKCk7CisgICAgY29uc3QgY2hhciogbGltaXRCID0gcSArIGtleUIubGVuZ3Ro
KCk7CisKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGVBID0gKnArKzsKKyAgICB1bnNpZ25lZCBjaGFy
IHR5cGVCID0gKnErKzsKKworICAgIFN0cmluZyBzLCB0OworICAgIGRvdWJsZSBkLCBlOworCisg
ICAgaWYgKGludCB4ID0gdHlwZUIgLSB0eXBlQSkgLy8gRklYTUU6IE5vdGUgdGhlIHN1YnRsZW5l
c3MhCisgICAgICAgIHJldHVybiB4OworCisgICAgc3dpdGNoICh0eXBlQSkgeworICAgIGNhc2Ug
a0lEQktleU51bGxUeXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlNaW5LZXlUeXBlQnl0ZToKKyAg
ICAgICAgLy8gTnVsbCB0eXBlIG9yIG1heCB0eXBlOyBubyBwYXlsb2FkIHRvIGNvbXBhcmUuCisg
ICAgICAgIHJldHVybiAwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAg
ICAvLyBTdHJpbmcgdHlwZS4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGlt
aXRBLCBzKTsgLy8gRklYTUU6IENvbXBhcmUgd2l0aG91dCBhY3R1YWxseSBkZWNvZGluZyB0aGUg
U3RyaW5nIQorICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIHEgPSBkZWNvZGVTdHJpbmdXaXRo
TGVuKHEsIGxpbWl0QiwgdCk7CisgICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgcmV0dXJuIGNv
ZGVQb2ludENvbXBhcmUocywgdCk7CisgICAgY2FzZSBrSURCS2V5RGF0ZVR5cGVCeXRlOgorICAg
IGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBEYXRlIG9yIG51bWJlci4K
KyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCBsaW1pdEEsICZkKTsKKyAgICAgICAgQVNTRVJU
KHApOworICAgICAgICBxID0gZGVjb2RlRG91YmxlKHEsIGxpbWl0QiwgJmUpOworICAgICAgICBB
U1NFUlQocSk7CisgICAgICAgIGlmIChkIDwgZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAg
ICAgICAgaWYgKGQgPiBlKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgIHJldHVybiAwOwogfQog
Ci1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50
NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5JiwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KikKK3N0YXRpYyBpbnQgY291bnROb25aZXJvQnl0ZXMoaW50NjRfdCBuKQoreworICAgIGludCBj
ID0gMTsKKyAgICB3aGlsZSAobiA+Pj0gOCkKKyAgICAgICAgYysrOworICAgIHJldHVybiBjOwor
fQorCitzdGF0aWMgYm9vbCBnZXRJbnQobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmlu
ZyYga2V5LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Cisg
ICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxl
dmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOworCisgICAgaWYgKHMuSXNOb3RGb3VuZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKHMub2soKSk7CisgICAgaWYgKCFzLm9r
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvdW5kSW50ID0gZGVjb2RlSW50KHJl
c3VsdC5jX3N0cigpLCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0
IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpCit7CisgICAgbGV2ZWxkYjo6U3RhdHVz
IHMgPSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBrZXksIGVuY29kZUludCh2YWx1
ZSkpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3N0YXRpYyBib29sIGdldFN0cmluZyhsZXZlbGRiOjpEQiogZGIsIGNvbnN0
IHN0ZDo6c3RyaW5nJiBrZXksIFN0cmluZyYgZm91bmRTdHJpbmcpCit7CisgICAgc3RkOjpzdHJp
bmcgcmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkdldChsZXZlbGRiOjpSZWFk
T3B0aW9ucygpLCBsZXZlbGRiOjpTbGljZShrZXkpLCAmcmVzdWx0KTsKKworICAgIGlmIChzLklz
Tm90Rm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChzLm9rKCkpOwor
ICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3VuZFN0cmlu
ZyA9IGRlY29kZVN0cmluZyhyZXN1bHQuY19zdHIoKSwgcmVzdWx0LmNfc3RyKCkgKyByZXN1bHQu
bGVuZ3RoKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwdXRTdHJpbmco
bGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUpCit7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+UHV0KGxldmVsZGI6OldyaXRlT3B0
aW9ucygpLCBrZXksIGVuY29kZVN0cmluZyh2YWx1ZSkpOworICAgIGlmICghcy5vaygpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCB1
bnNpZ25lZCBjaGFyIGtNaW5pbXVtSW5kZXhJZCA9IDMwOworc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNoYXIga09iamVjdFN0b3JlRGF0YUluZGV4SWQgPSAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNoYXIga0V4aXN0c0VudHJ5SW5kZXhJZCA9IDI7CisKK25hbWVzcGFjZSB7CitjbGFzcyBLZXlQ
cmVmaXggeworcHVibGljOgorICAgIEtleVByZWZpeCgpIHt9CisKKyAgICBLZXlQcmVmaXgoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkK
KyAgICAgICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICAgICAgLCBtX29iamVjdFN0
b3JlSWQob2JqZWN0U3RvcmVJZCkKKyAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKKyAgICB7
CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFy
dCwgY29uc3QgY2hhciogbGltaXQsIEtleVByZWZpeCogcmVzdWx0KQorICAgIHsKKyAgICAgICAg
aWYgKHN0YXJ0ID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgdW5z
aWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqc3RhcnQrKzsKKworICAgICAgICBpbnQgZGF0YWJhc2VJ
ZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gNSkgJiAweDcpICsgMTsKKyAgICAgICAgaW50IG9iamVj
dFN0b3JlSWRCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDIpICYgMHg3KSArIDE7CisgICAgICAgIGlu
dCBpbmRleElkQnl0ZXMgPSAoZmlyc3RCeXRlICYgMHgzKSArIDE7CisKKyAgICAgICAgaWYgKHN0
YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzICsgb2JqZWN0U3RvcmVJZEJ5dGVzICsgaW5kZXhJZEJ5dGVz
ID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByZXN1bHQtPm1fZGF0
YWJhc2VJZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBkYXRhYmFzZUlkQnl0ZXMpOworICAg
ICAgICBzdGFydCArPSBkYXRhYmFzZUlkQnl0ZXM7CisgICAgICAgIHJlc3VsdC0+bV9vYmplY3RT
dG9yZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIG9iamVjdFN0b3JlSWRCeXRlcyk7Cisg
ICAgICAgIHN0YXJ0ICs9IG9iamVjdFN0b3JlSWRCeXRlczsKKyAgICAgICAgcmVzdWx0LT5tX2lu
ZGV4SWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgaW5kZXhJZEJ5dGVzKTsKKyAgICAgICAg
c3RhcnQgKz0gaW5kZXhJZEJ5dGVzOworCisgICAgICAgIHJldHVybiBzdGFydDsKKyAgICB9CisK
KyAgICBzdGQ6OnN0cmluZyBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgaW50IGRhdGFi
YXNlSWRCeXRlcyA9IGNvdW50Tm9uWmVyb0J5dGVzKG1fZGF0YWJhc2VJZCk7CisgICAgICAgIGlu
dCBvYmplY3RTdG9yZUlkQnl0ZXMgPSBjb3VudE5vblplcm9CeXRlcyhtX29iamVjdFN0b3JlSWQp
OworICAgICAgICBpbnQgaW5kZXhJZEJ5dGVzID0gY291bnROb25aZXJvQnl0ZXMobV9pbmRleElk
KTsKKworICAgICAgICBBU1NFUlQoZGF0YWJhc2VJZEJ5dGVzIDw9IDgpOworICAgICAgICBBU1NF
UlQob2JqZWN0U3RvcmVJZEJ5dGVzIDw9IDgpOworICAgICAgICBBU1NFUlQoaW5kZXhJZEJ5dGVz
IDw9IDQpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgICAgIHMucmVzZXJ2ZSgxICsg
ZGF0YWJhc2VJZEJ5dGVzICsgb2JqZWN0U3RvcmVJZEJ5dGVzICsgaW5kZXhJZEJ5dGVzKTsKKwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9IChkYXRhYmFzZUlkQnl0ZXMgLSAxKSA8
PCA1IHwgKG9iamVjdFN0b3JlSWRCeXRlcyAtIDEpIDw8IDIgfCAoaW5kZXhJZEJ5dGVzIC0gMSk7
CisgICAgICAgIHMgKz0gZmlyc3RCeXRlOworICAgICAgICBzICs9IGVuY29kZUludChtX2RhdGFi
YXNlSWQpOworICAgICAgICBzICs9IGVuY29kZUludChtX29iamVjdFN0b3JlSWQpOworICAgICAg
ICBzICs9IGVuY29kZUludChtX2luZGV4SWQpOworCisgICAgICAgIHJldHVybiBzOworICAgIH0K
KworICAgIGludCBjb21wYXJlKGNvbnN0IEtleVByZWZpeCYgb3RoZXIpIGNvbnN0CisgICAgewor
ICAgICAgICBpZiAobV9kYXRhYmFzZUlkICE9IG90aGVyLm1fZGF0YWJhc2VJZCkKKyAgICAgICAg
ICAgIHJldHVybiBtX2RhdGFiYXNlSWQgLSBvdGhlci5tX2RhdGFiYXNlSWQ7CisgICAgICAgIGlm
IChtX29iamVjdFN0b3JlSWQgIT0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAg
cmV0dXJuIG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsKKyAgICAgICAg
aWYgKG1faW5kZXhJZCAhPSBvdGhlci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4gbV9p
bmRleElkIC0gb3RoZXIubV9pbmRleElkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAg
ICBlbnVtIFR5cGUgeworICAgICAgICBrR2xvYmFsTWV0YURhdGEsCisgICAgICAgIGtEYXRhYmFz
ZU1ldGFEYXRhLAorICAgICAgICBrT2JqZWN0U3RvcmVEYXRhLAorICAgICAgICBrRXhpc3RzRW50
cnksCisgICAgICAgIGtJbmRleERhdGEsCisgICAgICAgIGtJbnZhbGlkVHlwZQorICAgIH07CisK
KyAgICBUeXBlIHR5cGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlSWQp
CisgICAgICAgICAgICByZXR1cm4ga0dsb2JhbE1ldGFEYXRhOworICAgICAgICBpZiAoIW1fb2Jq
ZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiBrRGF0YWJhc2VNZXRhRGF0YTsKKyAgICAg
ICAgaWYgKG1faW5kZXhJZCA9PSBrT2JqZWN0U3RvcmVEYXRhSW5kZXhJZCkKKyAgICAgICAgICAg
IHJldHVybiBrT2JqZWN0U3RvcmVEYXRhOworICAgICAgICBpZiAobV9pbmRleElkID09IGtFeGlz
dHNFbnRyeUluZGV4SWQpCisgICAgICAgICAgICByZXR1cm4ga0V4aXN0c0VudHJ5OworICAgICAg
ICBpZiAobV9pbmRleElkID49IGtNaW5pbXVtSW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBr
SW5kZXhEYXRhOworCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4ga0ludmFsaWRUeXBlOworICAgIH0KKworICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAg
IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworfTsKKwor
Y2xhc3MgU2NoZW1hVmVyc2lvbktleSB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3RyaW5n
IGVuY29kZSgpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOworICAg
ICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5dGUpOworICAg
IH0KKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUeXBlQnl0ZSA9IDA7Cit9Owor
CitjbGFzcyBNYXhEYXRhYmFzZUlkS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjpzdHJp
bmcgZW5jb2RlKCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7Cisg
ICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtUeXBlQnl0ZSk7Cisg
ICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMTsKK307
CisKK2NsYXNzIERhdGFiYXNlRnJlZUxpc3RLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRh
YmFzZUZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4
OworICAgICAgICBjb25zdCBjaGFyICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0
LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4
Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Cisg
ICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlQodHlwZUJ5dGUgPT0g
a1R5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX2RhdGFi
YXNlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAg
ICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5cGVCeXRlKSArIGVu
Y29kZVZhckludChkYXRhYmFzZUlkKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQo
KSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlSWQ7IH0KKworICAgIGludCBjb21wYXJlKGNvbnN0
IERhdGFiYXNlRnJlZUxpc3RLZXkmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrVHlwZUJ5dGUgPSAxMDA7CisKK3ByaXZhdGU6CisgICAgaW50
NjRfdCBtX2RhdGFiYXNlSWQ7Cit9OworCitjbGFzcyBEYXRhYmFzZU5hbWVLZXkgeworcHVibGlj
OgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0
IGNoYXIqIGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtl
eVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29k
ZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICBy
ZXR1cm4gcDsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAg
QVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgu
bV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VS
VCh0eXBlQnl0ZSA9PSBrVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBsaW1p
dCwgcmVzdWx0LT5tX29yaWdpbik7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBsaW1pdCwgcmVzdWx0
LT5tX2RhdGFiYXNlTmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29k
ZShjb25zdCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUpCisgICAg
eworICAgICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOworICAgICAgICByZXR1cm4gcHJl
Zml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5dGUpICsgZW5jb2RlU3RyaW5nV2l0aExl
bihvcmlnaW4pICsgZW5jb2RlU3RyaW5nV2l0aExlbihkYXRhYmFzZU5hbWUpOworICAgIH0KKwor
ICAgIFN0cmluZyBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQorICAgIFN0cmlu
ZyBkYXRhYmFzZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlTmFtZTsgfQorCisgICAg
aW50IGNvbXBhcmUoY29uc3QgRGF0YWJhc2VOYW1lS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAg
IGlmIChpbnQgeCA9IGNvZGVQb2ludENvbXBhcmUobV9vcmlnaW4sIG90aGVyLm1fb3JpZ2luKSkK
KyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZSht
X2RhdGFiYXNlTmFtZSwgb3RoZXIubV9kYXRhYmFzZU5hbWUpOworICAgIH0KKworICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUeXBlQnl0ZSA9IDIwMTsKKworcHJpdmF0ZToKKyAgICBT
dHJpbmcgbV9vcmlnaW47IC8vIEZJWE1FOiBTdG9yZSBlbmNvZGVkIHN0cmluZ3MsIG9yIGp1c3Qg
cG9pbnRlcnMuCisgICAgU3RyaW5nIG1fZGF0YWJhc2VOYW1lOworfTsKKworY2xhc3MgRGF0YWJh
c2VNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgZW51bSBNZXRhRGF0YVR5cGUgeworICAgICAg
ICBrT3JpZ2luTmFtZSA9IDAsCisgICAgICAgIGtEYXRhYmFzZU5hbWUgPSAxLAorICAgICAgICBr
VXNlclZlcnNpb24gPSAyLAorICAgICAgICBrTWF4T2JqZWN0U3RvcmVJZCA9IDMKKyAgICB9Owor
CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIE1ldGFE
YXRhVHlwZSBtZXRhRGF0YVR5cGUpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRh
dGFiYXNlSWQsIDAsIDApOworICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2Rl
Qnl0ZShtZXRhRGF0YVR5cGUpOworICAgIH0KK307CisKK2NsYXNzIE9iamVjdFN0b3JlTWV0YURh
dGFLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1
bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFy
KiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAg
aWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9k
YXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAg
ICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9
ICpwKys7CisgICAgICAgIEFTU0VSVCh0eXBlQnl0ZSA9PSBrVHlwZUJ5dGUpOworICAgICAgICBp
ZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2Rl
VmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlmICgh
cCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocmVzdWx0LT5tX29iamVj
dFN0b3JlSWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURh
dGFUeXBlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkK
KyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAg
ICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtUeXBlQnl0ZSkgKyBlbmNv
ZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkgKyBlbmNvZGVWYXJJbnQobWV0YURhdGFUeXBlKTsKKyAg
ICB9CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdCB7IHJldHVybiBtX29iamVj
dFN0b3JlSWQ7IH0KKyAgICBpbnQ2NF90IG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
bWV0YURhdGFUeXBlOyB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJ
ZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OyAvLyBGSVhN
RTogSXMgdGhpcyBjYXN0IHNhZmU/IEkuZS4sIHdpbGwgaXQgcHJlc2VydmUgdGhlIHNpZ24/Cisg
ICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFUeXBlOworICAg
IH0KKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUeXBlQnl0ZSA9IDUwOworCitw
cml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9tZXRh
RGF0YVR5cGU7IC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBieXRlLgorfTsKKworY2xhc3MgSW5kZXhN
ZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25z
dCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TWV0YURhdGFLZXkqIHJlc3Vs
dCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIq
IHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBp
ZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2Rh
dGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAg
ICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0g
KnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVCeXRlID09IGtUeXBlQnl0ZSk7CisgICAgICAgIGlm
IChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVW
YXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYgKCFw
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGlt
aXQsIHJlc3VsdC0+bV9pbmRleElkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUgPSAqcCsrOworICAgICAgICByZXR1cm4gcDsK
KyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVkIGNoYXIg
bWV0YURhdGFUeXBlKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlk
LCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa1R5
cGVCeXRlKSArIGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSArIGVuY29kZVZhckludChpbmRl
eElkKSArIGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFy
ZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChpbnQg
eCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAg
IHJldHVybiB4OworICAgICAgICBpZiAoaW50IHggPSBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4
SWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBl
IC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7CisgICAgfQorCisgICAgaW50NjRfdCBpbmRleElkKCkg
Y29uc3QgeyByZXR1cm4gbV9pbmRleElkOyB9CisgICAgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5
cGUoKSBjb25zdCB7IHJldHVybiBtX21ldGFEYXRhVHlwZTsgfQorCisgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMTAwOworCitwcml2YXRlOgorICAgIGludDY0X3Qg
bV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworICAgIHVuc2lnbmVkIGNo
YXIgbV9tZXRhRGF0YVR5cGU7Cit9OworCitjbGFzcyBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0
LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0KQorICAg
IHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IEtl
eVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJ
ZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFT
U0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwor
ICAgICAgICBBU1NFUlQodHlwZUJ5dGUgPT0ga1R5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhcklu
dChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgIH0KKworICAgIHN0YXRp
YyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDAp
OworICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5dGUp
ICsgZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpOworICAgIH0KKworICAgIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsgfQorCisgICAgaW50
IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYgb3RoZXIpCisgICAgeworICAg
ICAgICAvLyBGSVhNRTogSXQgbWF5IHNlZW0gc3RyYW5nZSB0aGF0IHdlJ3JlIG5vdCBjb21wYXJp
bmcgZGF0YWJhc2UgaWQncywKKyAgICAgICAgLy8gYnV0IHRoYXQgY29tcGFyaXNvbiB3aWxsIGhh
dmUgYmVlbiBtYWRlIGVhcmxpZXIuCisgICAgICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBtYWtl
IHRoaXMgbW9yZSBjbGVhciwgdGhvdWdoLi4uCisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3Jl
SWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQ7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVu
c2lnbmVkIGNoYXIga1R5cGVCeXRlID0gMTUwOworCitwcml2YXRlOgorICAgIGludDY0X3QgbV9v
YmplY3RTdG9yZUlkOworfTsKKworY2xhc3MgSW5kZXhGcmVlTGlzdEtleSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hh
ciogbGltaXQsIEluZGV4RnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVBy
ZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShz
dGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NF
UlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2lu
ZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5
cGVCeXRlID09IGtUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9pbmRleElk
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgeworICAg
ICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICByZXR1cm4g
cHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5dGUpICsgZW5jb2RlVmFySW50KG9i
amVjdFN0b3JlSWQpICsgZW5jb2RlVmFySW50KGluZGV4SWQpOworICAgIH0KKworICAgIGludCBj
b21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYg
KGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAg
ICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4
SWQ7CisgICAgfQorCisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3QgeyByZXR1cm4g
bV9vYmplY3RTdG9yZUlkOyB9CisgICAgaW50NjRfdCBpbmRleElkKCkgY29uc3QgeyByZXR1cm4g
bV9pbmRleElkOyB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVHlwZUJ5dGUg
PSAxNTE7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50
NjRfdCBtX2luZGV4SWQ7Cit9OworCitjbGFzcyBPYmplY3RTdG9yZU5hbWVzS2V5IHsKK3B1Ymxp
YzoKKyAgICAvLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBvYmplY3Qgc3Rv
cmUgaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAgIC8vIGlzIGtlcHQgaW4gdGhlIElEQkRhdGFi
YXNlQmFja2VuZEltcGwuIENhbiB0aGUgbWFwcGluZyBiZWNvbWUgdW5yZWxpYWJsZT8KKyAgICAv
LyBDYW4gd2UgcmVtb3ZlIHRoaXM/CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25z
dCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTmFtZXNLZXkqIHJl
c3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNo
YXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAg
ICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5t
X2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOwor
ICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1p
dCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRl
ID0gKnArKzsKKyAgICAgICAgQVNTRVJUKHR5cGVCeXRlID09IGtUeXBlQnl0ZSk7CisgICAgICAg
IHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3Rv
cmVOYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICByZXR1cm4gcHJl
Zml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrVHlwZUJ5dGUpICsgZW5jb2RlU3RyaW5nV2l0aExl
bihvYmplY3RTdG9yZU5hbWUpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVj
dFN0b3JlTmFtZXNLZXkmIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENv
bXBhcmUobV9vYmplY3RTdG9yZU5hbWUsIG90aGVyLm1fb2JqZWN0U3RvcmVOYW1lKTsKKyAgICB9
CisKKyAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RT
dG9yZU5hbWU7IH0KKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUeXBlQnl0ZSA9
IDIwMDsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9vYmplY3RTdG9yZU5hbWU7IC8vIEZJWE1F
OiBTdG9yZSB0aGUgZW5jb2RlZCBzdHJpbmcsIG9yIGp1c3QgcG9pbnRlcnMgdG8gaXQuCit9Owor
CitjbGFzcyBJbmRleE5hbWVzS2V5IHsKK3B1YmxpYzoKKyAgICAvLyBGSVhNRTogV2UgbmV2ZXIg
dXNlIHRoaXMgdG8gbG9vayB1cCBpbmRleCBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisgICAgLy8g
aXMga2VwdCBhdCBhIGhpZ2hlciBsZXZlbC4KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhOYW1lc0tleSogcmVz
dWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAg
IGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1f
ZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUg
PSAqcCsrOworICAgICAgICBBU1NFUlQodHlwZUJ5dGUgPT0ga1R5cGVCeXRlKTsKKyAgICAgICAg
aWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29k
ZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAo
IXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dp
dGhMZW4ocCwgbGltaXQsIHJlc3VsdC0+bV9pbmRleE5hbWUpOworICAgIH0KKworICAgIHN0YXRp
YyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IFN0cmluZyYgaW5kZXhOYW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4
IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUo
KSArIGVuY29kZUJ5dGUoa1R5cGVCeXRlKSArIGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSAr
IGVuY29kZVN0cmluZ1dpdGhMZW4oaW5kZXhOYW1lKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFy
ZShjb25zdCBJbmRleE5hbWVzS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChpbnQgeCA9
IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJl
dHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX2luZGV4TmFtZSwgb3Ro
ZXIubV9pbmRleE5hbWUpOworICAgIH0KKworICAgIFN0cmluZyBpbmRleE5hbWUoKSBjb25zdCB7
IHJldHVybiBtX2luZGV4TmFtZTsgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIg
a1R5cGVCeXRlID0gMjAxOworCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlk
OworICAgIFN0cmluZyBtX2luZGV4TmFtZTsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlRGF0YUtl
eSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBz
dGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURhdGFLZXkqIHJlc3VsdCkKKyAgICB7
CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQ
cmVmaXg6OmRlY29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsK
KyAgICAgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQo
cHJlZml4Lm1faW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgaWYgKHAg
PT0gZW5kKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBleHRyYWN0RW5j
b2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1fZW5jb2RlZFVzZXJLZXkpOworICAgIH0KKwor
ICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IHN0ZDo6c3RyaW5nIGVuY29kZWRVc2VyS2V5KQorICAgIHsK
KyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrU3Bl
Y2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29k
ZWRVc2VyS2V5OworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktl
eSkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25z
dCBPYmplY3RTdG9yZURhdGFLZXkmIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBh
cmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5
KTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0CisgICAg
eworICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXk7CisgICAgICAgIGRlY29kZUlEQktleShtX2Vu
Y29kZWRVc2VyS2V5LmNfc3RyKCksIG1fZW5jb2RlZFVzZXJLZXkuY19zdHIoKSArIG1fZW5jb2Rl
ZFVzZXJLZXkubGVuZ3RoKCksIGtleSk7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisg
ICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NwZWNpYWxJbmRleE51bWJlciA9IGtPYmplY3RTdG9y
ZURhdGFJbmRleElkOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1fZW5jb2RlZFVzZXJL
ZXk7Cit9OworCitjbGFzcyBFeGlzdHNFbnRyeUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBFeGlz
dHNFbnRyeUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAg
ICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVm
aXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNT
RVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IGtTcGVjaWFsSW5k
ZXhOdW1iZXIpOworICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9l
bmNvZGVkVXNlcktleSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qgc3RkOjpzdHJp
bmcmIGVuY29kZWRLZXkpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgICAgICByZXR1cm4g
cHJlZml4LmVuY29kZSgpICsgZW5jb2RlZEtleTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpz
dHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJLZXkmIHVzZXJLZXkpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSk7CisgICAgfQorCisg
ICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkmIG90aGVyKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5t
X2VuY29kZWRVc2VyS2V5KTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktl
eSgpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXk7CisgICAgICAgIGRl
Y29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmNfc3RyKCksIG1fZW5jb2RlZFVzZXJLZXkuY19z
dHIoKSArIG1fZW5jb2RlZFVzZXJLZXkubGVuZ3RoKCksIGtleSk7CisgICAgICAgIHJldHVybiBr
ZXk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NwZWNpYWxJbmRleE51bWJl
ciA9IGtFeGlzdHNFbnRyeUluZGV4SWQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbV9l
bmNvZGVkVXNlcktleTsKK307CisKK2NsYXNzIEluZGV4RGF0YUtleSB7CitwdWJsaWM6CisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIEluZGV4RGF0YUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHBy
ZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBs
aW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVChwcmVm
aXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPj0g
a01pbmltdW1JbmRleElkKTsKKyAgICAgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBwcmVmaXgu
bV9kYXRhYmFzZUlkOworICAgICAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IHByZWZpeC5t
X29iamVjdFN0b3JlSWQ7CisgICAgICAgIHJlc3VsdC0+bV9pbmRleElkID0gcHJlZml4Lm1faW5k
ZXhJZDsKKyAgICAgICAgcCA9IGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGxpbWl0LCAmcmVzdWx0
LT5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGlmIChwID09IGxpbWl0KSB7CisgICAgICAgICAgICByZXN1bHQtPm1fc2Vx
dWVuY2VOdW1iZXIgPSAtMTsgLy8gRklYTUU6IFdlIHNob3VsZCBjaGFuZ2UgaXQgc28gdGhhdCBh
bGwga2V5cyBoYXZlIGEgc2VxdWVuY2UgbnVtYmVyLiBTaG91bGRuJ3QgbmVlZCB0byBoYW5kbGUg
dGhpcyBjYXNlLgorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX3NlcXVlbmNlTnVtYmVyKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IHN0ZDo6c3RyaW5n
JiBlbmNvZGVkVXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAgICAg
IEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Cisg
ICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVkVXNlcktleSArIGVuY29kZVZh
ckludChzZXF1ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBp
bmRleElkLCBjb25zdCBJREJLZXkmIHVzZXJLZXksIGludDY0X3Qgc2VxdWVuY2VOdW1iZXIpCisg
ICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSwgc2VxdWVuY2VOdW1iZXIpOworICAgIH0KKwor
ICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDMyX01BWCwgbWF4SURCS2V5KCksIElOVDY0X01BWCk7
CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9v
bCBpZ25vcmVTZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAgICAgIGlmIChpbnQgeCA9IGNvbXBh
cmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5
KSkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBpZiAoaWdub3JlU2VxdWVuY2VOdW1i
ZXIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG1fc2VxdWVuY2VOdW1i
ZXIgLSBvdGhlci5tX3NlcXVlbmNlTnVtYmVyOworICAgIH0KKworICAgIGludDY0X3QgZGF0YWJh
c2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VJZDsgfQorICAgIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsgfQorICAgIGludDY0X3Qg
aW5kZXhJZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXhJZDsgfQorCisgICAgUGFzc1JlZlB0cjxJ
REJLZXk+IHVzZXJLZXkoKSBjb25zdAorICAgIHsKKyAgICAgICAgUmVmUHRyPElEQktleT4ga2V5
OworICAgICAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5jX3N0cigpLCBtX2VuY29k
ZWRVc2VyS2V5LmNfc3RyKCkgKyBtX2VuY29kZWRVc2VyS2V5Lmxlbmd0aCgpLCBrZXkpOworICAg
ICAgICByZXR1cm4ga2V5OworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fZGF0YWJh
c2VJZDsKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJ
ZDsKKyAgICBzdGQ6OnN0cmluZyBtX2VuY29kZWRVc2VyS2V5OworICAgIGludDY0X3QgbV9zZXF1
ZW5jZU51bWJlcjsKK307CisKK2NsYXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgbGV2ZWxkYjo6Q29t
cGFyYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgQ29tcGFyZShjb25zdCBsZXZlbGRi
OjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAgICAg
ICBpbnQgeSA9IFJlYWxDb21wYXJlKGEsIGIpOworICAgICAgICByZXR1cm4geTsKKyAgICB9CisK
KyAgICBpbnQgQ29tcGFyZUluZGV4S2V5cyhjb25zdCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3Qg
bGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgeSA9IFJlYWxDb21w
YXJlKGEsIGIsIHRydWUpOworICAgICAgICByZXR1cm4geTsKKyAgICB9CisKKyAgICBpbnQgUmVh
bENvbXBhcmUoY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGEsIGNvbnN0IGxldmVsZGI6OlNsaWNlJiBi
LCBib29sIGluZGV4S2V5cyA9IGZhbHNlKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgY2hh
ciogcHRyQSA9IGEuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyKiBwdHJCID0gYi5kYXRhKCk7
CisgICAgICAgIGNvbnN0IGNoYXIqIGVuZEEgPSBwdHJBICsgYS5zaXplKCk7CisgICAgICAgIGNv
bnN0IGNoYXIqIGVuZEIgPSBwdHJCICsgYi5zaXplKCk7CisKKyAgICAgICAgS2V5UHJlZml4IHBy
ZWZpeEE7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXhCOworCisgICAgICAgIHB0ckEgPSBLZXlQ
cmVmaXg6OmRlY29kZShwdHJBLCBlbmRBLCAmcHJlZml4QSk7CisgICAgICAgIHB0ckIgPSBLZXlQ
cmVmaXg6OmRlY29kZShwdHJCLCBlbmRCLCAmcHJlZml4Qik7CisgICAgICAgIEFTU0VSVChwdHJB
KTsKKyAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgIGlmIChpbnQgeCA9IHByZWZpeEEu
Y29tcGFyZShwcmVmaXhCKSkKKyAgICAgICAgICAgIHJldHVybiB4OworCisgICAgICAgIGlmIChw
cmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtHbG9iYWxNZXRhRGF0YSkgeworICAgICAgICAg
ICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRC
KTsKKworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOworCisgICAgICAgICAg
ICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHg7CisKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPD0gMSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gRGF0YWJhc2VGcmVlTGlz
dEtleTo6a1R5cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBk
YXRhYmFzZUZyZWVMaXN0S2V5QTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5
IGRhdGFiYXNlRnJlZUxpc3RLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IERhdGFiYXNl
RnJlZUxpc3RLZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJmRhdGFiYXNlRnJlZUxpc3RLZXlB
KTsKKyAgICAgICAgICAgICAgICBwdHJCID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKGIu
ZGF0YSgpLCBlbmRCLCAmZGF0YWJhc2VGcmVlTGlzdEtleUIpOworICAgICAgICAgICAgICAgIEFT
U0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZGF0YWJhc2VGcmVlTGlzdEtleUEuY29tcGFyZShkYXRhYmFzZUZyZWVMaXN0
S2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IERhdGFi
YXNlTmFtZUtleTo6a1R5cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VOYW1lS2V5
IGRhdGFiYXNlTmFtZUtleUE7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VOYW1lS2V5IGRhdGFi
YXNlTmFtZUtleUI7CisKKyAgICAgICAgICAgICAgICBwdHJBID0gRGF0YWJhc2VOYW1lS2V5Ojpk
ZWNvZGUoYS5kYXRhKCksIGVuZEEsICZkYXRhYmFzZU5hbWVLZXlBKTsKKyAgICAgICAgICAgICAg
ICBwdHJCID0gRGF0YWJhc2VOYW1lS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZkYXRhYmFz
ZU5hbWVLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICAg
ICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlTmFtZUtl
eUEuY29tcGFyZShkYXRhYmFzZU5hbWVLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtEYXRhYmFzZU1ldGFE
YXRhKSB7CisgICAgICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsKKyAgICAgICAgICAgIEFT
U0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRl
QSA9ICpwdHJBKys7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQiA9ICpwdHJC
Kys7CisKKyAgICAgICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikKKyAg
ICAgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA8PSAz
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjprVHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAgICBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5QTsKKyAgICAgICAgICAgICAgICBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEg
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZtZXRhRGF0
YUtleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpk
ZWNvZGUoYi5kYXRhKCksIGVuZEIsICZtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgICAgIEFT
U0VSVChwdHJBKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAg
ICAgICByZXR1cm4gbWV0YURhdGFLZXlBLmNvbXBhcmUobWV0YURhdGFLZXlCKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gSW5kZXhNZXRhRGF0YUtleTo6a1R5
cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleUE7
CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleUI7CisKKyAgICAg
ICAgICAgICAgICBwdHJBID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRB
LCAmbWV0YURhdGFLZXlBKTsKKyAgICAgICAgICAgICAgICBwdHJCID0gSW5kZXhNZXRhRGF0YUtl
eTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmbWV0YURhdGFLZXlCKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5QS5jb21wYXJlKG1ldGFEYXRhS2V5Qik7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IE9iamVjdFN0b3JlRnJlZUxp
c3RLZXk6OmtUeXBlQnl0ZSkgeworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlRnJlZUxpc3RL
ZXkgZnJlZUxpc3RFbnRyeUtleUE7CisgICAgICAgICAgICAgICAgT2JqZWN0U3RvcmVGcmVlTGlz
dEtleSBmcmVlTGlzdEVudHJ5S2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEgPSBPYmplY3RT
dG9yZUZyZWVMaXN0S2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZmcmVlTGlzdEVudHJ5S2V5
QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29k
ZShiLmRhdGEoKSwgZW5kQiwgJmZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAgICAgICBB
U1NFUlQocHRyQSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZyZWVMaXN0RW50cnlLZXlBLmNvbXBhcmUoZnJlZUxpc3RFbnRyeUtleUIp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBJbmRleEZyZWVM
aXN0S2V5OjprVHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAgICBJbmRleEZyZWVMaXN0S2V5IGZy
ZWVMaXN0RW50cnlLZXlBOworICAgICAgICAgICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxp
c3RFbnRyeUtleUI7CisKKyAgICAgICAgICAgICAgICBwdHJBID0gSW5kZXhGcmVlTGlzdEtleTo6
ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmZnJlZUxpc3RFbnRyeUtleUEpOworICAgICAgICAgICAg
ICAgIHB0ckIgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZmcmVl
TGlzdEVudHJ5S2V5Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAg
ICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmcmVlTGlzdEVu
dHJ5S2V5QS5jb21wYXJlKGZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gT2JqZWN0U3RvcmVOYW1lc0tleTo6a1R5cGVCeXRlKSB7
CisgICAgICAgICAgICAgICAgT2JqZWN0U3RvcmVOYW1lc0tleSBvYmplY3RTdG9yZU5hbWVzS2V5
QTsKKyAgICAgICAgICAgICAgICBPYmplY3RTdG9yZU5hbWVzS2V5IG9iamVjdFN0b3JlTmFtZXNL
ZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmRlY29k
ZShhLmRhdGEoKSwgZW5kQSwgJm9iamVjdFN0b3JlTmFtZXNLZXlBKTsKKyAgICAgICAgICAgICAg
ICBwdHJCID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmb2Jq
ZWN0U3RvcmVOYW1lc0tleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0
U3RvcmVOYW1lc0tleUEuY29tcGFyZShvYmplY3RTdG9yZU5hbWVzS2V5Qik7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IEluZGV4TmFtZXNLZXk6OmtUeXBlQnl0
ZSkgeworICAgICAgICAgICAgICAgIEluZGV4TmFtZXNLZXkgaW5kZXhOYW1lc0tleUE7CisgICAg
ICAgICAgICAgICAgSW5kZXhOYW1lc0tleSBpbmRleE5hbWVzS2V5QjsKKworICAgICAgICAgICAg
ICAgIHB0ckEgPSBJbmRleE5hbWVzS2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZpbmRleE5h
bWVzS2V5QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IEluZGV4TmFtZXNLZXk6OmRlY29kZShi
LmRhdGEoKSwgZW5kQiwgJmluZGV4TmFtZXNLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cHRyQSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAg
cmV0dXJuIGluZGV4TmFtZXNLZXlBLmNvbXBhcmUoaW5kZXhOYW1lc0tleUIpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVBy
ZWZpeDo6a09iamVjdFN0b3JlRGF0YSkgeworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAm
JiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBp
ZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAg
IGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBU
aGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUg
aGFuZGxlZCB0aGlzIHdheS4KKworICAgICAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVj
dFN0b3JlRGF0YUtleUE7CisgICAgICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3Rv
cmVEYXRhS2V5QjsKKworICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVj
b2RlKGEuZGF0YSgpLCBlbmRBLCAmb2JqZWN0U3RvcmVEYXRhS2V5QSk7CisgICAgICAgICAgICBw
dHJCID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZvYmplY3RT
dG9yZURhdGFLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFT
U0VSVChwdHJCKTsKKworICAgICAgICAgICAgcmV0dXJuIG9iamVjdFN0b3JlRGF0YUtleUEuY29t
cGFyZShvYmplY3RTdG9yZURhdGFLZXlCKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4
QS50eXBlKCkgPT0gS2V5UHJlZml4OjprRXhpc3RzRW50cnkpIHsKKyAgICAgICAgICAgIGlmIChw
dHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7
CisgICAgICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAx
OyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5v
dCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAgICAgICAgIEV4aXN0c0VudHJ5
S2V5IGV4aXN0c0VudHJ5S2V5QTsKKyAgICAgICAgICAgIEV4aXN0c0VudHJ5S2V5IGV4aXN0c0Vu
dHJ5S2V5QjsKKworICAgICAgICAgICAgcHRyQSA9IEV4aXN0c0VudHJ5S2V5OjpkZWNvZGUoYS5k
YXRhKCksIGVuZEEsICZleGlzdHNFbnRyeUtleUEpOworICAgICAgICAgICAgcHRyQiA9IEV4aXN0
c0VudHJ5S2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZleGlzdHNFbnRyeUtleUIpOworICAg
ICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAg
ICAgICAgICByZXR1cm4gZXhpc3RzRW50cnlLZXlBLmNvbXBhcmUoZXhpc3RzRW50cnlLZXlCKTsK
KyAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprSW5k
ZXhEYXRhKSB7CisgICAgICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikK
KyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEp
CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHB0ckIgPT0gZW5k
QikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24t
ZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5
LgorCisgICAgICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QTsKKyAgICAgICAgICAg
IEluZGV4RGF0YUtleSBpbmRleERhdGFLZXlCOworCisgICAgICAgICAgICBwdHJBID0gSW5kZXhE
YXRhS2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZpbmRleERhdGFLZXlBKTsKKyAgICAgICAg
ICAgIHB0ckIgPSBJbmRleERhdGFLZXk6OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJmluZGV4RGF0
YUtleUIpOworICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgQVNTRVJUKHB0
ckIpOworCisgICAgICAgICAgICBib29sIGlnbm9yZVNlcXVlbmNlTnVtYmVyID0gaW5kZXhLZXlz
OworICAgICAgICAgICAgcmV0dXJuIGluZGV4RGF0YUtleUEuY29tcGFyZShpbmRleERhdGFLZXlC
LCBpZ25vcmVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3QgY2hhciog
TmFtZSgpIGNvbnN0IHsgcmV0dXJuICJpZGJfY21wMSI7IH0KKyAgICB2b2lkIEZpbmRTaG9ydGVz
dFNlcGFyYXRvcihzdGQ6OnN0cmluZyosIGNvbnN0IGxldmVsZGI6OlNsaWNlJikgY29uc3Qge30g
Ly8gRklYTUU6IEltcGxlbWVudCBldmVudHVhbGx5LgorICAgIHZvaWQgRmluZFNob3J0U3VjY2Vz
c29yKHN0ZDo6c3RyaW5nKikgY29uc3Qge30gLy8gRklYTUU6IEltcGxlbWVudCBldmVudHVhbGx5
LgorfSBjb21wYXJhdG9yOworfQorCitzdGF0aWMgYm9vbCBzZXRVcE1ldGFkYXRhKGxldmVsZGI6
OkRCKiBkYikKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtZXRhRGF0YUtleSA9IFNjaGVtYVZl
cnNpb25LZXk6OmVuY29kZSgpOworCisgICAgaW50NjRfdCBzY2hlbWFWZXJzaW9uOworICAgIGlm
ICghZ2V0SW50KGRiLCBtZXRhRGF0YUtleSwgc2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAgc2No
ZW1hVmVyc2lvbiA9IDA7CisgICAgICAgIGlmICghcHV0SW50KGRiLCBtZXRhRGF0YUtleSwgc2No
ZW1hVmVyc2lvbikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8g
RklYTUU6IEV2ZW50dWFsbHksIHdlJ2xsIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFuc2l0aW9uIGJl
dHdlZW4gc2NoZW1hcy4KKyAgICBpZiAoc2NoZW1hVmVyc2lvbikKKyAgICAgICAgcmV0dXJuIGZh
bHNlOyAvLyBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZlcnNpb24uCisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJC
YWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBT
dHJpbmcmIHBhdGhCYXNlQXJnLCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJpbmcmIGZp
bGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnkpCit7CisgICAgU3Ry
aW5nIHBhdGhCYXNlID0gcGF0aEJhc2VBcmc7CisKKyAgICBpZiAocGF0aEJhc2UuaXNFbXB0eSgp
KSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogV2UgbmVlZCB0byBo
YW5kbGUgdGhpcyBjYXNlIGZvciBpbmNvZ25pdG8gYW5kIER1bXBSZW5kZXJUcmVlLgorICAgICAg
ICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhwYXRoQmFz
ZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIEluZGV4ZWREQiBkYXRh
YmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGV2ZW50dWFsbHkgdXNlIHRoZSBzYW1l
IExldmVsREIgZGF0YWJhc2UgZm9yIGFsbCBvcmlnaW5zLgorICAgIFN0cmluZyBwYXRoID0gcGF0
aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAgICBsZXZlbGRiOjpEQiog
ZGI7CisgICAgbGV2ZWxkYjo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcGFyYXRv
ciA9ICZjb21wYXJhdG9yOworICAgIG9wdGlvbnMuY3JlYXRlX2lmX21pc3NpbmcgPSB0cnVlOwor
ICAgIGxldmVsZGI6OlN0YXR1cyBzdGF0dXMgPSBsZXZlbGRiOjpEQjo6T3BlbihvcHRpb25zLCBw
YXRoLnV0ZjgoKS5kYXRhKCksICZkYik7CisKKyAgICBpZiAoIXN0YXR1cy5vaygpKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBJZiB0aGUgY29tcGFyYXRvciBuYW1lIGNoYW5nZXMsIHdlIG5lZWQgYSB0
cmFuc2l0aW9uaW5nIHN0cmF0ZWd5LgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBS
ZWZQdHI8SURCTGV2ZWxEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJ
REJMZXZlbERCQmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5LCBkYikpKTsKKwor
ICAgIGlmICghc2V0VXBNZXRhZGF0YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0KCkpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIHJldHVybiBiYWNraW5nU3RvcmUucmVsZWFzZSgpOworfQorCiti
b29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNv
bnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQp
CiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAg
cmV0dXJuIGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSA9IERhdGFiYXNlTmFtZUtl
eTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7CisKKyAgICBib29sIG9rID0gZ2V0SW50KG1f
ZGIuZ2V0KCksIGtleSwgZm91bmRJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtl
eTo6ZW5jb2RlKGZvdW5kSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIGZv
dW5kVmVyc2lvbik7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9i
amVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJh
Y2smKQorc3RhdGljIGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChsZXZlbGRiOjpEQiogZGIpCiB7
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0
dXJuIGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyZWVMaXN0U3RhcnRLZXkgPSBEYXRh
YmFzZUZyZWVMaXN0S2V5OjplbmNvZGUoMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZnJlZUxp
c3RTdG9wS2V5ID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKElOVDY0X01BWCk7CisKKyAg
ICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpS
ZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhmcmVlTGlzdFN0YXJ0S2V5KTsgaXQt
PlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgZnJlZUxpc3RTdG9wS2V5
KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5k
YXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7
CisKKyAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAgcCA9
IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsKKyAg
ICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0
ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtleSgpKTsKKyAgICAgICAgQVNTRVJUKHMu
b2soKSk7CisKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0S2V5LmRhdGFiYXNlSWQoKTsKKyAgICB9
CisKKyAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlcmUgd2FzIG5vIGZyZWUtbGlzdC4KKyAgICBp
bnQ2NF90IG1heERhdGFiYXNlSWQ7CisgICAgaWYgKCFnZXRJbnQoZGIsIE1heERhdGFiYXNlSWRL
ZXk6OmVuY29kZSgpLCBtYXhEYXRhYmFzZUlkKSkKKyAgICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7
CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFzZUlkICsgMTsKKyAgICBib29s
IG9rID0gcHV0SW50KGRiLCBNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUoKSwgZGF0YWJhc2VJZCk7
CisgICAgQVNTRVJUKG9rKTsKKworICAgIHJldHVybiBkYXRhYmFzZUlkOworCiB9CiAKLXZvaWQg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2NF90LCBpbnQ2NF90LCBWZWN0
b3I8aW50NjRfdD4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3RvcjxTdHJpbmc+JiwgVmVjdG9yPGJv
b2w+JikKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6c2V0SURCRGF0YWJhc2VNZXRhRGF0
YShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgaW50NjRfdCYgcm93
SWQsIGJvb2wgaW52YWxpZFJvd0lkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBG
SVhNRTogSW1wbGVtZW50LgorICAgIGlmIChpbnZhbGlkUm93SWQpIHsKKyAgICAgICAgcm93SWQg
PSBnZXROZXdEYXRhYmFzZUlkKG1fZGIuZ2V0KCkpOworCisgICAgICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7Cisg
ICAgICAgIGlmICghcHV0SW50KG1fZGIuZ2V0KCksIGtleSwgcm93SWQpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghcHV0U3RyaW5nKG1fZGIuZ2V0KCksIERh
dGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShyb3dJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6a1Vz
ZXJWZXJzaW9uKSwgdmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biB0cnVlOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGlu
dDY0X3QsIGludDY0X3QsIGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYsIGJvb2wsIGludDY0
X3QmKQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRf
dCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYg
Zm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYg
Zm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IDEsIDApOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYLCAwKTsKKworICAgIE93blB0cjxs
ZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlv
bnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21w
YXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAg
ICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNo
YXIgKmxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAgT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOwor
CisgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IG1ldGFEYXRhS2V5Lm9iamVjdFN0b3Jl
SWQoKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lID0gZGVjb2RlU3RyaW5nKGl0
LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgp
KTsKKworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQt
PnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkp
OworCisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiaXQgbm90IHZhbGlkXG4iKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBib29sIGF1dG9JbmNyZW1lbnQgPSAqaXQtPnZhbHVlKCku
ZGF0YSgpOworCisgICAgICAgIGl0LT5OZXh0KCk7IC8vIElzIGV2aWNhdGJsZS4KKyAgICAgICAg
aWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRc
biIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXQtPk5leHQo
KTsgLy8gTGFzdCB2ZXJzaW9uLgorICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpdC0+TmV4dCgpOyAvLyBNYXhpdW0gaW5kZXggaWQgYWxsb2Nh
dGVkLgorICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
Iml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICBmb3VuZElkcy5hcHBlbmQob2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGZvdW5kTmFtZXMu
YXBwZW5kKG9iamVjdFN0b3JlTmFtZSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtl
eVBhdGgpOworICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5hcHBlbmQoYXV0b0luY3Jl
bWVudCk7CisgICAgfQorfQorCitzdGF0aWMgaW50NjRfdCBnZXROZXdPYmplY3RTdG9yZUlkKGxl
dmVsZGI6OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIGZyZWVMaXN0U3RhcnRLZXkgPSBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZnJlZUxpc3RTdG9wS2V5ID0gT2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIElOVDY0X01BWCk7CisKKyAg
ICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpS
ZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhmcmVlTGlzdFN0YXJ0S2V5KTsgaXQt
PlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgZnJlZUxpc3RTdG9wS2V5
KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5k
YXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7
CisKKyAgICAgICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAg
cCA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5
KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGIt
PkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtleSgpKTsKKyAgICAgICAgQVNT
RVJUKHMub2soKSk7CisKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0S2V5Lm9iamVjdFN0b3JlSWQo
KTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQ7CisgICAgY29uc3Qgc3Rk
OjpzdHJpbmcgbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprTWF4T2JqZWN0U3RvcmVJZCk7Cisg
ICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG1heE9iamVjdFN0b3JlSWQp
KQorICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKKworICAgIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCA9IG1heE9iamVjdFN0b3JlSWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1h
eE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVChvayk7CisKKyAg
ICByZXR1cm4gb2JqZWN0U3RvcmVJZDsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGludDY0X3QmIGFz
c2lnbmVkT2JqZWN0U3RvcmVJZCkKK3sKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQgPSBnZXRO
ZXdPYmplY3RTdG9yZUlkKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQpOworCisgICAgY29uc3Qgc3Rk
OjpzdHJpbmcgbmFtZUtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCAwKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXlQYXRoS2V5
ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDEpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGF1dG9JbmNyZW1lbnRLZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7Cisg
ICAgY29uc3Qgc3RkOjpzdHJpbmcgZXZpY3RhYmxlS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDMpOworICAgIGNvbnN0IHN0ZDo6
c3RyaW5nIGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDQpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1heElu
ZGV4SWRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgNSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZXNLZXkgPSBPYmplY3RT
dG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgbmFtZSk7CisKKyAgICBib29sIG9rID0g
cHV0U3RyaW5nKG1fZGIuZ2V0KCksIG5hbWVLZXksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIGtleVBhdGhLZXks
IGtleVBhdGgpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8g
c2V0IGtleSBwYXRoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9
IHB1dEludChtX2RiLmdldCgpLCBhdXRvSW5jcmVtZW50S2V5LCBhdXRvSW5jcmVtZW50KTsKKyAg
ICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBhdXRvIGluY3Jl
bWVudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQo
bV9kYi5nZXQoKSwgZXZpY3RhYmxlS2V5LCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAg
ICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgZXZpY3RhYmxlIik7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBsYXN0VmVyc2lvbktl
eSwgMSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQg
bGFzdCB2ZXJzaW9uIG51bWJlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWF4SW5kZXhJZEtleSwga01pbmltdW1JbmRleElk
KTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBtYXgg
aW5kZXggaWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0
SW50KG1fZGIuZ2V0KCksIG5hbWVzS2V5LCBvYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIW9rKSB7
CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBvYmplY3Qgc3RvcmUgaWQiKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCA9
IG9iamVjdFN0b3JlSWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGVs
ZXRlUmFuZ2UobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgYmVnaW4sIGNvbnN0
IHN0ZDo6c3RyaW5nJiBlbmQpCit7CisgICAgLy8gRklYTUU6IExldmVsREIgbWF5IGJlIGFibGUg
dG8gcHJvdmlkZSBhIGJ1bGsgb3BlcmF0aW9uIHRoYXQgd2UgY2FuIGRvIGZpcnN0LgorCisgICAg
bGV2ZWxkYjo6V3JpdGVCYXRjaCBiYXRjaDsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRv
cj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3Ig
KGl0LT5TZWVrKGJlZ2luKTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5r
ZXkoKSwgZW5kKSA8IDA7IGl0LT5OZXh0KCkpCisgICAgICAgIGJhdGNoLkRlbGV0ZShpdC0+a2V5
KCkpOworCisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+V3JpdGUobGV2ZWxkYjo6V3JpdGVP
cHRpb25zKCksICZiYXRjaCk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkKQoreworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7CisgICAgZ2V0U3RyaW5nKG1fZGIu
Z2V0KCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAwKSwgb2JqZWN0U3RvcmVOYW1lKTsKKworICAgIGlmICghZGVsZXRlUmFuZ2UobV9k
Yi5nZXQoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIDApLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgNikpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJy
b3IuCisKKyAgICBwdXRTdHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpLCAiIik7CisgICAgbV9kYi0+RGVsZXRl
KGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVOYW1lKSk7CisKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIu
Z2V0KCksIEluZGV4RnJlZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCAwKSwgSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IElOVDY0X01BWCkpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCisg
ICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgsIDApKSkKKyAgICAgICAgcmV0
dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorCisgICAgY2xlYXJPYmplY3RTdG9yZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkKTsKK30KKworU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBs
ZXZlbGRiS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwga2V5KTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAgbGV2ZWxkYjo6U3Rh
dHVzIHMgPSBtX2RiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYktleSwgJmRh
dGEpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBp
bnQ2NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmNf
c3RyKCksIGRhdGEuY19zdHIoKSArIGRhdGEubGVuZ3RoKCksIHZlcnNpb24pOworICAgIGlmICgh
cCkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICh2b2lkKSB2ZXJzaW9uOworCisgICAg
cmV0dXJuIGRlY29kZVN0cmluZyhwLCBkYXRhLmNfc3RyKCkgKyBkYXRhLmxlbmd0aCgpKTsKK30K
KworbmFtZXNwYWNlIHsKK2NsYXNzIExldmVsREJSZWNvcmRJZGVudGlmaWVyIDogcHVibGljIElE
QkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyIHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gY3JlYXRlKGNvbnN0
IHN0ZDo6c3RyaW5nJiBwcmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNpb24pIHsgcmV0dXJuIGFkb3B0
UmVmKG5ldyBMZXZlbERCUmVjb3JkSWRlbnRpZmllcihwcmltYXJ5S2V5LCB2ZXJzaW9uKSk7IH0K
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gY3JlYXRlKCkg
eyByZXR1cm4gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKCkpOyB9CisKKyAg
ICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFyeUtleS5lbXB0
eSgpOyB9CisgICAgc3RkOjpzdHJpbmcgcHJpbWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJp
bWFyeUtleTsgfQorICAgIHZvaWQgc2V0UHJpbWFyeUtleShjb25zdCBzdGQ6OnN0cmluZyYgcHJp
bWFyeUtleSkgeyBtX3ByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OyB9CisgICAgaW50NjRfdCB2ZXJz
aW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJzaW9uOyB9CisgICAgdm9pZCBzZXRWZXJzaW9uKGlu
dDY0X3QgdmVyc2lvbikgeyBtX3ZlcnNpb24gPSB2ZXJzaW9uOyB9CisKK3ByaXZhdGU6CisgICAg
TGV2ZWxEQlJlY29yZElkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByaW1hcnlLZXksIGlu
dDY0X3QgdmVyc2lvbikgOiBtX3ByaW1hcnlLZXkocHJpbWFyeUtleSksIG1fdmVyc2lvbih2ZXJz
aW9uKSB7IEFTU0VSVCghcHJpbWFyeUtleS5lbXB0eSgpKTsgfQorICAgIExldmVsREJSZWNvcmRJ
ZGVudGlmaWVyKCkgOiBtX3ByaW1hcnlLZXkoKSwgbV92ZXJzaW9uKC0xKSB7fQorCisgICAgc3Rk
OjpzdHJpbmcgbV9wcmltYXJ5S2V5OyAvLyBGSVhNRTogTWFrZSBpdCBtb3JlIGNsZWFyIHRoYXQg
dGhpcyBpcyB0aGUgKmVuY29kZWQqIHZlcnNpb24gb2YgdGhlIGtleS4KKyAgICBpbnQ2NF90IG1f
dmVyc2lvbjsKK307Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5ld1ZlcnNpb25OdW1iZXIobGV2
ZWxkYjo6REIqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkK
K3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBsYXN0VmVyc2lvbktleSA9IE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA0KTsKKworICAgIGlu
dDY0X3QgbGFzdFZlcnNpb247CisgICAgaWYgKCFnZXRJbnQoZGIsIGxhc3RWZXJzaW9uS2V5LCBs
YXN0VmVyc2lvbikpCisgICAgICAgIGxhc3RWZXJzaW9uID0gMDsKKworICAgIEFTU0VSVChsYXN0
VmVyc2lvbiA+PSAwKTsKKworICAgIGludDY0X3QgdmVyc2lvbiA9IGxhc3RWZXJzaW9uICsgMTsK
KyAgICBib29sIG9rID0gcHV0SW50KGRiLCBsYXN0VmVyc2lvbktleSwgdmVyc2lvbik7CisgICAg
QVNTRVJUKG9rKTsKKworICAgIEFTU0VSVCh2ZXJzaW9uID4gbGFzdFZlcnNpb24pOyAvLyBGSVhN
RTogVGhpbmsgYWJvdXQgaG93IHdlIHdhbnQgdG8gaGFuZGxlIHRoZSBvdmVyZmxvdyBzY2VuYXJp
by4KKworICAgIHJldHVybiB2ZXJzaW9uOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgT2JqZWN0
U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVudGlmaWVyKQoreworICAgIGludDY0X3Qg
dmVyc2lvbiA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2JqZWN0U3RvcmVkYXRhS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5
KTsKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPlB1dChsZXZlbGRiOjpXcml0ZU9wdGlv
bnMoKSwgb2JqZWN0U3RvcmVkYXRhS2V5LCBlbmNvZGVWYXJJbnQodmVyc2lvbikgKyBlbmNvZGVT
dHJpbmcodmFsdWUpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhpc3RzRW50cnlLZXkgPSBFeGlzdHNFbnRyeUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgcyA9IG1fZGItPlB1
dChsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJz
aW9uKSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExl
dmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19j
YXN0PExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3JkSWRlbnRpZmllcik7CisgICAgbGV2
ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURCS2V5KGtleSkpOwor
ICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNpb24pOworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2JqZWN0
U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAg
Y29uc3Qgc3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMCkuZW5jb2RlKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IEtl
eVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7CisKKyAg
ICBkZWxldGVSYW5nZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7Cit9CisKK1Bhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKCkKK3sKKyAg
ICByZXR1cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZSgpOworfQorCit2b2lkIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElk
ZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCit7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElk
ZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2
ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBrZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKKyAgICBs
ZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwg
a2V5KTsKK30KKworZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVt
ZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorewor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgIGNvbnN0IHN0
ZDo6c3RyaW5nIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRl
cmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKwor
ICAgIGludCBtYXhOdW1lcmljS2V5ID0gMDsKKworICAgIC8vIEZJWE1FOiBCZSBtb3JlIGVmZmlj
aWVudDogc2VlayB0byBzb21ldGhpbmcgYWZ0ZXIgdGhlIG9iamVjdCBzdG9yZSBkYXRhLCB0aGVu
IHJldmVyc2UuCisKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYg
Y29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7
CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAgICAgICBjb25z
dCBjaGFyICpsaW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgpOworCisgICAgICAgIE9iamVjdFN0
b3JlRGF0YUtleSBkYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNv
ZGUocCwgbGltaXQsICZkYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGlm
IChkYXRhS2V5LnVzZXJLZXkoKS0+dHlwZSgpID09IElEQktleTo6TnVtYmVyVHlwZSkgeworICAg
ICAgICAgICAgaW50NjRfdCBuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZGF0YUtleS51c2VyS2V5
KCktPm51bWJlcigpKTsKKyAgICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAg
ICAgICAgICAgICBtYXhOdW1lcmljS2V5ID0gbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBtYXhOdW1lcmljS2V5ICsgMTsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KiBmb3VuZFJlY29yZElkZW50aWZpZXIpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxk
YktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGtleSk7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKworICAgIGxldmVsZGI6OlN0YXR1cyBz
ID0gbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxldmVsZGJLZXksICZkYXRhKTsK
KyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCB2
ZXJzaW9uOworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0cigp
ICsgZGF0YS5sZW5ndGgoKSwgdmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRp
Y19jYXN0PExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4oZm91bmRSZWNvcmRJZGVudGlmaWVyKTsK
KyAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXko
a2V5KSk7CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9y
RWFjaE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKK3sKKyAgICBjb25z
dCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmlu
ZyBzdG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgbWF4SURCS2V5KCkpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBp
dChtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChp
dC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+
a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBjb25zdCBjaGFyICpw
ID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBwICsgaXQt
PmtleSgpLnNpemUoKTsKKyAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IGRhdGFLZXk7CisgICAg
ICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOwor
ICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9
IGRhdGFLZXkudXNlcktleSgpOworCisgICAgICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICAgICAg
Y29uc3QgY2hhciogcSA9IGRlY29kZVZhckludChpdC0+dmFsdWUoKS5kYXRhKCksIGl0LT52YWx1
ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSwgdmVyc2lvbik7CisgICAgICAgIGlmICgh
cSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZWZQdHI8TGV2ZWxEQlJl
Y29yZElkZW50aWZpZXI+IHJpID0gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZShlbmNv
ZGVJREJLZXkoKnByaW1hcnlLZXkpLCB2ZXJzaW9uKTsKKyAgICAgICAgU3RyaW5nIGlkYlZhbHVl
ID0gZGVjb2RlU3RyaW5nKHEsIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUo
KSk7CisKKyAgICAgICAgY2FsbGJhY2suY2FsbGJhY2socmkuZ2V0KCksIGlkYlZhbHVlKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBW
ZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVj
dG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFn
cykKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGFydEtleSA9IEluZGV4TWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKTsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBzdG9wS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQgKyAxLCAwLCAwKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4g
aXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAo
aXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQt
PmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciog
cCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gcCArIGl0
LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsK
KyAgICAgICAgcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRh
S2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGludDY0X3QgaW5kZXhJZCA9IG1l
dGFEYXRhS2V5LmluZGV4SWQoKTsKKyAgICAgICAgQVNTRVJUKCFtZXRhRGF0YUtleS5tZXRhRGF0
YVR5cGUoKSk7CisKKyAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlY29kZVN0cmluZyhpdC0+
dmFsdWUoKS5kYXRhKCksIGl0LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSk7
CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAg
ICAgICAgIExPR19FUlJPUigiaXQgbm90IHZhbGlkIik7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBib29sIGluZGV4VW5pcXVlID0gKml0LT52YWx1ZSgpLmRhdGEo
KTsKKyAgICAgICAgaXQtPk5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBrZXlQYXRoID0gZGVjb2RlU3RyaW5nKGl0LT52
YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsK
KworICAgICAgICBmb3VuZElkcy5hcHBlbmQoaW5kZXhJZCk7CisgICAgICAgIGZvdW5kTmFtZXMu
YXBwZW5kKGluZGV4TmFtZSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtleVBhdGgp
OworICAgICAgICBmb3VuZFVuaXF1ZUZsYWdzLmFwcGVuZChpbmRleFVuaXF1ZSk7CisgICAgfQor
fQorCitzdGF0aWMgaW50NjRfdCBnZXROZXdJbmRleElkKGxldmVsZGI6OkRCKiBkYiwgaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgY29uc3Qgc3RkOjpz
dHJpbmcgc3RhcnRLZXkgPSBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IEluZGV4RnJl
ZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgpOwor
CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxk
Yjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBpdC0+VmFs
aWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5O
ZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAg
SW5kZXhGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAgcCA9IEluZGV4RnJlZUxpc3RL
ZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsKKyAgICAgICAgQVNTRVJUKHApOwor
CisgICAgICAgIGxldmVsZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9w
dGlvbnMoKSwgaXQtPmtleSgpKTsKKyAgICAgICAgQVNTRVJUKHMub2soKSk7CisKKyAgICAgICAg
QVNTRVJUKGZyZWVMaXN0S2V5LmluZGV4SWQoKSA+PSBrTWluaW11bUluZGV4SWQpOworICAgICAg
ICByZXR1cm4gZnJlZUxpc3RLZXkuaW5kZXhJZCgpOworICAgIH0KKworICAgIGludDY0X3QgbWF4
SW5kZXhJZDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDUpOworICAg
IGlmICghZ2V0SW50KGRiLCBtYXhJbmRleElkS2V5LCBtYXhJbmRleElkKSkKKyAgICAgICAgbWF4
SW5kZXhJZCA9IGtNaW5pbXVtSW5kZXhJZDsKKworICAgIGludDY0X3QgaW5kZXhJZCA9IG1heElu
ZGV4SWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1heEluZGV4SWRLZXksIGluZGV4
SWQpOworICAgIGlmICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBp
bmRleElkOworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBpc1VuaXF1ZSwgaW50NjRfdCYgaW5kZXhJ
ZCkKK3sKKyAgICBpbmRleElkID0gZ2V0TmV3SW5kZXhJZChtX2RiLmdldCgpLCBkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVLZXkgPSBJbmRl
eE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
MCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdW5pcXVlS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDEpOworICAgIGNvbnN0
IHN0ZDo6c3RyaW5nIGtleVBhdGhLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgMik7CisKKyAgICBib29sIG9rID0gcHV0U3Ry
aW5nKG1fZGIuZ2V0KCksIG5hbWVLZXksIG5hbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGluZGV4IG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIHVuaXF1ZUtleSwgaXNV
bmlxdWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0
IGlzX3VuaXF1ZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBw
dXRTdHJpbmcobV9kYi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0aCk7CisgICAgaWYgKCFvaykg
eworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQga2V5IHBhdGgiKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3Qp
CiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQgYW5kIGFkZCBsYXlvdXQg
dGVzdC4KKyAgICByZXR1cm47CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0
SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktl
eSYsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSwg
Y29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVudGlmaWVyKQogewot
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVy
biBmYWxzZTsKKyAgICBBU1NFUlQoaW5kZXhJZCA+PSBrTWluaW11bUluZGV4SWQpOworICAgIGNv
bnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0
YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4ocmVjb3JkSWRlbnRpZmll
cik7CisKKyAgICBjb25zdCBpbnQ2NF90IGdsb2JhbFNlcXVlbmNlTnVtYmVyID0gZ2V0TmV3VmVy
c2lvbk51bWJlcihtX2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKTsKKyAgICBj
b25zdCBzdGQ6OnN0cmluZyBpbmRleERhdGFLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGdsb2JhbFNlcXVlbmNlTnVtYmVy
KTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkYXRhID0gZW5jb2RlVmFySW50KGxldmVsREJSZWNv
cmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpICsgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1h
cnlLZXkoKTsKKworICAgIHJldHVybiBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCks
IGluZGV4RGF0YUtleSwgZGF0YSkub2soKTsKK30KKworc3RhdGljIGJvb2wgZmluZEdyZWF0ZXN0
S2V5TGVzc1RoYW4obGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBz
dGQ6OnN0cmluZyYgZm91bmRLZXkpCit7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBp
dChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVr
KHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgIGl0LT5TZWVrVG9M
YXN0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgd2hpbGUgKGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+
a2V5KCksIHRhcmdldCkgPj0gMCkgeworICAgICAgICBpdC0+UHJldigpOworICAgICAgICBpZiAo
IWl0LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZv
dW5kS2V5ID0gaXQtPmtleSgpLlRvU3RyaW5nKCk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVjb3JkKGludDY0
X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciop
CiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAg
cmV0dXJuIGZhbHNlOworICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IG5lZWRlZCBzaW5jZSB3ZSBp
bnZhbGlkYXRlIGluZGV4IGRhdGEgdmlhIHRoZSB2ZXJzaW9uIG51bWJlciBtZWNoYW5pc20uCisg
ICAgcmV0dXJuIHRydWU7CiB9CiAKLVN0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRP
YmplY3RWaWFJbmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmKQor
U3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFZpYUluZGV4KGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1w
bGVtZW50LgotICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5
S2V5ID0gZ2V0UHJpbWFyeUtleVZpYUluZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsIGtleSk7CisgICAgaWYgKCFwcmltYXJ5S2V5KQorICAgICAgICByZXR1cm4gU3RyaW5n
KCk7CisKKyAgICByZXR1cm4gZ2V0T2JqZWN0U3RvcmVSZWNvcmQoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgKnByaW1hcnlLZXkpOwogfQogCi1QYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QsIGludDY0X3QsIGlu
dDY0X3QsIGNvbnN0IElEQktleSYpCitzdGF0aWMgYm9vbCB2ZXJzaW9uRXhpc3RzKGxldmVsZGI6
OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgdmVyc2lvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRQcmltYXJ5S2V5KQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAw
OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlZFByaW1hcnlLZXkpOworICAgIHN0ZDo6c3Ry
aW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVh
ZE9wdGlvbnMoKSwga2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiBkZWNvZGVJbnQoZGF0YS5jX3N0cigpLCBkYXRhLmNfc3Ry
KCkgKyBkYXRhLmxlbmd0aCgpKSA9PSB2ZXJzaW9uOwogfQogCi1ib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29u
c3QgSURCS2V5JikKK1Bhc3NSZWZQdHI8SURCS2V5PiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpn
ZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOwor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsZGJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIDApOworICAgIE93blB0cjxs
ZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVhZE9wdGlv
bnMoKSkpOworICAgIGl0LT5TZWVrKGxldmVsZGJLZXkpOworCisgICAgZm9yICg7OykgeworICAg
ICAgICBpZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlm
IChjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDAp
CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAg
ICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+
dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCksIHZlcnNpb24pOworICAgICAgICBp
ZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5jb2Rl
ZFByaW1hcnlLZXkgPSBzdGQ6OnN0cmluZyhwLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFs
dWUoKS5zaXplKCkpOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyhtX2RiLmdldCgpLCBk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJpbWFyeUtleSkpIHsK
KyAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBjb250aW51
ZS4KKyAgICAgICAgICAgIG1fZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQt
PmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7CisgICAgICAg
IGRlY29kZUlEQktleShlbmNvZGVkUHJpbWFyeUtleS5jX3N0cigpLCBlbmNvZGVkUHJpbWFyeUtl
eS5jX3N0cigpICsgZW5jb2RlZFByaW1hcnlLZXkubGVuZ3RoKCksIHByaW1hcnlLZXkpOworICAg
ICAgICByZXR1cm4gcHJpbWFyeUtleS5yZWxlYXNlKCk7CisgICAgfQogfQogCi1QYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2Jq
ZWN0U3RvcmVDdXJzb3IoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJD
dXJzb3I6OkRpcmVjdGlvbikKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3Rz
SW5JbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gMDsKKyAgICBjb25zdCBzdGQ6OnN0
cmluZyBsZXZlbERCS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwga2V5LCAwKTsKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+
IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKworICAgIGJv
b2wgZm91bmQgPSBmYWxzZTsKKworICAgIGl0LT5TZWVrKGxldmVsREJLZXkpOworICAgIGlmIChp
dC0+VmFsaWQoKSAmJiAhY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKS5Ub1N0
cmluZygpLCBsZXZlbERCS2V5KSkKKyAgICAgICAgZm91bmQgPSB0cnVlOworCisgICAgcmV0dXJu
IGZvdW5kOwogfQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCwgaW50NjRfdCwgaW50
NjRfdCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbikKK25hbWVzcGFj
ZSB7CitjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yIHsKK3B1YmxpYzoKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNvcgorICAgIHZpcnR1
YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSopOworICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7
IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0
b3JlUmVjb3JkSWRlbnRpZmllcigpID0gMDsgLy8gRklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyBp
cyBhY3R1YWxseSB1c2VkLCBzbyBkcm9wIGl0LgorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERh
dGFJZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpID0gMDsKKyAg
ICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0ZWQ6CisgICAgQ3Vyc29ySW1wbENvbW1vbihs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3Blbiwg
Y29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkK
KyAgICAgICAgOiBtX2RiKGRiKQorICAgICAgICAsIG1fbG93S2V5KGxvd0tleSkKKyAgICAgICAg
LCBtX2xvd09wZW4obG93T3BlbikKKyAgICAgICAgLCBtX2hpZ2hLZXkoaGlnaEtleSkKKyAgICAg
ICAgLCBtX2hpZ2hPcGVuKGhpZ2hPcGVuKQorICAgICAgICAsIG1fZm9yd2FyZChmb3J3YXJkKQor
ICAgIHsKKyAgICB9CisgICAgdmlydHVhbCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9CisKKyAgICBs
ZXZlbGRiOjpEQiogbV9kYjsKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IG1faXRlcmF0
b3I7CisgICAgc3RkOjpzdHJpbmcgbV9sb3dLZXk7CisgICAgYm9vbCBtX2xvd09wZW47CisgICAg
c3RkOjpzdHJpbmcgbV9oaWdoS2V5OworICAgIGJvb2wgbV9oaWdoT3BlbjsKKyAgICBib29sIG1f
Zm9yd2FyZDsKKyAgICBSZWZQdHI8SURCS2V5PiBtX2N1cnJlbnRLZXk7Cit9OworCitib29sIEN1
cnNvckltcGxDb21tb246OmZpcnN0U2VlaygpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgbV9pdGVyYXRvciA9IG1f
ZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpOworCisgICAgaWYgKG1fZm9y
d2FyZCkKKyAgICAgICAgbV9pdGVyYXRvci0+U2VlayhtX2xvd0tleSk7CisgICAgZWxzZQorICAg
ICAgICBtX2l0ZXJhdG9yLT5TZWVrKG1faGlnaEtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAg
ICAgIGlmICghbV9pdGVyYXRvci0+VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1faGlnaE9wZW4gJiYgY29tcGFyYXRvci5Db21w
YXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGlnaE9wZW4g
JiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hL
ZXkpID4gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2Zvcndh
cmQgJiYgbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGlmICghbV9mb3J3YXJkICYmICFtX2xvd09wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9sb3dPcGVuKSB7CisgICAg
ICAgICAgICAvLyBsb3dLZXkgbm90IGluY2x1ZGVkIGluIHRoZSByYW5nZS4KKyAgICAgICAgICAg
IGlmIChjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93
S2V5KSA8PSAwKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
ICghbV9mb3J3YXJkICYmIG1faGlnaE9wZW4pIHsKKyAgICAgICAgICAgIC8vIGhpZ2hLZXkgbm90
IGluY2x1ZGVkIGluIHRoZSByYW5nZS4KKyAgICAgICAgICAgIGlmIChjb21wYXJhdG9yLkNvbXBh
cmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPj0gMCkgeworICAgICAg
ICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3co
KSkgeworICAgICAgICAgICAgaWYgKG1fZm9yd2FyZCkKKyAgICAgICAgICAgICAgICBtX2l0ZXJh
dG9yLT5OZXh0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9pdGVyYXRv
ci0+UHJldigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CiB9CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihpbnQ2NF90LCBpbnQ2
NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKQor
Ym9vbCBDdXJzb3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5
KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAg
IHJldHVybiAwOworICAgIC8vIEZJWE1FOiBUaGlzIHNoYXJlcyBhIGxvdCBvZiBjb2RlIHdpdGgg
Zmlyc3RTZWVrLgorCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAobV9mb3J3YXJkKQorICAg
ICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBt
X2l0ZXJhdG9yLT5QcmV2KCk7CisKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5WYWxpZCgpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYXNoOwor
ICAgICAgICBpZiAobV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1faXRlcmF0b3It
PmtleSgpLCAmdHJhc2gpLklzTm90Rm91bmQoKSkKKyAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1faGlnaE9wZW4gJiYgY29tcGFyYXRvci5Db21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIC8vIGhpZ2gga2V5
IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4
S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJh
dG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8PSAwKSAv
LyBsb3cga2V5IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29t
cGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAo
bV9mb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhh
bihrZXkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS0+aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0
KCkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBPYmV5IHRoZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQg
KGFuZCB0ZXN0IGZvciBpdCEpCisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2NsYXNzIE9iamVjdFN0b3JlQ3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJ
bXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUN1
cnNvckltcGw+IGNyZWF0ZShsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dL
ZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9w
ZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVu
LCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1
YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+
IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJl
dHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3co
KTsKKworcHJpdmF0ZToKKyAgICBPYmplY3RTdG9yZUN1cnNvckltcGwobGV2ZWxkYjo6REIqIGRi
LCBjb25zdCBzdGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3Ry
aW5nJiBoaWdoS2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogQ3Vy
c29ySW1wbENvbW1vbihkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9y
d2FyZCkKKyAgICB7CisgICAgfQorCisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOworfTsKKwor
Ym9vbCBPYmplY3RTdG9yZUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25z
dCBjaGFyKiBwID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGtl
eUxpbWl0ID0gcCArIG1faXRlcmF0b3ItPmtleSgpLnNpemUoKTsKKworICAgIE9iamVjdFN0b3Jl
RGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7CisgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZGVjb2RlKHAsIGtleUxpbWl0LCAmb2JqZWN0U3RvcmVEYXRhS2V5KTsKKyAgICBBU1NFUlQocCk7
CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX2N1cnJlbnRLZXkg
PSBvYmplY3RTdG9yZURhdGFLZXkudXNlcktleSgpOworCisgICAgaW50NjRfdCB2ZXJzaW9uOwor
ICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5kYXRh
KCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXpl
KCksIHZlcnNpb24pOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBzdGF0aWNfY2FzdDx2b2lkPih2ZXJzaW9uKTsKKworICAgIG1fY3VycmVu
dFZhbHVlID0gZGVjb2RlU3RyaW5nKHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsgbV9p
dGVyYXRvci0+dmFsdWUoKS5zaXplKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNz
IEluZGV4S2V5Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGNyZWF0ZShsZXZlbGRi
OjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qg
c3RkOjpzdHJpbmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7
CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKGRiLCBsb3dL
ZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisgICAg
Ly8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRy
PElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmll
cj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
cmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJv
dygpOworCitwcml2YXRlOgorICAgIEluZGV4S2V5Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIs
IGNvbnN0IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJp
bmcmIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJz
b3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3
YXJkKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cit9
OworCitib29sIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNv
bnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5kYXRhKCk7CisgICAgY29uc3QgY2hhciog
a2V5TGltaXQgPSBwICsgbV9pdGVyYXRvci0+a2V5KCkuc2l6ZSgpOworICAgIEluZGV4RGF0YUtl
eSBpbmRleERhdGFLZXk7CisgICAgcCA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHAsIGtleUxpbWl0
LCAmaW5kZXhEYXRhS2V5KTsKKworICAgIG1fY3VycmVudEtleSA9IGluZGV4RGF0YUtleS51c2Vy
S2V5KCk7CisKKyAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgY29uc3QgY2hhciog
cSA9IGRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSwgbV9pdGVyYXRvci0+
dmFsdWUoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNpemUoKSwgaW5kZXhEYXRhVmVy
c2lvbik7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcSA9IGRlY29kZUlEQktleShxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSAr
IG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpLCBtX3ByaW1hcnlLZXkpOworICAgIEFTU0VSVChx
KTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0ZDo6c3RyaW5n
IHByaW1hcnlMZXZlbERCS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRh
S2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFy
eUtleSk7CisKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMg
PSBtX2RiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgcHJpbWFyeUxldmVsREJLZXksICZy
ZXN1bHQpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
bnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNpb247CisgICAgY29uc3QgY2hhciogdCA9IGRlY29k
ZVZhckludChyZXN1bHQuY19zdHIoKSwgcmVzdWx0LmNfc3RyKCkgKyByZXN1bHQubGVuZ3RoKCks
IG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOworICAgIEFTU0VSVCh0KTsKKyAgICBpZiAoIXQpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9uICE9
IGluZGV4RGF0YVZlcnNpb24pIHsgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IHZlcnkg
d2VsbCBjb3ZlcmVkIGJ5IHRoZSBsYXlvdXQgdGVzdHMuCisgICAgICAgIG1fZGItPkRlbGV0ZShs
ZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4Q3Vy
c29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxJbmRleEN1cnNvckltcGw+IGNyZWF0ZShsZXZlbGRiOjpEQiogZGIsIGNvbnN0
IHN0ZDo6c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhp
Z2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZihuZXcgSW5kZXhDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hL
ZXksIGhpZ2hPcGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1v
bgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3ByaW1hcnlL
ZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9y
ZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsgQVNTRVJU
X05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0
YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29sIGxvYWRD
dXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgSW5kZXhDdXJzb3JJbXBsKGxldmVsZGI6OkRC
KiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6
OnN0cmluZyYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6
IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4s
IGZvcndhcmQpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtl
eTsKKyAgICBTdHJpbmcgbV92YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlMZXZlbERC
S2V5OworfTsKKworYm9vbCBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAg
ICBjb25zdCBjaGFyICpwID0gbV9pdGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIGNvbnN0IGNo
YXIgKmxpbWl0ID0gcCArIG1faXRlcmF0b3ItPmtleSgpLnNpemUoKTsKKworICAgIEluZGV4RGF0
YUtleSBpbmRleERhdGFLZXk7CisgICAgcCA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0
LCAmaW5kZXhEYXRhS2V5KTsKKworICAgIG1fY3VycmVudEtleSA9IGluZGV4RGF0YUtleS51c2Vy
S2V5KCk7CisKKyAgICBjb25zdCBjaGFyICpxID0gbV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCk7
CisgICAgY29uc3QgY2hhciAqdmFsdWVMaW1pdCA9IHEgKyBtX2l0ZXJhdG9yLT52YWx1ZSgpLnNp
emUoKTsKKworICAgIGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKKyAgICBxID0gZGVjb2RlVmFy
SW50KHEsIHZhbHVlTGltaXQsIGluZGV4RGF0YVZlcnNpb24pOworICAgIEFTU0VSVChxKTsKKyAg
ICBpZiAoIXEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBxID0gZGVjb2RlSURCS2V5KHEs
IHZhbHVlTGltaXQsIG1fcHJpbWFyeUtleSk7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IE9iamVj
dFN0b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0
YUtleS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgc3RkOjpzdHJpbmcg
cmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRP
cHRpb25zKCksIG1fcHJpbWFyeUxldmVsREJLZXksICZyZXN1bHQpOworICAgIGlmICghcy5vaygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZl
cnNpb247CisgICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuY19zdHIoKSwg
cmVzdWx0LmNfc3RyKCkgKyByZXN1bHQubGVuZ3RoKCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24p
OworICAgIEFTU0VSVCh0KTsKKyAgICBpZiAoIXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9uICE9IGluZGV4RGF0YVZlcnNpb24pIHsKKyAg
ICAgICAgbV9kYi0+RGVsZXRlKGxldmVsZGI6OldyaXRlT3B0aW9ucygpLCBtX2l0ZXJhdG9yLT5r
ZXkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3ZhbHVlID0gZGVj
b2RlU3RyaW5nKHQsIHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworfQorCitzdGF0aWMgYm9vbCBmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhs
ZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIHN0ZDo6c3RyaW5nJiBm
b3VuZEtleSkKK3sKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJdGVy
YXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgaXQtPlNlZWsodGFyZ2V0KTsKKwor
ICAgIGlmICghaXQtPlZhbGlkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHdoaWxl
IChpdC0+VmFsaWQoKSAmJiAhY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwg
dGFyZ2V0KSkgeworICAgICAgICBmb3VuZEtleSA9IGl0LT5rZXkoKS5Ub1N0cmluZygpOworICAg
ICAgICBpdC0+TmV4dCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVm
UHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVu
T2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0
aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOwor
ICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wg
Zm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBk
aXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUKTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBl
ck9wZW47CisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxv
d2VyQm91bmQpIHsKKyAgICAgICAgc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgICAgIGxvd2Vy
T3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFy
dEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsICpyYW5nZS0+bG93ZXIoKSk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9w
ZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9
IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1h
eElEQktleSgpKTsKKyAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgor
CisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgor
ICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9w
S2V5LCBzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVw
cGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtl
eSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
ICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4o
KTsKKyAgICB9CisKKyAgICBSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJbXBsPiBjdXJzb3IgPSBP
YmplY3RTdG9yZUN1cnNvckltcGw6OmNyZWF0ZShtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJP
cGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQpOworICAgIGlmICghY3Vyc29yLT5maXJz
dFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5n
ZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdl
ICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURC
Q3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhU
KTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CisgICAgc3RkOjpzdHJpbmcgc3Rh
cnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgc3RhcnRL
ZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBtaW5JREJLZXkoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IGZhbHNlOyAvLyBJbmNs
dWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSwg
MCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAg
ICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1heElEQktleSgpLCAwKTsK
KyAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorCisgICAgICAgIGlmICgh
Zm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYg
KCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNl
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+dXBw
ZXIoKSwgMCk7CisgICAgICAgIGlmICghZmluZExhc3RJbmRleEtleUVxdWFsVG8obV9kYi5nZXQo
KSwgc3RvcEtleSwgc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4gdGhlIHNl
dCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKyAgICB9CisKKyAgICBSZWZQdHI8SW5k
ZXhLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBJbmRleEtleUN1cnNvckltcGw6OmNyZWF0ZShtX2Ri
LmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQp
OworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleVJhbmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQor
eworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJv
b2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2Fy
ZCA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rp
b24gPT0gSURCQ3Vyc29yOjpORVhUKTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47
CisgICAgc3RkOjpzdHJpbmcgc3RhcnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91
bmQpIHsKKyAgICAgICAgc3RhcnRLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtaW5JREJLZXkoKSwgMCk7CisgICAgICAgIGxvd2Vy
T3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtl
eSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsICpyYW5nZS0+bG93ZXIoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dl
ck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtl
eSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIG1heElEQktleSgpLCAwKTsKKyAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1
ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhp
c3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgp
LCBzdG9wS2V5LCBzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
ICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAg
c3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQsICpyYW5nZS0+dXBwZXIoKSwgMCk7CisgICAgICAgIGlmICghZmluZExhc3RJbmRl
eEtleUVxdWFsVG8obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhl
ICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKyAg
ICB9CisKKyAgICBSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBJbmRleEN1cnNvcklt
cGw6OmNyZWF0ZShtX2RiLmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBl
ck9wZW4sIGZvcndhcmQpOworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworbmFtZXNwYWNl
IHsKK2NsYXNzIER1bW15VHJhbnNhY3Rpb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGJlZ2luKCkge30KKyAgICB2aXJ0
dWFsIHZvaWQgY29tbWl0KCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcm9sbGJhY2soKSB7fQorfTsK
IH0KIAogUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVUcmFuc2FjdGlvbigpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgLy8gRklYTUU6
IFdlIG5lZWQgdG8gaW1wbGVtZW50IGEgdHJhbnNhY3Rpb24gYWJzdHJhY3Rpb24gdGhhdCBhbGxv
d3MgZm9yIHJvbGwtYmFja3MsIGFuZCB3cml0ZSB0ZXN0cyBmb3IgaXQuCisgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBEdW1teVRyYW5zYWN0aW9uKCkpOwogfQogCisvLyBGSVhNRTogZGVsZXRlRGF0
YWJhc2Ugc2hvdWxkIGJlIHBhcnQgb2YgSURCQmFja2luZ1N0b3JlLgorCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFu
Z2VMb2cKaW5kZXggZTY4N2U2MjRhNGM2NWY4Y2JmM2YyMWM1N2QzOTQ3NTlkZTk3MDcxNy4uZTZl
MzY0OWQ5YTAxNzQ1ZTkzZWQ5MjZjMmM4ODg1ZDNjNzM1ZTNmMyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cKQEAgLTEsNSArMSwxNSBAQAogMjAxMS0wNC0xMiAgSGFucyBXZW5uYm9yZyAgPGhh
bnNAY2hyb21pdW0ub3JnPgogCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIExldmVsREIgYmFja2VuZCBmb3IgSW5kZXhlZERCCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NzM3MgorCisgICAgICAgICogZmVhdHVy
ZXMuZ3lwaToKKyAgICAgICAgVHVybiBvbiBFTkFCTEVfTEVWRUxEQiBzbyB0aGF0IGl0IGdldHMg
Y29tcGlsZWQgdXBzdHJlYW0gYXMgd2VsbC4KKworMjAxMS0wNC0xMiAgSGFucyBXZW5uYm9yZyAg
PGhhbnNAY2hyb21pdW0ub3JnPgorCiAgICAgICAgIFJldmlld2VkIGJ5IEplcmVteSBPcmxvdy4K
IAogICAgICAgICBDaHJvbWl1bTogU2V0IEVOQUJMRV9MRVZFTERCPTEgYW5kIGFkZCBsZXZlbGRi
IGFuZCBzbmFwcHkgdG8gREVQUwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>89574</attachid>
            <date>2011-04-14 06:31:56 -0700</date>
            <delta_ts>2011-04-15 05:50:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110414143154.patch</filename>
            <type>text/plain</type>
            <size>101311</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA1MTkxY2Q5ODA1NmY0NGQ5YTA1ODcxNzQyNDg0NDNhNTQ0NDA0OGUxLi4y
MmQ3ZjM1N2NlYjA3YmE3NTk5NzJlNDU1ZjY5ODQ5YTlhMzg1NjE4IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTMyIEBACisyMDExLTA0LTEyICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgT25seSBhdmFpbGFibGUgYmVoaW5k
IGEgcnVuLXRpbWUgZmxhZy4gQ292ZXJlZCBieSBleGlzdGluZyBsYXlvdXQgdGVzdHMuCisKKyAg
ICAgICAgKiBzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6ZW5jb2RlQnl0ZSk6CisgICAgICAgIChXZWJDb3JlOjptYXhJREJLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6bWluSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUludCk6Cisg
ICAgICAgIChXZWJDb3JlOjpkZWNvZGVJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlVmFy
SW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZVZhckludCk6CisgICAgICAgIChXZWJDb3Jl
OjplbmNvZGVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlU3RyaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZ1dpdGhMZW4pOgorICAgICAgICAoV2ViQ29yZTo6ZGVj
b2RlU3RyaW5nV2l0aExlbik6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVEb3VibGUpOgorICAg
ICAgICAoV2ViQ29yZTo6ZGVjb2RlRG91YmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUlE
QktleSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVJREJLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6ZXh0cmFjdEVuY29kZWRJREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZUVuY29k
ZWRJREJLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvdW50Tm9uWmVyb0J5dGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dFN0cmluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRh
dGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZUZyZWVMaXN0
S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1l
S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFtZUtl
eTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1lS2V5
OjpkYXRhYmFzZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5h
bWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU1l
dGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6bWV0YURhdGFUeXBlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29t
cGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmVu
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5Ojpp
bmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6
bWV0YURhdGFUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVG
cmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQpOgor
ICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU5hbWVzS2V5Ojpj
b21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1lc0tl
eTo6b2JqZWN0U3RvcmVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhO
YW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1l
c0tleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhOYW1lc0tl
eTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6
OmluZGV4TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0
YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVE
YXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9y
ZURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZURhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpFeGlz
dHNFbnRyeUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3Rz
RW50cnlLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkV4aXN0c0Vu
dHJ5S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50
cnlLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFL
ZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjplbmNv
ZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmNv
bXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmRhdGFi
YXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Om9iamVj
dFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6Omlu
ZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OnVzZXJL
ZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6Q29tcGFyZUluZGV4S2V5
cyk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OlJlYWxDb21wYXJl
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6TmFtZSk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydGVzdFNlcGFyYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydFN1
Y2Nlc3Nvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0TmV3RGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpzZXRJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3Jlcyk6CisgICAgICAg
IChXZWJDb3JlOjpnZXROZXdPYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OmRlbGV0ZVJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OmRlbGV0ZU9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld1Zl
cnNpb25OdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcik6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3Jl
bWVudE51bWJlcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpr
ZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld0luZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
ZGVsZXRlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
cHV0SW5kZXhEYXRhRm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRHcmVhdGVzdEtl
eUxlc3NUaGFuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRl
bGV0ZUluZGV4RGF0YUZvclJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjp2ZXJzaW9u
RXhpc3RzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFBy
aW1hcnlLZXlWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRMYXN0SW5kZXhL
ZXlFcXVhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW5PYmplY3RTdG9yZUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKToKKwogMjAxMS0wNC0xNCAgUmVu
YXRhIEhvZG92YW4gIDxyZW5pQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmlr
b2xhcyBaaW1tZXJtYW5uLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJM
ZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZS5jcHAKaW5kZXggYzA2ZWEwMDQyMjE1NTYxNTg0NjZjM2JkMjYwZDU2ZjIz
MGJkMzdhMC4uODViY2MxYmExY2VjYWZiZmU3MjczNmFlMjYxZTNiOWQzYTA4M2UzMiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCkBA
IC0yOSw4ICsyOSwxMzYgQEAKICNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICNpZiBFTkFC
TEUoTEVWRUxEQikKIAorI2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKKyNpbmNsdWRlICJGaWxlU3lz
dGVtLmgiCiAjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgiCisjaW5jbHVkZSAiSURC
S2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgPGxldmVs
ZGIvY29tcGFyYXRvci5oPgogI2luY2x1ZGUgPGxldmVsZGIvZGIuaD4KKyNpbmNsdWRlIDxsZXZl
bGRiL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9zbGljZS5oPgorI2luY2x1ZGUgPGxl
dmVsZGIvd3JpdGVfYmF0Y2guaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZm5kZWYgSU5UNjRf
TUFYCisvLyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gcmVseSBvbiB0aGVzZSBtYWNyb3Mu
CisjZGVmaW5lIElOVDY0X01BWCAweDdmZmZmZmZmZmZmZmZmZmZMTAorI2VuZGlmCisjaWZuZGVm
IElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggMHg3ZmZmZmZmZkwKKyNlbmRpZgorCisvLyBM
ZXZlbERCIHN0b3JlcyBrZXkvdmFsdWUgcGFpcnMuIEtleXMgYW5kIHZhbHVlcyBhcmUgc3RyaW5n
cyBvZiBieXRlcywgbm9ybWFsbHkgb2YgdHlwZSBzdGQ6OnN0cmluZy4KKy8vIFRoZSBzdGQ6OnN0
cmluZ3MgZG9uJ3QgaGF2ZSBhbnkgcGFydGljdWxhciBlbmNvZGluZywgYW5kIGFyZW4ndCBudWxs
IHRlcm1pbmF0ZWQuCisvLworLy8gVGhlIGtleXMgaW4gdGhlIGJhY2tpbmcgc3RvcmUgYXJlIHZh
cmlhYmxlLWxlbmd0aCB0dXBsZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMKKy8vIG9mIGZpZWxkcy4g
RWFjaCBrZXkgaW4gdGhlIGJhY2tpbmcgc3RvcmUgc3RhcnRzIHdpdGggYSB0ZXJuYXJ5IHByZWZp
eDogKGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkKS4gRm9yIGVhY2gsIDAg
aXMgcmVzZXJ2ZWQgZm9yIG1ldGEtZGF0YS4KKy8vIFRoZSBwcmVmaXggbWFrZXMgc3VyZSB0aGF0
IGRhdGEgZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2UsIG9iamVjdCBzdG9yZSwgYW5kIGluZGV4IGFy
ZSBncm91cGVkIHRvZ2V0aGVyLiBUaGUgbG9jYWxpdHkgaXMgaW1wb3J0YW50IGZvciBwZXJmb3Jt
YW5jZTogY29tbW9uCisvLyBvcGVyYXRpb25zIHNob3VsZCBvbmx5IG5lZWQgYSBtaW5pbWFsIG51
bWJlciBvZiBzZWVrIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhbGwgdGhlIG1ldGEtZGF0YSBm
b3IgYSBkYXRhYmFzZSBpcyBncm91cGVkIHRvZ2V0aGVyIHNvIHRoYXQgcmVhZGluZyB0aGF0Cisv
LyBtZXRhLWRhdGEgb25seSByZXF1aXJlcyBvbmUgc2Vlay4KKy8vCisvLyBFYWNoIGtleSB0eXBl
IGhhcyBhIGNsYXNzIChpbiBzcXVhcmUgYnJhY2tldHMgYmVsb3cpIHdoaWNoIGtub3dzIGhvdyB0
byBlbmNvZGUsIGRlY29kZSwgYW5kIGNvbXBhcmUgdGhhdCBrZXkgdHlwZS4KKy8vCisvLyBHbG9i
YWwgbWV0YS1kYXRhIGhhdmUga2V5cyB3aXRoIHByZWZpeCAoMCwwLDApLCBmb2xsb3dlZCBieSBh
IHR5cGUgYnl0ZToKKy8vCisvLyAgICAgPDAsIDAsIDAsIDA+ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgID0+IEluZGV4ZWREQi9MZXZlbERCIHNjaGVtYSB2ZXJzaW9u
ICgwIGZvciBub3cpIFtTY2hlbWFWZXJzaW9uS2V5XQorLy8gICAgIDwwLCAwLCAwLCAxPiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUaGUgbWF4aW11bSBkYXRh
YmFzZSBpZCBldmVyIGFsbG9jYXRlZCBbTWF4RGF0YWJhc2VJZEtleV0KKy8vICAgICA8MCwgMCwg
MCwgMTAwLCBkYXRhYmFzZSBpZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gRXhpc3Rl
bmNlIGltcGxpZXMgdGhlIGRhdGFiYXNlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0RhdGFiYXNl
RnJlZUxpc3RLZXldCisvLyAgICAgPDAsIDAsIDAsIDIwMSwgdXRmMTYgb3JpZ2luIG5hbWUsIHV0
ZjE2IGRhdGFiYXNlIG5hbWU+ID0+IERhdGFiYXNlIGlkIFtEYXRhYmFzZU5hbWVLZXldCisvLwor
Ly8KKy8vIERhdGFiYXNlIG1ldGEtZGF0YToKKy8vCisvLyAgICAgQWdhaW4sIHRoZSBwcmVmaXgg
aXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwg
MCwgMD4gPT4gdXRmMTYgb3JpZ2luIG5hbWUgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAg
PGRhdGFiYXNlIGlkLCAwLCAwLCAxPiA9PiB1dGYxNiBkYXRhYmFzZSBuYW1lIFtEYXRhYmFzZU1l
dGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMj4gPT4gdXRmMTYgdXNlciB2
ZXJzaW9uIGRhdGEgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAw
LCAwLCAzPiA9PiBtYXhpbXVtIG9iamVjdCBzdG9yZSBpZCBldmVyIGFsbG9jYXRlZCBbRGF0YWJh
c2VNZXRhRGF0YUtleV0KKy8vCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEtZGF0YToKKy8vCisv
LyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiBhIHZhcmlh
YmxlLWxlbmd0aCBpbnRlZ2VyLCBhbmQgdGhlbiBhbm90aGVyIHZhcmlhYmxlLWxlbmd0aCBpbnRl
Z2VyIChGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBieXRlKS4KKy8vCisvLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAwPiA9PiB1dGYxNiBvYmplY3Qgc3RvcmUg
bmFtZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAs
IDUwLCBvYmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0ZjE2IGtleSBwYXRoIFtPYmplY3RTdG9yZU1l
dGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBp
ZCwgMj4gPT4gaGFzIGF1dG8gaW5jcmVtZW50IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8g
ICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMz4gPT4gaXMgZXZp
Y3RhYmxlIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwg
MCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgND4gPT4gbGFzdCAidmVyc2lvbiIgbnVtYmVyIFtPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVj
dCBzdG9yZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9jYXRlZCBbT2JqZWN0
U3RvcmVNZXRhRGF0YUtleV0KKy8vCisvLworLy8gSW5kZXggbWV0YS1kYXRhOgorLy8KKy8vICAg
ICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVuIHR3byB2YXJpYWJs
ZS1sZW5ndGggaW50ZWdlcnMsIGFuZCB0aGVuIGFub3RoZXIgdHlwZSBieXRlLgorLy8KKy8vICAg
ICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMD4g
PT4gdXRmMTYgaW5kZXggbmFtZSBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2Ug
aWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMT4gPT4gYXJlIGluZGV4
IGtleXMgdW5pcXVlIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwg
MCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAyPiA9PiB1dGYxNiBrZXkgcGF0aCBb
SW5kZXhNZXRhRGF0YUtleV0KKy8vCisvLworLy8gT3RoZXIgb2JqZWN0IHN0b3JlIGFuZCBpbmRl
eCBtZXRhLWRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBl
IGJ5dGUuIFRoZSBvYmplY3Qgc3RvcmUgYW5kIGluZGV4IGlkIGFyZSB2YXJpYWJsZSBsZW5ndGgg
aW50ZWdlcnMsIHRoZSB1dGYxNiBzdHJpbmdzIGFyZSB2YXJpYWJsZSBsZW5ndGggc3RyaW5ncy4K
Ky8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTAsIG9iamVjdCBzdG9yZSBpZD4gICAg
ICAgICAgICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIG9iamVjdCBzdG9yZSBpZCBp
cyBpbiB0aGUgZnJlZSBsaXN0IFtPYmplY3RTdG9yZUZyZWVMaXN0S2V5XQorLy8gICAgIDxkYXRh
YmFzZSBpZCwgMCwgMCwgMTUxLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkPiAgICAgICAgID0+
IGV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBpbmRleCBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtJbmRl
eEZyZWVMaXN0S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAwLCB1dGYxNiBvYmpl
Y3Qgc3RvcmUgbmFtZT4gICAgICAgICAgID0+IG9iamVjdCBzdG9yZSBpZCBbT2JqZWN0U3RvcmVO
YW1lc0tleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMSwgb2JqZWN0IHN0b3JlIGlk
LCB1dGYxNiBpbmRleCBuYW1lPiA9PiBpbmRleCBpZCBbSW5kZXhOYW1lc0tleV0KKy8vCisvLwor
Ly8gT2JqZWN0IHN0b3JlIGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQg
YnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4KKy8vCisv
LyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDEsIHVzZXIga2V5PiA9PiAidmVy
c2lvbiIsIHNlcmlhbGl6ZWQgc2NyaXB0IHZhbHVlIFtPYmplY3RTdG9yZURhdGFLZXldCisvLwor
Ly8KKy8vICJFeGlzdHMiIGVudHJ5OgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2Vk
IGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuCisvLwor
Ly8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCAyLCB1c2VyIGtleT4gPT4gInZl
cnNpb24iIFtFeGlzdHNFbnRyeUtleV0KKy8vCisvLworLy8gSW5kZXggZGF0YToKKy8vCisvLyAg
ICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlz
IGFuIGVuY29kZWQgSURCS2V5LiBUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIGEgdmFyaWFibGUgbGVu
Z3RoIGludGVnZXIuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBp
bmRleCBpZCwgdXNlciBrZXksIHNlcXVlbmNlIG51bWJlcj4gPT4gInZlcnNpb24iLCB1c2VyIGtl
eSBbSW5kZXhEYXRhS2V5XQorLy8KKy8vICAgICAoVGhlIHNlcXVlbmNlIG51bWJlciBpcyB1c2Vk
IHRvIGFsbG93IHR3byBlbnRyaWVzIHdpdGggdGhlIHNhbWUgdXNlciBrZXkKKy8vICAgICBpbiBu
b24tdW5pcXVlIGluZGV4ZXMuIFRoZSAidmVyc2lvbiIgZmllbGQgaXMgdXNlZCB0byB3ZWVkIG91
dCBzdGFsZQorLy8gICAgIGluZGV4IGRhdGEuIFdoZW5ldmVyIG5ldyBvYmplY3Qgc3RvcmUgZGF0
YSBpcyBpbnNlcnRlZCwgaXQgZ2V0cyBhIG5ldworLy8gICAgICJ2ZXJzaW9uIiBudW1iZXIsIGFu
ZCBuZXcgaW5kZXggZGF0YSBpcyB3cml0dGVuIHdpdGggdGhpcyBudW1iZXIuIFdoZW4KKy8vICAg
ICB0aGUgaW5kZXggaXMgdXNlZCBmb3IgbG9vay11cHMsIGVudHJpZXMgYXJlIHZhbGlkYXRlZCBh
Z2FpbnN0IHRoZQorLy8gICAgICJleGlzdHMiIGVudHJpZXMsIGFuZCByZWNvcmRzIHdpdGggb2xk
ICJ2ZXJzaW9uIiBudW1iZXJzIGFyZSBkZWxldGVkCisvLyAgICAgd2hlbiB0aGV5IGFyZSBlbmNv
dW50ZXJlZCBpbiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgsCisvLyAgICAgSW5kZXhDdXJzb3JJbXBs
Ojpsb2FkQ3VycmVudFJvdywgYW5kIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3cp
LgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TnVsbFR5cGVCeXRlID0gMDsK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlTdHJpbmdUeXBlQnl0ZSA9IDE7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5RGF0ZVR5cGVCeXRlID0gMjsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdW1iZXJUeXBlQnl0ZSA9IDM7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TWluS2V5VHlwZUJ5dGUgPSA0OworCitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrTWluaW11bUluZGV4SWQgPSAzMDsKK3N0YXRpYyBjb25zdCB1
bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZURhdGFJbmRleElkID0gMTsKK3N0YXRpYyBjb25zdCB1
bnNpZ25lZCBjaGFyIGtFeGlzdHNFbnRyeUluZGV4SWQgPSAyOworCitzdGF0aWMgY29uc3QgdW5z
aWduZWQgY2hhciBrU2NoZW1hVmVyc2lvblR5cGVCeXRlID0gMDsKK3N0YXRpYyBjb25zdCB1bnNp
Z25lZCBjaGFyIGtNYXhEYXRhYmFzZUlkVHlwZUJ5dGUgPSAxOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIga0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSA9IDEwMDsKK3N0YXRpYyBjb25zdCB1
bnNpZ25lZCBjaGFyIGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSA9IDIwMTsKKworc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSA9IDUwOworc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4TWV0YURhdGFUeXBlQnl0ZSA9IDEwMDsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUgPSAxNTA7
CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhGcmVlTGlzdFR5cGVCeXRlID0gMTUx
Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSA9
IDIwMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleE5hbWVzS2V5VHlwZUJ5dGUg
PSAyMDE7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDcsMTU3ICsxNzUsMjQ3NiBAQCBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjp+SURCTGV2ZWxEQkJhY2tpbmdTdG9yZSgpCiAgICAgbV9m
YWN0b3J5LT5yZW1vdmVJREJCYWNraW5nU3RvcmUobV9pZGVudGlmaWVyKTsKIH0KIAotUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJp
dHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmLCBpbnQ2NF90LCBjb25zdCBTdHJpbmcmLCBJREJGYWN0
b3J5QmFja2VuZEltcGwqKQorc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZUJ5dGUodW5zaWduZWQg
Y2hhciBjKQoreworICAgIHJldHVybiBzdGQ6OnN0cmluZygxLCBjKTsKK30KKworc3RhdGljIHN0
ZDo6c3RyaW5nIG1heElEQktleSgpCit7CisgICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51
bGxUeXBlQnl0ZSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBtaW5JREJLZXkoKQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZSgiIiwgMCwgMCkpOworICAgIHJldHVy
biBlbmNvZGVCeXRlKGtJREJLZXlNaW5LZXlUeXBlQnl0ZSk7CiB9CiAKLWJvb2wgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiwg
U3RyaW5nJiwgaW50NjRfdCYpCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlSW50KGludDY0X3Qg
bikKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAg
ICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKG4gPj0gMCk7CisgICAgc3RkOjpzdHJpbmcgcmV0
OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZG8geworICAgICAgICB1
bnNpZ25lZCBjaGFyIGMgPSBuOworICAgICAgICByZXQuYXBwZW5kKDEsIHN0YXRpY19jYXN0PGNo
YXI+KGMpKTsKKyAgICAgICAgbiA+Pj0gODsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVy
biByZXQ7CiB9CiAKK3N0YXRpYyBpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwg
Y29uc3QgY2hhciogZW5kKQoreworICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOworICAgIGludDY0
X3QgcmV0ID0gMDsKKworICAgIHdoaWxlIChiZWdpbiA8IGVuZCkgeworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGMgPSAqYmVnaW4rKzsKKyAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7CisgICAg
fQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEo
Y29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgaW50NjRfdCYsIGJvb2wpCisgICAgcmV0dXJu
IHJldDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZVZhckludChpbnQ2NF90IG4pCiB7
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0
dXJuIGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBj
cmVhdGlvbi4KKworICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbiAmIDB4N2Y7
CisgICAgICAgIG4gPj49IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAxMjg7
CisgICAgICAgIHJldC5hcHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOworICAgIH0gd2hp
bGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCwgVmVjdG9yPGludDY0X3Q+JiwgVmVjdG9yPFN0
cmluZz4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3Rvcjxib29sPiYpCitzdGF0aWMgY29uc3QgY2hh
ciogZGVjb2RlVmFySW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIqIGxpbWl0LCBpbnQ2NF90
JiBmb3VuZEludCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxl
bWVudC4KKyAgICBBU1NFUlQobGltaXQgPj0gcCk7CisgICAgZm91bmRJbnQgPSAwOworCisgICAg
ZG8geworICAgICAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisg
ICAgICAgIGZvdW5kSW50ID0gKGZvdW5kSW50IDw8IDcpIHwgKCpwICYgMHg3Zik7CisgICAgfSB3
aGlsZSAoKnArKyAmIDEyOCk7CisgICAgcmV0dXJuIHA7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCwgY29uc3QgU3RyaW5nJiwgY29u
c3QgU3RyaW5nJiwgYm9vbCwgaW50NjRfdCYpCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlU3Ry
aW5nKGNvbnN0IFN0cmluZyYgcykKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklY
TUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgcmV0OyAv
LyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgeworICAgICAgICBVQ2hhciB1ID0gc1tpXTsKKyAgICAg
ICAgdW5zaWduZWQgY2hhciBoaSA9IHUgPj4gODsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9
IHU7CisgICAgICAgIHJldC5hcHBlbmQoMSwgaGkpOworICAgICAgICByZXQuYXBwZW5kKDEsIGxv
KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKGludDY0X3QsIGludDY0X3QpCitzdGF0aWMgU3RyaW5n
IGRlY29kZVN0cmluZyhjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgQVNTRVJUKGVuZCA+
PSBwKTsKKyAgICBBU1NFUlQoISgoZW5kIC0gcCkgJSAyKSk7CisKKyAgICBzaXplX3QgbGVuID0g
KGVuZCAtIHApIC8gMjsKKyAgICBWZWN0b3I8VUNoYXI+IHZlY3RvcihsZW4pOworCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGhp
ID0gKnArKzsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9ICpwKys7CisKKyAgICAgICAgdmVj
dG9yW2ldID0gKGhpIDw8IDgpIHwgbG87CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZzo6YWRv
cHQodmVjdG9yKTsKIH0KIAotU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleSYpCitzdGF0aWMgc3Rk
OjpzdHJpbmcgZW5jb2RlU3RyaW5nV2l0aExlbihjb25zdCBTdHJpbmcmIHMpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIFN0cmlu
ZygpOworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGVuY29kZVZhckludChzLmxlbmd0aCgpKTsKKyAg
ICByZXQgKz0gZW5jb2RlU3RyaW5nKHMpOworICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCwgaW50NjRf
dCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlm
aWVyKikKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuKGNvbnN0IGNoYXIq
IHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQogewotICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsK
KyAgICBBU1NFUlQobGltaXQgPj0gcCk7CisgICAgaW50NjRfdCBsZW47CisgICAgcCA9IGRlY29k
ZVZhckludChwLCBsaW1pdCwgbGVuKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOwor
ICAgIGlmIChwICsgbGVuICogMiA+IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZv
dW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHAsIHAgKyBsZW4gKiAyKTsKKyAgICBwICs9IGxlbiAq
IDI7CisgICAgcmV0dXJuIHA7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xl
YXJPYmplY3RTdG9yZShpbnQ2NF90LCBpbnQ2NF90KQorc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29k
ZURvdWJsZShkb3VibGUgeCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6
IEltcGxlbWVudC4KKyAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBi
ZSBieXRlIG9yZGVyIGluZGVwZW5kZW50LgorICAgIGNvbnN0IGNoYXIqIHAgPSByZWludGVycHJl
dF9jYXN0PGNoYXIqPigmeCk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHAsIHNpemVvZih4KSk7
CiB9CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50
aWZpZXI+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlm
aWVyKCkKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29u
c3QgY2hhciogbGltaXQsIGRvdWJsZSogZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
Ly8gRklYTUU6IEltcGxlbWVudC4KKyAgICBpZiAocCArIHNpemVvZigqZCkgPiBsaW1pdCkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBjaGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4o
ZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoKmQpOyArK2kpCisgICAgICAg
ICp4KysgPSAqcCsrOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW5j
b2RlSURCS2V5KGNvbnN0IElEQktleSYga2V5KQoreworICAgIHN0ZDo6c3RyaW5nIHJldDsKKwor
ICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAg
ICAgICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0ZSk7CisgICAgY2FzZSBJ
REJLZXk6OlN0cmluZ1R5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleVN0cmlu
Z1R5cGVCeXRlKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZVN0cmluZ1dpdGhMZW4oa2V5LnN0cmlu
ZygpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6Cisg
ICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7CisgICAgICAgIHJl
dCArPSBlbmNvZGVEb3VibGUoa2V5LmRhdGUoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAg
Y2FzZSBJREJLZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktl
eU51bWJlclR5cGVCeXRlKTsKKyAgICAgICAgcmV0ICs9IGVuY29kZURvdWJsZShrZXkubnVtYmVy
KCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCitzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlSURCS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBSZWZQdHI8SURC
S2V5PiYgZm91bmRLZXkpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOworICAgIGlmIChwID49
IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9ICpw
Kys7CisgICAgU3RyaW5nIHM7CisgICAgZG91YmxlIGQ7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsK
KyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgICAgIC8vIE51bGwuCisgICAgICAg
IGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdWxsKCk7CisgICAgICAgIHJldHVybiBwOworICAg
IGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBTdHJpbmcuCisgICAgICAg
IHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCBzKTsKKyAgICAgICAgaWYgKCFwKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVT
dHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Uga0lEQktleURhdGVUeXBlQnl0
ZToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCBsaW1pdCwg
JmQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm91
bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7CisgICAgICAgIHJldHVybiBwOworICAgIGNh
c2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBOdW1iZXIuCisgICAgICAgIHAg
PSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdW1iZXIoZCk7
CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwog
ICAgIHJldHVybiAwOwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9i
amVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3Jk
SWRlbnRpZmllciopCitzdGF0aWMgY29uc3QgY2hhciogZXh0cmFjdEVuY29kZWRJREJLZXkoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBzdGQ6OnN0cmluZyogcmVzdWx0KQog
ewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIGNv
bnN0IGNoYXIqIHAgPSBzdGFydDsKKyAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOworCisgICAgaW50NjRfdCBzdHJp
bmdMZW47CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5
dGU6CisgICAgY2FzZSBrSURCS2V5TWluS2V5VHlwZUJ5dGU6CisgICAgICAgICpyZXN1bHQgPSBl
bmNvZGVCeXRlKHR5cGUpOworICAgICAgICByZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlTdHJp
bmdUeXBlQnl0ZToKKyAgICAgICAgLy8gU3RyaW5nLgorICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGxpbWl0LCBzdHJpbmdMZW4pOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgaWYgKHAgKyBzdHJpbmdMZW4gKiAyID4gbGltaXQpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgKnJlc3VsdCA9IHN0ZDo6c3RyaW5nKHN0YXJ0LCBwICsgc3Ry
aW5nTGVuICogMik7CisgICAgICAgIHJldHVybiBwICsgc3RyaW5nTGVuICogMjsKKyAgICBjYXNl
IGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6Cisg
ICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAgICAgICBpZiAocCArIHNpemVvZihkb3VibGUp
ID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnJlc3VsdCA9IHN0ZDo6
c3RyaW5nKHN0YXJ0LCBwICsgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICByZXR1cm4gcCArIHNp
emVvZihkb3VibGUpOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1
cm4gMDsKIH0KIAotZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVt
ZW50TnVtYmVyKGludDY0X3QsIGludDY0X3QpCitzdGF0aWMgaW50IGNvbXBhcmVFbmNvZGVkSURC
S2V5cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5QSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleUIpCiB7
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgQVNT
RVJUKGtleUEubGVuZ3RoKCkgPj0gMSk7CisgICAgQVNTRVJUKGtleUIubGVuZ3RoKCkgPj0gMSk7
CisKKyAgICBjb25zdCBjaGFyKiBwID0ga2V5QS5jX3N0cigpOworICAgIGNvbnN0IGNoYXIqIGxp
bWl0QSA9IHAgKyBrZXlBLmxlbmd0aCgpOworICAgIGNvbnN0IGNoYXIqIHEgPSBrZXlCLmNfc3Ry
KCk7CisgICAgY29uc3QgY2hhciogbGltaXRCID0gcSArIGtleUIubGVuZ3RoKCk7CisKKyAgICB1
bnNpZ25lZCBjaGFyIHR5cGVBID0gKnArKzsKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGVCID0gKnEr
KzsKKworICAgIFN0cmluZyBzLCB0OworICAgIGRvdWJsZSBkLCBlOworCisgICAgaWYgKGludCB4
ID0gdHlwZUIgLSB0eXBlQSkgLy8gRklYTUU6IE5vdGUgdGhlIHN1YnRsZW5lc3MhCisgICAgICAg
IHJldHVybiB4OworCisgICAgc3dpdGNoICh0eXBlQSkgeworICAgIGNhc2Uga0lEQktleU51bGxU
eXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlNaW5LZXlUeXBlQnl0ZToKKyAgICAgICAgLy8gTnVs
bCB0eXBlIG9yIG1heCB0eXBlOyBubyBwYXlsb2FkIHRvIGNvbXBhcmUuCisgICAgICAgIHJldHVy
biAwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBTdHJpbmcg
dHlwZS4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXRBLCBzKTsgLy8g
RklYTUU6IENvbXBhcmUgd2l0aG91dCBhY3R1YWxseSBkZWNvZGluZyB0aGUgU3RyaW5nIQorICAg
ICAgICBBU1NFUlQocCk7CisgICAgICAgIHEgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHEsIGxpbWl0
QiwgdCk7CisgICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBh
cmUocywgdCk7CisgICAgY2FzZSBrSURCS2V5RGF0ZVR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktl
eU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBEYXRlIG9yIG51bWJlci4KKyAgICAgICAgcCA9
IGRlY29kZURvdWJsZShwLCBsaW1pdEEsICZkKTsKKyAgICAgICAgQVNTRVJUKHApOworICAgICAg
ICBxID0gZGVjb2RlRG91YmxlKHEsIGxpbWl0QiwgJmUpOworICAgICAgICBBU1NFUlQocSk7Cisg
ICAgICAgIGlmIChkIDwgZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGQg
PiBlKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwor
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgIHJldHVybiAwOwogfQogCi1ib29sIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCwgaW50NjRf
dCwgY29uc3QgSURCS2V5JiwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikKK3N0YXRpYyBi
b29sIGdldEludChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0
X3QmIGZvdW5kSW50KQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBsZXZlbGRiOjpT
dGF0dXMgcyA9IGRiLT5HZXQobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSwgbGV2ZWxkYjo6U2xpY2Uo
a2V5KSwgJnJlc3VsdCk7CisKKyAgICBpZiAocy5Jc05vdEZvdW5kKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBBU1NFUlQocy5vaygpKTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZm91bmRJbnQgPSBkZWNvZGVJbnQocmVzdWx0LmNfc3RyKCks
IHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kworc3RhdGljIGJvb2wgcHV0SW50KGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IGtleSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQo
bGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSwgZW5jb2RlSW50KHZhbHVlKSk7CisgICAgaWYg
KCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
c3RhdGljIGJvb2wgZ2V0U3RyaW5nKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJpbmcm
IGtleSwgU3RyaW5nJiBmb3VuZFN0cmluZykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Cisg
ICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGxl
dmVsZGI6OlNsaWNlKGtleSksICZyZXN1bHQpOworCisgICAgaWYgKHMuSXNOb3RGb3VuZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKHMub2soKSk7CisgICAgaWYgKCFzLm9r
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvdW5kU3RyaW5nID0gZGVjb2RlU3Ry
aW5nKHJlc3VsdC5jX3N0cigpLCByZXN1bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dFN0cmluZyhsZXZlbGRiOjpEQiog
ZGIsIGNvbnN0IHN0ZDo6c3RyaW5nIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBs
ZXZlbGRiOjpTdGF0dXMgcyA9IGRiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSwg
ZW5jb2RlU3RyaW5nKHZhbHVlKSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIEtleVByZWZp
eCB7CitwdWJsaWM6CisgICAgS2V5UHJlZml4KCkKKyAgICAgICAgOiBtX2RhdGFiYXNlSWQoLTEp
CisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1faW5kZXhJZCgtMSkK
KyAgICB7CisgICAgfQorCisgICAgS2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgICAgIDogbV9kYXRhYmFzZUlk
KGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisg
ICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBL
ZXlQcmVmaXgqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0g
KnN0YXJ0Kys7CisKKyAgICAgICAgaW50IGRhdGFiYXNlSWRCeXRlcyA9ICgoZmlyc3RCeXRlID4+
IDUpICYgMHg3KSArIDE7CisgICAgICAgIGludCBvYmplY3RTdG9yZUlkQnl0ZXMgPSAoKGZpcnN0
Qnl0ZSA+PiAyKSAmIDB4NykgKyAxOworICAgICAgICBpbnQgaW5kZXhJZEJ5dGVzID0gKGZpcnN0
Qnl0ZSAmIDB4MykgKyAxOworCisgICAgICAgIGlmIChzdGFydCArIGRhdGFiYXNlSWRCeXRlcyAr
IG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyA+IGxpbWl0KQorICAgICAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3Rh
cnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzKTsKKyAgICAgICAgc3RhcnQgKz0gZGF0YWJhc2VJ
ZEJ5dGVzOworICAgICAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IGRlY29kZUludChzdGFy
dCwgc3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0ZXMpOworICAgICAgICBzdGFydCArPSBvYmplY3RT
dG9yZUlkQnl0ZXM7CisgICAgICAgIHJlc3VsdC0+bV9pbmRleElkID0gZGVjb2RlSW50KHN0YXJ0
LCBzdGFydCArIGluZGV4SWRCeXRlcyk7CisgICAgICAgIHN0YXJ0ICs9IGluZGV4SWRCeXRlczsK
KworICAgICAgICByZXR1cm4gc3RhcnQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZW5jb2Rl
KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAg
ICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX2luZGV4
SWQgPj0gMCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZGF0YWJhc2VJZFN0cmluZyA9IGVuY29k
ZUludChtX2RhdGFiYXNlSWQpOworICAgICAgICBzdGQ6OnN0cmluZyBvYmplY3RTdG9yZUlkU3Ry
aW5nID0gZW5jb2RlSW50KG1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlu
ZGV4SWRTdHJpbmcgPSBlbmNvZGVJbnQobV9pbmRleElkKTsKKworICAgICAgICBBU1NFUlQoZGF0
YWJhc2VJZFN0cmluZy5sZW5ndGgoKSA8PSA4KTsKKyAgICAgICAgQVNTRVJUKG9iamVjdFN0b3Jl
SWRTdHJpbmcubGVuZ3RoKCkgPD0gOCk7CisgICAgICAgIEFTU0VSVChpbmRleElkU3RyaW5nLmxl
bmd0aCgpIDw9IDQpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgICAgIHMucmVzZXJ2
ZSgxICsgZGF0YWJhc2VJZFN0cmluZy5sZW5ndGgoKSArIG9iamVjdFN0b3JlSWRTdHJpbmcubGVu
Z3RoKCkgKyBpbmRleElkU3RyaW5nLmxlbmd0aCgpKTsKKworICAgICAgICB1bnNpZ25lZCBjaGFy
IGZpcnN0Qnl0ZSA9IChkYXRhYmFzZUlkU3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgNSB8IChvYmpl
Y3RTdG9yZUlkU3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgMiB8IChpbmRleElkU3RyaW5nLmxlbmd0
aCgpIC0gMSk7CisgICAgICAgIHMgKz0gZmlyc3RCeXRlOworICAgICAgICBzICs9IGRhdGFiYXNl
SWRTdHJpbmc7CisgICAgICAgIHMgKz0gb2JqZWN0U3RvcmVJZFN0cmluZzsKKyAgICAgICAgcyAr
PSBpbmRleElkU3RyaW5nOworCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIGludCBj
b21wYXJlKGNvbnN0IEtleVByZWZpeCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOworCisgICAgICAgIGlmIChtX2Rh
dGFiYXNlSWQgIT0gb3RoZXIubV9kYXRhYmFzZUlkKQorICAgICAgICAgICAgcmV0dXJuIG1fZGF0
YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICAgICAgaWYgKG1fb2JqZWN0U3RvcmVJ
ZCAhPSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4gbV9vYmplY3RT
dG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOworICAgICAgICBpZiAobV9pbmRleElkICE9
IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBvdGhlci5t
X2luZGV4SWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVudW0gVHlwZSB7Cisg
ICAgICAgIGtHbG9iYWxNZXRhRGF0YSwKKyAgICAgICAga0RhdGFiYXNlTWV0YURhdGEsCisgICAg
ICAgIGtPYmplY3RTdG9yZURhdGEsCisgICAgICAgIGtFeGlzdHNFbnRyeSwKKyAgICAgICAga0lu
ZGV4RGF0YSwKKyAgICAgICAga0ludmFsaWRUeXBlCisgICAgfTsKKworICAgIFR5cGUgdHlwZSgp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAg
ICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9pbmRleElk
ID49IDApOworCisgICAgICAgIGlmICghbV9kYXRhYmFzZUlkKQorICAgICAgICAgICAgcmV0dXJu
IGtHbG9iYWxNZXRhRGF0YTsKKyAgICAgICAgaWYgKCFtX29iamVjdFN0b3JlSWQpCisgICAgICAg
ICAgICByZXR1cm4ga0RhdGFiYXNlTWV0YURhdGE7CisgICAgICAgIGlmIChtX2luZGV4SWQgPT0g
a09iamVjdFN0b3JlRGF0YUluZGV4SWQpCisgICAgICAgICAgICByZXR1cm4ga09iamVjdFN0b3Jl
RGF0YTsKKyAgICAgICAgaWYgKG1faW5kZXhJZCA9PSBrRXhpc3RzRW50cnlJbmRleElkKQorICAg
ICAgICAgICAgcmV0dXJuIGtFeGlzdHNFbnRyeTsKKyAgICAgICAgaWYgKG1faW5kZXhJZCA+PSBr
TWluaW11bUluZGV4SWQpCisgICAgICAgICAgICByZXR1cm4ga0luZGV4RGF0YTsKKworICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtJbnZhbGlkVHlwZTsKKyAg
ICB9CisKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3Rv
cmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJZDsKK307CisKK2NsYXNzIFNjaGVtYVZlcnNpb25L
ZXkgeworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoKQorICAgIHsKKyAg
ICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5l
bmNvZGUoKSArIGVuY29kZUJ5dGUoa1NjaGVtYVZlcnNpb25UeXBlQnl0ZSk7CisgICAgfQorfTsK
KworY2xhc3MgTWF4RGF0YWJhc2VJZEtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3Ry
aW5nIGVuY29kZSgpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOwor
ICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrTWF4RGF0YWJhc2VJ
ZFR5cGVCeXRlKTsKKyAgICB9Cit9OworCitjbGFzcyBEYXRhYmFzZUZyZWVMaXN0S2V5IHsKK3B1
YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCkKKyAgICAgICAgOiBtX2RhdGFiYXNlSWQo
LTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3Qg
Y2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZyZWVMaXN0S2V5KiByZXN1
bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFy
ICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAg
aWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1f
ZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUg
PSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrRGF0
YWJhc2VGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVz
dWx0LT5tX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgw
LCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa0Rh
dGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSkgKyBlbmNvZGVWYXJJbnQoZGF0YWJhc2VJZCk7CisgICAg
fQorCisgICAgaW50NjRfdCBkYXRhYmFzZUlkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX2RhdGFiYXNlSWQ7CisgICAg
fQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgRGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAgICBy
ZXR1cm4gbV9kYXRhYmFzZUlkIC0gb3RoZXIubV9kYXRhYmFzZUlkOworICAgIH0KKworcHJpdmF0
ZToKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKK307CisKK2NsYXNzIERhdGFiYXNlTmFtZUtl
eSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBz
dGFydCwgY29uc3QgY2hhciogbGltaXQsIERhdGFiYXNlTmFtZUtleSogcmVzdWx0KQorICAgIHsK
KyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVBy
ZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAg
ICAgICAgICAgIHJldHVybiBwOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2RhdGFiYXNlSWQp
OworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NF
UlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAg
ICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0RhdGFiYXNlTmFtZVR5
cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsIHJlc3VsdC0+bV9vcmln
aW4pOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0
dXJuIGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZU5hbWUp
OworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoY29uc3QgU3RyaW5nJiBv
cmlnaW4sIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJl
Zml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVu
Y29kZUJ5dGUoa0RhdGFiYXNlTmFtZVR5cGVCeXRlKSArIGVuY29kZVN0cmluZ1dpdGhMZW4ob3Jp
Z2luKSArIGVuY29kZVN0cmluZ1dpdGhMZW4oZGF0YWJhc2VOYW1lKTsKKyAgICB9CisKKyAgICBT
dHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICBTdHJpbmcgZGF0
YWJhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhYmFzZU5hbWU7IH0KKworICAgIGludCBj
b21wYXJlKGNvbnN0IERhdGFiYXNlTmFtZUtleSYgb3RoZXIpCisgICAgeworICAgICAgICBpZiAo
aW50IHggPSBjb2RlUG9pbnRDb21wYXJlKG1fb3JpZ2luLCBvdGhlci5tX29yaWdpbikpCisgICAg
ICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9kYXRh
YmFzZU5hbWUsIG90aGVyLm1fZGF0YWJhc2VOYW1lKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
U3RyaW5nIG1fb3JpZ2luOyAvLyBGSVhNRTogU3RvcmUgZW5jb2RlZCBzdHJpbmdzLCBvciBqdXN0
IHBvaW50ZXJzLgorICAgIFN0cmluZyBtX2RhdGFiYXNlTmFtZTsKK307CisKK2NsYXNzIERhdGFi
YXNlTWV0YURhdGFLZXkgeworcHVibGljOgorICAgIGVudW0gTWV0YURhdGFUeXBlIHsKKyAgICAg
ICAga09yaWdpbk5hbWUgPSAwLAorICAgICAgICBrRGF0YWJhc2VOYW1lID0gMSwKKyAgICAgICAg
a1VzZXJWZXJzaW9uID0gMiwKKyAgICAgICAga01heE9iamVjdFN0b3JlSWQgPSAzCisgICAgfTsK
KworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBNZXRh
RGF0YVR5cGUgbWV0YURhdGFUeXBlKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChk
YXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29k
ZUJ5dGUobWV0YURhdGFUeXBlKTsKKyAgICB9Cit9OworCitjbGFzcyBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KCkKKyAgICAgICAg
OiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9tZXRhRGF0YVR5cGUoLTEpCisgICAg
eworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3Rh
cnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1bHQpCisg
ICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0g
S2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFw
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFz
ZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAg
QVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7
CisgICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtPYmplY3RTdG9y
ZU1ldGFEYXRhVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1f
b2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBBU1NFUlQocmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAocCA9
PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlVmFy
SW50KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBlKTsKKyAgICB9CisKKyAgICBzdGF0
aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBw
cmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkg
KyBlbmNvZGVCeXRlKGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpICsgZW5jb2RlVmFySW50
KG9iamVjdFN0b3JlSWQpICsgZW5jb2RlVmFySW50KG1ldGFEYXRhVHlwZSk7CisgICAgfQorCisg
ICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQ7Cisg
ICAgfQorICAgIGludDY0X3QgbWV0YURhdGFUeXBlKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX21ldGFEYXRhVHlwZSA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBl
OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlTWV0YURhdGFLZXkm
IG90aGVyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAg
ICAgICAgQVNTRVJUKG1fbWV0YURhdGFUeXBlID49IDApOworICAgICAgICBpZiAoaW50IHggPSBt
X29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1
cm4geDsgLy8gRklYTUU6IElzIHRoaXMgY2FzdCBzYWZlPyBJLmUuLCB3aWxsIGl0IHByZXNlcnZl
IHRoZSBzaWduPworICAgICAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFE
YXRhVHlwZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7
CisgICAgaW50NjRfdCBtX21ldGFEYXRhVHlwZTsgLy8gRklYTUU6IE1ha2UgdGhpcyBhIGJ5dGUu
Cit9OworCitjbGFzcyBJbmRleE1ldGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleE1ldGFE
YXRhS2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9pbmRl
eElkKC0xKQorICAgICAgICAsIG1fbWV0YURhdGFUeXBlKDApCisgICAgeworICAgIH0KKworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBJbmRleE1ldGFEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVm
aXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3Rh
cnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJU
KCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRl
eElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVF9VTlVT
RUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUpOworICAgICAg
ICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVj
b2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlm
ICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAs
IGxpbWl0LCByZXN1bHQtPm1faW5kZXhJZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICByZXN1bHQtPm1fbWV0YURhdGFUeXBlID0gKnArKzsKKyAgICAgICAgcmV0dXJu
IHA7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCB1bnNpZ25lZCBj
aGFyIG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJh
c2VJZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRl
KGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUpICsgZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpICsg
ZW5jb2RlVmFySW50KGluZGV4SWQpICsgZW5jb2RlQnl0ZShtZXRhRGF0YVR5cGUpOworICAgIH0K
KworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4TWV0YURhdGFLZXkmIG90aGVyKQorICAgIHsK
KyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgQVNTRVJUKG1f
aW5kZXhJZCA+PSAwKTsKKworICAgICAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBv
dGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgaWYg
KGludCB4ID0gbV9pbmRleElkIC0gb3RoZXIubV9pbmRleElkKQorICAgICAgICAgICAgcmV0dXJu
IHg7CisgICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFUeXBl
OworICAgIH0KKworICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0CisgICAgeworICAgICAgICBB
U1NFUlQobV9pbmRleElkID49IDApOworICAgICAgICByZXR1cm4gbV9pbmRleElkOworICAgIH0K
KworICAgIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9tZXRh
RGF0YVR5cGU7IH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAg
ICBpbnQ2NF90IG1faW5kZXhJZDsKKyAgICB1bnNpZ25lZCBjaGFyIG1fbWV0YURhdGFUeXBlOwor
fTsKKworY2xhc3MgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSB7CitwdWJsaWM6CisgICAgT2JqZWN0
U3RvcmVGcmVlTGlzdEtleSgpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgIHsK
KyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0
LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0KQorICAg
IHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IEtl
eVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJ
ZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFT
U0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwor
ICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVG
cmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5t
X29iamVjdFN0b3JlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICByZXR1cm4gcHJl
Zml4LmVuY29kZSgpICsgZW5jb2RlQnl0ZShrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKSAr
IGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG9iamVj
dFN0b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+
PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICBpbnQg
Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5JiBvdGhlcikKKyAgICB7CisgICAg
ICAgIC8vIEZJWE1FOiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRoYXQgd2UncmUgbm90IGNvbXBhcmlu
ZyBkYXRhYmFzZSBpZCdzLAorICAgICAgICAvLyBidXQgdGhhdCBjb21wYXJpc29uIHdpbGwgaGF2
ZSBiZWVuIG1hZGUgZWFybGllci4KKyAgICAgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2Ug
dGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJ
ZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0
U3RvcmVJZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7
Cit9OworCitjbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleEZyZWVM
aXN0S2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9pbmRl
eElkKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNv
bnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhGcmVlTGlzdEtleSogcmVz
dWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAg
IGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1f
ZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUg
PSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrSW5k
ZXhGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5t
X29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4SWQp
OworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKKyAgICB7CisgICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBw
cmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpICsgZW5j
b2RlVmFySW50KG9iamVjdFN0b3JlSWQpICsgZW5jb2RlVmFySW50KGluZGV4SWQpOworICAgIH0K
KworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKQorICAgIHsK
KyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgQVNTRVJUKG1f
aW5kZXhJZCA+PSAwKTsKKyAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3Ro
ZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVy
biBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4SWQ7CisgICAgfQorCisgICAgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQg
Pj0gMCk7CisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQ7CisgICAgfQorCisgICAgaW50
NjRfdCBpbmRleElkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0g
MCk7CisgICAgICAgIHJldHVybiBtX2luZGV4SWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGlu
dDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworfTsKKworY2xh
c3MgT2JqZWN0U3RvcmVOYW1lc0tleSB7CitwdWJsaWM6CisgICAgLy8gRklYTUU6IFdlIG5ldmVy
IHVzZSB0aGlzIHRvIGxvb2sgdXAgb2JqZWN0IHN0b3JlIGlkcywgYmVjYXVzZSBhIG1hcHBpbmcK
KyAgICAvLyBpcyBrZXB0IGluIHRoZSBJREJEYXRhYmFzZUJhY2tlbmRJbXBsLiBDYW4gdGhlIG1h
cHBpbmcgYmVjb21lIHVucmVsaWFibGU/CisgICAgLy8gQ2FuIHdlIHJlbW92ZSB0aGlzPworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBPYmplY3RTdG9yZU5hbWVzS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQ
cmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUo
c3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNT
RVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9p
bmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVF9V
TlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtPYmplY3RTdG9yZU5hbWVzVHlwZUJ5dGUpOwor
ICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBsaW1pdCwgcmVzdWx0LT5tX29i
amVjdFN0b3JlTmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgb2JqZWN0U3RvcmVOYW1lKQorICAgIHsK
KyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgcmV0
dXJuIHByZWZpeC5lbmNvZGUoKSArIGVuY29kZUJ5dGUoa09iamVjdFN0b3JlTmFtZXNUeXBlQnl0
ZSkgKyBlbmNvZGVTdHJpbmdXaXRoTGVuKG9iamVjdFN0b3JlTmFtZSk7CisgICAgfQorCisgICAg
aW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tleSYgb3RoZXIpCisgICAgeworICAg
ICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVjdFN0b3JlTmFtZSwgb3RoZXIubV9v
YmplY3RTdG9yZU5hbWUpOworICAgIH0KKworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUoKSBj
b25zdCB7IHJldHVybiBtX29iamVjdFN0b3JlTmFtZTsgfQorCitwcml2YXRlOgorICAgIFN0cmlu
ZyBtX29iamVjdFN0b3JlTmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmluZywg
b3IganVzdCBwb2ludGVycyB0byBpdC4KK307CisKK2NsYXNzIEluZGV4TmFtZXNLZXkgeworcHVi
bGljOgorICAgIEluZGV4TmFtZXNLZXkoKQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkK
KyAgICB7CisgICAgfQorCisgICAgLy8gRklYTUU6IFdlIG5ldmVyIHVzZSB0aGlzIHRvIGxvb2sg
dXAgaW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAgIC8vIGlzIGtlcHQgYXQgYSBoaWdo
ZXIgbGV2ZWwuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFy
dCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAg
ICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6
OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAg
ICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXBy
ZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAg
QVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0luZGV4TmFtZXNLZXlUeXBlQnl0
ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBk
ZWNvZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhOYW1lKTsKKyAgICB9
CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIGluZGV4TmFtZSkKKyAgICB7CisgICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIHJldHVybiBw
cmVmaXguZW5jb2RlKCkgKyBlbmNvZGVCeXRlKGtJbmRleE5hbWVzS2V5VHlwZUJ5dGUpICsgZW5j
b2RlVmFySW50KG9iamVjdFN0b3JlSWQpICsgZW5jb2RlU3RyaW5nV2l0aExlbihpbmRleE5hbWUp
OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4TmFtZXNLZXkmIG90aGVyKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgaWYg
KGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAg
ICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKG1faW5kZXhO
YW1lLCBvdGhlci5tX2luZGV4TmFtZSk7CisgICAgfQorCisgICAgU3RyaW5nIGluZGV4TmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1faW5kZXhOYW1lOyB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBt
X29iamVjdFN0b3JlSWQ7CisgICAgU3RyaW5nIG1faW5kZXhOYW1lOworfTsKKworY2xhc3MgT2Jq
ZWN0U3RvcmVEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIE9iamVjdFN0b3JlRGF0YUtleSog
cmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3Qg
Y2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVmaXgpOworICAgICAg
ICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5t
X2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IGtTcGVjaWFsSW5kZXhOdW1iZXIpOwor
ICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0
dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNlcktl
eSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qgc3RkOjpzdHJpbmcgZW5jb2RlZFVz
ZXJLZXkpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgICAgICByZXR1cm4gcHJlZml4LmVu
Y29kZSgpICsgZW5jb2RlZFVzZXJLZXk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5n
IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiB1c2VyS2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBlbmNvZGVJREJLZXkodXNlcktleSkpOworICAgIH0KKworICAgIGlu
dCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlRGF0YUtleSYgb3RoZXIpCisgICAgeworICAgICAg
ICByZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1f
ZW5jb2RlZFVzZXJLZXkpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5
KCkgY29uc3QKKyAgICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVj
b2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuY19zdHIoKSwgbV9lbmNvZGVkVXNlcktleS5jX3N0
cigpICsgbV9lbmNvZGVkVXNlcktleS5sZW5ndGgoKSwga2V5KTsKKyAgICAgICAgcmV0dXJuIGtl
eTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU3BlY2lhbEluZGV4TnVtYmVy
ID0ga09iamVjdFN0b3JlRGF0YUluZGV4SWQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcg
bV9lbmNvZGVkVXNlcktleTsKK307CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5IHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBj
aGFyKiBlbmQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVm
aXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3Rh
cnQsIGVuZCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVChw
cmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQg
PT0ga1NwZWNpYWxJbmRleE51bWJlcik7CisgICAgICAgIGlmIChwID09IGVuZCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgZW5k
LCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpz
dHJpbmcgZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZEtleSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBw
cmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga1NwZWNpYWxJbmRleE51bWJlcik7Cisg
ICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCkgKyBlbmNvZGVkS2V5OworICAgIH0KKworICAg
IHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSkKKyAgICB7CisgICAgICAgIHJldHVy
biBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkp
KTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBFeGlzdHNFbnRyeUtleSYgb3RoZXIp
CisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVz
ZXJLZXksIG90aGVyLm1fZW5jb2RlZFVzZXJLZXkpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8
SURCS2V5PiB1c2VyS2V5KCkgY29uc3QKKyAgICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtl
eTsKKyAgICAgICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuY19zdHIoKSwgbV9lbmNv
ZGVkVXNlcktleS5jX3N0cigpICsgbV9lbmNvZGVkVXNlcktleS5sZW5ndGgoKSwga2V5KTsKKyAg
ICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU3Bl
Y2lhbEluZGV4TnVtYmVyID0ga0V4aXN0c0VudHJ5SW5kZXhJZDsKKworcHJpdmF0ZToKKyAgICBz
dGQ6OnN0cmluZyBtX2VuY29kZWRVc2VyS2V5OworfTsKKworY2xhc3MgSW5kZXhEYXRhS2V5IHsK
K3B1YmxpYzoKKyAgICBJbmRleERhdGFLZXkoKQorICAgICAgICA6IG1fZGF0YWJhc2VJZCgtMSkK
KyAgICAgICAgLCBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9pbmRleElkKC0xKQor
ICAgICAgICAsIG1fc2VxdWVuY2VOdW1iZXIoLTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRp
YyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0
LCBJbmRleERhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7
CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQs
ICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1f
b2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID49IGtNaW5p
bXVtSW5kZXhJZCk7CisgICAgICAgIHJlc3VsdC0+bV9kYXRhYmFzZUlkID0gcHJlZml4Lm1fZGF0
YWJhc2VJZDsKKyAgICAgICAgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQgPSBwcmVmaXgubV9vYmpl
Y3RTdG9yZUlkOworICAgICAgICByZXN1bHQtPm1faW5kZXhJZCA9IHByZWZpeC5tX2luZGV4SWQ7
CisgICAgICAgIHAgPSBleHRyYWN0RW5jb2RlZElEQktleShwLCBsaW1pdCwgJnJlc3VsdC0+bV9l
bmNvZGVkVXNlcktleSk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBpZiAocCA9PSBsaW1pdCkgeworICAgICAgICAgICAgcmVzdWx0LT5tX3NlcXVlbmNl
TnVtYmVyID0gLTE7IC8vIEZJWE1FOiBXZSBzaG91bGQgY2hhbmdlIGl0IHNvIHRoYXQgYWxsIGtl
eXMgaGF2ZSBhIHNlcXVlbmNlIG51bWJlci4gU2hvdWxkbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMg
Y2FzZS4KKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBk
ZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9zZXF1ZW5jZU51bWJlcik7CisgICAgfQor
CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBzdGQ6OnN0cmluZyYgZW5j
b2RlZFVzZXJLZXksIGludDY0X3Qgc2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAgICBLZXlQ
cmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOworICAgICAg
ICByZXR1cm4gcHJlZml4LmVuY29kZSgpICsgZW5jb2RlZFVzZXJLZXkgKyBlbmNvZGVWYXJJbnQo
c2VxdWVuY2VOdW1iZXIpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5LCBpbnQ2NF90IHNlcXVlbmNlTnVtYmVyKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCBlbmNvZGVJREJLZXkodXNlcktleSksIHNlcXVlbmNlTnVtYmVyKTsKKyAgICB9CisKKyAgICBz
dGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBJTlQzMl9NQVgsIG1heElEQktleSgpLCBJTlQ2NF9NQVgpOworICAg
IH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4RGF0YUtleSYgb3RoZXIsIGJvb2wgaWdu
b3JlU2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49
IDApOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NF
UlQobV9pbmRleElkID49IDApOworICAgICAgICBpZiAoaW50IHggPSBjb21wYXJlRW5jb2RlZElE
QktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktleSkpCisgICAgICAg
ICAgICByZXR1cm4geDsKKyAgICAgICAgaWYgKGlnbm9yZVNlcXVlbmNlTnVtYmVyKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtX3NlcXVlbmNlTnVtYmVyIC0gb3RoZXIu
bV9zZXF1ZW5jZU51bWJlcjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKKyAgICAgICAgcmV0
dXJuIG1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBj
b25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAg
ICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGluZGV4SWQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKyAgICAgICAg
cmV0dXJuIG1faW5kZXhJZDsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktl
eSgpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8SURCS2V5PiBrZXk7CisgICAgICAgIGRl
Y29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmNfc3RyKCksIG1fZW5jb2RlZFVzZXJLZXkuY19z
dHIoKSArIG1fZW5jb2RlZFVzZXJLZXkubGVuZ3RoKCksIGtleSk7CisgICAgICAgIHJldHVybiBr
ZXk7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGlu
dDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworICAgIHN0ZDo6
c3RyaW5nIG1fZW5jb2RlZFVzZXJLZXk7CisgICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVyOwor
fTsKKworY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBsZXZlbGRiOjpDb21wYXJhdG9yIHsKK3B1
YmxpYzoKKyAgICB2aXJ0dWFsIGludCBDb21wYXJlKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBj
b25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QKKyAgICB7CisgICAgICAgIGludCB5ID0gUmVh
bENvbXBhcmUoYSwgYik7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworICAgIGludCBDb21w
YXJlSW5kZXhLZXlzKGNvbnN0IGxldmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGlj
ZSYgYikgY29uc3QKKyAgICB7CisgICAgICAgIGludCB5ID0gUmVhbENvbXBhcmUoYSwgYiwgdHJ1
ZSk7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworICAgIGludCBSZWFsQ29tcGFyZShjb25z
dCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIsIGJvb2wgaW5kZXhL
ZXlzID0gZmFsc2UpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBwdHJBID0gYS5k
YXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBiLmRhdGEoKTsKKyAgICAgICAgY29u
c3QgY2hhciogZW5kQSA9IHB0ckEgKyBhLnNpemUoKTsKKyAgICAgICAgY29uc3QgY2hhciogZW5k
QiA9IHB0ckIgKyBiLnNpemUoKTsKKworICAgICAgICBLZXlQcmVmaXggcHJlZml4QTsKKyAgICAg
ICAgS2V5UHJlZml4IHByZWZpeEI7CisKKyAgICAgICAgcHRyQSA9IEtleVByZWZpeDo6ZGVjb2Rl
KHB0ckEsIGVuZEEsICZwcmVmaXhBKTsKKyAgICAgICAgcHRyQiA9IEtleVByZWZpeDo6ZGVjb2Rl
KHB0ckIsIGVuZEIsICZwcmVmaXhCKTsKKyAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICBB
U1NFUlQocHRyQik7CisKKyAgICAgICAgaWYgKGludCB4ID0gcHJlZml4QS5jb21wYXJlKHByZWZp
eEIpKQorICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgaWYgKHByZWZpeEEudHlwZSgp
ID09IEtleVByZWZpeDo6a0dsb2JhbE1ldGFEYXRhKSB7CisgICAgICAgICAgICBBU1NFUlQocHRy
QSAhPSBlbmRBKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAg
ICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyIHR5cGVCeXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgICAgIGlmIChpbnQgeCA9
IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKworICAg
ICAgICAgICAgaWYgKHR5cGVCeXRlQSA8PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKSB7
CisgICAgICAgICAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBkYXRhYmFzZUZyZWVMaXN0S2V5
QTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5IGRhdGFiYXNlRnJlZUxpc3RL
ZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29k
ZShhLmRhdGEoKSwgZW5kQSwgJmRhdGFiYXNlRnJlZUxpc3RLZXlBKTsKKyAgICAgICAgICAgICAg
ICBwdHJCID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZGF0
YWJhc2VGcmVlTGlzdEtleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YWJh
c2VGcmVlTGlzdEtleUEuY29tcGFyZShkYXRhYmFzZUZyZWVMaXN0S2V5Qik7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSkg
eworICAgICAgICAgICAgICAgIERhdGFiYXNlTmFtZUtleSBkYXRhYmFzZU5hbWVLZXlBOworICAg
ICAgICAgICAgICAgIERhdGFiYXNlTmFtZUtleSBkYXRhYmFzZU5hbWVLZXlCOworCisgICAgICAg
ICAgICAgICAgcHRyQSA9IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAm
ZGF0YWJhc2VOYW1lS2V5QSk7CisgICAgICAgICAgICAgICAgcHRyQiA9IERhdGFiYXNlTmFtZUtl
eTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZGF0YWJhc2VOYW1lS2V5Qik7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAg
ICAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZU5hbWVLZXlBLmNvbXBhcmUoZGF0YWJhc2VOYW1l
S2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZml4QS50
eXBlKCkgPT0gS2V5UHJlZml4OjprRGF0YWJhc2VNZXRhRGF0YSkgeworICAgICAgICAgICAgQVNT
RVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKKwor
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOworCisgICAgICAgICAgICBpZiAo
aW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7
CisKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPD0gMykKKyAgICAgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga09iamVjdFN0b3JlTWV0YURhdGFU
eXBlQnl0ZSkgeworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURh
dGFLZXlBOworICAgICAgICAgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURhdGFL
ZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRl
Y29kZShhLmRhdGEoKSwgZW5kQSwgJm1ldGFEYXRhS2V5QSk7CisgICAgICAgICAgICAgICAgcHRy
QiA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJm1ldGFE
YXRhS2V5Qik7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAg
IEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUtleUEuY29t
cGFyZShtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVC
eXRlQSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgSW5kZXhN
ZXRhRGF0YUtleSBtZXRhRGF0YUtleUE7CisgICAgICAgICAgICAgICAgSW5kZXhNZXRhRGF0YUtl
eSBtZXRhRGF0YUtleUI7CisKKyAgICAgICAgICAgICAgICBwdHJBID0gSW5kZXhNZXRhRGF0YUtl
eTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmbWV0YURhdGFLZXlBKTsKKyAgICAgICAgICAgICAg
ICBwdHJCID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmbWV0YURh
dGFLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICAgICAg
QVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5QS5jb21w
YXJlKG1ldGFEYXRhS2V5Qik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5
dGVBID09IGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAgICBP
YmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0RW50cnlLZXlBOworICAgICAgICAgICAgICAg
IE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUI7CisKKyAgICAgICAgICAg
ICAgICBwdHJBID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRB
LCAmZnJlZUxpc3RFbnRyeUtleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9y
ZUZyZWVMaXN0S2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZmcmVlTGlzdEVudHJ5S2V5Qik7
CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChw
dHJCKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBmcmVlTGlzdEVudHJ5S2V5QS5jb21wYXJl
KGZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBl
Qnl0ZUEgPT0ga0luZGV4RnJlZUxpc3RUeXBlQnl0ZSkgeworICAgICAgICAgICAgICAgIEluZGV4
RnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUE7CisgICAgICAgICAgICAgICAgSW5kZXhGcmVl
TGlzdEtleSBmcmVlTGlzdEVudHJ5S2V5QjsKKworICAgICAgICAgICAgICAgIHB0ckEgPSBJbmRl
eEZyZWVMaXN0S2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZmcmVlTGlzdEVudHJ5S2V5QSk7
CisgICAgICAgICAgICAgICAgcHRyQiA9IEluZGV4RnJlZUxpc3RLZXk6OmRlY29kZShiLmRhdGEo
KSwgZW5kQiwgJmZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRy
QSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZyZWVMaXN0RW50cnlLZXlBLmNvbXBhcmUoZnJlZUxpc3RFbnRyeUtleUIpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5
cGVCeXRlKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0U3RvcmVOYW1lc0tleSBvYmplY3RTdG9y
ZU5hbWVzS2V5QTsKKyAgICAgICAgICAgICAgICBPYmplY3RTdG9yZU5hbWVzS2V5IG9iamVjdFN0
b3JlTmFtZXNLZXlCOworCisgICAgICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTmFtZXNL
ZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJm9iamVjdFN0b3JlTmFtZXNLZXlBKTsKKyAgICAg
ICAgICAgICAgICBwdHJCID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZGVjb2RlKGIuZGF0YSgpLCBl
bmRCLCAmb2JqZWN0U3RvcmVOYW1lc0tleUIpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJB
KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gb2JqZWN0U3RvcmVOYW1lc0tleUEuY29tcGFyZShvYmplY3RTdG9yZU5hbWVzS2V5Qik7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtJbmRleE5hbWVzS2V5
VHlwZUJ5dGUpIHsKKyAgICAgICAgICAgICAgICBJbmRleE5hbWVzS2V5IGluZGV4TmFtZXNLZXlB
OworICAgICAgICAgICAgICAgIEluZGV4TmFtZXNLZXkgaW5kZXhOYW1lc0tleUI7CisKKyAgICAg
ICAgICAgICAgICBwdHJBID0gSW5kZXhOYW1lc0tleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAm
aW5kZXhOYW1lc0tleUEpOworICAgICAgICAgICAgICAgIHB0ckIgPSBJbmRleE5hbWVzS2V5Ojpk
ZWNvZGUoYi5kYXRhKCksIGVuZEIsICZpbmRleE5hbWVzS2V5Qik7CisgICAgICAgICAgICAgICAg
QVNTRVJUKHB0ckEpOworICAgICAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAg
ICAgICAgIHJldHVybiBpbmRleE5hbWVzS2V5QS5jb21wYXJlKGluZGV4TmFtZXNLZXlCKTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9
PSBLZXlQcmVmaXg6OmtPYmplY3RTdG9yZURhdGEpIHsKKyAgICAgICAgICAgIGlmIChwdHJBID09
IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAg
ICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBG
SVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZl
IHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAgICAgICAgIE9iamVjdFN0b3JlRGF0YUtl
eSBvYmplY3RTdG9yZURhdGFLZXlBOworICAgICAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9i
amVjdFN0b3JlRGF0YUtleUI7CisKKyAgICAgICAgICAgIHB0ckEgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJm9iamVjdFN0b3JlRGF0YUtleUEpOworICAgICAg
ICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAm
b2JqZWN0U3RvcmVEYXRhS2V5Qik7CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAg
ICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgICAgIHJldHVybiBvYmplY3RTdG9yZURhdGFL
ZXlBLmNvbXBhcmUob2JqZWN0U3RvcmVEYXRhS2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a0V4aXN0c0VudHJ5KSB7CisgICAgICAgICAg
ICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICAgICAgcmV0
dXJuIC0xOworICAgICAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNo
b3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgICAgICBFeGlz
dHNFbnRyeUtleSBleGlzdHNFbnRyeUtleUE7CisgICAgICAgICAgICBFeGlzdHNFbnRyeUtleSBl
eGlzdHNFbnRyeUtleUI7CisKKyAgICAgICAgICAgIHB0ckEgPSBFeGlzdHNFbnRyeUtleTo6ZGVj
b2RlKGEuZGF0YSgpLCBlbmRBLCAmZXhpc3RzRW50cnlLZXlBKTsKKyAgICAgICAgICAgIHB0ckIg
PSBFeGlzdHNFbnRyeUtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZXhpc3RzRW50cnlLZXlC
KTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCKTsK
KworICAgICAgICAgICAgcmV0dXJuIGV4aXN0c0VudHJ5S2V5QS5jb21wYXJlKGV4aXN0c0VudHJ5
S2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZp
eDo6a0luZGV4RGF0YSkgeworICAgICAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09
IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAocHRyQSA9
PSBlbmRBKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChwdHJC
ID09IGVuZEIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ug
b2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0
aGlzIHdheS4KKworICAgICAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleUE7CisgICAg
ICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QjsKKworICAgICAgICAgICAgcHRyQSA9
IEluZGV4RGF0YUtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmaW5kZXhEYXRhS2V5QSk7Cisg
ICAgICAgICAgICBwdHJCID0gSW5kZXhEYXRhS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZp
bmRleERhdGFLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFT
U0VSVChwdHJCKTsKKworICAgICAgICAgICAgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlciA9IGlu
ZGV4S2V5czsKKyAgICAgICAgICAgIHJldHVybiBpbmRleERhdGFLZXlBLmNvbXBhcmUoaW5kZXhE
YXRhS2V5QiwgaWdub3JlU2VxdWVuY2VOdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnN0
IGNoYXIqIE5hbWUoKSBjb25zdCB7IHJldHVybiAiaWRiX2NtcDEiOyB9CisgICAgdm9pZCBGaW5k
U2hvcnRlc3RTZXBhcmF0b3Ioc3RkOjpzdHJpbmcqLCBjb25zdCBsZXZlbGRiOjpTbGljZSYpIGNv
bnN0IHt9IC8vIEZJWE1FOiBJbXBsZW1lbnQgZXZlbnR1YWxseS4KKyAgICB2b2lkIEZpbmRTaG9y
dFN1Y2Nlc3NvcihzdGQ6OnN0cmluZyopIGNvbnN0IHt9IC8vIEZJWE1FOiBJbXBsZW1lbnQgZXZl
bnR1YWxseS4KK30gY29tcGFyYXRvcjsKK30KKworc3RhdGljIGJvb2wgc2V0VXBNZXRhZGF0YShs
ZXZlbGRiOjpEQiogZGIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJ
bXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGFE
YXRhS2V5ID0gU2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKCk7CisKKyAgICBpbnQ2NF90IHNjaGVt
YVZlcnNpb247CisgICAgaWYgKCFnZXRJbnQoZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9u
KSkgeworICAgICAgICBzY2hlbWFWZXJzaW9uID0gMDsKKyAgICAgICAgaWYgKCFwdXRJbnQoZGIs
IG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICAvLyBGSVhNRTogRXZlbnR1YWxseSwgd2UnbGwgbmVlZCB0byBiZSBhYmxl
IHRvIHRyYW5zaXRpb24gYmV0d2VlbiBzY2hlbWFzLgorICAgIGlmIChzY2hlbWFWZXJzaW9uKQor
ICAgICAgICByZXR1cm4gZmFsc2U7IC8vIERvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMg
dmVyc2lvbi4KKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJp
dHlPcmlnaW4sIGNvbnN0IFN0cmluZyYgcGF0aEJhc2VBcmcsIGludDY0X3QgbWF4aW11bVNpemUs
IGNvbnN0IFN0cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFj
dG9yeSkKK3sKKyAgICBTdHJpbmcgcGF0aEJhc2UgPSBwYXRoQmFzZUFyZzsKKworICAgIGlmIChw
YXRoQmFzZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJ
WE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2UgZm9yIGluY29nbml0byBhbmQgRHVtcFJl
bmRlclRyZWUuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghbWFrZUFsbERp
cmVjdG9yaWVzKHBhdGhCYXNlKSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVh
dGUgSW5kZXhlZERCIGRhdGFiYXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZXZlbnR1
YWxseSB1c2UgdGhlIHNhbWUgTGV2ZWxEQiBkYXRhYmFzZSBmb3IgYWxsIG9yaWdpbnMuCisgICAg
U3RyaW5nIHBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNlY3VyaXR5
T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIuaW5kZXhlZGRiLmxldmVsZGIiKTsKKwor
ICAgIGxldmVsZGI6OkRCKiBkYjsKKyAgICBsZXZlbGRiOjpPcHRpb25zIG9wdGlvbnM7CisgICAg
b3B0aW9ucy5jb21wYXJhdG9yID0gJmNvbXBhcmF0b3I7CisgICAgb3B0aW9ucy5jcmVhdGVfaWZf
bWlzc2luZyA9IHRydWU7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHN0YXR1cyA9IGxldmVsZGI6OkRC
OjpPcGVuKG9wdGlvbnMsIHBhdGgudXRmOCgpLmRhdGEoKSwgJmRiKTsKKworICAgIGlmICghc3Rh
dHVzLm9rKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IElmIHRoZSBjb21wYXJhdG9yIG5hbWUgY2hh
bmdlcywgd2UgbmVlZCBhIHRyYW5zaXRpb25pbmcgc3RyYXRlZ3kuCisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIFJlZlB0cjxJREJMZXZlbERCQmFja2luZ1N0b3JlPiBiYWNraW5nU3Rv
cmUoYWRvcHRSZWYobmV3IElEQkxldmVsREJCYWNraW5nU3RvcmUoZmlsZUlkZW50aWZpZXIsIGZh
Y3RvcnksIGRiKSkpOworCisgICAgaWYgKCFzZXRVcE1ldGFkYXRhKGJhY2tpbmdTdG9yZS0+bV9k
Yi5nZXQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5y
ZWxlYXNlKCk7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVj
dFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJhY2sm
KQorYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0
YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmluZyYgZm91bmRWZXJzaW9uLCBpbnQ2NF90JiBmb3Vu
ZElkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50Lgot
ICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBEYXRhYmFzZU5h
bWVLZXk6OmVuY29kZShtX2lkZW50aWZpZXIsIG5hbWUpOworCisgICAgYm9vbCBvayA9IGdldElu
dChtX2RiLmdldCgpLCBrZXksIGZvdW5kSWQpOworICAgIGlmICghb2spCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIG9rID0gZ2V0U3RyaW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURh
dGFLZXk6OmVuY29kZShmb3VuZElkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprVXNlclZlcnNpb24p
LCBmb3VuZFZlcnNpb24pOworICAgIGlmICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldElu
ZGV4ZXMoaW50NjRfdCwgaW50NjRfdCwgVmVjdG9yPGludDY0X3Q+JiwgVmVjdG9yPFN0cmluZz4m
LCBWZWN0b3I8U3RyaW5nPiYsIFZlY3Rvcjxib29sPiYpCitzdGF0aWMgaW50NjRfdCBnZXROZXdE
YXRhYmFzZUlkKGxldmVsZGI6OkRCKiBkYikKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsg
Ly8gRklYTUU6IEltcGxlbWVudC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmcmVlTGlzdFN0YXJ0
S2V5ID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKDApOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIGZyZWVMaXN0U3RvcEtleSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29kZShJTlQ2NF9N
QVgpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3Io
bGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoZnJlZUxpc3RTdGFy
dEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFyZShpdC0+a2V5KCksIGZyZWVM
aXN0U3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBp
dC0+a2V5KCkuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyICpsaW1pdCA9IHAgKyBpdC0+a2V5
KCkuc2l6ZSgpOworCisgICAgICAgIERhdGFiYXNlRnJlZUxpc3RLZXkgZnJlZUxpc3RLZXk7Cisg
ICAgICAgIHAgPSBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkZWNvZGUocCwgbGltaXQsICZmcmVlTGlz
dEtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBsZXZlbGRiOjpTdGF0dXMgcyA9
IGRiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAg
IEFTU0VSVChzLm9rKCkpOworCisgICAgICAgIHJldHVybiBmcmVlTGlzdEtleS5kYXRhYmFzZUlk
KCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZXJlIHdhcyBubyBmcmVlLWxp
c3QuCisgICAgaW50NjRfdCBtYXhEYXRhYmFzZUlkOworICAgIGlmICghZ2V0SW50KGRiLCBNYXhE
YXRhYmFzZUlkS2V5OjplbmNvZGUoKSwgbWF4RGF0YWJhc2VJZCkpCisgICAgICAgIG1heERhdGFi
YXNlSWQgPSAwOworCisgICAgaW50NjRfdCBkYXRhYmFzZUlkID0gbWF4RGF0YWJhc2VJZCArIDE7
CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIGRh
dGFiYXNlSWQpOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIHJldHVybiBkYXRh
YmFzZUlkOworCiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgo
aW50NjRfdCwgaW50NjRfdCwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50
NjRfdCYpCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURh
dGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QmIHJv
d0lkLCBib29sIGludmFsaWRSb3dJZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8g
RklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGludmFsaWRSb3dJ
ZCkgeworICAgICAgICByb3dJZCA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSk7CisKKyAg
ICAgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9p
ZGVudGlmaWVyLCBuYW1lKTsKKyAgICAgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCBy
b3dJZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwdXRT
dHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRh
YmFzZU1ldGFEYXRhS2V5OjprVXNlclZlcnNpb24pLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwgVmVjdG9yPGludDY0X3Q+
JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kQXV0b0luY3JlbWVudEZsYWdzKQorewor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIDEsIDApOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkg
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYLCAw
KTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0b3Io
bGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkpOyBp
dC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7
IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5kYXRhKCk7
CisgICAgICAgIGNvbnN0IGNoYXIgKmxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7CisKKyAg
ICAgICAgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKKyAgICAgICAgcCA9IE9i
amVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRhS2V5KTsKKyAg
ICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IG1ldGFE
YXRhS2V5Lm9iamVjdFN0b3JlSWQoKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1l
ID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsg
aXQtPnZhbHVlKCkuc2l6ZSgpKTsKKworICAgICAgICBpdC0+TmV4dCgpOworICAgICAgICBpZiAo
IWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGtleVBhdGgg
PSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBp
dC0+dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgICAgIGlmICgh
aXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiaXQgbm90IHZhbGlkXG4iKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBib29sIGF1dG9JbmNyZW1l
bnQgPSAqaXQtPnZhbHVlKCkuZGF0YSgpOworCisgICAgICAgIGl0LT5OZXh0KCk7IC8vIElzIGV2
aWNhdGJsZS4KKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgaXQtPk5leHQoKTsgLy8gTGFzdCB2ZXJzaW9uLgorICAgICAgICBpZiAoIWl0LT5W
YWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdC0+TmV4dCgpOyAvLyBNYXhp
dW0gaW5kZXggaWQgYWxsb2NhdGVkLgorICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAg
ICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICBmb3VuZElkcy5hcHBlbmQob2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKG9iamVjdFN0b3JlTmFtZSk7CisgICAgICAgIGZvdW5k
S2V5UGF0aHMuYXBwZW5kKGtleVBhdGgpOworICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFn
cy5hcHBlbmQoYXV0b0luY3JlbWVudCk7CisgICAgfQorfQorCitzdGF0aWMgaW50NjRfdCBnZXRO
ZXdPYmplY3RTdG9yZUlkKGxldmVsZGI6OkRCKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkKQorewor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyZWVMaXN0U3RhcnRLZXkgPSBPYmplY3RTdG9yZUZyZWVM
aXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZnJl
ZUxpc3RTdG9wS2V5ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IElOVDY0X01BWCk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KGRiLT5OZXdJ
dGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisgICAgZm9yIChpdC0+U2VlayhmcmVl
TGlzdFN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXko
KSwgZnJlZUxpc3RTdG9wS2V5KSA8IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IGl0LT5rZXkoKS5kYXRhKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gcCAr
IGl0LT5rZXkoKS5zaXplKCk7CisKKyAgICAgICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSBmcmVl
TGlzdEtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBs
aW1pdCwgJmZyZWVMaXN0S2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGxldmVs
ZGI6OlN0YXR1cyBzID0gZGItPkRlbGV0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgaXQtPmtl
eSgpKTsKKyAgICAgICAgQVNTRVJUKHMub2soKSk7CisKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0
S2V5Lm9iamVjdFN0b3JlSWQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3Jl
SWQ7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprTWF4
T2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXks
IG1heE9iamVjdFN0b3JlSWQpKQorICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKKworICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IG1heE9iamVjdFN0b3JlSWQgKyAxOworICAgIGJvb2wg
b2sgPSBwdXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAg
IEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIHJldHVybiBvYmplY3RTdG9yZUlkOworfQor
Citib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJv
b2wgYXV0b0luY3JlbWVudCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQoreworICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IGdldE5ld09iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwg
ZGF0YWJhc2VJZCk7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApOworICAg
IGNvbnN0IHN0ZDo6c3RyaW5nIGtleVBhdGhLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CisgICAgY29uc3Qgc3RkOjpzdHJp
bmcgYXV0b0luY3JlbWVudEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBldmljdGFi
bGVLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgMyk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGFzdFZlcnNpb25LZXkgPSBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7
CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBjb25zdCBz
dGQ6OnN0cmluZyBuYW1lc0tleSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBuYW1lKTsKKworICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbmFtZUtl
eSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBz
ZXQgbmFtZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRT
dHJpbmcobV9kYi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0aCk7CisgICAgaWYgKCFvaykgewor
ICAgICAgICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQga2V5IHBhdGgiKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIGF1dG9JbmNy
ZW1lbnRLZXksIGF1dG9JbmNyZW1lbnQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJmYWlsZWQgdG8gc2V0IGF1dG8gaW5jcmVtZW50Iik7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBldmljdGFibGVLZXksIGZh
bHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBl
dmljdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0
SW50KG1fZGIuZ2V0KCksIGxhc3RWZXJzaW9uS2V5LCAxKTsKKyAgICBpZiAoIW9rKSB7CisgICAg
ICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBsYXN0IHZlcnNpb24gbnVtYmVyIik7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBt
YXhJbmRleElkS2V5LCBrTWluaW11bUluZGV4SWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG1heCBpbmRleCBpZCIpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbmFtZXNLZXksIG9i
amVjdFN0b3JlSWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQg
dG8gc2V0IG9iamVjdCBzdG9yZSBpZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgYXNzaWduZWRPYmplY3RTdG9yZUlkID0gb2JqZWN0U3RvcmVJZDsKKworICAgIHJldHVy
biB0cnVlOworfQorCitzdGF0aWMgYm9vbCBkZWxldGVSYW5nZShsZXZlbGRiOjpEQiogZGIsIGNv
bnN0IHN0ZDo6c3RyaW5nJiBiZWdpbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuZCkKK3sKKyAgICAv
LyBGSVhNRTogTGV2ZWxEQiBtYXkgYmUgYWJsZSB0byBwcm92aWRlIGEgYnVsayBvcGVyYXRpb24g
dGhhdCB3ZSBjYW4gZG8gZmlyc3QuCisKKyAgICBsZXZlbGRiOjpXcml0ZUJhdGNoIGJhdGNoOwor
CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxk
Yjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoYmVnaW4pOyBpdC0+VmFsaWQo
KSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBlbmQpIDwgMDsgaXQtPk5leHQoKSkK
KyAgICAgICAgYmF0Y2guRGVsZXRlKGl0LT5rZXkoKSk7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMg
cyA9IGRiLT5Xcml0ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgJmJhdGNoKTsKKyAgICBpZiAo
IXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgU3RyaW5nIG9iamVjdFN0
b3JlTmFtZTsKKyAgICBnZXRTdHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBvYmplY3RTdG9yZU5hbWUp
OworCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA2KSkpCisgICAgICAg
IHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKworICAgIHB1dFN0cmluZyhtX2RiLmdl
dCgpLCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCksICIiKTsKKyAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIE9i
amVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZU5hbWUpKTsK
KworICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgSW5kZXhGcmVlTGlzdEtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBJbmRleEZyZWVMaXN0S2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKSkpCisgICAgICAgIHJldHVy
bjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIuZ2V0
KCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAw
LCAwKSwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IElOVDY0X01BWCwgMCkpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3Iu
CisKKyAgICBjbGVhck9iamVjdFN0b3JlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOworfQor
CitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5
KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIHN0ZDo6c3Ry
aW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpS
ZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkpCisgICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBj
aGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0cigpICsgZGF0YS5s
ZW5ndGgoKSwgdmVyc2lvbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisgICAgKHZvaWQpIHZlcnNpb247CisKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nKHAsIGRhdGEu
Y19zdHIoKSArIGRhdGEubGVuZ3RoKCkpOworfQorCituYW1lc3BhY2UgeworY2xhc3MgTGV2ZWxE
QlJlY29yZElkZW50aWZpZXIgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJl
Y29yZElkZW50aWZpZXIgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVsREJS
ZWNvcmRJZGVudGlmaWVyPiBjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHByaW1hcnlLZXksIGlu
dDY0X3QgdmVyc2lvbikgeyByZXR1cm4gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlm
aWVyKHByaW1hcnlLZXksIHZlcnNpb24pKTsgfQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVs
REJSZWNvcmRJZGVudGlmaWVyPiBjcmVhdGUoKSB7IHJldHVybiBhZG9wdFJlZihuZXcgTGV2ZWxE
QlJlY29yZElkZW50aWZpZXIoKSk7IH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29u
c3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5LmVtcHR5KCk7IH0KKyAgICBzdGQ6OnN0cmluZyBwcmlt
YXJ5S2V5KCkgY29uc3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdm9pZCBzZXRQcmlt
YXJ5S2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmltYXJ5S2V5KSB7IG1fcHJpbWFyeUtleSA9IHBy
aW1hcnlLZXk7IH0KKyAgICBpbnQ2NF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtX3ZlcnNp
b247IH0KKyAgICB2b2lkIHNldFZlcnNpb24oaW50NjRfdCB2ZXJzaW9uKSB7IG1fdmVyc2lvbiA9
IHZlcnNpb247IH0KKworcHJpdmF0ZToKKyAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmllcihjb25z
dCBzdGQ6OnN0cmluZyYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtl
eShwcmltYXJ5S2V5KSwgbV92ZXJzaW9uKHZlcnNpb24pIHsgQVNTRVJUKCFwcmltYXJ5S2V5LmVt
cHR5KCkpOyB9CisgICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIoKSA6IG1fcHJpbWFyeUtleSgp
LCBtX3ZlcnNpb24oLTEpIHt9CisKKyAgICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlLZXk7IC8vIEZJ
WE1FOiBNYWtlIGl0IG1vcmUgY2xlYXIgdGhhdCB0aGlzIGlzIHRoZSAqZW5jb2RlZCogdmVyc2lv
biBvZiB0aGUga2V5LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKK30KKworc3RhdGljIGlu
dDY0X3QgZ2V0TmV3VmVyc2lvbk51bWJlcihsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxh
c3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDQpOworCisgICAgaW50NjRfdCBsYXN0VmVyc2lvbjsKKyAgICBpZiAo
IWdldEludChkYiwgbGFzdFZlcnNpb25LZXksIGxhc3RWZXJzaW9uKSkKKyAgICAgICAgbGFzdFZl
cnNpb24gPSAwOworCisgICAgQVNTRVJUKGxhc3RWZXJzaW9uID49IDApOworCisgICAgaW50NjRf
dCB2ZXJzaW9uID0gbGFzdFZlcnNpb24gKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIGxh
c3RWZXJzaW9uS2V5LCB2ZXJzaW9uKTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAg
ICBBU1NFUlQodmVyc2lvbiA+IGxhc3RWZXJzaW9uKTsgLy8gRklYTUU6IFRoaW5rIGFib3V0IGhv
dyB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgb3ZlcmZsb3cgc2NlbmFyaW8uCisKKyAgICByZXR1cm4g
dmVyc2lvbjsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9y
ZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRp
ZmllciogcmVjb3JkSWRlbnRpZmllcikKK3sKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBnZXROZXdW
ZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOworICAg
IGNvbnN0IHN0ZDo6c3RyaW5nIG9iamVjdFN0b3JlZGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgbGV2ZWxkYjo6
U3RhdHVzIHMgPSBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIG9iamVjdFN0b3Jl
ZGF0YUtleSwgZW5jb2RlVmFySW50KHZlcnNpb24pICsgZW5jb2RlU3RyaW5nKHZhbHVlKSk7Cisg
ICAgaWYgKCFzLm9rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IHN0ZDo6
c3RyaW5nIGV4aXN0c0VudHJ5S2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIHMgPSBtX2RiLT5QdXQobGV2ZWxkYjo6V3JpdGVP
cHRpb25zKCksIGV4aXN0c0VudHJ5S2V5LCBlbmNvZGVJbnQodmVyc2lvbikpOworICAgIGlmICgh
cy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMZXZlbERCUmVjb3JkSWRlbnRp
ZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxMZXZlbERCUmVjb3Jk
SWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOworICAgIGxldmVsREJSZWNvcmRJZGVudGlm
aWVyLT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShrZXkpKTsKKyAgICBsZXZlbERCUmVjb3Jk
SWRlbnRpZmllci0+c2V0VmVyc2lvbih2ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
IHN0YXJ0S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLmVuY29k
ZSgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCArIDEsIDApLmVuY29kZSgpOworCisgICAgZGVsZXRlUmFuZ2UobV9k
Yi5nZXQoKSwgc3RhcnRLZXksIHN0b3BLZXkpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdT
dG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcigpCit7CisgICAgcmV0dXJuIExldmVsREJS
ZWNvcmRJZGVudGlmaWVyOjpjcmVhdGUoKTsKK30KKwordm9pZCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpkZWxldGVPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJ
ZGVudGlmaWVyKQoreworICAgIGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERC
UmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0PGNvbnN0IExldmVsREJSZWNvcmRJZGVudGlm
aWVyKj4ocmVjb3JkSWRlbnRpZmllcik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5ID0gT2Jq
ZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbGV2ZWxE
QlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMg
PSBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGtleSk7Cit9CisKK2RvdWJs
ZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICBjb25zdCBzdGQ6OnN0
cmluZyBzdGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBzdG9wS2V5
ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
bWF4SURCS2V5KCkpOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5O
ZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAgICBpbnQgbWF4TnVtZXJp
Y0tleSA9IDA7CisKKyAgICAvLyBGSVhNRTogQmUgbW9yZSBlZmZpY2llbnQ6IHNlZWsgdG8gc29t
ZXRoaW5nIGFmdGVyIHRoZSBvYmplY3Qgc3RvcmUgZGF0YSwgdGhlbiByZXZlcnNlLgorCisgICAg
Zm9yIChpdC0+U2VlayhzdGFydEtleSk7IGl0LT5WYWxpZCgpICYmIGNvbXBhcmF0b3IuQ29tcGFy
ZShpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPk5leHQoKSkgeworICAgICAgICBjb25zdCBj
aGFyICpwID0gaXQtPmtleSgpLmRhdGEoKTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBw
ICsgaXQtPmtleSgpLnNpemUoKTsKKworICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkgZGF0YUtl
eTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0
YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBpZiAoZGF0YUtleS51c2VyS2V5
KCktPnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpIHsKKyAgICAgICAgICAgIGludDY0X3Qg
biA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGRhdGFLZXkudXNlcktleSgpLT5udW1iZXIoKSk7Cisg
ICAgICAgICAgICBpZiAobiA+IG1heE51bWVyaWNLZXkpCisgICAgICAgICAgICAgICAgbWF4TnVt
ZXJpY0tleSA9IG47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWF4TnVtZXJpY0tl
eSArIDE7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmpl
Y3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiBrZXksIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciogZm91bmRSZWNvcmRJZGVu
dGlmaWVyKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxldmVsZGJLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIHN0
ZDo6c3RyaW5nIGRhdGE7CisKKyAgICBsZXZlbGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZl
bGRiOjpSZWFkT3B0aW9ucygpLCBsZXZlbGRiS2V5LCAmZGF0YSk7CisgICAgaWYgKCFzLm9rKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBpZiAo
IWRlY29kZVZhckludChkYXRhLmNfc3RyKCksIGRhdGEuY19zdHIoKSArIGRhdGEubGVuZ3RoKCks
IHZlcnNpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBMZXZlbERCUmVjb3JkSWRl
bnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxMZXZlbERCUmVj
b3JkSWRlbnRpZmllcio+KGZvdW5kUmVjb3JkSWRlbnRpZmllcik7CisgICAgbGV2ZWxEQlJlY29y
ZElkZW50aWZpZXItPnNldFByaW1hcnlLZXkoZW5jb2RlSURCS2V5KGtleSkpOworICAgIGxldmVs
REJSZWNvcmRJZGVudGlmaWVyLT5zZXRWZXJzaW9uKHZlcnNpb24pOworICAgIHJldHVybiB0cnVl
OworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9yZVJl
Y29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3Rv
cmVSZWNvcmRDYWxsYmFjayYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3Rh
cnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBtaW5JREJLZXkoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9IE9iamVj
dFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktl
eSgpKTsKKworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQobV9kYi0+TmV3SXRlcmF0
b3IobGV2ZWxkYjo6UmVhZE9wdGlvbnMoKSkpOworICAgIGZvciAoaXQtPlNlZWsoc3RhcnRLZXkp
OyBpdC0+VmFsaWQoKSAmJiBjb21wYXJhdG9yLkNvbXBhcmUoaXQtPmtleSgpLCBzdG9wS2V5KSA8
IDA7IGl0LT5OZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5kYXRh
KCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxpbWl0ID0gcCArIGl0LT5rZXkoKS5zaXplKCk7Cisg
ICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBkYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3Rv
cmVEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZkYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHAp
OworCisgICAgICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkgPSBkYXRhS2V5LnVzZXJLZXko
KTsKKworICAgICAgICBpbnQ2NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHEgPSBk
ZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuZGF0YSgpLCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+
dmFsdWUoKS5zaXplKCksIHZlcnNpb24pOworICAgICAgICBpZiAoIXEpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBy
aSA9IExldmVsREJSZWNvcmRJZGVudGlmaWVyOjpjcmVhdGUoZW5jb2RlSURCS2V5KCpwcmltYXJ5
S2V5KSwgdmVyc2lvbik7CisgICAgICAgIFN0cmluZyBpZGJWYWx1ZSA9IGRlY29kZVN0cmluZyhx
LCBpdC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworCisgICAgICAgIGNh
bGxiYWNrLmNhbGxiYWNrKHJpLmdldCgpLCBpZGJWYWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+JiBm
b3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBmb3Vu
ZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpCit7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcgc3RhcnRLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RvcEtleSA9
IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwg
MCwgMCk7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+IGl0KG1fZGItPk5ld0l0ZXJh
dG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5
KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRvci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkg
PCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuZGF0
YSgpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgpOwor
CisgICAgICAgIEluZGV4TWV0YURhdGFLZXkgbWV0YURhdGFLZXk7CisgICAgICAgIHAgPSBJbmRl
eE1ldGFEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZtZXRhRGF0YUtleSk7CisgICAgICAgIEFT
U0VSVChwKTsKKworICAgICAgICBpbnQ2NF90IGluZGV4SWQgPSBtZXRhRGF0YUtleS5pbmRleElk
KCk7CisgICAgICAgIEFTU0VSVCghbWV0YURhdGFLZXkubWV0YURhdGFUeXBlKCkpOworCisgICAg
ICAgIFN0cmluZyBpbmRleE5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuZGF0YSgpLCBp
dC0+dmFsdWUoKS5kYXRhKCkgKyBpdC0+dmFsdWUoKS5zaXplKCkpOworICAgICAgICBpdC0+TmV4
dCgpOworICAgICAgICBpZiAoIWl0LT5WYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
Iml0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgYm9vbCBpbmRleFVuaXF1ZSA9ICppdC0+dmFsdWUoKS5kYXRhKCk7CisgICAgICAgIGl0LT5O
ZXh0KCk7CisgICAgICAgIGlmICghaXQtPlZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiaXQgbm90IHZhbGlkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICBTdHJpbmcga2V5UGF0aCA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5kYXRhKCksIGl0
LT52YWx1ZSgpLmRhdGEoKSArIGl0LT52YWx1ZSgpLnNpemUoKSk7CisKKyAgICAgICAgZm91bmRJ
ZHMuYXBwZW5kKGluZGV4SWQpOworICAgICAgICBmb3VuZE5hbWVzLmFwcGVuZChpbmRleE5hbWUp
OworICAgICAgICBmb3VuZEtleVBhdGhzLmFwcGVuZChrZXlQYXRoKTsKKyAgICAgICAgZm91bmRV
bmlxdWVGbGFncy5hcHBlbmQoaW5kZXhVbmlxdWUpOworICAgIH0KK30KKworc3RhdGljIGludDY0
X3QgZ2V0TmV3SW5kZXhJZChsZXZlbGRiOjpEQiogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXJ0S2V5ID0g
SW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApOwor
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0b3BLZXkgPSBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKTsKKworICAgIE93blB0cjxsZXZl
bGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkp
KTsKKyAgICBmb3IgKGl0LT5TZWVrKHN0YXJ0S2V5KTsgaXQtPlZhbGlkKCkgJiYgY29tcGFyYXRv
ci5Db21wYXJlKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+TmV4dCgpKSB7CisgICAgICAg
IGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuZGF0YSgpOworICAgICAgICBjb25zdCBjaGFyKiBs
aW1pdCA9IHAgKyBpdC0+a2V5KCkuc2l6ZSgpOworCisgICAgICAgIEluZGV4RnJlZUxpc3RLZXkg
ZnJlZUxpc3RLZXk7CisgICAgICAgIHAgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUocCwgbGlt
aXQsICZmcmVlTGlzdEtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBsZXZlbGRi
OjpTdGF0dXMgcyA9IGRiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXko
KSk7CisgICAgICAgIEFTU0VSVChzLm9rKCkpOworCisgICAgICAgIEFTU0VSVChmcmVlTGlzdEtl
eS5pbmRleElkKCkgPj0ga01pbmltdW1JbmRleElkKTsKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0
S2V5LmluZGV4SWQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1heEluZGV4SWQ7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcgbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBpZiAoIWdldEludChkYiwg
bWF4SW5kZXhJZEtleSwgbWF4SW5kZXhJZCkpCisgICAgICAgIG1heEluZGV4SWQgPSBrTWluaW11
bUluZGV4SWQ7CisKKyAgICBpbnQ2NF90IGluZGV4SWQgPSBtYXhJbmRleElkICsgMTsKKyAgICBi
b29sIG9rID0gcHV0SW50KGRiLCBtYXhJbmRleElkS2V5LCBpbmRleElkKTsKKyAgICBpZiAoIW9r
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gaW5kZXhJZDsKK30KKworYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpCit7CisgICAgaW5kZXhJ
ZCA9IGdldE5ld0luZGV4SWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7
CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDApOworICAgIGNvbnN0IHN0
ZDo6c3RyaW5nIHVuaXF1ZUtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAxKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXlQ
YXRoS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsIDIpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBu
YW1lS2V5LCBuYW1lKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVk
IHRvIHNldCBpbmRleCBuYW1lIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBvayA9IHB1dEludChtX2RiLmdldCgpLCB1bmlxdWVLZXksIGlzVW5pcXVlKTsKKyAgICBpZiAo
IW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBpc191bmlxdWUiKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0
KCksIGtleVBhdGhLZXksIGtleVBhdGgpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJmYWlsZWQgdG8gc2V0IGtleSBwYXRoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVJbmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90KQogewotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyAvLyBGSVhNRTogSW1wbGVtZW50IGFuZCBhZGQgbGF5b3V0IHRlc3QuCisgICAgcmV0dXJu
OworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29y
ZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KiByZWNvcmRJZGVudGlmaWVyKQoreworICAgIEFTU0VSVChpbmRleElkID49IGtNaW5pbXVtSW5k
ZXhJZCk7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJ
ZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihy
ZWNvcmRJZGVudGlmaWVyKTsKKworICAgIGNvbnN0IGludDY0X3QgZ2xvYmFsU2VxdWVuY2VOdW1i
ZXIgPSBnZXROZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGluZGV4RGF0YUtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgZ2xvYmFs
U2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRhdGEgPSBlbmNvZGVWYXJJ
bnQobGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnZlcnNpb24oKSkgKyBsZXZlbERCUmVjb3JkSWRl
bnRpZmllci0+cHJpbWFyeUtleSgpOworCisgICAgcmV0dXJuIG1fZGItPlB1dChsZXZlbGRiOjpX
cml0ZU9wdGlvbnMoKSwgaW5kZXhEYXRhS2V5LCBkYXRhKS5vaygpOwogfQogCi1ib29sIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90LCBpbnQ2NF90
LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXIqKQorc3RhdGljIGJvb2wgZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obGV2ZWxkYjo6REIqIGRi
LCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyYgZm91bmRLZXkpCiB7Ci0g
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJu
IGZhbHNlOworICAgIE93blB0cjxsZXZlbGRiOjpJdGVyYXRvcj4gaXQoZGItPk5ld0l0ZXJhdG9y
KGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBpdC0+U2Vlayh0YXJnZXQpOworCisgICAg
aWYgKCFpdC0+VmFsaWQoKSkgeworICAgICAgICBpdC0+U2Vla1RvTGFzdCgpOworICAgICAgICBp
ZiAoIWl0LT5WYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IHdoaWxlIChjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpID49
IDApIHsKKyAgICAgICAgaXQtPlByZXYoKTsKKyAgICAgICAgaWYgKCFpdC0+VmFsaWQoKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3VuZEtleSA9IGl0LT5rZXko
KS5Ub1N0cmluZygpOworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2
NF90LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqKQogewotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAg
ICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQgc2luY2Ugd2UgaW52YWxpZGF0ZSBpbmRleCBk
YXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVjaGFuaXNtLgorICAgIHJldHVybiB0cnVlOwog
fQogCi1TdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50
NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5JikKK1N0cmluZyBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsK
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1
cm4gU3RyaW5nKCk7CisgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSA9IGdldFByaW1hcnlL
ZXlWaWFJbmRleChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOworICAg
IGlmICghcHJpbWFyeUtleSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJu
IGdldE9iamVjdFN0b3JlUmVjb3JkKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpwcmltYXJ5
S2V5KTsKIH0KIAotUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJL
ZXkmKQorc3RhdGljIGJvb2wgdmVyc2lvbkV4aXN0cyhsZXZlbGRiOjpEQiogZGIsIGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IHZlcnNpb24sIGNvbnN0
IHN0ZDo6c3RyaW5nJiBlbmNvZGVkUHJpbWFyeUtleSkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gMDsKKyAgICBjb25zdCBzdGQ6
OnN0cmluZyBrZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGVuY29kZWRQcmltYXJ5S2V5KTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworCisgICAg
bGV2ZWxkYjo6U3RhdHVzIHMgPSBkYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIGtleSwg
JmRhdGEpOworICAgIGlmICghcy5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gZGVjb2RlSW50KGRhdGEuY19zdHIoKSwgZGF0YS5jX3N0cigpICsgZGF0YS5sZW5ndGgo
KSkgPT0gdmVyc2lvbjsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlz
dHNJbkluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleSYpCitQYXNz
UmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUlu
ZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAv
LyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBzdGQ6OnN0
cmluZyBsZXZlbGRiS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCwga2V5LCAwKTsKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+
IGl0KG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpKTsKKyAgICBpdC0+
U2VlayhsZXZlbGRiS2V5KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFpdC0+VmFs
aWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoY29tcGFyYXRvci5Db21w
YXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgbGV2ZWxkYktleSkgPiAwKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisKKyAgICAgICAgaW50NjRfdCB2ZXJzaW9uOworICAgICAgICBjb25zdCBjaGFyKiBw
ID0gZGVjb2RlVmFySW50KGl0LT52YWx1ZSgpLmRhdGEoKSwgaXQtPnZhbHVlKCkuZGF0YSgpICsg
aXQtPnZhbHVlKCkuc2l6ZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRQcmltYXJ5S2V5ID0gc3Rk
OjpzdHJpbmcocCwgaXQtPnZhbHVlKCkuZGF0YSgpICsgaXQtPnZhbHVlKCkuc2l6ZSgpKTsKKwor
ICAgICAgICBpZiAoIXZlcnNpb25FeGlzdHMobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgdmVyc2lvbiwgZW5jb2RlZFByaW1hcnlLZXkpKSB7CisgICAgICAgICAgICAvLyBE
ZWxldGUgc3RhbGUgaW5kZXggZGF0YSBlbnRyeSBhbmQgY29udGludWUuCisgICAgICAgICAgICBt
X2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRpb25zKCksIGl0LT5rZXkoKSk7CisgICAgICAg
ICAgICBpdC0+TmV4dCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg
ICAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OworICAgICAgICBkZWNvZGVJREJLZXkoZW5j
b2RlZFByaW1hcnlLZXkuY19zdHIoKSwgZW5jb2RlZFByaW1hcnlLZXkuY19zdHIoKSArIGVuY29k
ZWRQcmltYXJ5S2V5Lmxlbmd0aCgpLCBwcmltYXJ5S2V5KTsKKyAgICAgICAgcmV0dXJuIHByaW1h
cnlLZXkucmVsZWFzZSgpOworICAgIH0KIH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6
OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGlu
dDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24p
Citib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBs
ZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbGV2ZWxEQktleSA9
IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQs
IGtleSwgMCk7CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChtX2RiLT5OZXdJdGVy
YXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKSk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7
CisKKyAgICBpdC0+U2VlayhsZXZlbERCS2V5KTsKKyAgICBpZiAoaXQtPlZhbGlkKCkgJiYgIWNv
bXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCkuVG9TdHJpbmcoKSwgbGV2ZWxEQktl
eSkpCisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKworICAgIHJldHVybiBmb3VuZDsKIH0KIAotUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktl
eVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pCituYW1lc3BhY2UgeworY2xhc3MgQ3Vyc29y
SW1wbENvbW1vbiA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7CitwdWJsaWM6Cisg
ICAgLy8gSURCQmFja2luZ1N0b3JlOjpDdXJzb3IKKyAgICB2aXJ0dWFsIGJvb2wgY29udGludWVG
dW5jdGlvbihjb25zdCBJREJLZXkqKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBr
ZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURC
S2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9jdXJyZW50S2V5OyB9CisgICAgdmlydHVhbCBT
dHJpbmcgdmFsdWUoKSA9IDA7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXIoKSA9IDA7IC8vIEZJWE1FOiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgYWN0dWFsbHkgdXNlZCwg
c28gZHJvcCBpdC4KKyAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSA9IDA7CisKKyAg
ICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKSA9IDA7CisgICAgYm9vbCBmaXJzdFNlZWso
KTsKKworcHJvdGVjdGVkOgorICAgIEN1cnNvckltcGxDb21tb24obGV2ZWxkYjo6REIqIGRiLCBj
b25zdCBzdGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5n
JiBoaWdoS2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogbV9kYihk
YikKKyAgICAgICAgLCBtX2xvd0tleShsb3dLZXkpCisgICAgICAgICwgbV9sb3dPcGVuKGxvd09w
ZW4pCisgICAgICAgICwgbV9oaWdoS2V5KGhpZ2hLZXkpCisgICAgICAgICwgbV9oaWdoT3Blbiho
aWdoT3BlbikKKyAgICAgICAgLCBtX2ZvcndhcmQoZm9yd2FyZCkKKyAgICB7CisgICAgfQorICAg
IHZpcnR1YWwgfkN1cnNvckltcGxDb21tb24oKSB7fQorCisgICAgbGV2ZWxkYjo6REIqIG1fZGI7
CisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBtX2l0ZXJhdG9yOworICAgIHN0ZDo6c3Ry
aW5nIG1fbG93S2V5OworICAgIGJvb2wgbV9sb3dPcGVuOworICAgIHN0ZDo6c3RyaW5nIG1faGln
aEtleTsKKyAgICBib29sIG1faGlnaE9wZW47CisgICAgYm9vbCBtX2ZvcndhcmQ7CisgICAgUmVm
UHRyPElEQktleT4gbV9jdXJyZW50S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpm
aXJzdFNlZWsoKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVt
ZW50LgotICAgIHJldHVybiAwOworICAgIG1faXRlcmF0b3IgPSBtX2RiLT5OZXdJdGVyYXRvcihs
ZXZlbGRiOjpSZWFkT3B0aW9ucygpKTsKKworICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgIG1f
aXRlcmF0b3ItPlNlZWsobV9sb3dLZXkpOworICAgIGVsc2UKKyAgICAgICAgbV9pdGVyYXRvci0+
U2VlayhtX2hpZ2hLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIW1faXRlcmF0
b3ItPlZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1f
Zm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0
ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29t
cGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAm
JiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fbG93S2V5
KSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2Fy
ZCAmJiAhbV9sb3dPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
ICAgICBpZiAobV9mb3J3YXJkICYmIG1fbG93T3BlbikgeworICAgICAgICAgICAgLy8gbG93S2V5
IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCisgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5D
b21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgeworICAg
ICAgICAgICAgICAgIG1faXRlcmF0b3ItPk5leHQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBt
X2hpZ2hPcGVuKSB7CisgICAgICAgICAgICAvLyBoaWdoS2V5IG5vdCBpbmNsdWRlZCBpbiB0aGUg
cmFuZ2UuCisgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5Db21wYXJlSW5kZXhLZXlzKG1faXRl
cmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIHsKKyAgICAgICAgICAgICAgICBtX2l0ZXJh
dG9yLT5QcmV2KCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIWxvYWRDdXJyZW50Um93KCkpIHsKKyAgICAgICAgICAg
IGlmIChtX2ZvcndhcmQpCisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+TmV4dCgpOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPlByZXYoKTsKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQogfQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29u
c3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlvbikKK2Jvb2wgQ3Vyc29ySW1wbENv
bW1vbjo6Y29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqIGtleSkKIHsKLSAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gMDsKKyAgICAv
LyBGSVhNRTogVGhpcyBzaGFyZXMgYSBsb3Qgb2YgY29kZSB3aXRoIGZpcnN0U2Vlay4KKworICAg
IGZvciAoOzspIHsKKyAgICAgICAgaWYgKG1fZm9yd2FyZCkKKyAgICAgICAgICAgIG1faXRlcmF0
b3ItPk5leHQoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9pdGVyYXRvci0+UHJldigp
OworCisgICAgICAgIGlmICghbV9pdGVyYXRvci0+VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBzdGQ6OnN0cmluZyB0cmFzaDsKKyAgICAgICAgaWYgKG1fZGIt
PkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBtX2l0ZXJhdG9yLT5rZXkoKSwgJnRyYXNoKS5J
c05vdEZvdW5kKCkpCisgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG1fZm9y
d2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhtX2l0ZXJh
dG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSAvLyBoaWdoIGtleSBub3QgaW5jbHVkZWQgaW4g
cmFuZ2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAm
JiAhbV9oaWdoT3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+
a2V5KCksIG1faGlnaEtleSkgPiAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAoIW1fZm9yd2FyZCAmJiBtX2xvd09wZW4gJiYgY29tcGFyYXRvci5Db21wYXJlSW5kZXhL
ZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgLy8gbG93IGtleSBub3QgaW5j
bHVkZWQgaW4gcmFuZ2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFt
X2ZvcndhcmQgJiYgIW1fbG93T3BlbiAmJiBjb21wYXJhdG9yLkNvbXBhcmVJbmRleEtleXMobV9p
dGVyYXRvci0+a2V5KCksIG1fbG93S2V5KSA8IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKG1fZm9yd2FyZCkgeworICAg
ICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRLZXktPmlzTGVzc1RoYW4oa2V5KSkKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmIChrZXktPmlzTGVzc1RoYW4obV9jdXJyZW50S2V5LmdldCgpKSkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAv
LyBGSVhNRTogT2JleSB0aGUgdW5pcXVlbmVzcyBjb25zdHJhaW50IChhbmQgdGVzdCBmb3IgaXQh
KQorCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFz
cyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJs
aWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8T2JqZWN0U3RvcmVDdXJzb3JJbXBsPiBjcmVhdGUo
bGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4s
IGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQp
CisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlQ3Vyc29ySW1w
bChkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkpOworICAg
IH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgp
IHsgcmV0dXJuIG1fY3VycmVudFZhbHVlOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9yZVJlY29y
ZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZp
cnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVy
biAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6Cisg
ICAgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKGxldmVsZGI6OkRCKiBkYiwgY29uc3Qgc3RkOjpzdHJp
bmcmIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBzdGQ6OnN0cmluZyYgaGlnaEtleSwgYm9v
bCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIs
IGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAg
IH0KKworICAgIFN0cmluZyBtX2N1cnJlbnRWYWx1ZTsKK307CisKK2Jvb2wgT2JqZWN0U3RvcmVD
dXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRl
cmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBrZXlMaW1pdCA9IHAgKyBtX2l0
ZXJhdG9yLT5rZXkoKS5zaXplKCk7CisKKyAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3Rv
cmVEYXRhS2V5OworICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1p
dCwgJm9iamVjdFN0b3JlRGF0YUtleSk7CisgICAgQVNTRVJUKHApOworICAgIGlmICghcCkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9jdXJyZW50S2V5ID0gb2JqZWN0U3RvcmVEYXRh
S2V5LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBx
ID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpLCBtX2l0ZXJhdG9yLT52
YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVlKCkuc2l6ZSgpLCB2ZXJzaW9uKTsKKyAg
ICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3Rh
dGljX2Nhc3Q8dm9pZD4odmVyc2lvbik7CisKKyAgICBtX2N1cnJlbnRWYWx1ZSA9IGRlY29kZVN0
cmluZyhxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmRhdGEoKSArIG1faXRlcmF0b3ItPnZhbHVlKCku
c2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEtleUN1cnNvcklt
cGwgOiBwdWJsaWMgQ3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8SW5kZXhLZXlDdXJzb3JJbXBsPiBjcmVhdGUobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBz
dGQ6OnN0cmluZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdo
S2V5LCBib29sIGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgeworICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEluZGV4S2V5Q3Vyc29ySW1wbChkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdo
S2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkpOworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21t
b24KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJl
dHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlL
ZXkoKSB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVj
b3JkSWRlbnRpZmllcigpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAg
dmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0
dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKKworcHJpdmF0ZToK
KyAgICBJbmRleEtleUN1cnNvckltcGwobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmlu
ZyYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29s
IGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihkYiwg
bG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkKKyAgICB7CisgICAg
fQorCisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworfTsKKworYm9vbCBJbmRleEtl
eUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBwID0gbV9p
dGVyYXRvci0+a2V5KCkuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0gcCArIG1f
aXRlcmF0b3ItPmtleSgpLnNpemUoKTsKKyAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5Owor
ICAgIHAgPSBJbmRleERhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1pdCwgJmluZGV4RGF0YUtleSk7
CisKKyAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOworCisgICAgaW50
NjRfdCBpbmRleERhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQo
bV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpICsg
bV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCksIGluZGV4RGF0YVZlcnNpb24pOworICAgIEFTU0VS
VChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHEgPSBkZWNv
ZGVJREJLZXkocSwgbV9pdGVyYXRvci0+dmFsdWUoKS5kYXRhKCkgKyBtX2l0ZXJhdG9yLT52YWx1
ZSgpLnNpemUoKSwgbV9wcmltYXJ5S2V5KTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzdGQ6OnN0cmluZyBwcmltYXJ5TGV2ZWxEQktl
eSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCks
IGluZGV4RGF0YUtleS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgc3Rk
OjpzdHJpbmcgcmVzdWx0OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbV9kYi0+R2V0KGxldmVs
ZGI6OlJlYWRPcHRpb25zKCksIHByaW1hcnlMZXZlbERCS2V5LCAmcmVzdWx0KTsKKyAgICBpZiAo
IXMub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCBvYmplY3RTdG9y
ZURhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmNf
c3RyKCksIHJlc3VsdC5jX3N0cigpICsgcmVzdWx0Lmxlbmd0aCgpLCBvYmplY3RTdG9yZURhdGFW
ZXJzaW9uKTsKKyAgICBBU1NFUlQodCk7CisgICAgaWYgKCF0KQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9u
KSB7IC8vIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCB2ZXJ5IHdlbGwgY292ZXJlZCBieSB0
aGUgbGF5b3V0IHRlc3RzLgorICAgICAgICBtX2RiLT5EZWxldGUobGV2ZWxkYjo6V3JpdGVPcHRp
b25zKCksIG1faXRlcmF0b3ItPmtleSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEN1cnNvckltcGwgOiBwdWJsaWMg
Q3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8SW5kZXhD
dXJzb3JJbXBsPiBjcmVhdGUobGV2ZWxkYjo6REIqIGRiLCBjb25zdCBzdGQ6OnN0cmluZyYgbG93
S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBoaWdoS2V5LCBib29sIGhpZ2hP
cGVuLCBib29sIGZvcndhcmQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElu
ZGV4Q3Vyc29ySW1wbChkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9y
d2FyZCkpOworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
PiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyBy
ZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05P
VF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitw
cml2YXRlOgorICAgIEluZGV4Q3Vyc29ySW1wbChsZXZlbGRiOjpEQiogZGIsIGNvbnN0IHN0ZDo6
c3RyaW5nJiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGhpZ2hLZXks
IGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9u
KGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsK
KyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7CisgICAgU3RyaW5nIG1f
dmFsdWU7CisgICAgc3RkOjpzdHJpbmcgbV9wcmltYXJ5TGV2ZWxEQktleTsKK307CisKK2Jvb2wg
SW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29uc3QgY2hhciAqcCA9
IG1faXRlcmF0b3ItPmtleSgpLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyICpsaW1pdCA9IHAgKyBt
X2l0ZXJhdG9yLT5rZXkoKS5zaXplKCk7CisKKyAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5
OworICAgIHAgPSBJbmRleERhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmluZGV4RGF0YUtleSk7
CisKKyAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOworCisgICAgY29u
c3QgY2hhciAqcSA9IG1faXRlcmF0b3ItPnZhbHVlKCkuZGF0YSgpOworICAgIGNvbnN0IGNoYXIg
KnZhbHVlTGltaXQgPSBxICsgbV9pdGVyYXRvci0+dmFsdWUoKS5zaXplKCk7CisKKyAgICBpbnQ2
NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgcSA9IGRlY29kZVZhckludChxLCB2YWx1ZUxpbWl0
LCBpbmRleERhdGFWZXJzaW9uKTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgcSA9IGRlY29kZUlEQktleShxLCB2YWx1ZUxpbWl0LCBtX3By
aW1hcnlLZXkpOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIG1fcHJpbWFyeUxldmVsREJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVu
Y29kZShpbmRleERhdGFLZXkuZGF0YWJhc2VJZCgpLCBpbmRleERhdGFLZXkub2JqZWN0U3RvcmVJ
ZCgpLCAqbV9wcmltYXJ5S2V5KTsKKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBsZXZl
bGRiOjpTdGF0dXMgcyA9IG1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBtX3ByaW1h
cnlMZXZlbERCS2V5LCAmcmVzdWx0KTsKKyAgICBpZiAoIXMub2soKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAgIGNvbnN0
IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5jX3N0cigpICsg
cmVzdWx0Lmxlbmd0aCgpLCBvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsKKyAgICBBU1NFUlQodCk7
CisgICAgaWYgKCF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAob2JqZWN0U3Rv
cmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAgICAgIG1fZGItPkRlbGV0
ZShsZXZlbGRiOjpXcml0ZU9wdGlvbnMoKSwgbV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV92YWx1ZSA9IGRlY29kZVN0cmluZyh0LCByZXN1
bHQuY19zdHIoKSArIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30K
Kworc3RhdGljIGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8obGV2ZWxkYjo6REIqIGRiLCBj
b25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBzdGQ6OnN0cmluZyYgZm91bmRLZXkpCit7CisgICAg
T3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBpdChkYi0+TmV3SXRlcmF0b3IobGV2ZWxkYjo6UmVh
ZE9wdGlvbnMoKSkpOworICAgIGl0LT5TZWVrKHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5WYWxp
ZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoaXQtPlZhbGlkKCkgJiYg
IWNvbXBhcmF0b3IuQ29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkpIHsKKyAgICAg
ICAgZm91bmRLZXkgPSBpdC0+a2V5KCkuVG9TdHJpbmcoKTsKKyAgICAgICAgaXQtPk5leHQoKTsK
KyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29y
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlS
YW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29s
IGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91
bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0
aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1
cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIHN0ZDo6
c3RyaW5nIHN0YXJ0S2V5LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAg
ICAgIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgICAgICBsb3dlck9wZW4gPSB0cnVlOyAvLyBO
b3QgaW5jbHVkZWQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPmxvd2Vy
KCkpOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisg
ICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisgICAg
ICAgIHVwcGVyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgICAgICBpZiAoIWZv
cndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICgh
ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPnVwcGVyKCkp
OworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAg
UmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVDdXJzb3JJ
bXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBw
ZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGly
ZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5n
ZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIo
KTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19E
VVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxv
d2VyT3BlbiwgdXBwZXJPcGVuOworICAgIHN0ZDo6c3RyaW5nIHN0YXJ0S2V5LCBzdG9wS2V5Owor
CisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWluSURCS2V5KCks
IDApOworICAgICAgICBsb3dlck9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisgICAgfSBlbHNl
IHsKKyAgICAgICAgc3RhcnRLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxvd2VyKCksIDApOworICAgICAgICBsb3dl
ck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJvdW5k
KSB7CisgICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBtYXhJREJLZXkoKSwgMCk7CisgICAgICAgIHVwcGVyT3Bl
biA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKworICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8gV2Ug
bmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5
TGVzc1RoYW4obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPnVwcGVyKCksIDApOworICAgICAg
ICBpZiAoIWZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1fZGIuZ2V0KCksIHN0b3BLZXksIHN0b3BL
ZXkpKSAvLyBTZWVrIHRvIHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBr
ZXlzLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB1cHBlck9wZW4gPSByYW5n
ZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4g
Y3Vyc29yID0gSW5kZXhLZXlDdXJzb3JJbXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXks
IGxvd2VyT3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNv
ci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5y
ZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxl
dmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSog
cmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2Vy
Qm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSBy
YW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09
IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6
TkVYVCk7CisKKyAgICBib29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIHN0ZDo6c3RyaW5n
IHN0YXJ0S2V5LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIHN0
YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgbWluSURCS2V5KCksIDApOworICAgICAgICBsb3dlck9wZW4gPSBmYWxzZTsgLy8g
SW5jbHVkZWQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBJbmRleERhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxvd2Vy
KCksIDApOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQor
CisgICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtYXhJREJLZXkoKSwg
MCk7CisgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKworICAgICAgICBp
ZiAoIWZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAg
IGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtl
eSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBm
YWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBJbmRleERh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2Ut
PnVwcGVyKCksIDApOworICAgICAgICBpZiAoIWZpbmRMYXN0SW5kZXhLZXlFcXVhbFRvKG1fZGIu
Z2V0KCksIHN0b3BLZXksIHN0b3BLZXkpKSAvLyBTZWVrIHRvIHRoZSAqbGFzdCoga2V5IGluIHRo
ZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRy
PEluZGV4Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhDdXJzb3JJbXBsOjpjcmVhdGUobV9kYi5n
ZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3YXJkKTsK
KyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
cmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBEdW1teVRy
YW5zYWN0aW9uIDogcHVibGljIElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24geworcHVibGlj
OgorICAgIHZpcnR1YWwgdm9pZCBiZWdpbigpIHt9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgp
IHt9CisgICAgdmlydHVhbCB2b2lkIHJvbGxiYWNrKCkge30KK307CiB9CiAKIFBhc3NSZWZQdHI8
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3Jl
YXRlVHJhbnNhY3Rpb24oKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTog
SW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGltcGxl
bWVudCBhIHRyYW5zYWN0aW9uIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIGZvciByb2xsLWJhY2tz
LCBhbmQgd3JpdGUgdGVzdHMgZm9yIGl0LgorICAgIHJldHVybiBhZG9wdFJlZihuZXcgRHVtbXlU
cmFuc2FjdGlvbigpKTsKIH0KIAorLy8gRklYTUU6IGRlbGV0ZURhdGFiYXNlIHNob3VsZCBiZSBw
YXJ0IG9mIElEQkJhY2tpbmdTdG9yZS4KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5k
aWYgLy8gRU5BQkxFKExFVkVMREIpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>89772</attachid>
            <date>2011-04-15 05:50:18 -0700</date>
            <delta_ts>2011-04-18 15:27:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110415135015.patch</filename>
            <type>text/plain</type>
            <size>119428</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA1MTkxY2Q5ODA1NmY0NGQ5YTA1ODcxNzQyNDg0NDNhNTQ0NDA0OGUxLi4z
YjVmMzhlZWEwMmE2MjcyNTIzMDUxNGRmNDk4ZGYwYzg0MDA1YzY4IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMTcyIEBACisyMDExLTA0LTE1ICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2
ZWxEQiBiYWNrZW5kIGZvciBJbmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU3MzcyCisKKyAgICAgICAgT25seSBhdmFpbGFibGUgYmVoaW5k
IGEgcnVuLXRpbWUgZmxhZy4gQ292ZXJlZCBieSBleGlzdGluZyBsYXlvdXQgdGVzdHMuCisKKyAg
ICAgICAgKiBXZWJDb3JlLmd5cC9XZWJDb3JlLmd5cDoKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6
CisgICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJEYXRhYmFzZTo6TGV2ZWxEQkRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxldmVsREJEYXRhYmFzZTo6fkxldmVsREJEYXRhYmFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMZXZlbERCRGF0YWJhc2U6Om9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6
bWFrZVNsaWNlKToKKyAgICAgICAgKFdlYkNvcmU6Om1ha2VWZWN0b3IpOgorICAgICAgICAoV2Vi
Q29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpwdXQpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRh
dGFiYXNlOjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpnZXQp
OgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpuZXdJdGVyYXRvcik6CisgICAg
ICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuaDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6fkxldmVsREJJdGVyYXRvcik6CisgICAgICAgIChX
ZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OkxldmVsREJJdGVyYXRvcik6CisgICAgICAgIChXZWJD
b3JlOjptYWtlU2xpY2UpOgorICAgICAgICAoV2ViQ29yZTo6bWFrZUxldmVsREJTbGljZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OmlzVmFsaWQpOgorICAgICAgICAoV2Vi
Q29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjpzZWVrVG9MYXN0KToKKyAgICAgICAgKFdlYkNvcmU6Okxl
dmVsREJJdGVyYXRvcjo6c2Vlayk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6
Om5leHQpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjpwcmV2KToKKyAgICAg
ICAgKFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6a2V5KToKKyAgICAgICAgKFdlYkNvcmU6Okxl
dmVsREJJdGVyYXRvcjo6dmFsdWUpOgorICAgICAgICAqIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
Qkl0ZXJhdG9yLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQlNs
aWNlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQlNsaWNlOjpMZXZlbERCU2xp
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQlNsaWNlOjp+TGV2ZWxEQlNsaWNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxldmVsREJTbGljZTo6YmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6
TGV2ZWxEQlNsaWNlOjplbmQpOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVCeXRlKToKKyAgICAgICAgKFdlYkNv
cmU6Om1heElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjptaW5JREJLZXkpOgorICAgICAgICAo
V2ViQ29yZTo6ZW5jb2RlSW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZUludCk6CisgICAg
ICAgIChXZWJDb3JlOjplbmNvZGVWYXJJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlVmFy
SW50KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZyk6CisgICAgICAgIChXZWJDb3Jl
OjpkZWNvZGVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlU3RyaW5nV2l0aExlbik6
CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVTdHJpbmdXaXRoTGVuKToKKyAgICAgICAgKFdlYkNv
cmU6OmVuY29kZURvdWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVEb3VibGUpOgorICAg
ICAgICAoV2ViQ29yZTo6ZW5jb2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZUlE
QktleSk6CisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0RW5jb2RlZElEQktleSk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wYXJlRW5jb2RlZElEQktleXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0
SW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEludCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRT
dHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6U2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6TWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJhc2VGcmVlTGlzdEtleSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRh
dGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZUZyZWVMaXN0
S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1l
S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlTmFtZUtl
eTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VOYW1lS2V5
OjpkYXRhYmFzZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU5h
bWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZU1l
dGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5KToKKyAgICAgICAgKFdlYkNv
cmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6b2JqZWN0
U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlTWV0YURh
dGFLZXk6Om1ldGFEYXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpJbmRleE1ldGFEYXRhS2V5OjpJbmRleE1ldGFEYXRhS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmluZGV4SWQpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5OjptZXRhRGF0YVR5cGUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpPYmplY3RTdG9yZUZy
ZWVMaXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVGcmVl
TGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3Rv
cmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2Vi
Q29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjpJbmRleEZyZWVMaXN0S2V5KToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6ZGVjb2RlKToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAg
ICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6Y29tcGFyZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6Om9iamVjdFN0b3Jl
SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjppbmRl
eElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1lc0tleTo6
ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1lc0tl
eTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVOYW1l
c0tleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3Jl
TmFtZXNLZXk6Om9iamVjdFN0b3JlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
OkluZGV4TmFtZXNLZXk6OkluZGV4TmFtZXNLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpJbmRleE5hbWVzS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpJbmRleE5hbWVzS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJ
bmRleE5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5k
ZXhOYW1lc0tleTo6aW5kZXhOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2Jq
ZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpP
YmplY3RTdG9yZURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
Ok9iamVjdFN0b3JlRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVm
aXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6dXNlcktleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQ
cmVmaXg6OkV4aXN0c0VudHJ5S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZp
eDo6RXhpc3RzRW50cnlLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpFeGlzdHNFbnRyeUtleTo6dXNlcktleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
OkluZGV4RGF0YUtleTo6SW5kZXhEYXRhS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZp
eDo6SW5kZXhEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJ
bmRleERhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4
RGF0YUtleTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5k
ZXhEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhE
YXRhS2V5OjpkYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhE
YXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5k
ZXhEYXRhS2V5OjppbmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhE
YXRhS2V5Ojp1c2VyS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6cmVhbENvbXBh
cmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4Ojpjb21wYXJlS2V5cyk6CisgICAgICAg
IChXZWJDb3JlOjpLZXlQcmVmaXg6OmNvbXBhcmVJbmRleEtleXMpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpDb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6Oktl
eVByZWZpeDo6Q29tcGFyYXRvcjo6TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
OkNvbXBhcmF0b3I6OkZpbmRTaG9ydGVzdFNlcGFyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6OkNvbXBhcmF0b3I6OkZpbmRTaG9ydFN1Y2Nlc3Nvcik6CisgICAgICAgIChXZWJD
b3JlOjpzZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpnZXROZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld09iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVsZXRlUmFuZ2Up
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0
U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2Jq
ZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJlcik6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9y
ZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVh
ck9iamVjdFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2Jq
ZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9y
RWFjaE9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFG
b3JSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4pOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRh
Rm9yUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dE9iamVjdFZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OnZlcnNpb25FeGlzdHMpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUlu
ZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0
c0luSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6ZmluZExhc3RJbmRleEtleUVxdWFsVG8pOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3Jl
Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEtleUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpvcGVuSW5kZXhDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24pOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5oOgorCiAyMDExLTA0LTE0ICBSZW5hdGEgSG9kb3ZhbiAgPHJlbmlAd2Via2l0
Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBOaWtvbGFzIFppbW1lcm1hbm4uCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cCBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDYyYWRmOGY1OGYwY2RlMDkxMDYxOTEw
OWFhNTY4YzkwMzRjNDhiZGYuLjc2ZDg5YTM3MTI5NmRjMThmODk3YTNiMmU1YmNkMDE1ODFmZGIx
NzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCkBAIC0xODQsNiArMTg0
LDcgQEAKICAgICAgICcuLi9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy94Ym0nLAogICAgICAgJy4u
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAnLAogICAgICAgJy4uL3BsYXRmb3JtL2ltYWdl
LWVuY29kZXJzL3NraWEnLAorICAgICAgJy4uL3BsYXRmb3JtL2xldmVsZGInLAogICAgICAgJy4u
L3BsYXRmb3JtL21vY2snLAogICAgICAgJy4uL3BsYXRmb3JtL25ldHdvcmsnLAogICAgICAgJy4u
L3BsYXRmb3JtL25ldHdvcmsvY2hyb21pdW0nLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDE4NzMyMDlk
NjJkNDZjZTBjZDMxODYwMzRiYjFmNjlmMTcwMGExNTQuLjUwOTIxMzg5MmYxODU3MDU1NjI0MWRh
MDIxMjVmYjk2YWYxNjVlNzYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lw
aQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTg1Nyw2ICs4NTcsMTEgQEAK
ICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybU9wZXJh
dGlvbnMuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFu
c2Zvcm1hdGlvbk1hdHJpeC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ndGsvUGFzdGVib2Fy
ZEhlbHBlci5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFz
ZS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmgn
LAorICAgICAgICAgICAgJ3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNwcCcsCisg
ICAgICAgICAgICAncGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaCcsCisgICAgICAg
ICAgICAncGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaCcsCiAgICAgICAgICAgICAncGxh
dGZvcm0vbWFjL0Jsb2NrRXhjZXB0aW9ucy5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9tYWMv
Q2xpcGJvYXJkTWFjLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL21hYy9FbXB0eVByb3RvY29s
RGVmaW5pdGlvbnMuaCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZl
bGRiL0xldmVsREJEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRi
L0xldmVsREJEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjIxMWRjMmQwNDM3MDkyZGU3ZjMyZDUw
MTk4YmJiNzIxZTRhOGQ4YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMZXZlbERCRGF0YWJhc2UuaCIKKworI2lm
IEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgiCisjaW5jbHVk
ZSAiTGV2ZWxEQlNsaWNlLmgiCisjaW5jbHVkZSA8bGV2ZWxkYi9kYi5oPgorI2luY2x1ZGUgPGxl
dmVsZGIvc2xpY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0xldmVsREJEYXRhYmFzZTo6TGV2ZWxEQkRhdGFiYXNlKCkKKyAgICA6IG1fZGIo
MCkKK3sKK30KKworTGV2ZWxEQkRhdGFiYXNlOjp+TGV2ZWxEQkRhdGFiYXNlKCkKK3sKKyAgICBk
ZWxldGUgbV9kYjsKK30KKworTGV2ZWxEQkRhdGFiYXNlKiBMZXZlbERCRGF0YWJhc2U6Om9wZW4o
Y29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgbGV2ZWxkYjo6Q29tcGFyYXRvciogY29tcGFy
YXRvcikKK3sKKyAgICBMZXZlbERCRGF0YWJhc2UqIHJlc3VsdCA9IG5ldyBMZXZlbERCRGF0YWJh
c2UoKTsKKworICAgIGxldmVsZGI6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXBh
cmF0b3IgPSBjb21wYXJhdG9yOworICAgIG9wdGlvbnMuY3JlYXRlX2lmX21pc3NpbmcgPSB0cnVl
OworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbGV2ZWxkYjo6REI6Ok9wZW4ob3B0aW9ucywgZmls
ZU5hbWUudXRmOCgpLmRhdGEoKSwgJnJlc3VsdC0+bV9kYik7CisKKyAgICBpZiAoIXMub2soKSkg
eworICAgICAgICBkZWxldGUgcmVzdWx0OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgbGV2ZWxkYjo6U2xpY2UgbWFrZVNsaWNlKGNv
bnN0IFZlY3RvcjxjaGFyPiYgdmFsdWUpCit7CisgICAgcmV0dXJuIGxldmVsZGI6OlNsaWNlKHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KKworc3RhdGljIGxldmVsZGI6OlNsaWNlIG1h
a2VTbGljZShjb25zdCBMZXZlbERCU2xpY2UmIHMpCit7CisgICAgcmV0dXJuIGxldmVsZGI6OlNs
aWNlKHMuYmVnaW4oKSwgcy5lbmQoKSAtIHMuYmVnaW4oKSk7Cit9CisKK3N0YXRpYyBWZWN0b3I8
Y2hhcj4gbWFrZVZlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgcykKK3sKKyAgICBWZWN0b3I8Y2hh
cj4gcmVzOworICAgIHJlcy5hcHBlbmQocy5jX3N0cigpLCBzLmxlbmd0aCgpKTsKKyAgICByZXR1
cm4gcmVzOworfQorCitib29sIExldmVsREJEYXRhYmFzZTo6cHV0KGNvbnN0IExldmVsREJTbGlj
ZSYga2V5LCBjb25zdCBWZWN0b3I8Y2hhcj4mIHZhbHVlKQoreworICAgIGxldmVsZGI6OldyaXRl
T3B0aW9ucyB3cml0ZU9wdGlvbnM7CisgICAgd3JpdGVPcHRpb25zLnN5bmMgPSBmYWxzZTsKKwor
ICAgIHJldHVybiBtX2RiLT5QdXQod3JpdGVPcHRpb25zLCBtYWtlU2xpY2Uoa2V5KSwgbWFrZVNs
aWNlKHZhbHVlKSkub2soKTsKK30KKworYm9vbCBMZXZlbERCRGF0YWJhc2U6OnJlbW92ZShjb25z
dCBMZXZlbERCU2xpY2UmIGtleSkKK3sKKyAgICBsZXZlbGRiOjpXcml0ZU9wdGlvbnMgd3JpdGVP
cHRpb25zOworICAgIHdyaXRlT3B0aW9ucy5zeW5jID0gZmFsc2U7CisKKyAgICByZXR1cm4gbV9k
Yi0+RGVsZXRlKHdyaXRlT3B0aW9ucywgbWFrZVNsaWNlKGtleSkpLm9rKCk7Cit9CisKK2Jvb2wg
TGV2ZWxEQkRhdGFiYXNlOjpnZXQoY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIFZlY3RvcjxjaGFy
PiYgdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGlmICghbV9kYi0+R2V0
KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1ha2VTbGljZShrZXkpLCAmcmVzdWx0KS5vaygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2YWx1ZSA9IG1ha2VWZWN0b3IocmVzdWx0KTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworTGV2ZWxEQkl0ZXJhdG9yKiBMZXZlbERCRGF0YWJhc2U6
Om5ld0l0ZXJhdG9yKCkKK3sKKyAgICBsZXZlbGRiOjpJdGVyYXRvciogaSA9IG1fZGItPk5ld0l0
ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpOworICAgIGlmICghaSkgLy8gRklYTUU6IERv
dWJsZSBjaGVjayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIGNoZWNrIHRoaXMuCisgICAgICAgIHJl
dHVybiAwOworICAgIHJldHVybiBuZXcgTGV2ZWxEQkl0ZXJhdG9yKGkpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjJiYThiYmM1ZDQzNDA4NTU0MTFkNGQ2OGNjMzM5MTc2MDE3NzI2NWQKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5oCkBA
IC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExldmVsREJEYXRhYmFzZV9oCisjZGVmaW5l
IExldmVsREJEYXRhYmFzZV9oCisKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8VmVjdG9yLmg+CisKK25hbWVzcGFjZSBsZXZlbGRi
IHsKK2NsYXNzIENvbXBhcmF0b3I7CitjbGFzcyBEQjsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBMZXZlbERCV3JpdGVCYXRjaDsKK2NsYXNzIExldmVsREJJdGVyYXRvcjsKK2Ns
YXNzIExldmVsREJTbGljZTsKKworY2xhc3MgTGV2ZWxEQkRhdGFiYXNlIHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgTGV2ZWxEQkRhdGFiYXNlKiBvcGVuKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNv
bnN0IGxldmVsZGI6OkNvbXBhcmF0b3IqKTsKKyAgICB+TGV2ZWxEQkRhdGFiYXNlKCk7CisKKyAg
ICBib29sIHB1dChjb25zdCBMZXZlbERCU2xpY2UmIGtleSwgY29uc3QgVmVjdG9yPGNoYXI+JiB2
YWx1ZSk7CisgICAgYm9vbCByZW1vdmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXkpOworICAgIGJv
b2wgZ2V0KGNvbnN0IExldmVsREJTbGljZSYga2V5LCBWZWN0b3I8Y2hhcj4mIHZhbHVlKTsKKyAg
ICBMZXZlbERCSXRlcmF0b3IqIG5ld0l0ZXJhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgTGV2ZWxE
QkRhdGFiYXNlKCk7CisKKyAgICBsZXZlbGRiOjpEQiogbV9kYjsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIExldmVs
REJEYXRhYmFzZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRi
L0xldmVsREJJdGVyYXRvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xl
dmVsREJJdGVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODY4NDI3ZDEwZTg2YzIxZTg4ZDkyYjgzNTlj
NjU5MjZkMTc5NGIyNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNwcApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQg
SVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAq
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5oIgorCisjaWYgRU5B
QkxFKExFVkVMREIpCisKKyNpbmNsdWRlIDxsZXZlbGRiL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8
bGV2ZWxkYi9zbGljZS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMZXZlbERC
SXRlcmF0b3I6On5MZXZlbERCSXRlcmF0b3IoKQoreworICAgIGRlbGV0ZSBtX2l0ZXJhdG9yOwor
fQorCitMZXZlbERCSXRlcmF0b3I6OkxldmVsREJJdGVyYXRvcihsZXZlbGRiOjpJdGVyYXRvciog
aXQpCisgICAgOiBtX2l0ZXJhdG9yKGl0KQoreworfQorCitzdGF0aWMgbGV2ZWxkYjo6U2xpY2Ug
bWFrZVNsaWNlKGNvbnN0IFZlY3RvcjxjaGFyPiYgdmFsdWUpCit7CisgICAgcmV0dXJuIGxldmVs
ZGI6OlNsaWNlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KKworc3RhdGljIExldmVs
REJTbGljZSBtYWtlTGV2ZWxEQlNsaWNlKGxldmVsZGI6OlNsaWNlIHMpCit7CisgICAgcmV0dXJu
IExldmVsREJTbGljZShzLmRhdGEoKSwgcy5kYXRhKCkgKyBzLnNpemUoKSk7Cit9CisKK2Jvb2wg
TGV2ZWxEQkl0ZXJhdG9yOjppc1ZhbGlkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pdGVyYXRv
ci0+VmFsaWQoKTsKK30KKwordm9pZCBMZXZlbERCSXRlcmF0b3I6OnNlZWtUb0xhc3QoKQorewor
ICAgIG1faXRlcmF0b3ItPlNlZWtUb0xhc3QoKTsKK30KKwordm9pZCBMZXZlbERCSXRlcmF0b3I6
OnNlZWsoY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQpCit7CisgICAgbV9pdGVyYXRvci0+U2Vl
ayhtYWtlU2xpY2UodGFyZ2V0KSk7Cit9CisKK3ZvaWQgTGV2ZWxEQkl0ZXJhdG9yOjpuZXh0KCkK
K3sKKyAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7Cit9CisKK3ZvaWQgTGV2ZWxEQkl0ZXJhdG9yOjpw
cmV2KCkKK3sKKyAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7Cit9CisKK0xldmVsREJTbGljZSBMZXZl
bERCSXRlcmF0b3I6OmtleSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1ha2VMZXZlbERCU2xpY2Uo
bV9pdGVyYXRvci0+a2V5KCkpOworfQorCitMZXZlbERCU2xpY2UgTGV2ZWxEQkl0ZXJhdG9yOjp2
YWx1ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1ha2VMZXZlbERCU2xpY2UobV9pdGVyYXRvci0+
dmFsdWUoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJM
RShMRVZFTERCKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9M
ZXZlbERCSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
Qkl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmFhZTkwNmFkYmIzOWFkMTM5ZDA5YTBjNzYwMDU4N2M3
ZjgzOGUzYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVs
ZGIvTGV2ZWxEQkl0ZXJhdG9yLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTGV2
ZWxEQkl0ZXJhdG9yX2gKKyNkZWZpbmUgTGV2ZWxEQkl0ZXJhdG9yX2gKKworI2lmIEVOQUJMRShM
RVZFTERCKQorCisjaW5jbHVkZSAiTGV2ZWxEQlNsaWNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1T
dHJpbmcuaCIKKyNpbmNsdWRlIDxWZWN0b3IuaD4KKworbmFtZXNwYWNlIGxldmVsZGIgeworY2xh
c3MgSXRlcmF0b3I7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGV2ZWxEQkl0
ZXJhdG9yIHsKK3B1YmxpYzoKKyAgICB+TGV2ZWxEQkl0ZXJhdG9yKCk7CisKKyAgICBib29sIGlz
VmFsaWQoKSBjb25zdDsKKyAgICB2b2lkIHNlZWtUb0xhc3QoKTsKKyAgICB2b2lkIHNlZWsoY29u
c3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQpOworICAgIHZvaWQgbmV4dCgpOworICAgIHZvaWQgcHJl
digpOworICAgIExldmVsREJTbGljZSBrZXkoKSBjb25zdDsKKyAgICBMZXZlbERCU2xpY2UgdmFs
dWUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBMZXZlbERCSXRlcmF0b3IobGV2ZWxkYjo6SXRl
cmF0b3IqKTsKKyAgICBmcmllbmQgY2xhc3MgTGV2ZWxEQkRhdGFiYXNlOworCisgICAgbGV2ZWxk
Yjo6SXRlcmF0b3IqIG1faXRlcmF0b3I7Cit9OworCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIExldmVsREJJdGVyYXRvcl9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJTbGlj
ZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4xNWM1NzZjYTVlY2Q3ZDczZTBlMjllNGM3YmU1YmIyMTY5MmRkZGRlCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2Uu
aApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMZXZlbERCU2xpY2VfaAorI2RlZmlu
ZSBMZXZlbERCU2xpY2VfaAorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPFZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIExldmVsREJTbGljZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlNsaWNlKGNvbnN0
IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpCisgICAgICAgIDogbV9iZWdpbihiZWdpbikK
KyAgICAgICAgLCBtX2VuZChlbmQpCisgICAgeworICAgICAgICBBU1NFUlQobV9lbmQgPj0gbV9i
ZWdpbik7CisgICAgfQorCisgICAgTGV2ZWxEQlNsaWNlKGNvbnN0IFZlY3RvcjxjaGFyPiYgdikK
KyAgICAgICAgOiBtX2JlZ2luKHYuZGF0YSgpKQorICAgICAgICAsIG1fZW5kKG1fYmVnaW4gKyB2
LnNpemUoKSkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2VuZCA+PSBtX2JlZ2luKTsKKyAgICB9
CisKKyAgICB+TGV2ZWxEQlNsaWNlKCkKKyAgICB7CisgICAgfQorCisgICAgY29uc3QgY2hhciog
YmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2JlZ2luOyB9CisgICAgY29uc3QgY2hhciogZW5kKCkg
Y29uc3QgeyByZXR1cm4gbV9lbmQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtX2Jl
Z2luOworICAgIGNvbnN0IGNoYXIqIG1fZW5kOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gTGV2ZWxEQlNsaWNlX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3Bw
CmluZGV4IGMwNmVhMDA0MjIxNTU2MTU4NDY2YzNiZDI2MGQ1NmYyMzBiZDM3YTAuLjUzMmJhN2M5
YTU5YTViYzY3YjZiZTlkYmNkM2RmOTE1Mjg0NGZjNmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcApAQCAtMjksMTIgKzI5LDE1MjUg
QEAKICNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICNpZiBFTkFCTEUoTEVWRUxEQikKIAor
I2luY2x1ZGUgIkFzc2VydGlvbnMuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVk
ZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgiCi0jaW5jbHVkZSA8bGV2ZWxkYi9kYi5oPgorI2lu
Y2x1ZGUgIklEQktleVJhbmdlLmgiCisjaW5jbHVkZSAiTGV2ZWxEQkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGV2ZWxEQlNsaWNlLmgiCisjaW5j
bHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlIDxsZXZlbGRiL2NvbXBhcmF0b3IuaD4K
KyNpbmNsdWRlIDxsZXZlbGRiL3NsaWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZuZGVm
IElOVDY0X01BWAorLy8gRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHJlbHkgb24gdGhlc2Ug
bWFjcm9zLgorI2RlZmluZSBJTlQ2NF9NQVggMHg3ZmZmZmZmZmZmZmZmZmZmTEwKKyNlbmRpZgor
I2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYIDB4N2ZmZmZmZmZMCisjZW5kaWYK
KworLy8gTGV2ZWxEQiBzdG9yZXMga2V5L3ZhbHVlIHBhaXJzLiBLZXlzIGFuZCB2YWx1ZXMgYXJl
IHN0cmluZ3Mgb2YgYnl0ZXMsIG5vcm1hbGx5IG9mIHR5cGUgc3RkOjpzdHJpbmcuCisvLyBUaGUg
c3RkOjpzdHJpbmdzIGRvbid0IGhhdmUgYW55IHBhcnRpY3VsYXIgZW5jb2RpbmcsIGFuZCBhcmVu
J3QgbnVsbCB0ZXJtaW5hdGVkLgorLy8KKy8vIFRoZSBrZXlzIGluIHRoZSBiYWNraW5nIHN0b3Jl
IGFyZSB2YXJpYWJsZS1sZW5ndGggdHVwbGVzIHdpdGggZGlmZmVyZW50IHR5cGVzCisvLyBvZiBm
aWVsZHMuIEVhY2gga2V5IGluIHRoZSBiYWNraW5nIHN0b3JlIHN0YXJ0cyB3aXRoIGEgdGVybmFy
eSBwcmVmaXg6IChkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCkuIEZvciBl
YWNoLCAwIGlzIHJlc2VydmVkIGZvciBtZXRhLWRhdGEuCisvLyBUaGUgcHJlZml4IG1ha2VzIHN1
cmUgdGhhdCBkYXRhIGZvciBhIHNwZWNpZmljIGRhdGFiYXNlLCBvYmplY3Qgc3RvcmUsIGFuZCBp
bmRleCBhcmUgZ3JvdXBlZCB0b2dldGhlci4gVGhlIGxvY2FsaXR5IGlzIGltcG9ydGFudCBmb3Ig
cGVyZm9ybWFuY2U6IGNvbW1vbgorLy8gb3BlcmF0aW9ucyBzaG91bGQgb25seSBuZWVkIGEgbWlu
aW1hbCBudW1iZXIgb2Ygc2VlayBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgYWxsIHRoZSBtZXRh
LWRhdGEgZm9yIGEgZGF0YWJhc2UgaXMgZ3JvdXBlZCB0b2dldGhlciBzbyB0aGF0IHJlYWRpbmcg
dGhhdAorLy8gbWV0YS1kYXRhIG9ubHkgcmVxdWlyZXMgb25lIHNlZWsuCisvLworLy8gRWFjaCBr
ZXkgdHlwZSBoYXMgYSBjbGFzcyAoaW4gc3F1YXJlIGJyYWNrZXRzIGJlbG93KSB3aGljaCBrbm93
cyBob3cgdG8gZW5jb2RlLCBkZWNvZGUsIGFuZCBjb21wYXJlIHRoYXQga2V5IHR5cGUuCisvLwor
Ly8gR2xvYmFsIG1ldGEtZGF0YSBoYXZlIGtleXMgd2l0aCBwcmVmaXggKDAsMCwwKSwgZm9sbG93
ZWQgYnkgYSB0eXBlIGJ5dGU6CisvLworLy8gICAgIDwwLCAwLCAwLCAwPiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBJbmRleGVkREIvTGV2ZWxEQiBzY2hlbWEg
dmVyc2lvbiAoMCBmb3Igbm93KSBbU2NoZW1hVmVyc2lvbktleV0KKy8vICAgICA8MCwgMCwgMCwg
MT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gVGhlIG1heGlt
dW0gZGF0YWJhc2UgaWQgZXZlciBhbGxvY2F0ZWQgW01heERhdGFiYXNlSWRLZXldCisvLyAgICAg
PDAsIDAsIDAsIDEwMCwgZGF0YWJhc2UgaWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+
IEV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBkYXRhYmFzZSBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtE
YXRhYmFzZUZyZWVMaXN0S2V5XQorLy8gICAgIDwwLCAwLCAwLCAyMDEsIHV0ZjE2IG9yaWdpbiBu
YW1lLCB1dGYxNiBkYXRhYmFzZSBuYW1lPiA9PiBEYXRhYmFzZSBpZCBbRGF0YWJhc2VOYW1lS2V5
XQorLy8KKy8vCisvLyBEYXRhYmFzZSBtZXRhLWRhdGE6CisvLworLy8gICAgIEFnYWluLCB0aGUg
cHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLgorLy8KKy8vICAgICA8ZGF0YWJhc2Ug
aWQsIDAsIDAsIDA+ID0+IHV0ZjE2IG9yaWdpbiBuYW1lIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQor
Ly8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMT4gPT4gdXRmMTYgZGF0YWJhc2UgbmFtZSBbRGF0
YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDI+ID0+IHV0ZjE2
IHVzZXIgdmVyc2lvbiBkYXRhIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFz
ZSBpZCwgMCwgMCwgMz4gPT4gbWF4aW11bSBvYmplY3Qgc3RvcmUgaWQgZXZlciBhbGxvY2F0ZWQg
W0RhdGFiYXNlTWV0YURhdGFLZXldCisvLworLy8KKy8vIE9iamVjdCBzdG9yZSBtZXRhLWRhdGE6
CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4g
YSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciwgYW5kIHRoZW4gYW5vdGhlciB2YXJpYWJsZS1sZW5n
dGggaW50ZWdlciAoRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgYnl0ZSkuCisvLworLy8gICAgIDxk
YXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMD4gPT4gdXRmMTYgb2JqZWN0
IHN0b3JlIG5hbWUgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlk
LCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAxPiA9PiB1dGYxNiBrZXkgcGF0aCBbT2JqZWN0
U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qg
c3RvcmUgaWQsIDI+ID0+IGhhcyBhdXRvIGluY3JlbWVudCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDM+ID0+
IGlzIGV2aWN0YWJsZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2Ug
aWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDQ+ID0+IGxhc3QgInZlcnNpb24iIG51bWJl
ciBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUw
LCBvYmplY3Qgc3RvcmUgaWQsIDU+ID0+IG1heGltdW0gaW5kZXggaWQgZXZlciBhbGxvY2F0ZWQg
W09iamVjdFN0b3JlTWV0YURhdGFLZXldCisvLworLy8KKy8vIEluZGV4IG1ldGEtZGF0YToKKy8v
CisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiB0d28g
dmFyaWFibGUtbGVuZ3RoIGludGVnZXJzLCBhbmQgdGhlbiBhbm90aGVyIHR5cGUgYnl0ZS4KKy8v
CisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXgg
aWQsIDA+ID0+IHV0ZjE2IGluZGV4IG5hbWUgW0luZGV4TWV0YURhdGFLZXldCisvLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDE+ID0+IGFy
ZSBpbmRleCBrZXlzIHVuaXF1ZSBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2Ug
aWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMj4gPT4gdXRmMTYga2V5
IHBhdGggW0luZGV4TWV0YURhdGFLZXldCisvLworLy8KKy8vIE90aGVyIG9iamVjdCBzdG9yZSBh
bmQgaW5kZXggbWV0YS1kYXRhOgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5
IGEgdHlwZSBieXRlLiBUaGUgb2JqZWN0IHN0b3JlIGFuZCBpbmRleCBpZCBhcmUgdmFyaWFibGUg
bGVuZ3RoIGludGVnZXJzLCB0aGUgdXRmMTYgc3RyaW5ncyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN0
cmluZ3MuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTUwLCBvYmplY3Qgc3RvcmUg
aWQ+ICAgICAgICAgICAgICAgICAgID0+IGV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBvYmplY3Qgc3Rv
cmUgaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbT2JqZWN0U3RvcmVGcmVlTGlzdEtleV0KKy8vICAg
ICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1MSwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZD4gICAg
ICAgICA9PiBleGlzdGVuY2UgaW1wbGllcyB0aGUgaW5kZXggaWQgaXMgaW4gdGhlIGZyZWUgbGlz
dCBbSW5kZXhGcmVlTGlzdEtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMCwgdXRm
MTYgb2JqZWN0IHN0b3JlIG5hbWU+ICAgICAgICAgICA9PiBvYmplY3Qgc3RvcmUgaWQgW09iamVj
dFN0b3JlTmFtZXNLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyMDEsIG9iamVjdCBz
dG9yZSBpZCwgdXRmMTYgaW5kZXggbmFtZT4gPT4gaW5kZXggaWQgW0luZGV4TmFtZXNLZXldCisv
LworLy8KKy8vIE9iamVjdCBzdG9yZSBkYXRhOgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZv
bGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXku
CisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCAxLCB1c2VyIGtleT4g
PT4gInZlcnNpb24iLCBzZXJpYWxpemVkIHNjcmlwdCB2YWx1ZSBbT2JqZWN0U3RvcmVEYXRhS2V5
XQorLy8KKy8vCisvLyAiRXhpc3RzIiBlbnRyeToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBm
b2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5
LgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMiwgdXNlciBrZXk+
ID0+ICJ2ZXJzaW9uIiBbRXhpc3RzRW50cnlLZXldCisvLworLy8KKy8vIEluZGV4IGRhdGE6Cisv
LworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2Vy
IGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4gVGhlIHNlcXVlbmNlIG51bWJlciBpcyBhIHZhcmlh
YmxlIGxlbmd0aCBpbnRlZ2VyLgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9y
ZSBpZCwgaW5kZXggaWQsIHVzZXIga2V5LCBzZXF1ZW5jZSBudW1iZXI+ID0+ICJ2ZXJzaW9uIiwg
dXNlciBrZXkgW0luZGV4RGF0YUtleV0KKy8vCisvLyAgICAgKFRoZSBzZXF1ZW5jZSBudW1iZXIg
aXMgdXNlZCB0byBhbGxvdyB0d28gZW50cmllcyB3aXRoIHRoZSBzYW1lIHVzZXIga2V5CisvLyAg
ICAgaW4gbm9uLXVuaXF1ZSBpbmRleGVzLiBUaGUgInZlcnNpb24iIGZpZWxkIGlzIHVzZWQgdG8g
d2VlZCBvdXQgc3RhbGUKKy8vICAgICBpbmRleCBkYXRhLiBXaGVuZXZlciBuZXcgb2JqZWN0IHN0
b3JlIGRhdGEgaXMgaW5zZXJ0ZWQsIGl0IGdldHMgYSBuZXcKKy8vICAgICAidmVyc2lvbiIgbnVt
YmVyLCBhbmQgbmV3IGluZGV4IGRhdGEgaXMgd3JpdHRlbiB3aXRoIHRoaXMgbnVtYmVyLiBXaGVu
CisvLyAgICAgdGhlIGluZGV4IGlzIHVzZWQgZm9yIGxvb2stdXBzLCBlbnRyaWVzIGFyZSB2YWxp
ZGF0ZWQgYWdhaW5zdCB0aGUKKy8vICAgICAiZXhpc3RzIiBlbnRyaWVzLCBhbmQgcmVjb3JkcyB3
aXRoIG9sZCAidmVyc2lvbiIgbnVtYmVycyBhcmUgZGVsZXRlZAorLy8gICAgIHdoZW4gdGhleSBh
cmUgZW5jb3VudGVyZWQgaW4gZ2V0UHJpbWFyeUtleVZpYUluZGV4LAorLy8gICAgIEluZGV4Q3Vy
c29ySW1wbDo6bG9hZEN1cnJlbnRSb3csIGFuZCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRDdXJy
ZW50Um93KS4KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bGxUeXBlQnl0
ZSA9IDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5U3RyaW5nVHlwZUJ5dGUg
PSAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleURhdGVUeXBlQnl0ZSA9IDI7
CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TnVtYmVyVHlwZUJ5dGUgPSAzOwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU1pbktleVR5cGVCeXRlID0gNDsKKwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga01pbmltdW1JbmRleElkID0gMzA7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVEYXRhSW5kZXhJZCA9IDE7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrRXhpc3RzRW50cnlJbmRleElkID0gMjsKKworc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIga1NjaGVtYVZlcnNpb25UeXBlQnl0ZSA9IDA7CitzdGF0aWMgY29u
c3QgdW5zaWduZWQgY2hhciBrTWF4RGF0YWJhc2VJZFR5cGVCeXRlID0gMTsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjaGFyIGtEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUgPSAxMDA7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUgPSAyMDE7CisKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUgPSA1MDsK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUgPSAxMDA7
CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRl
ID0gMTUwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4RnJlZUxpc3RUeXBlQnl0
ZSA9IDE1MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZU5hbWVzVHlw
ZUJ5dGUgPSAyMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhOYW1lc0tleVR5
cGVCeXRlID0gMjAxOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUlEQkxldmVsREJCYWNraW5n
U3RvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3Rv
cnlCYWNrZW5kSW1wbCogZmFjdG9yeSwgbGV2ZWxkYjo6REIqIGRiKQorc3RhdGljIFZlY3Rvcjxj
aGFyPiBlbmNvZGVCeXRlKHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgICBWZWN0b3I8Y2hhcj4gdjsK
KyAgICB2LmFwcGVuZChjKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIFZlY3RvcjxjaGFy
PiBtYXhJREJLZXkoKQoreworICAgIHJldHVybiBlbmNvZGVCeXRlKGtJREJLZXlOdWxsVHlwZUJ5
dGUpOworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IG1pbklEQktleSgpCit7CisgICAgcmV0dXJu
IGVuY29kZUJ5dGUoa0lEQktleU1pbktleVR5cGVCeXRlKTsKK30KKworc3RhdGljIFZlY3Rvcjxj
aGFyPiBlbmNvZGVJbnQoaW50NjRfdCBuKQoreworICAgIEFTU0VSVChuID49IDApOworICAgIFZl
Y3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBk
byB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG47CisgICAgICAgIHJldC5hcHBlbmQoYyk7
CisgICAgICAgIG4gPj49IDg7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1cm4gcmV0Owor
fQorCitzdGF0aWMgaW50NjRfdCBkZWNvZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNo
YXIqIGVuZCkKK3sKKyAgICBBU1NFUlQoYmVnaW4gPD0gZW5kKTsKKyAgICBpbnQ2NF90IHJldCA9
IDA7CisKKyAgICB3aGlsZSAoYmVnaW4gPCBlbmQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBj
ID0gKmJlZ2luKys7CisgICAgICAgIHJldCA9IChyZXQgPDwgOCkgfCBjOworICAgIH0KKworICAg
IHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlVmFySW50KGludDY0
X3QgbikKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNy
ZWF0aW9uLgorCisgICAgZG8geworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBuICYgMHg3ZjsK
KyAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgICBjIHw9IDEyODsK
KyAgICAgICAgcmV0LmFwcGVuZChjKTsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVybiBy
ZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciAqcCwg
Y29uc3QgY2hhciogbGltaXQsIGludDY0X3QmIGZvdW5kSW50KQoreworICAgIEFTU0VSVChsaW1p
dCA+PSBwKTsKKyAgICBmb3VuZEludCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGlmIChwID49
IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZm91bmRJbnQgPSAoZm91
bmRJbnQgPDwgNykgfCAoKnAgJiAweDdmKTsKKyAgICB9IHdoaWxlICgqcCsrICYgMTI4KTsKKyAg
ICByZXR1cm4gcDsKK30KKworc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVTdHJpbmcoY29uc3Qg
U3RyaW5nJiBzKQoreworICAgIFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMg
YXQgY3JlYXRpb24uCisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsg
KytpKSB7CisgICAgICAgIFVDaGFyIHUgPSBzW2ldOworICAgICAgICB1bnNpZ25lZCBjaGFyIGhp
ID0gdSA+PiA4OworICAgICAgICB1bnNpZ25lZCBjaGFyIGxvID0gdTsKKyAgICAgICAgcmV0LmFw
cGVuZChoaSk7CisgICAgICAgIHJldC5hcHBlbmQobG8pOworICAgIH0KKworICAgIHJldHVybiBy
ZXQ7Cit9CisKK3N0YXRpYyBTdHJpbmcgZGVjb2RlU3RyaW5nKGNvbnN0IGNoYXIqIHAsIGNvbnN0
IGNoYXIqIGVuZCkKK3sKKyAgICBBU1NFUlQoZW5kID49IHApOworICAgIEFTU0VSVCghKChlbmQg
LSBwKSAlIDIpKTsKKworICAgIHNpemVfdCBsZW4gPSAoZW5kIC0gcCkgLyAyOworICAgIFZlY3Rv
cjxVQ2hhcj4gdmVjdG9yKGxlbik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsg
KytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSAqcCsrOworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGxvID0gKnArKzsKKworICAgICAgICB2ZWN0b3JbaV0gPSAoaGkgPDwgOCkgfCBsbzsK
KyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nOjphZG9wdCh2ZWN0b3IpOworfQorCitzdGF0aWMg
VmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZ1dpdGhMZW4oY29uc3QgU3RyaW5nJiBzKQoreworICAg
IFZlY3RvcjxjaGFyPiByZXQgPSBlbmNvZGVWYXJJbnQocy5sZW5ndGgoKSk7CisgICAgcmV0LmFw
cGVuZChlbmNvZGVTdHJpbmcocykpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxp
bWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsKKyAg
ICBpbnQ2NF90IGxlbjsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBsZW4pOworICAg
IGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHAgKyBsZW4gKiAyID4gbGltaXQp
CisgICAgICAgIHJldHVybiAwOworCisgICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocCwg
cCArIGxlbiAqIDIpOworICAgIHAgKz0gbGVuICogMjsKKyAgICByZXR1cm4gcDsKK30KKworc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGVEb3VibGUoZG91YmxlIHgpCit7CisgICAgLy8gRklYTUU6
IEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgYmUgYnl0ZSBvcmRlciBpbmRlcGVuZGVudC4K
KyAgICBjb25zdCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJngpOworICAgIFZl
Y3RvcjxjaGFyPiB2OworICAgIHYuYXBwZW5kKHAsIHNpemVvZih4KSk7CisgICAgQVNTRVJUKHYu
c2l6ZSgpID09IHNpemVvZih4KSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRvdWJs
ZSogZCkKK3sKKyAgICBpZiAocCArIHNpemVvZigqZCkgPiBsaW1pdCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBjaGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZCk7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoKmQpOyArK2kpCisgICAgICAgICp4KysgPSAqcCsr
OworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUlEQktleShj
b25zdCBJREJLZXkmIGtleSkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0OworCisgICAgc3dpdGNo
IChrZXkudHlwZSgpKSB7CisgICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAgICByZXR1
cm4gZW5jb2RlQnl0ZShrSURCS2V5TnVsbFR5cGVCeXRlKTsKKyAgICBjYXNlIElEQktleTo6U3Ry
aW5nVHlwZToKKyAgICAgICAgcmV0ID0gZW5jb2RlQnl0ZShrSURCS2V5U3RyaW5nVHlwZUJ5dGUp
OworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW4oa2V5LnN0cmluZygpKSk7
CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJLZXk6OkRhdGVUeXBlOgorICAgICAg
ICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlEYXRlVHlwZUJ5dGUpOworICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZURvdWJsZShrZXkuZGF0ZSgpKSk7CisgICAgICAgIEFTU0VSVChyZXQuc2l6ZSgp
ID09IDkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBl
OgorICAgICAgICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlOdW1iZXJUeXBlQnl0ZSk7CisgICAg
ICAgIHJldC5hcHBlbmQoZW5jb2RlRG91YmxlKGtleS5udW1iZXIoKSkpOworICAgICAgICBBU1NF
UlQocmV0LnNpemUoKSA9PSA5KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gVmVjdG9yPGNoYXI+KCk7Cit9CisKK3N0
YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVJREJLZXkoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciog
bGltaXQsIFJlZlB0cjxJREJLZXk+JiBmb3VuZEtleSkKK3sKKyAgICBBU1NFUlQobGltaXQgPj0g
cCk7CisgICAgaWYgKHAgPj0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWdu
ZWQgY2hhciB0eXBlID0gKnArKzsKKyAgICBTdHJpbmcgczsKKyAgICBkb3VibGUgZDsKKworICAg
IHN3aXRjaCAodHlwZSkgeworICAgIGNhc2Uga0lEQktleU51bGxUeXBlQnl0ZToKKyAgICAgICAg
Ly8gTnVsbC4KKyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZU51bGwoKTsKKyAgICAg
ICAgcmV0dXJuIHA7CisgICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6CisgICAgICAgIC8v
IFN0cmluZy4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsIHMpOwor
ICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm91bmRLZXkg
PSBJREJLZXk6OmNyZWF0ZVN0cmluZyhzKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSBr
SURCS2V5RGF0ZVR5cGVCeXRlOgorICAgICAgICAvLyBEYXRlLgorICAgICAgICBwID0gZGVjb2Rl
RG91YmxlKHAsIGxpbWl0LCAmZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlRGF0ZShkKTsKKyAgICAgICAg
cmV0dXJuIHA7CisgICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6CisgICAgICAgIC8vIE51
bWJlci4KKyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCBsaW1pdCwgJmQpOworICAgICAgICBp
ZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6
OmNyZWF0ZU51bWJlcihkKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBl
eHRyYWN0RW5jb2RlZElEQktleShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQs
IFZlY3RvcjxjaGFyPiogcmVzdWx0KQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBzdGFydDsKKyAg
ICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBjaGFy
IHR5cGUgPSAqcCsrOworCisgICAgaW50NjRfdCBzdHJpbmdMZW47CisKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TWlu
S2V5VHlwZUJ5dGU6CisgICAgICAgICpyZXN1bHQgPSBlbmNvZGVCeXRlKHR5cGUpOworICAgICAg
ICByZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgLy8g
U3RyaW5nLgorICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBzdHJpbmdMZW4pOwor
ICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHAgKyBz
dHJpbmdMZW4gKiAyID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmVz
dWx0LT5jbGVhcigpOworICAgICAgICByZXN1bHQtPmFwcGVuZChzdGFydCwgcCAtIHN0YXJ0ICsg
c3RyaW5nTGVuICogMik7CisgICAgICAgIHJldHVybiBwICsgc3RyaW5nTGVuICogMjsKKyAgICBj
YXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6
CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAgICAgICBpZiAocCArIHNpemVvZihkb3Vi
bGUpID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmVzdWx0LT5jbGVh
cigpOworICAgICAgICByZXN1bHQtPmFwcGVuZChzdGFydCwgMSArIHNpemVvZihkb3VibGUpKTsK
KyAgICAgICAgcmV0dXJuIHAgKyBzaXplb2YoZG91YmxlKTsKKyAgICB9CisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUVuY29k
ZWRJREJLZXlzKGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5QSwgY29uc3QgVmVjdG9yPGNoYXI+JiBr
ZXlCKQoreworICAgIEFTU0VSVChrZXlBLnNpemUoKSA+PSAxKTsKKyAgICBBU1NFUlQoa2V5Qi5z
aXplKCkgPj0gMSk7CisKKyAgICBjb25zdCBjaGFyKiBwID0ga2V5QS5kYXRhKCk7CisgICAgY29u
c3QgY2hhciogbGltaXRBID0gcCArIGtleUEuc2l6ZSgpOworICAgIGNvbnN0IGNoYXIqIHEgPSBr
ZXlCLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBsaW1pdEIgPSBxICsga2V5Qi5zaXplKCk7CisK
KyAgICB1bnNpZ25lZCBjaGFyIHR5cGVBID0gKnArKzsKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGVC
ID0gKnErKzsKKworICAgIFN0cmluZyBzLCB0OworICAgIGRvdWJsZSBkLCBlOworCisgICAgaWYg
KGludCB4ID0gdHlwZUIgLSB0eXBlQSkgLy8gRklYTUU6IE5vdGUgdGhlIHN1YnRsZW5lc3MhCisg
ICAgICAgIHJldHVybiB4OworCisgICAgc3dpdGNoICh0eXBlQSkgeworICAgIGNhc2Uga0lEQktl
eU51bGxUeXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlNaW5LZXlUeXBlQnl0ZToKKyAgICAgICAg
Ly8gTnVsbCB0eXBlIG9yIG1heCB0eXBlOyBubyBwYXlsb2FkIHRvIGNvbXBhcmUuCisgICAgICAg
IHJldHVybiAwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBT
dHJpbmcgdHlwZS4KKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW4ocCwgbGltaXRBLCBz
KTsgLy8gRklYTUU6IENvbXBhcmUgd2l0aG91dCBhY3R1YWxseSBkZWNvZGluZyB0aGUgU3RyaW5n
IQorICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIHEgPSBkZWNvZGVTdHJpbmdXaXRoTGVuKHEs
IGxpbWl0QiwgdCk7CisgICAgICAgIEFTU0VSVChxKTsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2lu
dENvbXBhcmUocywgdCk7CisgICAgY2FzZSBrSURCS2V5RGF0ZVR5cGVCeXRlOgorICAgIGNhc2Ug
a0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBEYXRlIG9yIG51bWJlci4KKyAgICAg
ICAgcCA9IGRlY29kZURvdWJsZShwLCBsaW1pdEEsICZkKTsKKyAgICAgICAgQVNTRVJUKHApOwor
ICAgICAgICBxID0gZGVjb2RlRG91YmxlKHEsIGxpbWl0QiwgJmUpOworICAgICAgICBBU1NFUlQo
cSk7CisgICAgICAgIGlmIChkIDwgZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAg
aWYgKGQgPiBlKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0
aWMgYm9vbCBnZXRJbnQoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBr
ZXksIGludDY0X3QmIGZvdW5kSW50KQoreworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAg
aWYgKCFkYi0+Z2V0KGtleSwgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Zm91bmRJbnQgPSBkZWNvZGVJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dEludChMZXZlbERCRGF0YWJhc2UqIGRi
LCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICByZXR1cm4g
ZGItPnB1dChrZXksIGVuY29kZUludCh2YWx1ZSkpOworfQorCitzdGF0aWMgYm9vbCBnZXRTdHJp
bmcoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIFN0cmluZyYg
Zm91bmRTdHJpbmcpCit7CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAoIWRiLT5n
ZXQoa2V5LCByZXN1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3VuZFN0cmlu
ZyA9IGRlY29kZVN0cmluZyhyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcHV0U3RyaW5nKExldmVsREJEYXRhYmFzZSogZGIs
IGNvbnN0IFZlY3RvcjxjaGFyPiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgaWYg
KCFkYi0+cHV0KGtleSwgZW5jb2RlU3RyaW5nKHZhbHVlKSkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIEtleVByZWZpeCB7
CitwdWJsaWM6CisgICAgS2V5UHJlZml4KCkKKyAgICAgICAgOiBtX2RhdGFiYXNlSWQoLTEpCisg
ICAgICAgICwgbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1faW5kZXhJZCgtMSkKKyAg
ICB7CisgICAgfQorCisgICAgS2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgICAgIDogbV9kYXRhYmFzZUlkKGRh
dGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAg
ICAgICwgbV9pbmRleElkKGluZGV4SWQpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBLZXlQ
cmVmaXgqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChzdGFydCA9PSBsaW1pdCkKKyAgICAg
ICAgICAgIHJldHVybiAwOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKnN0
YXJ0Kys7CisKKyAgICAgICAgaW50IGRhdGFiYXNlSWRCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDUp
ICYgMHg3KSArIDE7CisgICAgICAgIGludCBvYmplY3RTdG9yZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0
ZSA+PiAyKSAmIDB4NykgKyAxOworICAgICAgICBpbnQgaW5kZXhJZEJ5dGVzID0gKGZpcnN0Qnl0
ZSAmIDB4MykgKyAxOworCisgICAgICAgIGlmIChzdGFydCArIGRhdGFiYXNlSWRCeXRlcyArIG9i
amVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyA+IGxpbWl0KQorICAgICAgICAgICAgcmV0
dXJuIDA7CisKKyAgICAgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3RhcnQs
IHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzKTsKKyAgICAgICAgc3RhcnQgKz0gZGF0YWJhc2VJZEJ5
dGVzOworICAgICAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IGRlY29kZUludChzdGFydCwg
c3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0ZXMpOworICAgICAgICBzdGFydCArPSBvYmplY3RTdG9y
ZUlkQnl0ZXM7CisgICAgICAgIHJlc3VsdC0+bV9pbmRleElkID0gZGVjb2RlSW50KHN0YXJ0LCBz
dGFydCArIGluZGV4SWRCeXRlcyk7CisgICAgICAgIHN0YXJ0ICs9IGluZGV4SWRCeXRlczsKKwor
ICAgICAgICByZXR1cm4gc3RhcnQ7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGVuY29kZSgp
IGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAg
ICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9pbmRleElk
ID49IDApOworCisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhYmFzZUlkU3RyaW5nID0gZW5jb2Rl
SW50KG1fZGF0YWJhc2VJZCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZUlkU3Ry
aW5nID0gZW5jb2RlSW50KG1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiBp
bmRleElkU3RyaW5nID0gZW5jb2RlSW50KG1faW5kZXhJZCk7CisKKyAgICAgICAgQVNTRVJUKGRh
dGFiYXNlSWRTdHJpbmcuc2l6ZSgpIDw9IDgpOworICAgICAgICBBU1NFUlQob2JqZWN0U3RvcmVJ
ZFN0cmluZy5zaXplKCkgPD0gOCk7CisgICAgICAgIEFTU0VSVChpbmRleElkU3RyaW5nLnNpemUo
KSA8PSA0KTsKKworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKGRhdGFiYXNl
SWRTdHJpbmcuc2l6ZSgpIC0gMSkgPDwgNSB8IChvYmplY3RTdG9yZUlkU3RyaW5nLnNpemUoKSAt
IDEpIDw8IDIgfCAoaW5kZXhJZFN0cmluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgVmVjdG9yPGNo
YXI+IHJldDsKKyAgICAgICAgcmV0LmFwcGVuZChmaXJzdEJ5dGUpOworICAgICAgICByZXQuYXBw
ZW5kKGRhdGFiYXNlSWRTdHJpbmcpOworICAgICAgICByZXQuYXBwZW5kKG9iamVjdFN0b3JlSWRT
dHJpbmcpOworICAgICAgICByZXQuYXBwZW5kKGluZGV4SWRTdHJpbmcpOworCisKKyAgICAgICAg
eworICAgICAgICAgICAgS2V5UHJlZml4IHA7CisgICAgICAgICAgICBLZXlQcmVmaXg6OmRlY29k
ZShyZXQuYmVnaW4oKSwgcmV0LmVuZCgpLCAmcCk7CisgICAgICAgICAgICBBU1NFUlQocC5tX2Rh
dGFiYXNlSWQgPT0gbV9kYXRhYmFzZUlkKTsKKyAgICAgICAgICAgIEFTU0VSVChwLm1fb2JqZWN0
U3RvcmVJZCA9PSBtX29iamVjdFN0b3JlSWQpOworICAgICAgICAgICAgQVNTRVJUKHAubV9pbmRl
eElkID09IG1faW5kZXhJZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAg
IH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEtleVByZWZpeCYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9v
YmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOworCisg
ICAgICAgIGlmIChtX2RhdGFiYXNlSWQgIT0gb3RoZXIubV9kYXRhYmFzZUlkKQorICAgICAgICAg
ICAgcmV0dXJuIG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICAgICAgaWYg
KG1fb2JqZWN0U3RvcmVJZCAhPSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICBy
ZXR1cm4gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOworICAgICAgICBp
ZiAobV9pbmRleElkICE9IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBtX2lu
ZGV4SWQgLSBvdGhlci5tX2luZGV4SWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IGVudW0gVHlwZSB7CisgICAgICAgIGtHbG9iYWxNZXRhRGF0YSwKKyAgICAgICAga0RhdGFiYXNl
TWV0YURhdGEsCisgICAgICAgIGtPYmplY3RTdG9yZURhdGEsCisgICAgICAgIGtFeGlzdHNFbnRy
eSwKKyAgICAgICAga0luZGV4RGF0YSwKKyAgICAgICAga0ludmFsaWRUeXBlCisgICAgfTsKKwor
ICAgIFR5cGUgdHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlk
ID49IDApOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBB
U1NFUlQobV9pbmRleElkID49IDApOworCisgICAgICAgIGlmICghbV9kYXRhYmFzZUlkKQorICAg
ICAgICAgICAgcmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKKyAgICAgICAgaWYgKCFtX29iamVjdFN0
b3JlSWQpCisgICAgICAgICAgICByZXR1cm4ga0RhdGFiYXNlTWV0YURhdGE7CisgICAgICAgIGlm
IChtX2luZGV4SWQgPT0ga09iamVjdFN0b3JlRGF0YUluZGV4SWQpCisgICAgICAgICAgICByZXR1
cm4ga09iamVjdFN0b3JlRGF0YTsKKyAgICAgICAgaWYgKG1faW5kZXhJZCA9PSBrRXhpc3RzRW50
cnlJbmRleElkKQorICAgICAgICAgICAgcmV0dXJuIGtFeGlzdHNFbnRyeTsKKyAgICAgICAgaWYg
KG1faW5kZXhJZCA+PSBrTWluaW11bUluZGV4SWQpCisgICAgICAgICAgICByZXR1cm4ga0luZGV4
RGF0YTsKKworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtJ
bnZhbGlkVHlwZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKKyAgICBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJZDsKK307CisKK2NsYXNz
IFNjaGVtYVZlcnNpb25LZXkgeworcHVibGljOgorICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlKCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7CisgICAgICAg
IFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQo
ZW5jb2RlQnl0ZShrU2NoZW1hVmVyc2lvblR5cGVCeXRlKSk7CisgICAgICAgIHJldHVybiByZXQ7
CisgICAgfQorfTsKKworY2xhc3MgTWF4RGF0YWJhc2VJZEtleSB7CitwdWJsaWM6CisgICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZp
eCgwLCAwLCAwKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsK
KyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtNYXhEYXRhYmFzZUlkVHlwZUJ5dGUpKTsK
KyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9OworCitjbGFzcyBEYXRhYmFzZUZyZWVMaXN0
S2V5IHsKK3B1YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCkKKyAgICAgICAgOiBtX2Rh
dGFiYXNlSWQoLTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNv
ZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZyZWVMaXN0
S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBj
b25zdCBjaGFyICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVCgh
cHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChw
ID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
dHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0
ZSA9PSBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBs
aW1pdCwgcmVzdWx0LT5tX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8
Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCkKKyAgICB7CisgICAgICAgIEtleVByZWZp
eCBwcmVmaXgoMCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5j
b2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrRGF0YWJhc2VGcmVlTGlzdFR5
cGVCeXRlKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KGRhdGFiYXNlSWQpKTsK
KyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBj
b25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKKyAgICAgICAg
cmV0dXJuIG1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBEYXRh
YmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2Rh
dGFiYXNlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX2RhdGFiYXNlSWQgLSBvdGhlci5tX2Rh
dGFiYXNlSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOwor
fTsKKworY2xhc3MgRGF0YWJhc2VOYW1lS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qg
Y2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0YWJh
c2VOYW1lS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIEFT
U0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2Jq
ZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAg
IGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVk
IGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0
eXBlQnl0ZSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1p
dCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExl
bihwLCBsaW1pdCwgcmVzdWx0LT5tX29yaWdpbik7CisgICAgICAgIGlmICghcCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbihwLCBsaW1p
dCwgcmVzdWx0LT5tX2RhdGFiYXNlTmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIFZlY3Rvcjxj
aGFyPiBlbmNvZGUoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VO
YW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICAgICAg
VmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChl
bmNvZGVCeXRlKGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZVN0cmluZ1dpdGhMZW4ob3JpZ2luKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3Ry
aW5nV2l0aExlbihkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisK
KyAgICBTdHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgICBTdHJp
bmcgZGF0YWJhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhYmFzZU5hbWU7IH0KKworICAg
IGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNlTmFtZUtleSYgb3RoZXIpCisgICAgeworICAgICAg
ICBpZiAoaW50IHggPSBjb2RlUG9pbnRDb21wYXJlKG1fb3JpZ2luLCBvdGhlci5tX29yaWdpbikp
CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUo
bV9kYXRhYmFzZU5hbWUsIG90aGVyLm1fZGF0YWJhc2VOYW1lKTsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgU3RyaW5nIG1fb3JpZ2luOyAvLyBGSVhNRTogU3RvcmUgZW5jb2RlZCBzdHJpbmdzLCBv
ciBqdXN0IHBvaW50ZXJzLgorICAgIFN0cmluZyBtX2RhdGFiYXNlTmFtZTsKK307CisKK2NsYXNz
IERhdGFiYXNlTWV0YURhdGFLZXkgeworcHVibGljOgorICAgIGVudW0gTWV0YURhdGFUeXBlIHsK
KyAgICAgICAga09yaWdpbk5hbWUgPSAwLAorICAgICAgICBrRGF0YWJhc2VOYW1lID0gMSwKKyAg
ICAgICAga1VzZXJWZXJzaW9uID0gMiwKKyAgICAgICAga01heE9iamVjdFN0b3JlSWQgPSAzCisg
ICAgfTsKKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJ
ZCwgTWV0YURhdGFUeXBlIG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBw
cmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVm
aXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShtZXRhRGF0YVR5cGUp
KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9OworCitjbGFzcyBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KCkKKyAgICAg
ICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9tZXRhRGF0YVR5cGUoLTEpCisg
ICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciog
c3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1bHQp
CisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBw
ID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYg
KCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRh
YmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAg
ICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpw
Kys7CisgICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtPYmplY3RT
dG9yZU1ldGFEYXRhVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQt
Pm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICBBU1NFUlQocmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAo
cCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2Rl
VmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBlKTsKKyAgICB9CisKKyAgICBz
dGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBtZXRhRGF0YVR5cGUpCisgICAgeworICAgICAgICBLZXlQcmVm
aXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0g
cHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa09iamVjdFN0
b3JlTWV0YURhdGFUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChv
YmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG1ldGFEYXRh
VHlwZSkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOworICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOworICAgIH0KKyAgICBpbnQ2NF90
IG1ldGFEYXRhVHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9tZXRhRGF0YVR5
cGUgPj0gMCk7CisgICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlwZTsKKyAgICB9CisKKyAgICBp
bnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5JiBvdGhlcikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX21l
dGFEYXRhVHlwZSA+PSAwKTsKKyAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0g
b3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7IC8vIEZJWE1FOiBJ
cyB0aGlzIGNhc3Qgc2FmZT8gSS5lLiwgd2lsbCBpdCBwcmVzZXJ2ZSB0aGUgc2lnbj8KKyAgICAg
ICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7CisgICAgfQor
Citwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9t
ZXRhRGF0YVR5cGU7IC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBieXRlLgorfTsKKworY2xhc3MgSW5k
ZXhNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgSW5kZXhNZXRhRGF0YUtleSgpCisgICAgICAg
IDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1faW5kZXhJZCgtMSkKKyAgICAgICAg
LCBtX21ldGFEYXRhVHlwZSgwKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hh
ciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhNZXRh
RGF0YUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAg
ICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZp
eCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NF
UlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlm
IChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNo
YXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBl
Qnl0ZSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1p
dCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5t
X2luZGV4SWQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmVzdWx0
LT5tX21ldGFEYXRhVHlwZSA9ICpwKys7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAg
IHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBl
KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAg
ICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFw
cGVuZChlbmNvZGVCeXRlKGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0LmFw
cGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZVZhckludChpbmRleElkKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShtZXRh
RGF0YVR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFy
ZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7CisK
KyAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9y
ZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIGlmIChpbnQgeCA9IG1faW5kZXhJ
ZCAtIG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1
cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRhVHlwZTsKKyAgICB9CisKKyAgICBp
bnQ2NF90IGluZGV4SWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faW5kZXhJZCA+
PSAwKTsKKyAgICAgICAgcmV0dXJuIG1faW5kZXhJZDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBj
aGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWV0YURhdGFUeXBlOyB9CisKK3By
aXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4
SWQ7CisgICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlwZTsKK307CisKK2NsYXNzIE9iamVj
dFN0b3JlRnJlZUxpc3RLZXkgeworcHVibGljOgorICAgIE9iamVjdFN0b3JlRnJlZUxpc3RLZXko
KQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAgICB7CisgICAgfQorCisgICAgc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGlt
aXQsIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVBy
ZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBLZXlQcmVmaXg6OmRlY29kZShz
dGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NF
UlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2lu
ZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VO
VVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSk7
CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVm
aXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXgu
ZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrT2JqZWN0U3RvcmVGcmVl
TGlzdFR5cGVCeXRlKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0
b3JlSWQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IG9iamVj
dFN0b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+
PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICBpbnQg
Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5JiBvdGhlcikKKyAgICB7CisgICAg
ICAgIC8vIEZJWE1FOiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRoYXQgd2UncmUgbm90IGNvbXBhcmlu
ZyBkYXRhYmFzZSBpZCdzLAorICAgICAgICAvLyBidXQgdGhhdCBjb21wYXJpc29uIHdpbGwgaGF2
ZSBiZWVuIG1hZGUgZWFybGllci4KKyAgICAgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2Ug
dGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJ
ZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0
U3RvcmVJZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7
Cit9OworCitjbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleEZyZWVM
aXN0S2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9pbmRl
eElkKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNv
bnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhGcmVlTGlzdEtleSogcmVz
dWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hh
ciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAg
IGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1f
ZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Cisg
ICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUg
PSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrSW5k
ZXhGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5t
X29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4SWQp
OworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgeworICAg
ICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5
dGUoa0luZGV4RnJlZUxpc3RUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZh
ckludChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KGlu
ZGV4SWQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShj
b25zdCBJbmRleEZyZWVMaXN0S2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIEFTU0VSVChtX29i
amVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7CisgICAg
ICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkK
KyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gbV9pbmRleElkIC0gb3RoZXIu
bV9pbmRleElkOworICAgIH0KKworICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICByZXR1
cm4gbV9vYmplY3RTdG9yZUlkOworICAgIH0KKworICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOworICAgICAgICByZXR1cm4g
bV9pbmRleElkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJ
ZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJZDsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlTmFtZXNL
ZXkgeworcHVibGljOgorICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVw
IG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisgICAgLy8gaXMga2VwdCBpbiB0
aGUgSURCRGF0YWJhc2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBwaW5nIGJlY29tZSB1bnJlbGlh
YmxlPworICAgIC8vIENhbiB3ZSByZW1vdmUgdGhpcz8KKyAgICBzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVO
YW1lc0tleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAg
ICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZp
eCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NF
UlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlm
IChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNo
YXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBl
Qnl0ZSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKTsKKyAgICAgICAgcmV0dXJuIGRlY29k
ZVN0cmluZ1dpdGhMZW4ocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZU5hbWUpOworICAg
IH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwg
Y29uc3QgU3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCisgICAgeworICAgICAgICBLZXlQcmVmaXgg
cHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJl
Zml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa1NjaGVtYVZlcnNp
b25UeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa09iamVjdFN0b3Jl
TmFtZXNUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW4o
b2JqZWN0U3RvcmVOYW1lKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50
IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tleSYgb3RoZXIpCisgICAgeworICAgICAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVjdFN0b3JlTmFtZSwgb3RoZXIubV9vYmpl
Y3RTdG9yZU5hbWUpOworICAgIH0KKworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUoKSBjb25z
dCB7IHJldHVybiBtX29iamVjdFN0b3JlTmFtZTsgfQorCitwcml2YXRlOgorICAgIFN0cmluZyBt
X29iamVjdFN0b3JlTmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmluZywgb3Ig
anVzdCBwb2ludGVycyB0byBpdC4KK307CisKK2NsYXNzIEluZGV4TmFtZXNLZXkgeworcHVibGlj
OgorICAgIEluZGV4TmFtZXNLZXkoKQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAg
ICB7CisgICAgfQorCisgICAgLy8gRklYTUU6IFdlIG5ldmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAg
aW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAgIC8vIGlzIGtlcHQgYXQgYSBoaWdoZXIg
bGV2ZWwuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogbGltaXQsIEluZGV4TmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAg
IEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRl
Y29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAg
ICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZp
eC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNT
RVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0luZGV4TmFtZXNLZXlUeXBlQnl0ZSk7
CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAg
ICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNv
ZGVTdHJpbmdXaXRoTGVuKHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhOYW1lKTsKKyAgICB9CisK
KyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBpbmRleE5hbWUpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8Y2hh
cj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUo
a0luZGV4TmFtZXNLZXlUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZhcklu
dChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExl
bihpbmRleE5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQgY29t
cGFyZShjb25zdCBJbmRleE5hbWVzS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJ
ZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX2luZGV4TmFtZSwgb3RoZXIubV9pbmRleE5hbWUp
OworICAgIH0KKworICAgIFN0cmluZyBpbmRleE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4
TmFtZTsgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIFN0
cmluZyBtX2luZGV4TmFtZTsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlRGF0YUtleSB7CitwdWJs
aWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29u
c3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAg
IEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRl
Y29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAg
QVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1f
aW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgaWYgKHAgPT0gZW5kKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktl
eShwLCBlbmQsICZyZXN1bHQtPm1fZW5jb2RlZFVzZXJLZXkpOworICAgIH0KKworICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4gZW5jb2RlZFVzZXJLZXkpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5k
ZXhOdW1iZXIpOworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwor
ICAgICAgICByZXQuYXBwZW5kKGVuY29kZWRVc2VyS2V5KTsKKworICAgICAgICByZXR1cm4gcmV0
OworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIHVzZXJLZXkpCisgICAg
eworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29k
ZUlEQktleSh1c2VyS2V5KSk7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0
U3RvcmVEYXRhS2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wYXJlRW5jb2Rl
ZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktleSk7CisgICAg
fQorCisgICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgUmVmUHRyPElEQktleT4ga2V5OworICAgICAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNl
cktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkpOworICAgICAgICByZXR1
cm4ga2V5OworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTcGVjaWFsSW5kZXhO
dW1iZXIgPSBrT2JqZWN0U3RvcmVEYXRhSW5kZXhJZDsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8
Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsKK307CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5IHsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBlbmQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBL
ZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNv
ZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFT
U0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2lu
ZGV4SWQgPT0ga1NwZWNpYWxJbmRleE51bWJlcik7CisgICAgICAgIGlmIChwID09IGVuZCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXko
cCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKKyAgICB9CisKKyAgICBzdGF0aWMg
VmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkS2V5KQorICAgIHsKKyAgICAgICAgS2V5
UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrU3BlY2lhbEluZGV4TnVt
YmVyKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAg
ICAgcmV0LmFwcGVuZChlbmNvZGVkS2V5KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisK
KyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBlbmNvZGVJREJLZXkodXNl
cktleSkpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBv
dGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNv
ZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktleSk7CisgICAgfQorCisgICAgUGFzc1Jl
ZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdAorICAgIHsKKyAgICAgICAgUmVmUHRyPElEQktl
eT4ga2V5OworICAgICAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBt
X2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkpOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0K
KworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrRXhpc3Rz
RW50cnlJbmRleElkOworCitwcml2YXRlOgorICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRVc2Vy
S2V5OworfTsKKworY2xhc3MgSW5kZXhEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleERhdGFL
ZXkoKQorICAgICAgICA6IG1fZGF0YWJhc2VJZCgtMSkKKyAgICAgICAgLCBtX29iamVjdFN0b3Jl
SWQoLTEpCisgICAgICAgICwgbV9pbmRleElkKC0xKQorICAgICAgICAsIG1fc2VxdWVuY2VOdW1i
ZXIoLTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCkK
KyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAg
PSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAo
IXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFi
YXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAg
IEFTU0VSVChwcmVmaXgubV9pbmRleElkID49IGtNaW5pbXVtSW5kZXhJZCk7CisgICAgICAgIHJl
c3VsdC0+bV9kYXRhYmFzZUlkID0gcHJlZml4Lm1fZGF0YWJhc2VJZDsKKyAgICAgICAgcmVzdWx0
LT5tX29iamVjdFN0b3JlSWQgPSBwcmVmaXgubV9vYmplY3RTdG9yZUlkOworICAgICAgICByZXN1
bHQtPm1faW5kZXhJZCA9IHByZWZpeC5tX2luZGV4SWQ7CisgICAgICAgIHAgPSBleHRyYWN0RW5j
b2RlZElEQktleShwLCBsaW1pdCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNlcktleSk7CisgICAgICAg
IGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocCA9PSBsaW1pdCkg
eworICAgICAgICAgICAgcmVzdWx0LT5tX3NlcXVlbmNlTnVtYmVyID0gLTE7IC8vIEZJWE1FOiBX
ZSBzaG91bGQgY2hhbmdlIGl0IHNvIHRoYXQgYWxsIGtleXMgaGF2ZSBhIHNlcXVlbmNlIG51bWJl
ci4gU2hvdWxkbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVy
biBwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJl
c3VsdC0+bV9zZXF1ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFy
PiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkVXNlcktleSwgaW50NjRfdCBz
ZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBw
cmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlZFVzZXJLZXkpOworICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChzZXF1ZW5jZU51bWJlcikpOworICAgICAgICBy
ZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IElEQktleSYgdXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5j
b2RlSURCS2V5KHVzZXJLZXkpLCBzZXF1ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdGlj
IFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIElOVDMyX01BWCwgbWF4SURCS2V5KCksIElOVDY0X01BWCk7CisgICAgfQor
CisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVT
ZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7
CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVCht
X2luZGV4SWQgPj0gMCk7CisgICAgICAgIGlmIChpbnQgeCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5
cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5KSkKKyAgICAgICAgICAg
IHJldHVybiB4OworICAgICAgICBpZiAoaWdub3JlU2VxdWVuY2VOdW1iZXIpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG1fc2VxdWVuY2VOdW1iZXIgLSBvdGhlci5tX3Nl
cXVlbmNlTnVtYmVyOworICAgIH0KKworICAgIGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAgICByZXR1cm4g
bV9kYXRhYmFzZUlkOworICAgIH0KKworICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBy
ZXR1cm4gbV9vYmplY3RTdG9yZUlkOworICAgIH0KKworICAgIGludDY0X3QgaW5kZXhJZCgpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOworICAgICAgICByZXR1
cm4gbV9pbmRleElkOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkg
Y29uc3QKKyAgICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2Rl
SURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVkVXNlcktleS5lbmQoKSwg
a2V5KTsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRf
dCBtX2RhdGFiYXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRf
dCBtX2luZGV4SWQ7CisgICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVzZXJLZXk7CisgICAgaW50
NjRfdCBtX3NlcXVlbmNlTnVtYmVyOworfTsKKworc3RhdGljIGludCByZWFsQ29tcGFyZShjb25z
dCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIsIGJvb2wgaW5kZXhL
ZXlzID0gZmFsc2UpCit7CisgICAgY29uc3QgY2hhciogcHRyQSA9IGEuZGF0YSgpOworICAgIGNv
bnN0IGNoYXIqIHB0ckIgPSBiLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBlbmRBID0gcHRyQSAr
IGEuc2l6ZSgpOworICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBwdHJCICsgYi5zaXplKCk7CisKKyAg
ICBLZXlQcmVmaXggcHJlZml4QTsKKyAgICBLZXlQcmVmaXggcHJlZml4QjsKKworICAgIHB0ckEg
PSBLZXlQcmVmaXg6OmRlY29kZShwdHJBLCBlbmRBLCAmcHJlZml4QSk7CisgICAgcHRyQiA9IEtl
eVByZWZpeDo6ZGVjb2RlKHB0ckIsIGVuZEIsICZwcmVmaXhCKTsKKyAgICBBU1NFUlQocHRyQSk7
CisgICAgQVNTRVJUKHB0ckIpOworCisgICAgaWYgKGludCB4ID0gcHJlZml4QS5jb21wYXJlKHBy
ZWZpeEIpKQorICAgICAgICByZXR1cm4geDsKKworICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBL
ZXlQcmVmaXg6OmtHbG9iYWxNZXRhRGF0YSkgeworICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRB
KTsKKyAgICAgICAgQVNTRVJUKHB0ckIgIT0gZW5kQik7CisKKyAgICAgICAgdW5zaWduZWQgY2hh
ciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQiA9
ICpwdHJCKys7CisKKyAgICAgICAgaWYgKGludCB4ID0gdHlwZUJ5dGVBIC0gdHlwZUJ5dGVCKQor
ICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA8PSAxKQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0RhdGFiYXNlRnJl
ZUxpc3RUeXBlQnl0ZSkgeworICAgICAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBkYXRhYmFz
ZUZyZWVMaXN0S2V5QTsKKyAgICAgICAgICAgIERhdGFiYXNlRnJlZUxpc3RLZXkgZGF0YWJhc2VG
cmVlTGlzdEtleUI7CisKKyAgICAgICAgICAgIHB0ckEgPSBEYXRhYmFzZUZyZWVMaXN0S2V5Ojpk
ZWNvZGUoYS5kYXRhKCksIGVuZEEsICZkYXRhYmFzZUZyZWVMaXN0S2V5QSk7CisgICAgICAgICAg
ICBwdHJCID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZGF0
YWJhc2VGcmVlTGlzdEtleUIpOworICAgICAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICAg
ICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICByZXR1cm4gZGF0YWJhc2VGcmVlTGlzdEtl
eUEuY29tcGFyZShkYXRhYmFzZUZyZWVMaXN0S2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpIHsKKyAgICAgICAgICAgIERhdGFi
YXNlTmFtZUtleSBkYXRhYmFzZU5hbWVLZXlBOworICAgICAgICAgICAgRGF0YWJhc2VOYW1lS2V5
IGRhdGFiYXNlTmFtZUtleUI7CisKKyAgICAgICAgICAgIHB0ckEgPSBEYXRhYmFzZU5hbWVLZXk6
OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJmRhdGFiYXNlTmFtZUtleUEpOworICAgICAgICAgICAg
cHRyQiA9IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmZGF0YWJhc2VO
YW1lS2V5Qik7CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICBBU1NFUlQo
cHRyQik7CisKKyAgICAgICAgICAgIHJldHVybiBkYXRhYmFzZU5hbWVLZXlBLmNvbXBhcmUoZGF0
YWJhc2VOYW1lS2V5Qik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJlZml4QS50eXBl
KCkgPT0gS2V5UHJlZml4OjprRGF0YWJhc2VNZXRhRGF0YSkgeworICAgICAgICBBU1NFUlQocHRy
QSAhPSBlbmRBKTsKKyAgICAgICAgQVNTRVJUKHB0ckIgIT0gZW5kQik7CisKKyAgICAgICAgdW5z
aWduZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5
cGVCeXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgaWYgKGludCB4ID0gdHlwZUJ5dGVBIC0gdHlw
ZUJ5dGVCKQorICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA8
PSAzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga09i
amVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkgeworICAgICAgICAgICAgT2JqZWN0U3RvcmVNZXRh
RGF0YUtleSBtZXRhRGF0YUtleUE7CisgICAgICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
IG1ldGFEYXRhS2V5QjsKKworICAgICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmRlY29kZShhLmRhdGEoKSwgZW5kQSwgJm1ldGFEYXRhS2V5QSk7CisgICAgICAgICAgICBw
dHJCID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKGIuZGF0YSgpLCBlbmRCLCAmbWV0
YURhdGFLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFTU0VS
VChwdHJCKTsKKworICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5QS5jb21wYXJlKG1ldGFE
YXRhS2V5Qik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrSW5kZXhNZXRh
RGF0YVR5cGVCeXRlKSB7CisgICAgICAgICAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5
QTsKKyAgICAgICAgICAgIEluZGV4TWV0YURhdGFLZXkgbWV0YURhdGFLZXlCOworCisgICAgICAg
ICAgICBwdHJBID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmbWV0
YURhdGFLZXlBKTsKKyAgICAgICAgICAgIHB0ckIgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUo
Yi5kYXRhKCksIGVuZEIsICZtZXRhRGF0YUtleUIpOworICAgICAgICAgICAgQVNTRVJUKHB0ckEp
OworICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICByZXR1cm4gbWV0YURh
dGFLZXlBLmNvbXBhcmUobWV0YURhdGFLZXlCKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlw
ZUJ5dGVBID09IGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUpIHsKKyAgICAgICAgICAgIE9i
amVjdFN0b3JlRnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUE7CisgICAgICAgICAgICBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0RW50cnlLZXlCOworCisgICAgICAgICAgICBwdHJB
ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmZnJlZUxp
c3RFbnRyeUtleUEpOworICAgICAgICAgICAgcHRyQiA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6
OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJmZyZWVMaXN0RW50cnlLZXlCKTsKKyAgICAgICAgICAg
IEFTU0VSVChwdHJBKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAg
cmV0dXJuIGZyZWVMaXN0RW50cnlLZXlBLmNvbXBhcmUoZnJlZUxpc3RFbnRyeUtleUIpOworICAg
ICAgICB9CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4RnJlZUxpc3RUeXBlQnl0ZSkg
eworICAgICAgICAgICAgSW5kZXhGcmVlTGlzdEtleSBmcmVlTGlzdEVudHJ5S2V5QTsKKyAgICAg
ICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RFbnRyeUtleUI7CisKKyAgICAgICAgICAg
IHB0ckEgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUoYS5kYXRhKCksIGVuZEEsICZmcmVlTGlz
dEVudHJ5S2V5QSk7CisgICAgICAgICAgICBwdHJCID0gSW5kZXhGcmVlTGlzdEtleTo6ZGVjb2Rl
KGIuZGF0YSgpLCBlbmRCLCAmZnJlZUxpc3RFbnRyeUtleUIpOworICAgICAgICAgICAgQVNTRVJU
KHB0ckEpOworICAgICAgICAgICAgQVNTRVJUKHB0ckIpOworCisgICAgICAgICAgICByZXR1cm4g
ZnJlZUxpc3RFbnRyeUtleUEuY29tcGFyZShmcmVlTGlzdEVudHJ5S2V5Qik7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKSB7Cisg
ICAgICAgICAgICBPYmplY3RTdG9yZU5hbWVzS2V5IG9iamVjdFN0b3JlTmFtZXNLZXlBOworICAg
ICAgICAgICAgT2JqZWN0U3RvcmVOYW1lc0tleSBvYmplY3RTdG9yZU5hbWVzS2V5QjsKKworICAg
ICAgICAgICAgcHRyQSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmRlY29kZShhLmRhdGEoKSwgZW5k
QSwgJm9iamVjdFN0b3JlTmFtZXNLZXlBKTsKKyAgICAgICAgICAgIHB0ckIgPSBPYmplY3RTdG9y
ZU5hbWVzS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZvYmplY3RTdG9yZU5hbWVzS2V5Qik7
CisgICAgICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgICAgICBBU1NFUlQocHRyQik7CisK
KyAgICAgICAgICAgIHJldHVybiBvYmplY3RTdG9yZU5hbWVzS2V5QS5jb21wYXJlKG9iamVjdFN0
b3JlTmFtZXNLZXlCKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtJbmRl
eE5hbWVzS2V5VHlwZUJ5dGUpIHsKKyAgICAgICAgICAgIEluZGV4TmFtZXNLZXkgaW5kZXhOYW1l
c0tleUE7CisgICAgICAgICAgICBJbmRleE5hbWVzS2V5IGluZGV4TmFtZXNLZXlCOworCisgICAg
ICAgICAgICBwdHJBID0gSW5kZXhOYW1lc0tleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAmaW5k
ZXhOYW1lc0tleUEpOworICAgICAgICAgICAgcHRyQiA9IEluZGV4TmFtZXNLZXk6OmRlY29kZShi
LmRhdGEoKSwgZW5kQiwgJmluZGV4TmFtZXNLZXlCKTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJB
KTsKKyAgICAgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICAgICAgcmV0dXJuIGluZGV4
TmFtZXNLZXlBLmNvbXBhcmUoaW5kZXhOYW1lc0tleUIpOworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIGlm
IChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtPYmplY3RTdG9yZURhdGEpIHsKKyAgICAg
ICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAg
ICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTog
VGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJl
IGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVjdFN0
b3JlRGF0YUtleUE7CisgICAgICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFL
ZXlCOworCisgICAgICAgIHB0ckEgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShhLmRhdGEo
KSwgZW5kQSwgJm9iamVjdFN0b3JlRGF0YUtleUEpOworICAgICAgICBwdHJCID0gT2JqZWN0U3Rv
cmVEYXRhS2V5OjpkZWNvZGUoYi5kYXRhKCksIGVuZEIsICZvYmplY3RTdG9yZURhdGFLZXlCKTsK
KyAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAg
cmV0dXJuIG9iamVjdFN0b3JlRGF0YUtleUEuY29tcGFyZShvYmplY3RTdG9yZURhdGFLZXlCKTsK
KyAgICB9CisgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a0V4aXN0c0VudHJ5
KSB7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICByZXR1
cm4gLTE7CisgICAgICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMTsg
Ly8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3Qg
aGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgIEV4aXN0c0VudHJ5S2V5IGV4
aXN0c0VudHJ5S2V5QTsKKyAgICAgICAgRXhpc3RzRW50cnlLZXkgZXhpc3RzRW50cnlLZXlCOwor
CisgICAgICAgIHB0ckEgPSBFeGlzdHNFbnRyeUtleTo6ZGVjb2RlKGEuZGF0YSgpLCBlbmRBLCAm
ZXhpc3RzRW50cnlLZXlBKTsKKyAgICAgICAgcHRyQiA9IEV4aXN0c0VudHJ5S2V5OjpkZWNvZGUo
Yi5kYXRhKCksIGVuZEIsICZleGlzdHNFbnRyeUtleUIpOworICAgICAgICBBU1NFUlQocHRyQSk7
CisgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICByZXR1cm4gZXhpc3RzRW50cnlLZXlB
LmNvbXBhcmUoZXhpc3RzRW50cnlLZXlCKTsKKyAgICB9CisgICAgaWYgKHByZWZpeEEudHlwZSgp
ID09IEtleVByZWZpeDo6a0luZGV4RGF0YSkgeworICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYm
IHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocHRyQSA9
PSBlbmRBKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocHRyQiA9PSBlbmRC
KQorICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0
aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKwor
ICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QTsKKyAgICAgICAgSW5kZXhEYXRhS2V5
IGluZGV4RGF0YUtleUI7CisKKyAgICAgICAgcHRyQSA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKGEu
ZGF0YSgpLCBlbmRBLCAmaW5kZXhEYXRhS2V5QSk7CisgICAgICAgIHB0ckIgPSBJbmRleERhdGFL
ZXk6OmRlY29kZShiLmRhdGEoKSwgZW5kQiwgJmluZGV4RGF0YUtleUIpOworICAgICAgICBBU1NF
UlQocHRyQSk7CisgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICBib29sIGlnbm9yZVNl
cXVlbmNlTnVtYmVyID0gaW5kZXhLZXlzOworICAgICAgICByZXR1cm4gaW5kZXhEYXRhS2V5QS5j
b21wYXJlKGluZGV4RGF0YUtleUIsIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsKKyAgICB9CisKKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBj
b21wYXJlS2V5cyhjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikK
K3sKKyAgICByZXR1cm4gcmVhbENvbXBhcmUobGV2ZWxkYjo6U2xpY2UoYS5iZWdpbigpLCBhLmVu
ZCgpIC0gYS5iZWdpbigpKSwgbGV2ZWxkYjo6U2xpY2UoYi5iZWdpbigpLCBiLmVuZCgpIC0gYi5i
ZWdpbigpKSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUluZGV4S2V5cyhjb25zdCBMZXZlbERC
U2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sKKyAgICByZXR1cm4gcmVhbENvbXBh
cmUobGV2ZWxkYjo6U2xpY2UoYS5iZWdpbigpLCBhLmVuZCgpIC0gYS5iZWdpbigpKSwgbGV2ZWxk
Yjo6U2xpY2UoYi5iZWdpbigpLCBiLmVuZCgpIC0gYi5iZWdpbigpKSwgdHJ1ZSk7Cit9CisKK2Ns
YXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgbGV2ZWxkYjo6Q29tcGFyYXRvciB7CitwdWJsaWM6Cisg
ICAgdmlydHVhbCBpbnQgQ29tcGFyZShjb25zdCBsZXZlbGRiOjpTbGljZSYgYSwgY29uc3QgbGV2
ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgeSA9IHJlYWxDb21wYXJl
KGEsIGIpOworICAgICAgICByZXR1cm4geTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBOYW1l
KCkgY29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQorICAgIHZvaWQgRmluZFNob3J0ZXN0U2Vw
YXJhdG9yKHN0ZDo6c3RyaW5nKiwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmKSBjb25zdCB7fSAvLyBG
SVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCisgICAgdm9pZCBGaW5kU2hvcnRTdWNjZXNzb3Io
c3RkOjpzdHJpbmcqKSBjb25zdCB7fSAvLyBGSVhNRTogSW1wbGVtZW50IGV2ZW50dWFsbHkuCit9
OworfQorCitzdGF0aWMgYm9vbCBzZXRVcE1ldGFkYXRhKExldmVsREJEYXRhYmFzZSogZGIpCit7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG1ldGFEYXRhS2V5ID0gU2NoZW1hVmVyc2lvbktleTo6
ZW5jb2RlKCk7CisKKyAgICBpbnQ2NF90IHNjaGVtYVZlcnNpb247CisgICAgaWYgKCFnZXRJbnQo
ZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9uKSkgeworICAgICAgICBzY2hlbWFWZXJzaW9u
ID0gMDsKKyAgICAgICAgaWYgKCFwdXRJbnQoZGIsIG1ldGFEYXRhS2V5LCBzY2hlbWFWZXJzaW9u
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogRXZl
bnR1YWxseSwgd2UnbGwgbmVlZCB0byBiZSBhYmxlIHRvIHRyYW5zaXRpb24gYmV0d2VlbiBzY2hl
bWFzLgorICAgIGlmIChzY2hlbWFWZXJzaW9uKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIERv
bid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMgdmVyc2lvbi4KKworICAgIHJldHVybiB0cnVl
OworfQorCitJREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlKFN0
cmluZyBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3RvcnksIExldmVsREJE
YXRhYmFzZSogZGIpCiAgICAgOiBtX2lkZW50aWZpZXIoaWRlbnRpZmllcikKICAgICAsIG1fZmFj
dG9yeShmYWN0b3J5KQogICAgICwgbV9kYihkYikKQEAgLTQ3LDE1NyArMTU2MCwxMTM5IEBAIElE
QkxldmVsREJCYWNraW5nU3RvcmU6On5JREJMZXZlbERCQmFja2luZ1N0b3JlKCkKICAgICBtX2Zh
Y3RvcnktPnJlbW92ZUlEQkJhY2tpbmdTdG9yZShtX2lkZW50aWZpZXIpOwogfQogCi1QYXNzUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihTZWN1cml0
eU9yaWdpbiosIGNvbnN0IFN0cmluZyYsIGludDY0X3QsIGNvbnN0IFN0cmluZyYsIElEQkZhY3Rv
cnlCYWNrZW5kSW1wbCopCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6b3BlbihTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0
cmluZyYgcGF0aEJhc2VBcmcsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmls
ZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9yeSkKK3sKKyAgICBTdHJp
bmcgcGF0aEJhc2UgPSBwYXRoQmFzZUFyZzsKKworICAgIGlmIChwYXRoQmFzZS5pc0VtcHR5KCkp
IHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBXZSBuZWVkIHRvIGhh
bmRsZSB0aGlzIGNhc2UgZm9yIGluY29nbml0byBhbmQgRHVtcFJlbmRlclRyZWUuCisgICAgICAg
IHJldHVybiAwOworICAgIH0KKworICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhCYXNl
KSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgSW5kZXhlZERCIGRhdGFi
YXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZXZlbnR1YWxseSB1c2UgdGhlIHNhbWUg
TGV2ZWxEQiBkYXRhYmFzZSBmb3IgYWxsIG9yaWdpbnMuCisgICAgU3RyaW5nIHBhdGggPSBwYXRo
QnlBcHBlbmRpbmdDb21wb25lbnQocGF0aEJhc2UsIHNlY3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlk
ZW50aWZpZXIoKSArICIuaW5kZXhlZGRiLmxldmVsZGIiKTsKKworICAgIE93blB0cjxsZXZlbGRi
OjpDb21wYXJhdG9yPiBjb21wYXJhdG9yKG5ldyBDb21wYXJhdG9yKCkpOworICAgIExldmVsREJE
YXRhYmFzZSogZGIgPSBMZXZlbERCRGF0YWJhc2U6Om9wZW4ocGF0aCwgY29tcGFyYXRvci5nZXQo
KSk7CisgICAgaWYgKCFkYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBGSVhNRTogSGFu
ZGxlIGNvbXBhcmF0b3IgbmFtZSBjaGFuZ2VzLgorCisgICAgUmVmUHRyPElEQkxldmVsREJCYWNr
aW5nU3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZShmaWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CisgICAgYmFja2luZ1N0b3JlLT5tX2Nv
bXBhcmF0b3IgPSBjb21wYXJhdG9yLnJlbGVhc2UoKTsKKworICAgIGlmICghc2V0VXBNZXRhZGF0
YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0KCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJl
dHVybiBiYWNraW5nU3RvcmUucmVsZWFzZSgpOworfQorCitib29sIElEQkxldmVsREJCYWNraW5n
U3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3Ry
aW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpCit7CisgICAgY29uc3QgVmVjdG9y
PGNoYXI+IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7
CisKKyAgICBib29sIG9rID0gZ2V0SW50KG1fZGIuZ2V0KCksIGtleSwgZm91bmRJZCk7CisgICAg
aWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgb2sgPSBnZXRTdHJpbmcobV9k
Yi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGZvdW5kSWQsIERhdGFiYXNlTWV0
YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIGZvdW5kVmVyc2lvbik7CisgICAgaWYgKCFvaykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQ2
NF90IGdldE5ld0RhdGFiYXNlSWQoTGV2ZWxEQkRhdGFiYXNlKiBkYikKK3sKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdGFydEtleSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29k
ZSgwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdG9wS2V5ID0gRGF0YWJhc2VG
cmVlTGlzdEtleTo6ZW5jb2RlKElOVDY0X01BWCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJh
dG9yPiBpdChkYi0+bmV3SXRlcmF0b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhmcmVlTGlzdFN0
YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGZyZWVMaXN0
U3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+
a2V5KCkuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCkuZW5k
KCk7CisKKyAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAg
cCA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsK
KyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGJvb2wgb2sgPSBkYi0+cmVtb3ZlKGl0LT5r
ZXkoKSk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgICAgICByZXR1cm4g
ZnJlZUxpc3RLZXkuZGF0YWJhc2VJZCgpOworICAgIH0KKworICAgIC8vIElmIHdlIGdvdCBoZXJl
LCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0LgorICAgIGludDY0X3QgbWF4RGF0YWJhc2VJZDsKKyAg
ICBpZiAoIWdldEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIG1heERhdGFiYXNl
SWQpKQorICAgICAgICBtYXhEYXRhYmFzZUlkID0gMDsKKworICAgIGludDY0X3QgZGF0YWJhc2VJ
ZCA9IG1heERhdGFiYXNlSWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIE1heERhdGFi
YXNlSWRLZXk6OmVuY29kZSgpLCBkYXRhYmFzZUlkKTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBv
ayk7CisKKyAgICByZXR1cm4gZGF0YWJhc2VJZDsKKworfQorCitib29sIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKIHsK
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1
cm4gYWRvcHRSZWYobmV3IElEQkxldmVsREJCYWNraW5nU3RvcmUoIiIsIDAsIDApKTsKKyAgICBp
ZiAoaW52YWxpZFJvd0lkKSB7CisgICAgICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJhc2VJZChtX2Ri
LmdldCgpKTsKKworICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1l
S2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKKyAgICAgICAgaWYgKCFwdXRJbnQobV9k
Yi5nZXQoKSwga2V5LCByb3dJZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5j
b2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprVXNlclZlcnNpb24pLCB2ZXJzaW9uKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3Ry
aW5nJiwgU3RyaW5nJiwgaW50NjRfdCYpCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6Omdl
dE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJ
ZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQ
YXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykKIHsKLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIDEsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9w
S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIElOVDY0X01B
WCwgMCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChtX2RiLT5uZXdJdGVyYXRv
cigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21w
YXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgeworICAgICAgICBj
b25zdCBjaGFyICpwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxp
bWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkg
bWV0YURhdGFLZXk7CisgICAgICAgIHAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUo
cCwgbGltaXQsICZtZXRhRGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBp
bnQ2NF90IG9iamVjdFN0b3JlSWQgPSBtZXRhRGF0YUtleS5vYmplY3RTdG9yZUlkKCk7CisKKyAg
ICAgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5i
ZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsKKyAgICAg
ICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0IG5vdCB2
YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5n
IGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCku
ZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQo
KSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2wgYXV0b0luY3JlbWVudCA9ICppdC0+
dmFsdWUoKS5iZWdpbigpOworCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIElzIGV2aWNhdGJsZS4K
KyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIml0
IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAg
ICBpdC0+bmV4dCgpOyAvLyBMYXN0IHZlcnNpb24uCisgICAgICAgIGlmICghaXQtPmlzVmFsaWQo
KSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJpdCBub3QgdmFsaWRcbiIpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8gTWF4aXVtIGlu
ZGV4IGlkIGFsbG9jYXRlZC4KKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIml0IG5vdCB2YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBmb3VuZElkcy5hcHBlbmQob2JqZWN0U3RvcmVJZCk7CisgICAg
ICAgIGZvdW5kTmFtZXMuYXBwZW5kKG9iamVjdFN0b3JlTmFtZSk7CisgICAgICAgIGZvdW5kS2V5
UGF0aHMuYXBwZW5kKGtleVBhdGgpOworICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5h
cHBlbmQoYXV0b0luY3JlbWVudCk7CisgICAgfQogfQogCitzdGF0aWMgaW50NjRfdCBnZXROZXdP
YmplY3RTdG9yZUlkKExldmVsREJEYXRhYmFzZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKK3sK
KyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdGFydEtleSA9IE9iamVjdFN0b3JlRnJl
ZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
ZnJlZUxpc3RTdG9wS2V5ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIElOVDY0X01BWCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChkYi0+bmV3
SXRlcmF0b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhmcmVlTGlzdFN0YXJ0S2V5KTsgaXQtPmlz
VmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGZyZWVMaXN0U3RvcEtleSkgPCAwOyBp
dC0+bmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsK
KyAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAg
T2JqZWN0U3RvcmVGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0
b3JlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsKKyAgICAgICAg
QVNTRVJUKHApOworCisgICAgICAgIGJvb2wgb2sgPSBkYi0+cmVtb3ZlKGl0LT5rZXkoKSk7Cisg
ICAgICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgICAgICByZXR1cm4gZnJlZUxpc3RL
ZXkub2JqZWN0U3RvcmVJZCgpOworICAgIH0KKworICAgIGludDY0X3QgbWF4T2JqZWN0U3RvcmVJ
ZDsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprTWF4
T2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXks
IG1heE9iamVjdFN0b3JlSWQpKQorICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKKworICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IG1heE9iamVjdFN0b3JlSWQgKyAxOworICAgIGJvb2wg
b2sgPSBwdXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAg
IEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKIAotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpz
ZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYsIGludDY0
X3QmLCBib29sKQorICAgIHJldHVybiBvYmplY3RTdG9yZUlkOworfQorCitib29sIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVu
dCwgaW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQ2
NF90IG9iamVjdFN0b3JlSWQgPSBnZXROZXdPYmplY3RTdG9yZUlkKG1fZGIuZ2V0KCksIGRhdGFi
YXNlSWQpOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVLZXkgPSBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgY29u
c3QgVmVjdG9yPGNoYXI+IGtleVBhdGhLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IGF1dG9JbmNyZW1lbnRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGV2aWN0YWJs
ZUtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAzKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkgPSBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRLZXkgPSBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNSk7CisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IG5hbWVzS2V5ID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG5hbWUpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBuYW1l
S2V5LCBuYW1lKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRv
IHNldCBuYW1lIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1
dFN0cmluZyhtX2RiLmdldCgpLCBrZXlQYXRoS2V5LCBrZXlQYXRoKTsKKyAgICBpZiAoIW9rKSB7
CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBrZXkgcGF0aCIpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgYXV0b0lu
Y3JlbWVudEtleSwgYXV0b0luY3JlbWVudCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0df
RVJST1IoImZhaWxlZCB0byBzZXQgYXV0byBpbmNyZW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIGV2aWN0YWJsZUtleSwg
ZmFsc2UpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0
IGV2aWN0YWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBw
dXRJbnQobV9kYi5nZXQoKSwgbGFzdFZlcnNpb25LZXksIDEpOworICAgIGlmICghb2spIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0IGxhc3QgdmVyc2lvbiBudW1iZXIiKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCks
IG1heEluZGV4SWRLZXksIGtNaW5pbXVtSW5kZXhJZCk7CisgICAgaWYgKCFvaykgeworICAgICAg
ICBMT0dfRVJST1IoImZhaWxlZCB0byBzZXQgbWF4IGluZGV4IGlkIik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBuYW1lc0tleSwg
b2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoImZhaWxl
ZCB0byBzZXQgb2JqZWN0IHN0b3JlIGlkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBhc3NpZ25lZE9iamVjdFN0b3JlSWQgPSBvYmplY3RTdG9yZUlkOworCisgICAgcmV0
dXJuIHRydWU7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3Rv
cmVzKGludDY0X3QsIFZlY3RvcjxpbnQ2NF90PiYsIFZlY3RvcjxTdHJpbmc+JiwgVmVjdG9yPFN0
cmluZz4mLCBWZWN0b3I8Ym9vbD4mKQorc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UoTGV2ZWxEQkRh
dGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBiZWdpbiwgY29uc3QgVmVjdG9yPGNoYXI+
JiBlbmQpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQu
CisgICAgLy8gRklYTUU6IExldmVsREIgbWF5IGJlIGFibGUgdG8gcHJvdmlkZSBhIGJ1bGsgb3Bl
cmF0aW9uIHRoYXQgd2UgY2FuIGRvIGZpcnN0LgorICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+
IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKGJlZ2luKTsgaXQtPmlz
VmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+bmV4dCgpKSB7
CisgICAgICAgIGlmICghZGItPnJlbW92ZShpdC0+a2V5KCkpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QsIGNvbnN0IFN0cmluZyYsIGNv
bnN0IFN0cmluZyYsIGJvb2wsIGludDY0X3QmKQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4K
LSAgICByZXR1cm4gZmFsc2U7CisgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZTsKKyAgICBnZXRT
dHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIDApLCBvYmplY3RTdG9yZU5hbWUpOworCisgICAgaWYgKCFkZWxl
dGVSYW5nZShtX2RiLmdldCgpLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA2KSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KKworICAgIHB1dFN0cmluZyhtX2RiLmdldCgpLCBPYmplY3RTdG9yZUZy
ZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCksICIiKTsKKyAgICBt
X2RiLT5yZW1vdmUoT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlTmFtZSkpOworCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBJbmRleEZy
ZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIEluZGV4RnJl
ZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgpKSkK
KyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorICAgIGlmICghZGVsZXRl
UmFuZ2UobV9kYi5nZXQoKSwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIDAsIDApLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYLCAwKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KKworICAgIGNsZWFyT2JqZWN0U3RvcmUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCk7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0
U3RvcmUoaW50NjRfdCwgaW50NjRfdCkKK1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpn
ZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBP
YmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkp
OworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworCisgICAgaWYgKCFtX2RiLT5nZXQobGV2ZWxkYktl
eSwgZGF0YSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGludDY0X3QgdmVyc2lv
bjsKKyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwgZGF0YS5l
bmQoKSwgdmVyc2lvbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7Cisg
ICAgKHZvaWQpIHZlcnNpb247CisKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nKHAsIGRhdGEuZW5k
KCkpOworfQorCituYW1lc3BhY2UgeworY2xhc3MgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIgOiBw
dWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIgeworcHVi
bGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBjcmVh
dGUoY29uc3QgVmVjdG9yPGNoYXI+JiBwcmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNpb24pIHsgcmV0
dXJuIGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSWRlbnRpZmllcihwcmltYXJ5S2V5LCB2ZXJz
aW9uKSk7IH0KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4g
Y3JlYXRlKCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKCkp
OyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFy
eUtleS5pc0VtcHR5KCk7IH0KKyAgICBWZWN0b3I8Y2hhcj4gcHJpbWFyeUtleSgpIGNvbnN0IHsg
cmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZvaWQgc2V0UHJpbWFyeUtleShjb25zdCBWZWN0
b3I8Y2hhcj4mIHByaW1hcnlLZXkpIHsgbV9wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsgfQorICAg
IGludDY0X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorICAgIHZvaWQg
c2V0VmVyc2lvbihpbnQ2NF90IHZlcnNpb24pIHsgbV92ZXJzaW9uID0gdmVyc2lvbjsgfQorCitw
cml2YXRlOgorICAgIExldmVsREJSZWNvcmRJZGVudGlmaWVyKGNvbnN0IFZlY3RvcjxjaGFyPiYg
cHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtleShwcmltYXJ5S2V5KSwg
bV92ZXJzaW9uKHZlcnNpb24pIHsgQVNTRVJUKCFwcmltYXJ5S2V5LmlzRW1wdHkoKSk7IH0KKyAg
ICBMZXZlbERCUmVjb3JkSWRlbnRpZmllcigpIDogbV9wcmltYXJ5S2V5KCksIG1fdmVyc2lvbigt
MSkge30KKworICAgIFZlY3RvcjxjaGFyPiBtX3ByaW1hcnlLZXk7IC8vIEZJWE1FOiBNYWtlIGl0
IG1vcmUgY2xlYXIgdGhhdCB0aGlzIGlzIHRoZSAqZW5jb2RlZCogdmVyc2lvbiBvZiB0aGUga2V5
LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKIH0KIAotU3RyaW5nIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGNvbnN0IElE
QktleSYpCitzdGF0aWMgaW50NjRfdCBnZXROZXdWZXJzaW9uTnVtYmVyKExldmVsREJEYXRhYmFz
ZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBT
dHJpbmcoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7CisK
KyAgICBpbnQ2NF90IGxhc3RWZXJzaW9uOworICAgIGlmICghZ2V0SW50KGRiLCBsYXN0VmVyc2lv
bktleSwgbGFzdFZlcnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBBU1NF
UlQobGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lv
biArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbGFzdFZlcnNpb25LZXksIHZlcnNpb24p
OworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIEFTU0VSVCh2ZXJzaW9uID4gbGFz
dFZlcnNpb24pOyAvLyBGSVhNRTogVGhpbmsgYWJvdXQgaG93IHdlIHdhbnQgdG8gaGFuZGxlIHRo
ZSBvdmVyZmxvdyBzY2VuYXJpby4KKworICAgIHJldHVybiB2ZXJzaW9uOwogfQogCi1ib29sIElE
QkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0
X3QsIGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmluZyYsIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRp
ZmllciopCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiBy
ZWNvcmRJZGVudGlmaWVyKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTog
SW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBnZXRO
ZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwor
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZWRhdGFLZXkgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworCisgICAgVmVj
dG9yPGNoYXI+IHY7CisgICAgdi5hcHBlbmQoZW5jb2RlVmFySW50KHZlcnNpb24pKTsKKyAgICB2
LmFwcGVuZChlbmNvZGVTdHJpbmcodmFsdWUpKTsKKworICAgIGlmICghbV9kYi0+cHV0KG9iamVj
dFN0b3JlZGF0YUtleSwgdikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBleGlzdHNFbnRyeUtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsKKyAgICBpZiAoIW1fZGItPnB1dChleGlzdHNFbnRy
eUtleSwgZW5jb2RlSW50KHZlcnNpb24pKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGlj
X2Nhc3Q8TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAgICBs
ZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5KSk7
CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7CisgICAg
cmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xlYXJPYmpl
Y3RTdG9yZShpbnQ2NF90LCBpbnQ2NF90KQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
bGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAwKS5lbmNvZGUoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9
IEtleVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7CisK
KyAgICBkZWxldGVSYW5nZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7CiB9CiAKIFBh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IElE
QkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKCkKIHsK
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZSgpOwogfQog
Ci12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGlu
dDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCit2b2lk
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJlY29y
ZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZp
ZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJl
Y29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hh
cj4ga2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisgICAgbV9kYi0+
cmVtb3ZlKGtleSk7CiB9CiAKLWRvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0
b0luY3JlbWVudE51bWJlcihpbnQ2NF90LCBpbnQ2NF90KQorZG91YmxlIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhN
RTogSW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFy
dEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIG1pbklEQktleSgpKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9iamVj
dFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktl
eSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9y
KCkpOworCisgICAgaW50IG1heE51bWVyaWNLZXkgPSAwOworCisgICAgLy8gRklYTUU6IEJlIG1v
cmUgZWZmaWNpZW50OiBzZWVrIHRvIHNvbWV0aGluZyBhZnRlciB0aGUgb2JqZWN0IHN0b3JlIGRh
dGEsIHRoZW4gcmV2ZXJzZS4KKworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNW
YWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgp
KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAg
Y29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgT2JqZWN0U3Rv
cmVEYXRhS2V5IGRhdGFLZXk7CisgICAgICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29k
ZShwLCBsaW1pdCwgJmRhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaWYg
KGRhdGFLZXkudXNlcktleSgpLT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7CisgICAg
ICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihkYXRhS2V5LnVzZXJLZXko
KS0+bnVtYmVyKCkpOworICAgICAgICAgICAgaWYgKG4gPiBtYXhOdW1lcmljS2V5KQorICAgICAg
ICAgICAgICAgIG1heE51bWVyaWNLZXkgPSBuOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIG1heE51bWVyaWNLZXkgKyAxOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5Jiwg
T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmll
ciogZm91bmRSZWNvcmRJZGVudGlmaWVyKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAv
LyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8
Y2hhcj4gbGV2ZWxkYktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisKKyAgICBpZiAo
IW1fZGItPmdldChsZXZlbGRiS2V5LCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaW50NjRfdCB2ZXJzaW9uOworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwg
ZGF0YS5lbmQoKSwgdmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExldmVs
REJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19jYXN0
PExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4oZm91bmRSZWNvcmRJZGVudGlmaWVyKTsKKyAgICBs
ZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5KSk7
CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7CisgICAg
cmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9i
amVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIE9iamVjdFN0b3JlUmVjb3JkQ2FsbGJh
Y2smKQorYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNv
cmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3Jl
UmVjb3JkQ2FsbGJhY2smIGNhbGxiYWNrKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAv
LyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8
Y2hhcj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BL
ZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBtYXhJREJLZXkoKSk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChtX2RiLT5u
ZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQo
KSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgewor
ICAgICAgICBjb25zdCBjaGFyICpwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNvbnN0
IGNoYXIgKmxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworICAgICAgICBPYmplY3RTdG9yZURhdGFL
ZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAsIGxp
bWl0LCAmZGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBSZWZQdHI8SURC
S2V5PiBwcmltYXJ5S2V5ID0gZGF0YUtleS51c2VyS2V5KCk7CisKKyAgICAgICAgaW50NjRfdCB2
ZXJzaW9uOworICAgICAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KGl0LT52YWx1ZSgp
LmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKCFxKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlZlB0cjxMZXZlbERCUmVjb3Jk
SWRlbnRpZmllcj4gcmkgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29kZUlE
QktleSgqcHJpbWFyeUtleSksIHZlcnNpb24pOworICAgICAgICBTdHJpbmcgaWRiVmFsdWUgPSBk
ZWNvZGVTdHJpbmcocSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGNhbGxiYWNrLmNh
bGxiYWNrKHJpLmdldCgpLCBpZGJWYWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CiB9
CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2NF90LCBpbnQ2
NF90LCBWZWN0b3I8aW50NjRfdD4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3RvcjxTdHJpbmc+Jiwg
VmVjdG9yPGJvb2w+JikKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0X3Q+
JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+JiBm
b3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgVmVjdG9y
PGNoYXI+IHN0YXJ0S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIDAsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gSW5k
ZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAwLCAw
KTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9yKCkp
OworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVL
ZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgIGNvbnN0
IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgY2hhciogbGltaXQg
PSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0YUtl
eTsKKyAgICAgICAgcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFE
YXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGludDY0X3QgaW5kZXhJZCA9
IG1ldGFEYXRhS2V5LmluZGV4SWQoKTsKKyAgICAgICAgQVNTRVJUKCFtZXRhRGF0YUtleS5tZXRh
RGF0YVR5cGUoKSk7CisKKyAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlY29kZVN0cmluZyhp
dC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisgICAgICAgIGl0LT5uZXh0
KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJpdCBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIGJvb2wgaW5kZXhVbmlxdWUgPSAqaXQtPnZhbHVlKCkuYmVnaW4oKTsKKyAgICAgICAgaXQt
Pm5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0df
RVJST1IoIml0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElk
KTsKKyAgICAgICAgZm91bmROYW1lcy5hcHBlbmQoaW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRL
ZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7CisgICAgICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5k
KGluZGV4VW5pcXVlKTsKKyAgICB9CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlSW5kZXgoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5n
JiwgYm9vbCwgaW50NjRfdCYpCitzdGF0aWMgaW50NjRfdCBnZXROZXdJbmRleElkKExldmVsREJE
YXRhYmFzZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQog
ewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJl
dHVybiBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJbmRleEZyZWVM
aXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0
b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsg
aXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQt
Pm5leHQoKSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7Cisg
ICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIElu
ZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RLZXk7CisgICAgICAgIHAgPSBJbmRleEZyZWVMaXN0S2V5
OjpkZWNvZGUocCwgbGltaXQsICZmcmVlTGlzdEtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKwor
ICAgICAgICBib29sIG9rID0gZGItPnJlbW92ZShpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlRf
VU5VU0VEKG9rLCBvayk7CisKKyAgICAgICAgQVNTRVJUKGZyZWVMaXN0S2V5LmluZGV4SWQoKSA+
PSBrTWluaW11bUluZGV4SWQpOworICAgICAgICByZXR1cm4gZnJlZUxpc3RLZXkuaW5kZXhJZCgp
OworICAgIH0KKworICAgIGludDY0X3QgbWF4SW5kZXhJZDsKKyAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBpZiAoIWdldEludChkYiwgbWF4SW5kZXhJZEtl
eSwgbWF4SW5kZXhJZCkpCisgICAgICAgIG1heEluZGV4SWQgPSBrTWluaW11bUluZGV4SWQ7CisK
KyAgICBpbnQ2NF90IGluZGV4SWQgPSBtYXhJbmRleElkICsgMTsKKyAgICBib29sIG9rID0gcHV0
SW50KGRiLCBtYXhJbmRleElkS2V5LCBpbmRleElkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gaW5kZXhJZDsKK30KKworYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJv
b2wgaXNVbmlxdWUsIGludDY0X3QmIGluZGV4SWQpCit7CisgICAgaW5kZXhJZCA9IGdldE5ld0lu
ZGV4SWQobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7CisKKyAgICBjb25z
dCBWZWN0b3I8Y2hhcj4gbmFtZUtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
dW5pcXVlS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIDEpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0g
SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIDIpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBuYW1lS2V5LCBu
YW1lKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBp
bmRleCBuYW1lIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1
dEludChtX2RiLmdldCgpLCB1bmlxdWVLZXksIGlzVW5pcXVlKTsKKyAgICBpZiAoIW9rKSB7Cisg
ICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCBpc191bmlxdWUiKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIGtleVBh
dGhLZXksIGtleVBhdGgpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJmYWls
ZWQgdG8gc2V0IGtleSBwYXRoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJ
bmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBG
SVhNRTogSW1wbGVtZW50IGFuZCBhZGQgbGF5b3V0IHRlc3QuCisgICAgcmV0dXJuOworfQorCiti
b29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJ
ZGVudGlmaWVyKQoreworICAgIEFTU0VSVChpbmRleElkID49IGtNaW5pbXVtSW5kZXhJZCk7Cisg
ICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVy
ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVu
dGlmaWVyKTsKKworICAgIGNvbnN0IGludDY0X3QgZ2xvYmFsU2VxdWVuY2VOdW1iZXIgPSBnZXRO
ZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwor
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFLZXkgPSBJbmRleERhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGdsb2JhbFNlcXVlbmNl
TnVtYmVyKTsKKworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgIGRhdGEuYXBwZW5kKGVuY29k
ZVZhckludChsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+dmVyc2lvbigpKSk7CisgICAgZGF0YS5h
cHBlbmQobGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisKKyAgICByZXR1
cm4gbV9kYi0+cHV0KGluZGV4RGF0YUtleSwgZGF0YSk7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGludDY0
X3QsIGNvbnN0IElEQktleSYsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCitz
dGF0aWMgYm9vbCBmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihMZXZlbERCRGF0YWJhc2UqIGRiLCBj
b25zdCBWZWN0b3I8Y2hhcj4mIHRhcmdldCwgVmVjdG9yPGNoYXI+JiBmb3VuZEtleSkKIHsKLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4g
ZmFsc2U7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQoZGItPm5ld0l0ZXJhdG9yKCkp
OworICAgIGl0LT5zZWVrKHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpIHsKKyAg
ICAgICAgaXQtPnNlZWtUb0xhc3QoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChjb21wYXJlSW5kZXhL
ZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSA+PSAwKSB7CisgICAgICAgIGl0LT5wcmV2KCk7CisgICAg
ICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBmb3VuZEtleS5jbGVhcigpOworICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCku
YmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpIC0gaXQtPmtleSgpLmJlZ2luKCkpOworICAgIHJldHVy
biB0cnVlOwogfQogCiBib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0
YUZvclJlY29yZChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBPYmplY3RTdG9yZVJl
Y29yZElkZW50aWZpZXIqKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTog
SW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBu
ZWVkZWQgc2luY2Ugd2UgaW52YWxpZGF0ZSBpbmRleCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1i
ZXIgbWVjaGFuaXNtLgorICAgIHJldHVybiB0cnVlOwogfQogCi1TdHJpbmcgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwg
Y29uc3QgSURCS2V5JikKK1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RW
aWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgUmVmUHRy
PElEQktleT4gcHJpbWFyeUtleSA9IGdldFByaW1hcnlLZXlWaWFJbmRleChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOworICAgIGlmICghcHJpbWFyeUtleSkKKyAgICAg
ICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJuIGdldE9iamVjdFN0b3JlUmVjb3JkKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpwcmltYXJ5S2V5KTsKIH0KIAotUGFzc1JlZlB0cjxJ
REJLZXk+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2
NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmKQorc3RhdGljIGJvb2wgdmVyc2lv
bkV4aXN0cyhMZXZlbERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCB2ZXJzaW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29k
ZWRQcmltYXJ5S2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1w
bGVtZW50LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBFeGlz
dHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZWRQcmlt
YXJ5S2V5KTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKworICAgIGlmICghZGItPmdldChrZXks
IGRhdGEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGVjb2RlSW50KGRh
dGEuYmVnaW4oKSwgZGF0YS5lbmQoKSkgPT0gdmVyc2lvbjsKIH0KIAotYm9vbCBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbkluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3Qs
IGNvbnN0IElEQktleSYpCitQYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxz
ZTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGV2ZWxkYktleSA9IEluZGV4RGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgMCk7CisgICAgT3du
UHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0b3IoKSk7CisgICAgaXQtPnNl
ZWsobGV2ZWxkYktleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghaXQtPmlzVmFs
aWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoY29tcGFyZUluZGV4S2V5
cyhpdC0+a2V5KCksIGxldmVsZGJLZXkpID4gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisg
ICAgICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZh
ckludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWZWN0b3I8Y2hh
cj4gZW5jb2RlZFByaW1hcnlLZXk7CisgICAgICAgIGVuY29kZWRQcmltYXJ5S2V5LmFwcGVuZChw
LCBpdC0+dmFsdWUoKS5lbmQoKSAtIHApOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyht
X2RiLmdldCgpLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJp
bWFyeUtleSkpIHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5
IGFuZCBjb250aW51ZS4KKyAgICAgICAgICAgIG1fZGItPnJlbW92ZShpdC0+a2V5KCkpOworICAg
ICAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisK
KyAgICAgICAgUmVmUHRyPElEQktleT4gcHJpbWFyeUtleTsKKyAgICAgICAgZGVjb2RlSURCS2V5
KGVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmlt
YXJ5S2V5KTsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KIH0K
IAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktl
eVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pCitib29sIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmtleUV4aXN0c0luSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAg
Y29uc3QgVmVjdG9yPGNoYXI+IGxldmVsREJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIDApOworICAgIE93blB0cjxMZXZl
bERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9yKCkpOworCisgICAgYm9vbCBmb3VuZCA9
IGZhbHNlOworCisgICAgaXQtPnNlZWsobGV2ZWxEQktleSk7CisgICAgaWYgKGl0LT5pc1ZhbGlk
KCkgJiYgIWNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZlbERCS2V5KSkKKyAgICAgICAg
Zm91bmQgPSB0cnVlOworCisgICAgcmV0dXJuIGZvdW5kOwogfQogCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlD
dXJzb3IoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJD
dXJzb3I6OkRpcmVjdGlvbikKK25hbWVzcGFjZSB7CitjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDog
cHVibGljIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yIHsKK3B1YmxpYzoKKyAgICAvLyBJREJCYWNr
aW5nU3RvcmU6OkN1cnNvcgorICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0
IElEQktleSopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0dXJu
IG1fY3VycmVudEtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlL
ZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgp
ID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9y
ZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpID0gMDsgLy8g
RklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBhY3R1YWxseSB1c2VkLCBzbyBkcm9wIGl0Lgor
ICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9v
bCBsb2FkQ3VycmVudFJvdygpID0gMDsKKyAgICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0
ZWQ6CisgICAgQ3Vyc29ySW1wbENvbW1vbihMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0
b3I8Y2hhcj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hL
ZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBtX2RiKGRiKQorICAg
ICAgICAsIG1fbG93S2V5KGxvd0tleSkKKyAgICAgICAgLCBtX2xvd09wZW4obG93T3BlbikKKyAg
ICAgICAgLCBtX2hpZ2hLZXkoaGlnaEtleSkKKyAgICAgICAgLCBtX2hpZ2hPcGVuKGhpZ2hPcGVu
KQorICAgICAgICAsIG1fZm9yd2FyZChmb3J3YXJkKQorICAgIHsKKyAgICB9CisgICAgdmlydHVh
bCB+Q3Vyc29ySW1wbENvbW1vbigpIHt9CisKKyAgICBMZXZlbERCRGF0YWJhc2UqIG1fZGI7Cisg
ICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gbV9pdGVyYXRvcjsKKyAgICBWZWN0b3I8Y2hhcj4g
bV9sb3dLZXk7CisgICAgYm9vbCBtX2xvd09wZW47CisgICAgVmVjdG9yPGNoYXI+IG1faGlnaEtl
eTsKKyAgICBib29sIG1faGlnaE9wZW47CisgICAgYm9vbCBtX2ZvcndhcmQ7CisgICAgUmVmUHRy
PElEQktleT4gbV9jdXJyZW50S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpmaXJz
dFNlZWsoKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50
LgotICAgIHJldHVybiAwOworICAgIG1faXRlcmF0b3IgPSBtX2RiLT5uZXdJdGVyYXRvcigpOwor
CisgICAgaWYgKG1fZm9yd2FyZCkKKyAgICAgICAgbV9pdGVyYXRvci0+c2VlayhtX2xvd0tleSk7
CisgICAgZWxzZQorICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1faGlnaEtleSk7CisKKyAgICBm
b3IgKDs7KSB7CisgICAgICAgIGlmICghbV9pdGVyYXRvci0+aXNWYWxpZCgpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbiAm
JiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGln
aE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+
IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYm
IG1fbG93T3BlbiAmJiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tl
eSkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2Zvcndh
cmQgJiYgIW1fbG93T3BlbiAmJiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBt
X2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICht
X2ZvcndhcmQgJiYgbV9sb3dPcGVuKSB7CisgICAgICAgICAgICAvLyBsb3dLZXkgbm90IGluY2x1
ZGVkIGluIHRoZSByYW5nZS4KKyAgICAgICAgICAgIGlmIChjb21wYXJlSW5kZXhLZXlzKG1faXRl
cmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgeworICAgICAgICAgICAgICAgIG1faXRlcmF0
b3ItPm5leHQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuKSB7CisgICAgICAg
ICAgICAvLyBoaWdoS2V5IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCisgICAgICAgICAgICBp
ZiAoY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSB7
CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+cHJldigpOworICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsb2FkQ3Vy
cmVudFJvdygpKSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAgICAgICAg
IG1faXRlcmF0b3ItPm5leHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBt
X2l0ZXJhdG9yLT5wcmV2KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0
X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJl
Y3Rpb24pCitib29sIEN1cnNvckltcGxDb21tb246OmNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURC
S2V5KiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1l
bnQuCi0gICAgcmV0dXJuIDA7CisgICAgLy8gRklYTUU6IFRoaXMgc2hhcmVzIGEgbG90IG9mIGNv
ZGUgd2l0aCBmaXJzdFNlZWsuCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChtX2Zvcndh
cmQpCisgICAgICAgICAgICBtX2l0ZXJhdG9yLT5uZXh0KCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIG1faXRlcmF0b3ItPnByZXYoKTsKKworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPmlz
VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBWZWN0b3I8Y2hh
cj4gdHJhc2g7CisgICAgICAgIGlmICghbV9kYi0+Z2V0KG1faXRlcmF0b3ItPmtleSgpLCB0cmFz
aCkpCisgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiBt
X2hpZ2hPcGVuICYmIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtl
eSkgPj0gMCkgLy8gaGlnaCBrZXkgbm90IGluY2x1ZGVkIGluIHJhbmdlCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGlnaE9wZW4gJiYgY29t
cGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAm
JiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgLy8g
bG93IGtleSBub3QgaW5jbHVkZWQgaW4gcmFuZ2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgIW1fbG93T3BlbiAmJiBjb21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChtX2ZvcndhcmQpIHsK
KyAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50S2V5LT5pc0xlc3NUaGFuKGtleSkpCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBpZiAoa2V5LT5pc0xlc3NUaGFuKG1fY3VycmVudEtleS5nZXQoKSkpCisgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gRklYTUU6IE9iZXkgdGhlIHVuaXF1ZW5lc3MgY29uc3RyYWludCAoYW5kIHRlc3QgZm9y
IGl0ISkKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Y2xhc3MgT2JqZWN0U3RvcmVDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24gewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Jl
YXRlKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgbG93S2V5LCBib29s
IGxvd09wZW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9v
bCBmb3J3YXJkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9y
ZUN1cnNvckltcGwoZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndh
cmQpKTsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJp
bmcgdmFsdWUoKSB7IHJldHVybiBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0
U3RvcmVSZWNvcmRJZGVudGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7
IH0KKyAgICB2aXJ0dWFsIGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitw
cml2YXRlOgorICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChMZXZlbERCRGF0YWJhc2UqIGRiLCBj
b25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJz
b3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3
YXJkKQorICAgIHsKKyAgICB9CisKKyAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cit9OworCiti
b29sIE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0
IGNoYXIqIHAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGtl
eUxpbWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7CisKKyAgICBPYmplY3RTdG9yZURhdGFL
ZXkgb2JqZWN0U3RvcmVEYXRhS2V5OworICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29k
ZShwLCBrZXlMaW1pdCwgJm9iamVjdFN0b3JlRGF0YUtleSk7CisgICAgQVNTRVJUKHApOworICAg
IGlmICghcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9jdXJyZW50S2V5ID0gb2Jq
ZWN0U3RvcmVEYXRhS2V5LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBj
b25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwg
bV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7CisgICAgQVNTRVJUKHEpOworICAg
IGlmICghcSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICh2b2lkKSB2ZXJzaW9uOworCisg
ICAgbV9jdXJyZW50VmFsdWUgPSBkZWNvZGVTdHJpbmcocSwgbV9pdGVyYXRvci0+dmFsdWUoKS5l
bmQoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBs
IDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVm
UHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0
IFZlY3RvcjxjaGFyPiYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYg
aGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwoZGIsIGxvd0tleSwgbG93T3Blbiwg
aGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpKTsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBs
Q29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmlt
YXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9y
ZVJlY29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQor
ICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7
IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZh
dGU6CisgICAgSW5kZXhLZXlDdXJzb3JJbXBsKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZl
Y3RvcjxjaGFyPiYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYgaGln
aEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxD
b21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisg
ICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtleTsKK307CisKK2Jv
b2wgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29uc3QgY2hh
ciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGlt
aXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKyAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRh
S2V5OworICAgIHAgPSBJbmRleERhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1pdCwgJmluZGV4RGF0
YUtleSk7CisKKyAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOworCisg
ICAgaW50NjRfdCBpbmRleERhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVW
YXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVu
ZCgpLCBpbmRleERhdGFWZXJzaW9uKTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBxID0gZGVjb2RlSURCS2V5KHEsIG1faXRlcmF0b3It
PnZhbHVlKCkuZW5kKCksIG1fcHJpbWFyeUtleSk7CisgICAgQVNTRVJUKHEpOworICAgIGlmICgh
cSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVmVjdG9yPGNoYXI+IHByaW1hcnlMZXZl
bERCS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNl
SWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisKKyAg
ICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGlmICghbV9kYi0+Z2V0KHByaW1hcnlMZXZlbERC
S2V5LCByZXN1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVj
dFN0b3JlRGF0YVZlcnNpb247CisgICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1
bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsKKyAgICBB
U1NFUlQodCk7CisgICAgaWYgKCF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAo
b2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7IC8vIEZJWE1FOiBU
aGlzIGlzIHByb2JhYmx5IG5vdCB2ZXJ5IHdlbGwgY292ZXJlZCBieSB0aGUgbGF5b3V0IHRlc3Rz
LgorICAgICAgICBtX2RiLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4Q3Vy
c29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxJbmRleEN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCRGF0YWJhc2UqIGRiLCBj
b25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAg
IHJldHVybiBhZG9wdFJlZihuZXcgSW5kZXhDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4s
IGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1w
bENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV92YWx1ZTsgfQor
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3By
aW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmpl
Y3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGlu
ZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29s
IGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgSW5kZXhDdXJzb3JJbXBsKExldmVs
REJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgbG93S2V5LCBib29sIGxvd09wZW4s
IGNvbnN0IFZlY3RvcjxjaGFyPiYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJk
KQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtl
eSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+
IG1fcHJpbWFyeUtleTsKKyAgICBTdHJpbmcgbV92YWx1ZTsKKyAgICBWZWN0b3I8Y2hhcj4gbV9w
cmltYXJ5TGV2ZWxEQktleTsKK307CisKK2Jvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVu
dFJvdygpCit7CisgICAgY29uc3QgY2hhciAqcCA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7
CisgICAgY29uc3QgY2hhciAqbGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAg
IEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7CisgICAgcCA9IEluZGV4RGF0YUtleTo6ZGVjb2Rl
KHAsIGxpbWl0LCAmaW5kZXhEYXRhS2V5KTsKKworICAgIG1fY3VycmVudEtleSA9IGluZGV4RGF0
YUtleS51c2VyS2V5KCk7CisKKyAgICBjb25zdCBjaGFyICpxID0gbV9pdGVyYXRvci0+dmFsdWUo
KS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIgKnZhbHVlTGltaXQgPSBtX2l0ZXJhdG9yLT52YWx1
ZSgpLmVuZCgpOworCisgICAgaW50NjRfdCBpbmRleERhdGFWZXJzaW9uOworICAgIHEgPSBkZWNv
ZGVWYXJJbnQocSwgdmFsdWVMaW1pdCwgaW5kZXhEYXRhVmVyc2lvbik7CisgICAgQVNTRVJUKHEp
OworICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHEgPSBkZWNvZGVJREJL
ZXkocSwgdmFsdWVMaW1pdCwgbV9wcmltYXJ5S2V5KTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYg
KCFxKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX3ByaW1hcnlMZXZlbERCS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5k
ZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisKKyAgICBWZWN0b3I8
Y2hhcj4gcmVzdWx0OworICAgIGlmICghbV9kYi0+Z2V0KG1fcHJpbWFyeUxldmVsREJLZXksIHJl
c3VsdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3Qgb2JqZWN0U3RvcmVE
YXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiB0ID0gZGVjb2RlVmFySW50KHJlc3VsdC5iZWdp
bigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOworICAgIEFTU0VSVCh0
KTsKKyAgICBpZiAoIXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChvYmplY3RT
dG9yZURhdGFWZXJzaW9uICE9IGluZGV4RGF0YVZlcnNpb24pIHsKKyAgICAgICAgbV9kYi0+cmVt
b3ZlKG1faXRlcmF0b3ItPmtleSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIG1fdmFsdWUgPSBkZWNvZGVTdHJpbmcodCwgcmVzdWx0LmVuZCgpKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworfQorCitzdGF0aWMgYm9vbCBmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhMZXZl
bERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIHRhcmdldCwgVmVjdG9yPGNoYXI+
JiBmb3VuZEtleSkKK3sKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChkYi0+bmV3SXRl
cmF0b3IoKSk7CisgICAgaXQtPnNlZWsodGFyZ2V0KTsKKworICAgIGlmICghaXQtPmlzVmFsaWQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYg
IWNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCB0YXJnZXQpKSB7CisgICAgICAgIGZvdW5kS2V5
LmNsZWFyKCk7CisgICAgICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQt
PmtleSgpLmVuZCgpIC0gaXQtPmtleSgpLmJlZ2luKCkpOworICAgICAgICBpdC0+bmV4dCgpOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3Io
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJh
bmdlKiByYW5nZSwgSURCQ3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wg
bG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9IChkaXJlY3Rp
b24gPT0gSURCQ3Vyc29yOjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vy
c29yOjpORVhUKTsKKworICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CisgICAgVmVjdG9y
PGNoYXI+IHN0YXJ0S2V5LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAg
ICAgIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgICAgICBsb3dlck9wZW4gPSB0cnVlOyAvLyBO
b3QgaW5jbHVkZWQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPmxvd2Vy
KCkpOworICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisg
ICAgaWYgKCF1cHBlckJvdW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisgICAg
ICAgIHVwcGVyT3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgICAgICBpZiAoIWZv
cndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICgh
ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPnVwcGVyKCkp
OworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAg
UmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVDdXJzb3JJ
bXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBw
ZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5J
bmRleEtleUN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGly
ZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5n
ZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIo
KTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19E
VVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxv
d2VyT3BlbiwgdXBwZXJPcGVuOworICAgIFZlY3RvcjxjaGFyPiBzdGFydEtleSwgc3RvcEtleTsK
KworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1pbklEQktleSgp
LCAwKTsKKyAgICAgICAgbG93ZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorICAgIH0gZWxz
ZSB7CisgICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT5sb3dlcigpLCAwKTsKKyAgICAgICAgbG93
ZXJPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3Vu
ZCkgeworICAgICAgICBzdG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWF4SURCS2V5KCksIDApOworICAgICAgICB1cHBlck9w
ZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdl
IG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtl
eUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksIHN0b3BLZXkpKQorICAgICAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9IGVsc2UgeworICAgICAgICBzdG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpLCAwKTsKKyAgICAg
ICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9w
S2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlxdWUg
a2V5cy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdXBwZXJPcGVuID0gcmFu
Z2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+
IGN1cnNvciA9IEluZGV4S2V5Q3Vyc29ySW1wbDo6Y3JlYXRlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5
LCBsb3dlck9wZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCk7CisgICAgaWYgKCFjdXJz
b3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3Iu
cmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2Uq
IHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dl
ckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0g
cmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9
PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6
Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBWZWN0b3I8Y2hh
cj4gc3RhcnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAg
c3RhcnRLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkLCBtaW5JREJLZXkoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IGZhbHNlOyAv
LyBJbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93
ZXIoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9
CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1heElEQktleSgp
LCAwKTsKKyAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorCisgICAgICAg
IGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAg
ICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9w
S2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9
IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4
RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5n
ZS0+dXBwZXIoKSwgMCk7CisgICAgICAgIGlmICghZmluZExhc3RJbmRleEtleUVxdWFsVG8obV9k
Yi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4g
dGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHVwcGVyT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKyAgICB9CisKKyAgICBSZWZQ
dHI8SW5kZXhDdXJzb3JJbXBsPiBjdXJzb3IgPSBJbmRleEN1cnNvckltcGw6OmNyZWF0ZShtX2Ri
LmdldCgpLCBzdGFydEtleSwgbG93ZXJPcGVuLCBzdG9wS2V5LCB1cHBlck9wZW4sIGZvcndhcmQp
OworICAgIGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIER1bW15
VHJhbnNhY3Rpb24gOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiB7CitwdWJs
aWM6CisgICAgdmlydHVhbCB2b2lkIGJlZ2luKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0
KCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcm9sbGJhY2soKSB7fQorfTsKIH0KIAogUGFzc1JlZlB0
cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpj
cmVhdGVUcmFuc2FjdGlvbigpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1F
OiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gaW1w
bGVtZW50IGEgdHJhbnNhY3Rpb24gYWJzdHJhY3Rpb24gdGhhdCBhbGxvd3MgZm9yIHJvbGwtYmFj
a3MsIGFuZCB3cml0ZSB0ZXN0cyBmb3IgaXQuCisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBEdW1t
eVRyYW5zYWN0aW9uKCkpOwogfQogCisvLyBGSVhNRTogZGVsZXRlRGF0YWJhc2Ugc2hvdWxkIGJl
IHBhcnQgb2YgSURCQmFja2luZ1N0b3JlLgorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNl
bmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJM
ZXZlbERCQmFja2luZ1N0b3JlLmgKaW5kZXggODM0MmZiOWJjNWVhMDg1YTVjYjVhZDFmZjQzNzgw
ZWMxNjg0ZWEwMC4uMWZiMWZiNmQ5YjE4NmI1MTlkMTU4ZjVkZWUzMzcwMzc3ZDYyNjc5YiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmgKQEAg
LTMzLDEwICszMywxMyBAQAogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIAogbmFtZXNwYWNlIGxl
dmVsZGIgewotY2xhc3MgREI7CitjbGFzcyBDb21wYXJhdG9yOwogfQorCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKK2NsYXNzIExldmVsREJEYXRhYmFzZTsKKwogY2xhc3MgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZSA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmUgewogcHVibGljOgogICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gb3BlbihTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0
cmluZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0cmluZyYgZmlsZUlk
ZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCopOwpAQCAtNzQsMTEgKzc3LDEyIEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNyZWF0ZVRyYW5zYWN0
aW9uKCk7CiAKIHByaXZhdGU6Ci0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShTdHJpbmcgaWRl
bnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiwgbGV2ZWxkYjo6REIqKTsKKyAgICBJREJM
ZXZlbERCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZElt
cGwqLCBMZXZlbERCRGF0YWJhc2UqKTsKIAogICAgIFN0cmluZyBtX2lkZW50aWZpZXI7CiAgICAg
UmVmUHRyPElEQkZhY3RvcnlCYWNrZW5kSW1wbD4gbV9mYWN0b3J5OwotICAgIE93blB0cjxsZXZl
bGRiOjpEQj4gbV9kYjsKKyAgICBPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPiBtX2RiOworICAgIE93
blB0cjxsZXZlbGRiOjpDb21wYXJhdG9yPiBtX2NvbXBhcmF0b3I7CiB9OwogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>90035</attachid>
            <date>2011-04-18 07:49:58 -0700</date>
            <delta_ts>2011-04-18 08:06:10 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110418154955.patch</filename>
            <type>text/plain</type>
            <size>131748</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4MGQwNDNiN2IxOWNlODMz
MmY4NzRjNDM2NDViZTAyNThlMTE4ZGE3Li45MjBjYmY3ZGI1OTQzYTFlYTJiZWI2YWEzNTIzYmQx
M2MwNDEwYjkzIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTQgQEAKKzIwMTEtMDQtMTggIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBMZXZlbERC
IGJhY2tlbmQgZm9yIEluZGV4ZWREQgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTczNzIKKworICAgICAgICBBZGQgTGV2ZWxEQiB3cmFwcGVycyB0byBB
bmRyb2lkLm1rLgorCisgICAgICAgICogU291cmNlL0FuZHJvaWQubWs6CisKIDIwMTEtMDQtMTYg
IFBhdHJpY2sgR2Fuc3RlcmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRXJpYyBTZWlkZWwuCmRpZmYgLS1naXQgYS9Tb3VyY2UvQW5kcm9pZC5tayBiL1NvdXJj
ZS9BbmRyb2lkLm1rCmluZGV4IGMwMTE1YzE3ZTdjMjFmMjdkMzRjYjU5Mjc2N2ZiMmIxYmU4YWQ5
MDYuLmI4NjgzMGEzZDJlZTUxMzI1MTE3OWQzNDhmMGRhYWQyNTNhZTU4MzUgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9BbmRyb2lkLm1rCisrKyBiL1NvdXJjZS9BbmRyb2lkLm1rCkBAIC0xMTYsNiArMTE2
LDcgQEAgTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX0NfSU5DTFVERVMpIFwKIAkkKExPQ0FM
X1BBVEgpL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYSBcCiAJJChMT0NBTF9QQVRIKS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMgXAogCSQoTE9DQUxfUEFUSCkvV2Vi
Q29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycyBcCisJJChMT0NBTF9QQVRIKS9XZWJDb3JlL3Bs
YXRmb3JtL2xldmVsZGIgXAogCSQoTE9DQUxfUEFUSCkvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrIFwK
IAkkKExPQ0FMX1BBVEgpL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yayBcCiAJJChMT0NBTF9QQVRI
KS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYW5kcm9pZCBcCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9BbmRyb2lkLm1rIGIvU291cmNlL1dlYkNvcmUvQW5kcm9pZC5tawppbmRleCBkNmE1
Nzk3ZjYwMzVlZjhlNGM5NGZhNzU3MmUzNDY1ODViYTQxMThhLi44OGI5ZGIxMTQxZWI0MGI2NjIw
MGNmYWI3YzRhMTkwZGE3YmNiM2UxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9BbmRyb2lk
Lm1rCisrKyBiL1NvdXJjZS9XZWJDb3JlL0FuZHJvaWQubWsKQEAgLTYwNCw2ICs2MDQsOSBAQCBM
T0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpIFwKIAlwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy9naWYvR0lGSW1hZ2VEZWNvZGVyLmNwcCBcCiAJcGxhdGZvcm0vaW1hZ2UtZGVjb2Rl
cnMvZ2lmL0dJRkltYWdlUmVhZGVyLmNwcCBcCiAJXAorCXBsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
QkRhdGFiYXNlLmNwcCBcCisJcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuY3BwIFwK
KwlcCiAJcGxhdGZvcm0vbW9jay9EZXZpY2VPcmllbnRhdGlvbkNsaWVudE1vY2suY3BwIFwKIAlw
bGF0Zm9ybS9tb2NrL0dlb2xvY2F0aW9uQ2xpZW50TW9jay5jcHAgXAogCXBsYXRmb3JtL21vY2sv
R2VvbG9jYXRpb25TZXJ2aWNlTW9jay5jcHAgXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
Q01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAppbmRleCAwMzBi
OTcxMjliNDYwZGRhMDkxOTA2YzI1NDQ5NmNmODJjZDRhNDc0Li4yM2IxYTJkMzU0ODY5NzExZjQ4
YzlmNmZmMTI5MzdlNzM2YmEzMDI5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxp
c3RzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dApAQCAtMzgsNiArMzgs
NyBAQCBTRVQoV2ViQ29yZV9JTkNMVURFX0RJUkVDVE9SSUVTCiAgICAgIiR7V0VCQ09SRV9ESVJ9
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2pwZWciCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRm
b3JtL2ltYWdlLWRlY29kZXJzL3BuZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vaW1h
Z2UtZGVjb2RlcnMvd2VicCIKKyAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vbGV2ZWxkYiIK
ICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vbW9jayIKICAgICAiJHtXRUJDT1JFX0RJUn0v
cGxhdGZvcm0vbmV0d29yayIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vc3FsIgpAQCAt
MTQ0OCw2ICsxNDQ5LDEzIEBAIElGIChFTkFCTEVfREFUQV9UUkFOU0ZFUl9JVEVNUykKICAgICAp
CiBFTkRJRiAoKQogCitJRiAoRU5BQkxFX0xFVkVMREIpCisgICAgTElTVChBUFBFTkQgV2ViQ29y
ZV9TT1VSQ0VTCisgICAgICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcAor
ICAgICAgICBwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5jcHAKKyAgICApCitFTkRJ
RiAoKQorCiBJRiAoRU5BQkxFX01BVEhNTCkKICAgICBMSVNUKEFQUEVORCBXZWJDb3JlX1NPVVJD
RVMKICAgICAgICAgbWF0aG1sL01hdGhNTEVsZW1lbnQuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmRkMjUx
ZGU3NzQ2OTA0ZTU3N2ZhYmY5MjJlZmRiYzI0ZDVkY2FkMy4uMTE0NGNlZWUyNGJjMmZmYWMwMTAy
ODZmZWRhOWI2NzJjMzliZmQ3MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CisrKyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4MSBAQAorMjAxMS0w
NC0xOCAgSGFucyBXZW5uYm9yZyAgPGhhbnNAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIExldmVsREIgYmFja2VuZCBmb3IgSW5k
ZXhlZERCCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
NzM3MgorCisgICAgICAgIE9ubHkgYXZhaWxhYmxlIGJlaGluZCBhIHJ1bi10aW1lIGZsYWcuIENv
dmVyZWQgYnkgZXhpc3RpbmcgbGF5b3V0CisgICAgICAgIHRlc3RzLgorCisgICAgICAgICogQW5k
cm9pZC5tazoKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBHTlVtYWtlZmls
ZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgorICAgICAgICAqIFdlYkNvcmUu
Z3lwL1dlYkNvcmUuZ3lwOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJD
b3JlLnByaToKKyAgICAgICAgKiBXZWJDb3JlLnBybzoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERC
Q29tcGFyYXRvci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJDb21wYXJhdG9y
Ojp+TGV2ZWxEQkNvbXBhcmF0b3IpOgorICAgICAgICAqIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
QkRhdGFiYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjptYWtlU2xpY2UpOgorICAg
ICAgICAoV2ViQ29yZTo6bWFrZUxldmVsREJTbGljZSk6CisgICAgICAgIChXZWJDb3JlOjptYWtl
VmVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJEYXRhYmFzZTo6TGV2ZWxEQkRhdGFi
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJEYXRhYmFzZTo6fkxldmVsREJEYXRhYmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCRGF0YWJhc2U6Om9wZW4pOgorICAgICAgICAo
V2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpwdXQpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxE
QkRhdGFiYXNlOjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpn
ZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpuZXdJdGVyYXRvcik6Cisg
ICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuaDogQWRkZWQuCisgICAg
ICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6fkxldmVsREJJdGVyYXRvcik6CisgICAgICAg
IChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OkxldmVsREJJdGVyYXRvcik6CisgICAgICAgIChX
ZWJDb3JlOjptYWtlU2xpY2UpOgorICAgICAgICAoV2ViQ29yZTo6bWFrZUxldmVsREJTbGljZSk6
CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OmlzVmFsaWQpOgorICAgICAgICAo
V2ViQ29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjpzZWVrVG9MYXN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkxldmVsREJJdGVyYXRvcjo6c2Vlayk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCSXRlcmF0
b3I6Om5leHQpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjpwcmV2KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6a2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OkxldmVsREJJdGVyYXRvcjo6dmFsdWUpOgorICAgICAgICAqIHBsYXRmb3JtL2xldmVsZGIvTGV2
ZWxEQkl0ZXJhdG9yLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
QlNsaWNlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQlNsaWNlOjpMZXZlbERC
U2xpY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQlNsaWNlOjp+TGV2ZWxEQlNsaWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJTbGljZTo6YmVnaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6TGV2ZWxEQlNsaWNlOjplbmQpOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVCeXRlKToKKyAgICAgICAgKFdl
YkNvcmU6Om1heElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjptaW5JREJLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6ZW5jb2RlSW50KToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZUludCk6Cisg
ICAgICAgIChXZWJDb3JlOjplbmNvZGVWYXJJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2Rl
VmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVN0cmluZyk6CisgICAgICAgIChXZWJD
b3JlOjpkZWNvZGVTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlU3RyaW5nV2l0aExl
bmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKToKKyAgICAg
ICAgKFdlYkNvcmU6OmVuY29kZURvdWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpkZWNvZGVEb3Vi
bGUpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OmRlY29kZUlEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpleHRyYWN0RW5jb2RlZElEQktleSk6
CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlRW5jb2RlZElEQktleXMpOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0SW50KToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEludCk6CisgICAgICAgIChXZWJD
b3JlOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6cHV0U3RyaW5nKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6U2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6TWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJhc2VGcmVlTGlz
dEtleSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RLZXk6
OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxpc3RL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFiYXNlRnJlZUxp
c3RLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFz
ZUZyZWVMaXN0S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0
YWJhc2VOYW1lS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRh
YmFzZU5hbWVLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFi
YXNlTmFtZUtleTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJh
c2VOYW1lS2V5OjpkYXRhYmFzZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpE
YXRhYmFzZU5hbWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpE
YXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5KToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKToK
KyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5j
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0
b3JlTWV0YURhdGFLZXk6Om1ldGFEYXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVm
aXg6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5OjpJbmRleE1ldGFEYXRhS2V5KToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAg
IChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OmluZGV4SWQpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5OjptZXRhRGF0YVR5cGUpOgor
ICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChX
ZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5OjpJbmRleEZyZWVMaXN0
S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6ZGVj
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6ZW5j
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6Y29t
cGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6Om9i
amVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0
S2V5OjppbmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVO
YW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3Rv
cmVOYW1lc0tleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVOYW1lc0tleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9i
amVjdFN0b3JlTmFtZXNLZXk6Om9iamVjdFN0b3JlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OkluZGV4TmFtZXNLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpJbmRleE5hbWVzS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5UHJlZml4OjpJbmRleE5hbWVzS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpJbmRleE5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6SW5kZXhOYW1lc0tleTo6aW5kZXhOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6T2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6dXNlcktleSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6RXhpc3RzRW50cnlLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtleTo6dXNlcktleSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6SW5kZXhEYXRhS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpJbmRleERhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVm
aXg6OkluZGV4RGF0YUtleTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6SW5kZXhEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZp
eDo6SW5kZXhEYXRhS2V5OjpkYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZp
eDo6SW5kZXhEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6SW5kZXhEYXRhS2V5OjppbmRleElkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZp
eDo6SW5kZXhEYXRhS2V5Ojp1c2VyS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
cmVhbENvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4Ojpjb21wYXJlS2V5cyk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OmNvbXBhcmVJbmRleEtleXMpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpjb21wYXJlKToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6Q29tcGFyYXRvcjo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpz
ZXRVcE1ldGFkYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OklEQkxldmVsREJCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6b3Blbik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXRO
ZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6
OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld09i
amVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZGVsZXRlUmFuZ2UpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3Rv
cmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJlcik6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29y
ZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVj
dFN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0
ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJC
YWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3Rv
cmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9i
amVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmdldEluZGV4ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNv
cmQpOgorICAgICAgICAoV2ViQ29yZTo6ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4pOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXhEYXRhRm9yUmVj
b3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFZpYUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OnZlcnNpb25FeGlzdHMpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUluZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6ZmluZExhc3RJbmRleEtleUVxdWFsVG8pOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29y
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtl
eUN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVu
SW5kZXhDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlVHJhbnNhY3Rpb24pOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZS5oOgorCiAyMDExLTA0LTE3ICBUaGllcnJ5IFJlZGluZyAgPHRoaWVycnkucmVkaW5nQGF2
aW9uaWMtZGVzaWduLmRlPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1NvdXJjZS9XZWJDb3JlL0dO
VW1ha2VmaWxlLmFtCmluZGV4IGQ2OGVjMjdlMmJhYTY3M2YzZGJiOTI1ODg3NDMzZTU3ZGY0OGVm
NTguLjYzNTc1YWU5MmM4YmJhMDgxMDZjMmU4ZjAxMzcxMzhmNmY3MGViMjYgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtCkBAIC01Niw2ICs1Niw3IEBAIHdlYmNvcmVfY3BwZmxhZ3MgKz0gXAogCS1JJChz
cmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL2pwZWcgXAogCS1J
JChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAgXAog
CS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BuZyBc
CisJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYiBcCiAJLUkkKHNy
Y2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jayBcCiAJLUkkKHNyY2RpcikvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yayBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vc3FsIFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IGMwMWIwYzM5
NTZkNTE4MDM2ODlmNmI0MTcyZWIyMTkzOTE2NzFiMjQuLmRjNzgwYWMzMmNjM2ViMjhlMGY5YjRh
Nzk4MWQ2OWE5N2ZjMmExNTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxl
Lmxpc3QuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtMjUw
Niw2ICsyNTA2LDEyIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vTGVuZ3RoLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTGVuZ3RoLmggXAog
CVNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0xlbmd0aFNpemUuaCBcCisJU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFyYXRvci5oIFwKKwlTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmggXAorCVNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaCBcCisJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bGV2ZWxkYi9MZXZlbERCU2xpY2UuaCBcCiAJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTGlua0hh
c2guY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9MaW5rSGFzaC5oIFwKIAlTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9Mb2NhbGl6ZWRTdHJpbmdzLmggXApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lmd5cC9XZWJDb3JlLmd5cAppbmRleCA4OTE0MjFlMGVjOGM3YzljYmNmODlmM2RiOGZlYjEyNzQ3
MmUwODVmLi5iZDcwNTlhNGJiMTE5M2IzZTY4NjE0Y2Q1OThkOGE5M2U3NDIxZDk0IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cApAQCAtMTg0LDYgKzE4NCw3IEBACiAgICAg
ICAnLi4vcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMveGJtJywKICAgICAgICcuLi9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy93ZWJwJywKICAgICAgICcuLi9wbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy9z
a2lhJywKKyAgICAgICcuLi9wbGF0Zm9ybS9sZXZlbGRiJywKICAgICAgICcuLi9wbGF0Zm9ybS9t
b2NrJywKICAgICAgICcuLi9wbGF0Zm9ybS9uZXR3b3JrJywKICAgICAgICcuLi9wbGF0Zm9ybS9u
ZXR3b3JrL2Nocm9taXVtJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lw
aSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA2N2JkZTc5MWE0NzI3ZTYwZmNj
ZmEwNzkwNjY1OWU3MTVhZmMwODgwLi45NjY4NmIzNzg4OGQ2NGEyMzRjZjkyM2ZmZDBjMGQxYWE5
YzY3YTI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC04NTgsNiArODU4LDEyIEBACiAgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1PcGVyYXRpb25zLmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtYXRpb25N
YXRyaXguaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3RrL1Bhc3RlYm9hcmRIZWxwZXIuaCcs
CisgICAgICAgICAgICAncGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFyYXRvci5oJywKKyAg
ICAgICAgICAgICdwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5jcHAnLAorICAgICAg
ICAgICAgJ3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmgnLAorICAgICAgICAgICAg
J3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNwcCcsCisgICAgICAgICAgICAncGxh
dGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaCcsCisgICAgICAgICAgICAncGxhdGZvcm0v
bGV2ZWxkYi9MZXZlbERCU2xpY2UuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vbWFjL0Jsb2Nr
RXhjZXB0aW9ucy5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9tYWMvQ2xpcGJvYXJkTWFjLmgn
LAogICAgICAgICAgICAgJ3BsYXRmb3JtL21hYy9FbXB0eVByb3RvY29sRGVmaW5pdGlvbnMuaCcs
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnByaSBiL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUucHJpCmluZGV4IDUwMjE3NzFhMzdiNTdkZTc4ODE3MWM2OTFlZTBmNzFmZGM0Yzhl
YzYuLjMwMTc1NzBmNmNlNWJmN2I2YTdkMzNiYmExNDkwNWE1Yzc0MzAxYTIgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUucHJpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
cHJpCkBAIC05Nyw2ICs5Nyw3IEBAIFdFQkNPUkVfSU5DTFVERVBBVEggPSBcCiAgICAgJCRTT1VS
Q0VfRElSL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwIFwKICAgICAkJFNPVVJDRV9E
SVIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zIFwKICAgICAkJFNPVVJDRV9E
SVIvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycyBcCisgICAgJCRTT1VSQ0VfRElSL1dl
YkNvcmUvcGxhdGZvcm0vbGV2ZWxkYiBcCiAgICAgJCRTT1VSQ0VfRElSL1dlYkNvcmUvcGxhdGZv
cm0vbW9jayBcCiAgICAgJCRTT1VSQ0VfRElSL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yayBcCiAg
ICAgJCRTT1VSQ0VfRElSL1dlYkNvcmUvcGxhdGZvcm0vc3FsIFwKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUucHJvIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KaW5kZXgg
MGJiNzUxZDgzNDE0NTQ1MzI1NWQ3MzdiNjg4OGQ3ZGMyMjc0MzliNC4uNWZlMzBiNDAyYzljZTVm
NjFhNjhlMjI5ZGI1Mzc2MDU4NjU5ZjNjZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5wcm8KKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KQEAgLTEwMTAsNiArMTAx
MCwxMiBAQCBTT1VSQ0VTICs9IFwKICAgICBwbGF0Zm9ybS9MYW5ndWFnZS5jcHAgXAogICAgIHBs
YXRmb3JtL0xlbmd0aC5jcHAgXAogICAgIHBsYXRmb3JtL3RleHQvTGluZUVuZGluZy5jcHAgXAor
ICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkNvbXBhcmF0b3IuaCBcCisgICAgcGxhdGZvcm0v
bGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuY3BwIFwKKyAgICBwbGF0Zm9ybS9sZXZlbGRiL0xldmVs
REJEYXRhYmFzZS5oIFwKKyAgICBwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5jcHAg
XAorICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmggXAorICAgIHBsYXRmb3Jt
L2xldmVsZGIvTGV2ZWxEQlNsaWNlLmggXAogICAgIHBsYXRmb3JtL0xpbmtIYXNoLmNwcCBcCiAg
ICAgcGxhdGZvcm0vTG9nZ2luZy5jcHAgXAogICAgIHBsYXRmb3JtL01JTUVUeXBlUmVnaXN0cnku
Y3BwIFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagppbmRleCA1Nzg3Y2VhZmEwMmI1MGFiNWU3ZjA4YWYwOWExNTMzZmQ3YzdkNWQzLi45ZmZm
Mjc2MjI1YTIzOWM5YjNiMTMyMzFmYzVlOGE4NDFmZGFmMmU2IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0yNzkwLDYgKzI3OTAs
MTIgQEAKIAkJOEFGNEU1NUMxMURDNUE2MzAwMEVEM0RFIC8qIFBlcmZvcm1hbmNlVGltaW5nLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4QUY0RTU1OTEx
REM1QTYzMDAwRUQzREUgLyogUGVyZm9ybWFuY2VUaW1pbmcuaCAqLzsgfTsKIAkJOEM2RUE2MTkx
MUVGN0UwNDAwRkQ4RUUzIC8qIFJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOEM2RUE2MTcxMUVGN0UwNDAwRkQ4
RUUzIC8qIFJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuY3BwICovOyB9OwogCQk4QzZFQTYxQTExRUY3
RTA0MDBGRDhFRTMgLyogUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOEM2RUE2MTgxMUVGN0UwNDAwRkQ4RUUzIC8q
IFJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCAqLzsgfTsKKwkJOENBREYyQTkxMzVDN0IzNjAwOUVG
NDNGIC8qIExldmVsREJDb21wYXJhdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4Q0FERjJBMzEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkNvbXBh
cmF0b3IuaCAqLzsgfTsKKwkJOENBREYyQUExMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRh
YmFzZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4
Q0FERjJBNDEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkRhdGFiYXNlLmNwcCAqLzsgfTsKKwkJ
OENBREYyQUIxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRhYmFzZS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOENBREYyQTUxMzVDN0IzNjAwOUVG
NDNGIC8qIExldmVsREJEYXRhYmFzZS5oICovOyB9OworCQk4Q0FERjJBQzEzNUM3QjM2MDA5RUY0
M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDhDQURGMkE2MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRlcmF0
b3IuY3BwICovOyB9OworCQk4Q0FERjJBRDEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJh
dG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Q0FE
RjJBNzEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmggKi87IH07CisJCThDQURG
MkFFMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCU2xpY2UuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhDQURGMkE4MTM1QzdCMzYwMDlFRjQzRiAvKiBM
ZXZlbERCU2xpY2UuaCAqLzsgfTsKIAkJOEY2NzU2MUIxMjg4QjE3QjAwNDdBQ0EzIC8qIEV2ZW50
UXVldWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhG
Njc1NjE5MTI4OEIxN0IwMDQ3QUNBMyAvKiBFdmVudFF1ZXVlLmggKi87IH07CiAJCThGNjc1NjFD
MTI4OEIxN0IwMDQ3QUNBMyAvKiBFdmVudFF1ZXVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhGNjc1NjFBMTI4OEIxN0IwMDQ3QUNBMyAvKiBFdmVu
dFF1ZXVlLmNwcCAqLzsgfTsKIAkJOEZBQzc3NEQxMTk4NzJDQjAwMTVBRTk0IC8qIEpTTWFpblRo
cmVhZEV4ZWNTdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA4RjkzNEQ4NDExODlGMUVFMDA1MDhENUQgLyogSlNNYWluVGhyZWFkRXhlY1N0YXRl
LmNwcCAqLzsgfTsKQEAgLTkzNDcsNiArOTM1MywxMiBAQAogCQk4QUY0RTU1QTExREM1QTYzMDAw
RUQzREUgLyogUGVyZm9ybWFuY2VUaW1pbmcuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFBl
cmZvcm1hbmNlVGltaW5nLmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJOEM2RUE2
MTcxMUVGN0UwNDAwRkQ4RUUzIC8qIFJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gUnVudGltZUVuYWJsZWRGZWF0dXJlcy5jcHA7
IHBhdGggPSBnZW5lcmljL1J1bnRpbWVFbmFibGVkRmVhdHVyZXMuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQk4QzZFQTYxODExRUY3RTA0MDBGRDhFRTMgLyogUnVudGltZUVuYWJs
ZWRGZWF0dXJlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBSdW50aW1lRW5h
YmxlZEZlYXR1cmVzLmg7IHBhdGggPSBnZW5lcmljL1J1bnRpbWVFbmFibGVkRmVhdHVyZXMuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOENBREYyQTMxMzVDN0IzNjAwOUVGNDNGIC8q
IExldmVsREJDb21wYXJhdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExl
dmVsREJDb21wYXJhdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThDQURGMkE0
MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCRGF0YWJhc2UuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gTGV2ZWxEQkRhdGFiYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJOENBREYyQTUxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRhYmFz
ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMZXZlbERCRGF0YWJhc2UuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOENBREYyQTYxMzVDN0IzNjAwOUVGNDNGIC8q
IExldmVsREJJdGVyYXRvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBMZXZlbERCSXRlcmF0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Q0FE
RjJBNzEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IExldmVsREJJdGVyYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQk4Q0FERjJBODEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQlNsaWNlLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExldmVsREJTbGljZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk4RjY3NTYxOTEyODhCMTdCMDA0N0FDQTMgLyogRXZlbnRRdWV1
ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBFdmVudFF1ZXVlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCThGNjc1NjFBMTI4OEIxN0IwMDQ3QUNBMyAvKiBFdmVu
dFF1ZXVlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEV2ZW50UXVl
dWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4RjkzNEQ4MzExODlGMUVFMDA1
MDhENUQgLyogSlNNYWluVGhyZWFkRXhlY1N0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEpTTWFpblRocmVhZEV4ZWNTdGF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtMTU2MDcsNiArMTU2MTksMTkgQEAKIAkJCW5hbWUgPSBGaWxlQVBJOwogCQkJc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJOENBREYyQTIxMzVDN0IzNjAwOUVGNDNGIC8q
IGxldmVsZGIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJ
CThDQURGMkEzMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCQ29tcGFyYXRvci5oICovLAorCQkJ
CThDQURGMkE0MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCRGF0YWJhc2UuY3BwICovLAorCQkJ
CThDQURGMkE1MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCRGF0YWJhc2UuaCAqLywKKwkJCQk4
Q0FERjJBNjEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmNwcCAqLywKKwkJCQk4
Q0FERjJBNzEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmggKi8sCisJCQkJOENB
REYyQTgxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJTbGljZS5oICovLAorCQkJKTsKKwkJCXBh
dGggPSBsZXZlbGRiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIAkJOTMzMDlE
ODYwOTlFNjQ5MTAwNTZFNTgxIC8qIGVkaXRpbmcgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKApAQCAtMTg2MjEsNiArMTg2NDYsNyBAQAogCQkJCUE1Qzk3NENFMTE0
ODVGREEwMDY2RjJBQiAvKiBjb2NvYSAqLywKIAkJCQlCMkEwMTU5MTBBRjZDRDUzMDA2QkNFMEUg
LyogZ3JhcGhpY3MgKi8sCiAJCQkJQTU5RTNDMUIxMTU4MEYzNDAwNzI5MjhFIC8qIGlwaG9uZSAq
LywKKwkJCQk4Q0FERjJBMjEzNUM3QjM2MDA5RUY0M0YgLyogbGV2ZWxkYiAqLywKIAkJCQk2NTgy
QTE0ODA5OTk5RDZDMDBCRUVCNkQgLyogbWFjICovLAogCQkJCTU5Qzc3RjEwMTA1NDU5MUMwMDUw
NjEwNCAvKiBtb2NrICovLAogCQkJCTY1NkI4NEQ3MEFFQTFDRTkwMEEwOTVCNCAvKiBuZXR3b3Jr
ICovLApAQCAtMjI5NTksNiArMjI5ODUsMTAgQEAKIAkJCQk5M0YxOTlFRDA4MjQ1RTU5MDAxRTlB
QkMgLyogWFNMVFByb2Nlc3Nvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTFCRTUxMkUwQ0Y2QzUx
MjAwMkVBOTU5IC8qIFhTTFRVbmljb2RlU29ydC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTc3RTJF
MEYxMkYwRkM5QzAwQzEzMzc5IC8qIFhTU0ZpbHRlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJOENB
REYyQTkxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJDb21wYXJhdG9yLmggaW4gSGVhZGVycyAq
LywKKwkJCQk4Q0FERjJBQjEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkRhdGFiYXNlLmggaW4g
SGVhZGVycyAqLywKKwkJCQk4Q0FERjJBRDEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJh
dG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQk4Q0FERjJBRTEzNUM3QjM2MDA5RUY0M0YgLyogTGV2
ZWxEQlNsaWNlLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVu
dFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTI1NjY0LDYgKzI1Njk0LDggQEAKIAkJCQk5
M0YxOUIwNTA4MjQ1RTU5MDAxRTlBQkMgLyogWFNMVFByb2Nlc3NvckxpYnhzbHQuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJRTFCRTUxMkQwQ0Y2QzUxMjAwMkVBOTU5IC8qIFhTTFRVbmljb2RlU29y
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdFMkUwRTEyRjBGQzlDMDBDMTMzNzkgLyogWFNT
RmlsdGVyLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCThDQURGMkFBMTM1QzdCMzYwMDlFRjQzRiAv
KiBMZXZlbERCRGF0YWJhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJOENBREYyQUMxMzVDN0Iz
NjAwOUVGNDNGIC8qIExldmVsREJJdGVyYXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJ
CQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkNvbXBhcmF0b3IuaCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkNvbXBhcmF0b3IuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4wOGFjMjYxYTAzNmE1ZWU2YzEyYTg4ZTY2MDMyMTUyMDE1MzUzZTI4Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFy
YXRvci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExldmVsREJDb21wYXJhdG9y
X2gKKyNkZWZpbmUgTGV2ZWxEQkNvbXBhcmF0b3JfaAorCisjaWYgRU5BQkxFKExFVkVMREIpCisK
KyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBMZXZlbERCU2xpY2U7CisKK2NsYXNzIExldmVsREJDb21wYXJhdG9yIHsKK3B1Ymxp
YzoKKyAgICB2aXJ0dWFsIH5MZXZlbERCQ29tcGFyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGlu
dCBjb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYsIGNvbnN0IExldmVsREJTbGljZSYpIGNvbnN0
ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCA9IDA7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKKyNlbmRp
ZiAvLyBMZXZlbERCQ29tcGFyYXRvcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDU4NzYzMTJhY2ZiZGQ1
MTBlOTU5MDZhZTE1ZTJmNzBiNWFiYTRhMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcApAQCAtMCwwICsxLDE1OSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAq
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMZXZlbERCRGF0YWJhc2Uu
aCIKKworI2lmIEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAiTGV2ZWxEQkNvbXBhcmF0b3Iu
aCIKKyNpbmNsdWRlICJMZXZlbERCSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMZXZlbERCU2xpY2Uu
aCIKKyNpbmNsdWRlIDxsZXZlbGRiL2NvbXBhcmF0b3IuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL2Ri
Lmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9zbGljZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNs
dWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNp
bmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dGF0aWMgbGV2ZWxkYjo6U2xpY2UgbWFrZVNsaWNlKGNvbnN0IFZlY3RvcjxjaGFyPiYgdmFsdWUp
Cit7CisgICAgcmV0dXJuIGxldmVsZGI6OlNsaWNlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKK30KKworc3RhdGljIGxldmVsZGI6OlNsaWNlIG1ha2VTbGljZShjb25zdCBMZXZlbERCU2xp
Y2UmIHMpCit7CisgICAgcmV0dXJuIGxldmVsZGI6OlNsaWNlKHMuYmVnaW4oKSwgcy5lbmQoKSAt
IHMuYmVnaW4oKSk7Cit9CisKK3N0YXRpYyBMZXZlbERCU2xpY2UgbWFrZUxldmVsREJTbGljZShj
b25zdCBsZXZlbGRiOjpTbGljZSYgcykKK3sKKyAgICByZXR1cm4gTGV2ZWxEQlNsaWNlKHMuZGF0
YSgpLCBzLmRhdGEoKSArIHMuc2l6ZSgpKTsKK30KKworc3RhdGljIFZlY3RvcjxjaGFyPiBtYWtl
VmVjdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQoreworICAgIFZlY3RvcjxjaGFyPiByZXM7Cisg
ICAgcmVzLmFwcGVuZChzLmNfc3RyKCksIHMubGVuZ3RoKCkpOworICAgIHJldHVybiByZXM7Cit9
CisKK25hbWVzcGFjZSB7CitjbGFzcyBDb21wYXJhdG9yQWRhcHRlciA6IHB1YmxpYyBsZXZlbGRi
OjpDb21wYXJhdG9yIHsKK3B1YmxpYzoKKyAgICBDb21wYXJhdG9yQWRhcHRlcihjb25zdCBMZXZl
bERCQ29tcGFyYXRvciogY29tcGFyYXRvcikKKyAgICAgICAgOiBtX2NvbXBhcmF0b3IoY29tcGFy
YXRvcikKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgQ29tcGFyZShjb25zdCBsZXZl
bGRiOjpTbGljZSYgYSwgY29uc3QgbGV2ZWxkYjo6U2xpY2UmIGIpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9jb21wYXJhdG9yLT5jb21wYXJlKG1ha2VMZXZlbERCU2xpY2UoYSksIG1h
a2VMZXZlbERCU2xpY2UoYikpOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogTmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcGFyYXRvci0+bmFtZSgpOyB9CisKKyAgICAvLyBGSVhN
RTogU3VwcG9ydCB0aGUgbWV0aG9kcyBiZWxvdyBpbiB0aGUgZnV0dXJlLgorICAgIHZpcnR1YWwg
dm9pZCBGaW5kU2hvcnRlc3RTZXBhcmF0b3Ioc3RkOjpzdHJpbmcqIHN0YXJ0LCBjb25zdCBsZXZl
bGRiOjpTbGljZSYgbGltaXQpIGNvbnN0IHsgfQorICAgIHZpcnR1YWwgdm9pZCBGaW5kU2hvcnRT
dWNjZXNzb3Ioc3RkOjpzdHJpbmcqIGtleSkgY29uc3QgeyB9CisKK3ByaXZhdGU6CisgICAgY29u
c3QgTGV2ZWxEQkNvbXBhcmF0b3IqIG1fY29tcGFyYXRvcjsKK307Cit9CisKK0xldmVsREJEYXRh
YmFzZTo6TGV2ZWxEQkRhdGFiYXNlKCkKKyAgICA6IG1fZGIoMCkKK3sKK30KKworTGV2ZWxEQkRh
dGFiYXNlOjp+TGV2ZWxEQkRhdGFiYXNlKCkKK3sKK30KKworTGV2ZWxEQkRhdGFiYXNlKiBMZXZl
bERCRGF0YWJhc2U6Om9wZW4oY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgTGV2ZWxEQkNv
bXBhcmF0b3IqIGNvbXBhcmF0b3IpCit7CisgICAgT3duUHRyPENvbXBhcmF0b3JBZGFwdGVyPiBj
b21wYXJhdG9yQWRhcHRlcihuZXcgQ29tcGFyYXRvckFkYXB0ZXIoY29tcGFyYXRvcikpOworCisg
ICAgTGV2ZWxEQkRhdGFiYXNlKiByZXN1bHQgPSBuZXcgTGV2ZWxEQkRhdGFiYXNlKCk7CisKKyAg
ICBsZXZlbGRiOjpPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wYXJhdG9yID0gY29t
cGFyYXRvckFkYXB0ZXIuZ2V0KCk7CisgICAgb3B0aW9ucy5jcmVhdGVfaWZfbWlzc2luZyA9IHRy
dWU7CisgICAgbGV2ZWxkYjo6REIqIGRiOworICAgIGxldmVsZGI6OlN0YXR1cyBzID0gbGV2ZWxk
Yjo6REI6Ok9wZW4ob3B0aW9ucywgZmlsZU5hbWUudXRmOCgpLmRhdGEoKSwgJmRiKTsKKworICAg
IGlmICghcy5vaygpKSB7CisgICAgICAgIGRlbGV0ZSByZXN1bHQ7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIHJlc3VsdC0+bV9kYiA9IFdURjo6YWRvcHRQdHIoZGIpOworICAgIHJl
c3VsdC0+bV9jb21wYXJhdG9yQWRhcHRlciA9IGNvbXBhcmF0b3JBZGFwdGVyLnJlbGVhc2UoKTsK
KworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCBMZXZlbERCRGF0YWJhc2U6OnB1dChj
b25zdCBMZXZlbERCU2xpY2UmIGtleSwgY29uc3QgVmVjdG9yPGNoYXI+JiB2YWx1ZSkKK3sKKyAg
ICBsZXZlbGRiOjpXcml0ZU9wdGlvbnMgd3JpdGVPcHRpb25zOworICAgIHdyaXRlT3B0aW9ucy5z
eW5jID0gZmFsc2U7CisKKyAgICByZXR1cm4gbV9kYi0+UHV0KHdyaXRlT3B0aW9ucywgbWFrZVNs
aWNlKGtleSksIG1ha2VTbGljZSh2YWx1ZSkpLm9rKCk7Cit9CisKK2Jvb2wgTGV2ZWxEQkRhdGFi
YXNlOjpyZW1vdmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXkpCit7CisgICAgbGV2ZWxkYjo6V3Jp
dGVPcHRpb25zIHdyaXRlT3B0aW9uczsKKyAgICB3cml0ZU9wdGlvbnMuc3luYyA9IGZhbHNlOwor
CisgICAgcmV0dXJuIG1fZGItPkRlbGV0ZSh3cml0ZU9wdGlvbnMsIG1ha2VTbGljZShrZXkpKS5v
aygpOworfQorCitib29sIExldmVsREJEYXRhYmFzZTo6Z2V0KGNvbnN0IExldmVsREJTbGljZSYg
a2V5LCBWZWN0b3I8Y2hhcj4mIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAg
ICBpZiAoIW1fZGItPkdldChsZXZlbGRiOjpSZWFkT3B0aW9ucygpLCBtYWtlU2xpY2Uoa2V5KSwg
JnJlc3VsdCkub2soKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdmFsdWUgPSBtYWtl
VmVjdG9yKHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0xldmVsREJJdGVyYXRvciog
TGV2ZWxEQkRhdGFiYXNlOjpuZXdJdGVyYXRvcigpCit7CisgICAgbGV2ZWxkYjo6SXRlcmF0b3Iq
IGkgPSBtX2RiLT5OZXdJdGVyYXRvcihsZXZlbGRiOjpSZWFkT3B0aW9ucygpKTsKKyAgICBpZiAo
IWkpIC8vIEZJWE1FOiBEb3VibGUgY2hlY2sgaWYgd2UgYWN0dWFsbHkgbmVlZCB0byBjaGVjayB0
aGlzLgorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbmV3IExldmVsREJJdGVyYXRvcihp
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVM
REIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJE
YXRhYmFzZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJh
c2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi40NzFmMzM1YTc3ZTkxNmIxM2IyZjE4ZGVhMzE1Y2M3MWQ5M2IzNmI5
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZl
bERCRGF0YWJhc2UuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEx
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMZXZlbERCRGF0
YWJhc2VfaAorI2RlZmluZSBMZXZlbERCRGF0YWJhc2VfaAorCisjaWYgRU5BQkxFKExFVkVMREIp
CisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPE93blB0ci5oPgorI2lu
Y2x1ZGUgPFZlY3Rvci5oPgorCituYW1lc3BhY2UgbGV2ZWxkYiB7CitjbGFzcyBDb21wYXJhdG9y
OworY2xhc3MgREI7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGV2ZWxEQkNv
bXBhcmF0b3I7CitjbGFzcyBMZXZlbERCSXRlcmF0b3I7CitjbGFzcyBMZXZlbERCU2xpY2U7CisK
K2NsYXNzIExldmVsREJEYXRhYmFzZSB7CitwdWJsaWM6CisgICAgc3RhdGljIExldmVsREJEYXRh
YmFzZSogb3Blbihjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBMZXZlbERCQ29tcGFyYXRv
ciopOworICAgIH5MZXZlbERCRGF0YWJhc2UoKTsKKworICAgIGJvb2wgcHV0KGNvbnN0IExldmVs
REJTbGljZSYga2V5LCBjb25zdCBWZWN0b3I8Y2hhcj4mIHZhbHVlKTsKKyAgICBib29sIHJlbW92
ZShjb25zdCBMZXZlbERCU2xpY2UmIGtleSk7CisgICAgYm9vbCBnZXQoY29uc3QgTGV2ZWxEQlNs
aWNlJiBrZXksIFZlY3RvcjxjaGFyPiYgdmFsdWUpOworICAgIExldmVsREJJdGVyYXRvciogbmV3
SXRlcmF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBMZXZlbERCRGF0YWJhc2UoKTsKKworICAgIE93
blB0cjxsZXZlbGRiOjpEQj4gbV9kYjsKKyAgICBPd25QdHI8bGV2ZWxkYjo6Q29tcGFyYXRvcj4g
bV9jb21wYXJhdG9yQWRhcHRlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIExldmVsREJEYXRhYmFzZV9oCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZGUwZjI4NmEyMzIzMGZiZjI2YTkyMzZhODhiZDI4ZGYzN2I3MDJlYwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0
ZXJhdG9yLmNwcApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5oIgorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNp
bmNsdWRlIDxsZXZlbGRiL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8bGV2ZWxkYi9zbGljZS5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJp
bmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMZXZlbERCSXRlcmF0b3I6On5MZXZlbERC
SXRlcmF0b3IoKQoreworfQorCitMZXZlbERCSXRlcmF0b3I6OkxldmVsREJJdGVyYXRvcihsZXZl
bGRiOjpJdGVyYXRvciogaXQpCisgICAgOiBtX2l0ZXJhdG9yKGl0KQoreworfQorCitzdGF0aWMg
bGV2ZWxkYjo6U2xpY2UgbWFrZVNsaWNlKGNvbnN0IFZlY3RvcjxjaGFyPiYgdmFsdWUpCit7Cisg
ICAgcmV0dXJuIGxldmVsZGI6OlNsaWNlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30K
Kworc3RhdGljIExldmVsREJTbGljZSBtYWtlTGV2ZWxEQlNsaWNlKGxldmVsZGI6OlNsaWNlIHMp
Cit7CisgICAgcmV0dXJuIExldmVsREJTbGljZShzLmRhdGEoKSwgcy5kYXRhKCkgKyBzLnNpemUo
KSk7Cit9CisKK2Jvb2wgTGV2ZWxEQkl0ZXJhdG9yOjppc1ZhbGlkKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9pdGVyYXRvci0+VmFsaWQoKTsKK30KKwordm9pZCBMZXZlbERCSXRlcmF0b3I6OnNl
ZWtUb0xhc3QoKQoreworICAgIG1faXRlcmF0b3ItPlNlZWtUb0xhc3QoKTsKK30KKwordm9pZCBM
ZXZlbERCSXRlcmF0b3I6OnNlZWsoY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQpCit7CisgICAg
bV9pdGVyYXRvci0+U2VlayhtYWtlU2xpY2UodGFyZ2V0KSk7Cit9CisKK3ZvaWQgTGV2ZWxEQkl0
ZXJhdG9yOjpuZXh0KCkKK3sKKyAgICBtX2l0ZXJhdG9yLT5OZXh0KCk7Cit9CisKK3ZvaWQgTGV2
ZWxEQkl0ZXJhdG9yOjpwcmV2KCkKK3sKKyAgICBtX2l0ZXJhdG9yLT5QcmV2KCk7Cit9CisKK0xl
dmVsREJTbGljZSBMZXZlbERCSXRlcmF0b3I6OmtleSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1h
a2VMZXZlbERCU2xpY2UobV9pdGVyYXRvci0+a2V5KCkpOworfQorCitMZXZlbERCU2xpY2UgTGV2
ZWxEQkl0ZXJhdG9yOjp2YWx1ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1ha2VMZXZlbERCU2xp
Y2UobV9pdGVyYXRvci0+dmFsdWUoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmY5Y2JjYWZlN2ZlZDU1Mjdl
MjYxOGQ2YWU4Y2YwYmYzMGZiZjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmgKQEAgLTAsMCArMSw2NSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisg
KiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgTGV2ZWxEQkl0ZXJhdG9yX2gKKyNkZWZpbmUgTGV2ZWxEQkl0ZXJhdG9yX2gK
KworI2lmIEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAiTGV2ZWxEQlNsaWNlLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlIDxPd25QdHIuaD4KKyNpbmNsdWRlIDxW
ZWN0b3IuaD4KKworbmFtZXNwYWNlIGxldmVsZGIgeworY2xhc3MgSXRlcmF0b3I7Cit9CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGV2ZWxEQkl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAg
ICB+TGV2ZWxEQkl0ZXJhdG9yKCk7CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKKyAgICB2
b2lkIHNlZWtUb0xhc3QoKTsKKyAgICB2b2lkIHNlZWsoY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJn
ZXQpOworICAgIHZvaWQgbmV4dCgpOworICAgIHZvaWQgcHJldigpOworICAgIExldmVsREJTbGlj
ZSBrZXkoKSBjb25zdDsKKyAgICBMZXZlbERCU2xpY2UgdmFsdWUoKSBjb25zdDsKKworcHJpdmF0
ZToKKyAgICBMZXZlbERCSXRlcmF0b3IobGV2ZWxkYjo6SXRlcmF0b3IqKTsKKyAgICBmcmllbmQg
Y2xhc3MgTGV2ZWxEQkRhdGFiYXNlOworCisgICAgT3duUHRyPGxldmVsZGI6Okl0ZXJhdG9yPiBt
X2l0ZXJhdG9yOworfTsKKworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBF
TkFCTEUoTEVWRUxEQikKKyNlbmRpZiAvLyBMZXZlbERCSXRlcmF0b3JfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQlNsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTVjNTc2
Y2E1ZWNkN2Q3M2UwZTI5ZTRjN2JlNWJiMjE2OTJkZGRkZQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQlNsaWNlLmgKQEAgLTAsMCArMSw2
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoK
KyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgTGV2ZWxEQlNsaWNlX2gKKyNkZWZpbmUgTGV2ZWxEQlNsaWNl
X2gKKworI2lmIEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
KyNpbmNsdWRlIDxWZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMZXZl
bERCU2xpY2UgeworcHVibGljOgorICAgIExldmVsREJTbGljZShjb25zdCBjaGFyKiBiZWdpbiwg
Y29uc3QgY2hhciogZW5kKQorICAgICAgICA6IG1fYmVnaW4oYmVnaW4pCisgICAgICAgICwgbV9l
bmQoZW5kKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZW5kID49IG1fYmVnaW4pOworICAgIH0K
KworICAgIExldmVsREJTbGljZShjb25zdCBWZWN0b3I8Y2hhcj4mIHYpCisgICAgICAgIDogbV9i
ZWdpbih2LmRhdGEoKSkKKyAgICAgICAgLCBtX2VuZChtX2JlZ2luICsgdi5zaXplKCkpCisgICAg
eworICAgICAgICBBU1NFUlQobV9lbmQgPj0gbV9iZWdpbik7CisgICAgfQorCisgICAgfkxldmVs
REJTbGljZSgpCisgICAgeworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGJlZ2luKCkgY29uc3Qg
eyByZXR1cm4gbV9iZWdpbjsgfQorICAgIGNvbnN0IGNoYXIqIGVuZCgpIGNvbnN0IHsgcmV0dXJu
IG1fZW5kOyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciogbV9iZWdpbjsKKyAgICBjb25z
dCBjaGFyKiBtX2VuZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIExldmVsREJTbGljZV9oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIGIvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcAppbmRleCBjMDZlYTAw
NDIyMTU1NjE1ODQ2NmMzYmQyNjBkNTZmMjMwYmQzN2EwLi40OWE0NTU0ZTBmNWYwZjk4MDkwMjMw
NmJmNDMzNjg1OWE5NjQxM2UxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lE
QkxldmVsREJCYWNraW5nU3RvcmUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKQEAgLTI5LDEyICsyOSwxNDM4IEBACiAjaWYgRU5BQkxF
KElOREVYRURfREFUQUJBU0UpCiAjaWYgRU5BQkxFKExFVkVMREIpCiAKKyNpbmNsdWRlICJBc3Nl
cnRpb25zLmgiCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgIklEQkZhY3RvcnlC
YWNrZW5kSW1wbC5oIgotI2luY2x1ZGUgPGxldmVsZGIvZGIuaD4KKyNpbmNsdWRlICJJREJLZXlS
YW5nZS5oIgorI2luY2x1ZGUgIkxldmVsREJDb21wYXJhdG9yLmgiCisjaW5jbHVkZSAiTGV2ZWxE
QkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGV2
ZWxEQlNsaWNlLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlIDxzdHJp
bmc+CisKKyNpZm5kZWYgSU5UNjRfTUFYCisvLyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8g
cmVseSBvbiB0aGVzZSBtYWNyb3MuCisjZGVmaW5lIElOVDY0X01BWCAweDdmZmZmZmZmZmZmZmZm
ZmZMTAorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggMHg3ZmZm
ZmZmZkwKKyNlbmRpZgorCisvLyBMZXZlbERCIHN0b3JlcyBrZXkvdmFsdWUgcGFpcnMuIEtleXMg
YW5kIHZhbHVlcyBhcmUgc3RyaW5ncyBvZiBieXRlcywgbm9ybWFsbHkgb2YgdHlwZSBWZWN0b3I8
Y2hhcj4uCisvLworLy8gVGhlIGtleXMgaW4gdGhlIGJhY2tpbmcgc3RvcmUgYXJlIHZhcmlhYmxl
LWxlbmd0aCB0dXBsZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMKKy8vIG9mIGZpZWxkcy4gRWFjaCBr
ZXkgaW4gdGhlIGJhY2tpbmcgc3RvcmUgc3RhcnRzIHdpdGggYSB0ZXJuYXJ5IHByZWZpeDogKGRh
dGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkKS4gRm9yIGVhY2gsIDAgaXMgcmVz
ZXJ2ZWQgZm9yIG1ldGEtZGF0YS4KKy8vIFRoZSBwcmVmaXggbWFrZXMgc3VyZSB0aGF0IGRhdGEg
Zm9yIGEgc3BlY2lmaWMgZGF0YWJhc2UsIG9iamVjdCBzdG9yZSwgYW5kIGluZGV4IGFyZSBncm91
cGVkIHRvZ2V0aGVyLiBUaGUgbG9jYWxpdHkgaXMgaW1wb3J0YW50IGZvciBwZXJmb3JtYW5jZTog
Y29tbW9uCisvLyBvcGVyYXRpb25zIHNob3VsZCBvbmx5IG5lZWQgYSBtaW5pbWFsIG51bWJlciBv
ZiBzZWVrIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhbGwgdGhlIG1ldGEtZGF0YSBmb3IgYSBk
YXRhYmFzZSBpcyBncm91cGVkIHRvZ2V0aGVyIHNvIHRoYXQgcmVhZGluZyB0aGF0CisvLyBtZXRh
LWRhdGEgb25seSByZXF1aXJlcyBvbmUgc2Vlay4KKy8vCisvLyBFYWNoIGtleSB0eXBlIGhhcyBh
IGNsYXNzIChpbiBzcXVhcmUgYnJhY2tldHMgYmVsb3cpIHdoaWNoIGtub3dzIGhvdyB0byBlbmNv
ZGUsIGRlY29kZSwgYW5kIGNvbXBhcmUgdGhhdCBrZXkgdHlwZS4KKy8vCisvLyBHbG9iYWwgbWV0
YS1kYXRhIGhhdmUga2V5cyB3aXRoIHByZWZpeCAoMCwwLDApLCBmb2xsb3dlZCBieSBhIHR5cGUg
Ynl0ZToKKy8vCisvLyAgICAgPDAsIDAsIDAsIDA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgID0+IEluZGV4ZWREQi9MZXZlbERCIHNjaGVtYSB2ZXJzaW9uICgwIGZv
ciBub3cpIFtTY2hlbWFWZXJzaW9uS2V5XQorLy8gICAgIDwwLCAwLCAwLCAxPiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUaGUgbWF4aW11bSBkYXRhYmFzZSBp
ZCBldmVyIGFsbG9jYXRlZCBbTWF4RGF0YWJhc2VJZEtleV0KKy8vICAgICA8MCwgMCwgMCwgMTAw
LCBkYXRhYmFzZSBpZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gRXhpc3RlbmNlIGlt
cGxpZXMgdGhlIGRhdGFiYXNlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0RhdGFiYXNlRnJlZUxp
c3RLZXldCisvLyAgICAgPDAsIDAsIDAsIDIwMSwgdXRmMTYgb3JpZ2luIG5hbWUsIHV0ZjE2IGRh
dGFiYXNlIG5hbWU+ID0+IERhdGFiYXNlIGlkIFtEYXRhYmFzZU5hbWVLZXldCisvLworLy8KKy8v
IERhdGFiYXNlIG1ldGEtZGF0YToKKy8vCisvLyAgICAgQWdhaW4sIHRoZSBwcmVmaXggaXMgZm9s
bG93ZWQgYnkgYSB0eXBlIGJ5dGUuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMD4g
PT4gdXRmMTYgb3JpZ2luIG5hbWUgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFi
YXNlIGlkLCAwLCAwLCAxPiA9PiB1dGYxNiBkYXRhYmFzZSBuYW1lIFtEYXRhYmFzZU1ldGFEYXRh
S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMj4gPT4gdXRmMTYgdXNlciB2ZXJzaW9u
IGRhdGEgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAz
PiA9PiBtYXhpbXVtIG9iamVjdCBzdG9yZSBpZCBldmVyIGFsbG9jYXRlZCBbRGF0YWJhc2VNZXRh
RGF0YUtleV0KKy8vCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEtZGF0YToKKy8vCisvLyAgICAg
VGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiBhIHZhcmlhYmxlLWxl
bmd0aCBpbnRlZ2VyLCBhbmQgdGhlbiBhbm90aGVyIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIChG
SVhNRTogdGhpcyBzaG91bGQgYmUgYSBieXRlKS4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAw
LCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAwPiA9PiB1dGYxNiBvYmplY3Qgc3RvcmUgbmFtZSBb
T2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBv
YmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0ZjE2IGtleSBwYXRoIFtPYmplY3RTdG9yZU1ldGFEYXRh
S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMj4g
PT4gaGFzIGF1dG8gaW5jcmVtZW50IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxk
YXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMz4gPT4gaXMgZXZpY3RhYmxl
IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAs
IG9iamVjdCBzdG9yZSBpZCwgND4gPT4gbGFzdCAidmVyc2lvbiIgbnVtYmVyIFtPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9y
ZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9jYXRlZCBbT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleV0KKy8vCisvLworLy8gSW5kZXggbWV0YS1kYXRhOgorLy8KKy8vICAgICBUaGUg
cHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVuIHR3byB2YXJpYWJsZS1sZW5n
dGggaW50ZWdlcnMsIGFuZCB0aGVuIGFub3RoZXIgdHlwZSBieXRlLgorLy8KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMD4gPT4gdXRm
MTYgaW5kZXggbmFtZSBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAs
IDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMT4gPT4gYXJlIGluZGV4IGtleXMg
dW5pcXVlIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAw
LCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAyPiA9PiB1dGYxNiBrZXkgcGF0aCBbSW5kZXhN
ZXRhRGF0YUtleV0KKy8vCisvLworLy8gT3RoZXIgb2JqZWN0IHN0b3JlIGFuZCBpbmRleCBtZXRh
LWRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUu
IFRoZSBvYmplY3Qgc3RvcmUgYW5kIGluZGV4IGlkIGFyZSB2YXJpYWJsZSBsZW5ndGggaW50ZWdl
cnMsIHRoZSB1dGYxNiBzdHJpbmdzIGFyZSB2YXJpYWJsZSBsZW5ndGggc3RyaW5ncy4KKy8vCisv
LyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTAsIG9iamVjdCBzdG9yZSBpZD4gICAgICAgICAg
ICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIG9iamVjdCBzdG9yZSBpZCBpcyBpbiB0
aGUgZnJlZSBsaXN0IFtPYmplY3RTdG9yZUZyZWVMaXN0S2V5XQorLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgMTUxLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkPiAgICAgICAgID0+IGV4aXN0
ZW5jZSBpbXBsaWVzIHRoZSBpbmRleCBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtJbmRleEZyZWVM
aXN0S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAwLCB1dGYxNiBvYmplY3Qgc3Rv
cmUgbmFtZT4gICAgICAgICAgID0+IG9iamVjdCBzdG9yZSBpZCBbT2JqZWN0U3RvcmVOYW1lc0tl
eV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMSwgb2JqZWN0IHN0b3JlIGlkLCB1dGYx
NiBpbmRleCBuYW1lPiA9PiBpbmRleCBpZCBbSW5kZXhOYW1lc0tleV0KKy8vCisvLworLy8gT2Jq
ZWN0IHN0b3JlIGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0
eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4KKy8vCisvLyAgICAg
PGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDEsIHVzZXIga2V5PiA9PiAidmVyc2lvbiIs
IHNlcmlhbGl6ZWQgc2NyaXB0IHZhbHVlIFtPYmplY3RTdG9yZURhdGFLZXldCisvLworLy8KKy8v
ICJFeGlzdHMiIGVudHJ5OgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEg
dHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuCisvLworLy8gICAg
IDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCAyLCB1c2VyIGtleT4gPT4gInZlcnNpb24i
IFtFeGlzdHNFbnRyeUtleV0KKy8vCisvLworLy8gSW5kZXggZGF0YToKKy8vCisvLyAgICAgVGhl
IHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVu
Y29kZWQgSURCS2V5LiBUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGlu
dGVnZXIuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBp
ZCwgdXNlciBrZXksIHNlcXVlbmNlIG51bWJlcj4gPT4gInZlcnNpb24iLCB1c2VyIGtleSBbSW5k
ZXhEYXRhS2V5XQorLy8KKy8vICAgICAoVGhlIHNlcXVlbmNlIG51bWJlciBpcyB1c2VkIHRvIGFs
bG93IHR3byBlbnRyaWVzIHdpdGggdGhlIHNhbWUgdXNlciBrZXkKKy8vICAgICBpbiBub24tdW5p
cXVlIGluZGV4ZXMuIFRoZSAidmVyc2lvbiIgZmllbGQgaXMgdXNlZCB0byB3ZWVkIG91dCBzdGFs
ZQorLy8gICAgIGluZGV4IGRhdGEuIFdoZW5ldmVyIG5ldyBvYmplY3Qgc3RvcmUgZGF0YSBpcyBp
bnNlcnRlZCwgaXQgZ2V0cyBhIG5ldworLy8gICAgICJ2ZXJzaW9uIiBudW1iZXIsIGFuZCBuZXcg
aW5kZXggZGF0YSBpcyB3cml0dGVuIHdpdGggdGhpcyBudW1iZXIuIFdoZW4KKy8vICAgICB0aGUg
aW5kZXggaXMgdXNlZCBmb3IgbG9vay11cHMsIGVudHJpZXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0
IHRoZQorLy8gICAgICJleGlzdHMiIGVudHJpZXMsIGFuZCByZWNvcmRzIHdpdGggb2xkICJ2ZXJz
aW9uIiBudW1iZXJzIGFyZSBkZWxldGVkCisvLyAgICAgd2hlbiB0aGV5IGFyZSBlbmNvdW50ZXJl
ZCBpbiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgsCisvLyAgICAgSW5kZXhDdXJzb3JJbXBsOjpsb2Fk
Q3VycmVudFJvdywgYW5kIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3cpLgorCitz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TnVsbFR5cGVCeXRlID0gMDsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlTdHJpbmdUeXBlQnl0ZSA9IDE7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5RGF0ZVR5cGVCeXRlID0gMjsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdW1iZXJUeXBlQnl0ZSA9IDM7CitzdGF0aWMgY29uc3Qg
dW5zaWduZWQgY2hhciBrSURCS2V5TWluS2V5VHlwZUJ5dGUgPSA0OworCitzdGF0aWMgY29uc3Qg
dW5zaWduZWQgY2hhciBrTWluaW11bUluZGV4SWQgPSAzMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBjaGFyIGtPYmplY3RTdG9yZURhdGFJbmRleElkID0gMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBjaGFyIGtFeGlzdHNFbnRyeUluZGV4SWQgPSAyOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQg
Y2hhciBrU2NoZW1hVmVyc2lvblR5cGVCeXRlID0gMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBj
aGFyIGtNYXhEYXRhYmFzZUlkVHlwZUJ5dGUgPSAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNo
YXIga0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSA9IDEwMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBjaGFyIGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSA9IDIwMTsKKworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIga09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSA9IDUwOworc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGNoYXIga0luZGV4TWV0YURhdGFUeXBlQnl0ZSA9IDEwMDsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUgPSAxNTA7CitzdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhGcmVlTGlzdFR5cGVCeXRlID0gMTUxOworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSA9IDIwMDsK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleE5hbWVzS2V5VHlwZUJ5dGUgPSAyMDE7
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6SURCTGV2
ZWxEQkJhY2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBs
KiBmYWN0b3J5LCBsZXZlbGRiOjpEQiogZGIpCitzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUJ5
dGUodW5zaWduZWQgY2hhciBjKQoreworICAgIFZlY3RvcjxjaGFyPiB2OworICAgIHYuYXBwZW5k
KGMpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IG1heElEQktleSgp
Cit7CisgICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0ZSk7Cit9CisKK3N0
YXRpYyBWZWN0b3I8Y2hhcj4gbWluSURCS2V5KCkKK3sKKyAgICByZXR1cm4gZW5jb2RlQnl0ZShr
SURCS2V5TWluS2V5VHlwZUJ5dGUpOworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUlu
dChpbnQ2NF90IG4pCit7CisgICAgQVNTRVJUKG4gPj0gMCk7CisgICAgVmVjdG9yPGNoYXI+IHJl
dDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKworICAgIGRvIHsKKyAgICAgICAg
dW5zaWduZWQgY2hhciBjID0gbjsKKyAgICAgICAgcmV0LmFwcGVuZChjKTsKKyAgICAgICAgbiA+
Pj0gODsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp
bnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kKQorewor
ICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOworICAgIGludDY0X3QgcmV0ID0gMDsKKworICAgIHdo
aWxlIChiZWdpbiA8IGVuZCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqYmVnaW4rKzsK
KyAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsK
K30KKworc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVWYXJJbnQoaW50NjRfdCBuKQoreworICAg
IFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAg
ICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAweDdmOworICAgICAgICBuID4+
PSA3OworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGMgfD0gMTI4OworICAgICAgICByZXQu
YXBwZW5kKGMpOworICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyKiBs
aW1pdCwgaW50NjRfdCYgZm91bmRJbnQpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOworICAg
IGZvdW5kSW50ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHAgPj0gbGltaXQpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBmb3VuZEludCA9IChmb3VuZEludCA8PCA3KSB8
ICgqcCAmIDB4N2YpOworICAgIH0gd2hpbGUgKCpwKysgJiAxMjgpOworICAgIHJldHVybiBwOwor
fQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmIHMpCit7
CisgICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4K
KworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAg
ICAgVUNoYXIgdSA9IHNbaV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSB1ID4+IDg7Cisg
ICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSB1OworICAgICAgICByZXQuYXBwZW5kKGhpKTsKKyAg
ICAgICAgcmV0LmFwcGVuZChsbyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3Rh
dGljIFN0cmluZyBkZWNvZGVTdHJpbmcoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogZW5kKQor
eworICAgIEFTU0VSVChlbmQgPj0gcCk7CisgICAgQVNTRVJUKCEoKGVuZCAtIHApICUgMikpOwor
CisgICAgc2l6ZV90IGxlbiA9IChlbmQgLSBwKSAvIDI7CisgICAgVmVjdG9yPFVDaGFyPiB2ZWN0
b3IobGVuKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAg
ICAgdW5zaWduZWQgY2hhciBoaSA9ICpwKys7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSAq
cCsrOworCisgICAgICAgIHZlY3RvcltpXSA9IChoaSA8PCA4KSB8IGxvOworICAgIH0KKworICAg
IHJldHVybiBTdHJpbmc6OmFkb3B0KHZlY3Rvcik7Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4g
ZW5jb2RlU3RyaW5nV2l0aExlbmd0aChjb25zdCBTdHJpbmcmIHMpCit7CisgICAgVmVjdG9yPGNo
YXI+IHJldCA9IGVuY29kZVZhckludChzLmxlbmd0aCgpKTsKKyAgICByZXQuYXBwZW5kKGVuY29k
ZVN0cmluZyhzKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZVN0cmluZ1dpdGhMZW5ndGgoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIFN0
cmluZyYgZm91bmRTdHJpbmcpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOworICAgIGludDY0
X3QgbGVuOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbik7CisgICAgaWYgKCFw
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocCArIGxlbiAqIDIgPiBsaW1pdCkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBmb3VuZFN0cmluZyA9IGRlY29kZVN0cmluZyhwLCBwICsgbGVu
ICogMik7CisgICAgcCArPSBsZW4gKiAyOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgVmVj
dG9yPGNoYXI+IGVuY29kZURvdWJsZShkb3VibGUgeCkKK3sKKyAgICAvLyBGSVhNRTogSXQgd291
bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBiZSBieXRlIG9yZGVyIGluZGVwZW5kZW50LgorICAgIGNv
bnN0IGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7CisgICAgVmVjdG9yPGNo
YXI+IHY7CisgICAgdi5hcHBlbmQocCwgc2l6ZW9mKHgpKTsKKyAgICBBU1NFUlQodi5zaXplKCkg
PT0gc2l6ZW9mKHgpKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgZG91YmxlKiBkKQor
eworICAgIGlmIChwICsgc2l6ZW9mKCpkKSA+IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGNoYXIqIHggPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkKTsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemVvZigqZCk7ICsraSkKKyAgICAgICAgKngrKyA9ICpwKys7CisgICAg
cmV0dXJuIHA7Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlSURCS2V5KGNvbnN0IElE
QktleSYga2V5KQoreworICAgIFZlY3RvcjxjaGFyPiByZXQ7CisKKyAgICBzd2l0Y2ggKGtleS50
eXBlKCkpIHsKKyAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6CisgICAgICAgIHJldHVybiBlbmNv
ZGVCeXRlKGtJREJLZXlOdWxsVHlwZUJ5dGUpOworICAgIGNhc2UgSURCS2V5OjpTdHJpbmdUeXBl
OgorICAgICAgICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlTdHJpbmdUeXBlQnl0ZSk7CisgICAg
ICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChrZXkuc3RyaW5nKCkpKTsKKyAg
ICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6CisgICAgICAgIHJl
dCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7CisgICAgICAgIHJldC5hcHBlbmQo
ZW5jb2RlRG91YmxlKGtleS5kYXRlKCkpKTsKKyAgICAgICAgQVNTRVJUKHJldC5zaXplKCkgPT0g
OSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJLZXk6Ok51bWJlclR5cGU6Cisg
ICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleU51bWJlclR5cGVCeXRlKTsKKyAgICAgICAg
cmV0LmFwcGVuZChlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKSk7CisgICAgICAgIEFTU0VSVChy
ZXQuc2l6ZSgpID09IDkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBWZWN0b3I8Y2hhcj4oKTsKK30KKworc3RhdGlj
IGNvbnN0IGNoYXIqIGRlY29kZUlEQktleShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1p
dCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsK
KyAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBj
aGFyIHR5cGUgPSAqcCsrOworICAgIFN0cmluZyBzOworICAgIGRvdWJsZSBkOworCisgICAgc3dp
dGNoICh0eXBlKSB7CisgICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgorICAgICAgICAvLyBO
dWxsLgorICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlTnVsbCgpOworICAgICAgICBy
ZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgLy8gU3Ry
aW5nLgorICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcyk7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3VuZEtleSA9
IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOworICAgICAgICByZXR1cm4gcDsKKyAgICBjYXNlIGtJ
REJLZXlEYXRlVHlwZUJ5dGU6CisgICAgICAgIC8vIERhdGUuCisgICAgICAgIHAgPSBkZWNvZGVE
b3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKGQpOworICAgICAgICBy
ZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0ZToKKyAgICAgICAgLy8gTnVt
YmVyLgorICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7CisgICAgICAgIGlm
ICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3VuZEtleSA9IElEQktleTo6
Y3JlYXRlTnVtYmVyKGQpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGV4
dHJhY3RFbmNvZGVkSURCS2V5KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwg
VmVjdG9yPGNoYXI+KiByZXN1bHQpCit7CisgICAgY29uc3QgY2hhciogcCA9IHN0YXJ0OworICAg
IGlmIChwID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGNoYXIg
dHlwZSA9ICpwKys7CisKKyAgICBpbnQ2NF90IHN0cmluZ0xlbjsKKworICAgIHN3aXRjaCAodHlw
ZSkgeworICAgIGNhc2Uga0lEQktleU51bGxUeXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlNaW5L
ZXlUeXBlQnl0ZToKKyAgICAgICAgKnJlc3VsdCA9IGVuY29kZUJ5dGUodHlwZSk7CisgICAgICAg
IHJldHVybiBwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBT
dHJpbmcuCisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHN0cmluZ0xlbik7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocCArIHN0
cmluZ0xlbiAqIDIgPiBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXN1
bHQtPmNsZWFyKCk7CisgICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0YXJ0LCBwIC0gc3RhcnQgKyBz
dHJpbmdMZW4gKiAyKTsKKyAgICAgICAgcmV0dXJuIHAgKyBzdHJpbmdMZW4gKiAyOworICAgIGNh
c2Uga0lEQktleURhdGVUeXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0ZToK
KyAgICAgICAgLy8gRGF0ZSBvciBudW1iZXIuCisgICAgICAgIGlmIChwICsgc2l6ZW9mKGRvdWJs
ZSkgPiBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXN1bHQtPmNsZWFy
KCk7CisgICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0YXJ0LCAxICsgc2l6ZW9mKGRvdWJsZSkpOwor
ICAgICAgICByZXR1cm4gcCArIHNpemVvZihkb3VibGUpOworICAgIH0KKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXJlRW5jb2Rl
ZElEQktleXMoY29uc3QgVmVjdG9yPGNoYXI+JiBrZXlBLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtl
eUIpCit7CisgICAgQVNTRVJUKGtleUEuc2l6ZSgpID49IDEpOworICAgIEFTU0VSVChrZXlCLnNp
emUoKSA+PSAxKTsKKworICAgIGNvbnN0IGNoYXIqIHAgPSBrZXlBLmRhdGEoKTsKKyAgICBjb25z
dCBjaGFyKiBsaW1pdEEgPSBwICsga2V5QS5zaXplKCk7CisgICAgY29uc3QgY2hhciogcSA9IGtl
eUIuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGxpbWl0QiA9IHEgKyBrZXlCLnNpemUoKTsKKwor
ICAgIHVuc2lnbmVkIGNoYXIgdHlwZUEgPSAqcCsrOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUIg
PSAqcSsrOworCisgICAgU3RyaW5nIHMsIHQ7CisgICAgZG91YmxlIGQsIGU7CisKKyAgICBpZiAo
aW50IHggPSB0eXBlQiAtIHR5cGVBKSAvLyBGSVhNRTogTm90ZSB0aGUgc3VidGxlbmVzcyEKKyAg
ICAgICAgcmV0dXJuIHg7CisKKyAgICBzd2l0Y2ggKHR5cGVBKSB7CisgICAgY2FzZSBrSURCS2V5
TnVsbFR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU1pbktleVR5cGVCeXRlOgorICAgICAgICAv
LyBOdWxsIHR5cGUgb3IgbWF4IHR5cGU7IG5vIHBheWxvYWQgdG8gY29tcGFyZS4KKyAgICAgICAg
cmV0dXJuIDA7CisgICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6CisgICAgICAgIC8vIFN0
cmluZyB0eXBlLgorICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdEEs
IHMpOyAvLyBGSVhNRTogQ29tcGFyZSB3aXRob3V0IGFjdHVhbGx5IGRlY29kaW5nIHRoZSBTdHJp
bmchCisgICAgICAgIEFTU0VSVChwKTsKKyAgICAgICAgcSA9IGRlY29kZVN0cmluZ1dpdGhMZW5n
dGgocSwgbGltaXRCLCB0KTsKKyAgICAgICAgQVNTRVJUKHEpOworICAgICAgICByZXR1cm4gY29k
ZVBvaW50Q29tcGFyZShzLCB0KTsKKyAgICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAg
Y2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgor
ICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0QSwgJmQpOworICAgICAgICBBU1NFUlQo
cCk7CisgICAgICAgIHEgPSBkZWNvZGVEb3VibGUocSwgbGltaXRCLCAmZSk7CisgICAgICAgIEFT
U0VSVChxKTsKKyAgICAgICAgaWYgKGQgPCBlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAg
ICAgICBpZiAoZCA+IGUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisK
K3N0YXRpYyBib29sIGdldEludChMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGtleSwgaW50NjRfdCYgZm91bmRJbnQpCit7CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsK
KyAgICBpZiAoIWRiLT5nZXQoa2V5LCByZXN1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBmb3VuZEludCA9IGRlY29kZUludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcHV0SW50KExldmVsREJEYXRhYmFz
ZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBpbnQ2NF90IHZhbHVlKQoreworICAgIHJl
dHVybiBkYi0+cHV0KGtleSwgZW5jb2RlSW50KHZhbHVlKSk7Cit9CisKK3N0YXRpYyBib29sIGdl
dFN0cmluZyhMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgU3Ry
aW5nJiBmb3VuZFN0cmluZykKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGlmICgh
ZGItPmdldChrZXksIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvdW5k
U3RyaW5nID0gZGVjb2RlU3RyaW5nKHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOworICAg
IHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwdXRTdHJpbmcoTGV2ZWxEQkRhdGFiYXNl
KiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAg
ICBpZiAoIWRiLT5wdXQoa2V5LCBlbmNvZGVTdHJpbmcodmFsdWUpKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworY2xhc3MgS2V5UHJl
Zml4IHsKK3B1YmxpYzoKKyAgICBLZXlQcmVmaXgoKQorICAgICAgICA6IG1fZGF0YWJhc2VJZChr
SW52YWxpZFR5cGUpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKGtJbnZhbGlkVHlwZSkKKyAg
ICAgICAgLCBtX2luZGV4SWQoa0ludmFsaWRUeXBlKQorICAgIHsKKyAgICB9CisKKyAgICBLZXlQ
cmVmaXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCkKKyAgICAgICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKKyAgICAgICAgLCBt
X29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkKKyAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJ
ZCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBj
aGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEtleVByZWZpeCogcmVzdWx0KQorICAgIHsK
KyAgICAgICAgaWYgKHN0YXJ0ID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICAgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqc3RhcnQrKzsKKworICAgICAgICBpbnQg
ZGF0YWJhc2VJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gNSkgJiAweDcpICsgMTsKKyAgICAgICAg
aW50IG9iamVjdFN0b3JlSWRCeXRlcyA9ICgoZmlyc3RCeXRlID4+IDIpICYgMHg3KSArIDE7Cisg
ICAgICAgIGludCBpbmRleElkQnl0ZXMgPSAoZmlyc3RCeXRlICYgMHgzKSArIDE7CisKKyAgICAg
ICAgaWYgKHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzICsgb2JqZWN0U3RvcmVJZEJ5dGVzICsgaW5k
ZXhJZEJ5dGVzID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByZXN1
bHQtPm1fZGF0YWJhc2VJZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBkYXRhYmFzZUlkQnl0
ZXMpOworICAgICAgICBzdGFydCArPSBkYXRhYmFzZUlkQnl0ZXM7CisgICAgICAgIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIG9iamVjdFN0b3JlSWRC
eXRlcyk7CisgICAgICAgIHN0YXJ0ICs9IG9iamVjdFN0b3JlSWRCeXRlczsKKyAgICAgICAgcmVz
dWx0LT5tX2luZGV4SWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgaW5kZXhJZEJ5dGVzKTsK
KyAgICAgICAgc3RhcnQgKz0gaW5kZXhJZEJ5dGVzOworCisgICAgICAgIHJldHVybiBzdGFydDsK
KyAgICB9CisKKyAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlKCkgY29uc3QKKyAgICB7CisgICAgICAg
IEFTU0VSVChtX2RhdGFiYXNlSWQgIT0ga0ludmFsaWRJZCk7CisgICAgICAgIEFTU0VSVChtX29i
amVjdFN0b3JlSWQgIT0ga0ludmFsaWRJZCk7CisgICAgICAgIEFTU0VSVChtX2luZGV4SWQgIT0g
a0ludmFsaWRJZCk7CisKKyAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGFiYXNlSWRTdHJpbmcgPSBl
bmNvZGVJbnQobV9kYXRhYmFzZUlkKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IG9iamVjdFN0b3Jl
SWRTdHJpbmcgPSBlbmNvZGVJbnQobV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgVmVjdG9yPGNo
YXI+IGluZGV4SWRTdHJpbmcgPSBlbmNvZGVJbnQobV9pbmRleElkKTsKKworICAgICAgICBBU1NF
UlQoZGF0YWJhc2VJZFN0cmluZy5zaXplKCkgPD0gOCk7CisgICAgICAgIEFTU0VSVChvYmplY3RT
dG9yZUlkU3RyaW5nLnNpemUoKSA8PSA4KTsKKyAgICAgICAgQVNTRVJUKGluZGV4SWRTdHJpbmcu
c2l6ZSgpIDw9IDQpOworCisKKyAgICAgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAoZGF0
YWJhc2VJZFN0cmluZy5zaXplKCkgLSAxKSA8PCA1IHwgKG9iamVjdFN0b3JlSWRTdHJpbmcuc2l6
ZSgpIC0gMSkgPDwgMiB8IChpbmRleElkU3RyaW5nLnNpemUoKSAtIDEpOworICAgICAgICBWZWN0
b3I8Y2hhcj4gcmV0OworICAgICAgICByZXQuYXBwZW5kKGZpcnN0Qnl0ZSk7CisgICAgICAgIHJl
dC5hcHBlbmQoZGF0YWJhc2VJZFN0cmluZyk7CisgICAgICAgIHJldC5hcHBlbmQob2JqZWN0U3Rv
cmVJZFN0cmluZyk7CisgICAgICAgIHJldC5hcHBlbmQoaW5kZXhJZFN0cmluZyk7CisKKyAgICAg
ICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBLZXlQcmVmaXgm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52
YWxpZElkKTsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElkKTsK
KyAgICAgICAgQVNTRVJUKG1faW5kZXhJZCAhPSBrSW52YWxpZElkKTsKKworICAgICAgICBpZiAo
bV9kYXRhYmFzZUlkICE9IG90aGVyLm1fZGF0YWJhc2VJZCkKKyAgICAgICAgICAgIHJldHVybiBt
X2RhdGFiYXNlSWQgLSBvdGhlci5tX2RhdGFiYXNlSWQ7CisgICAgICAgIGlmIChtX29iamVjdFN0
b3JlSWQgIT0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIG1fb2Jq
ZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsKKyAgICAgICAgaWYgKG1faW5kZXhJ
ZCAhPSBvdGhlci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4gbV9pbmRleElkIC0gb3Ro
ZXIubV9pbmRleElkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbnVtIFR5cGUg
eworICAgICAgICBrR2xvYmFsTWV0YURhdGEsCisgICAgICAgIGtEYXRhYmFzZU1ldGFEYXRhLAor
ICAgICAgICBrT2JqZWN0U3RvcmVEYXRhLAorICAgICAgICBrRXhpc3RzRW50cnksCisgICAgICAg
IGtJbmRleERhdGEsCisgICAgICAgIGtJbnZhbGlkVHlwZQorICAgIH07CisKKyAgICBUeXBlIHR5
cGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52YWxp
ZElkKTsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElkKTsKKyAg
ICAgICAgQVNTRVJUKG1faW5kZXhJZCAhPSBrSW52YWxpZElkKTsKKworICAgICAgICBpZiAoIW1f
ZGF0YWJhc2VJZCkKKyAgICAgICAgICAgIHJldHVybiBrR2xvYmFsTWV0YURhdGE7CisgICAgICAg
IGlmICghbV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIGtEYXRhYmFzZU1ldGFE
YXRhOworICAgICAgICBpZiAobV9pbmRleElkID09IGtPYmplY3RTdG9yZURhdGFJbmRleElkKQor
ICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RTdG9yZURhdGE7CisgICAgICAgIGlmIChtX2luZGV4
SWQgPT0ga0V4aXN0c0VudHJ5SW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBrRXhpc3RzRW50
cnk7CisgICAgICAgIGlmIChtX2luZGV4SWQgPj0ga01pbmltdW1JbmRleElkKQorICAgICAgICAg
ICAgcmV0dXJuIGtJbmRleERhdGE7CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBrSW52YWxpZFR5cGU7CisgICAgfQorCisgICAgaW50NjRfdCBtX2RhdGFi
YXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4
SWQ7CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrSW52YWxpZElkID0gLTE7Cit9OworCitj
bGFzcyBTY2hlbWFWZXJzaW9uS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+
IGVuY29kZSgpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOworICAg
ICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZUJ5dGUoa1NjaGVtYVZlcnNpb25UeXBlQnl0ZSkpOworICAgICAgICByZXR1cm4g
cmV0OworICAgIH0KK307CisKK2NsYXNzIE1heERhdGFiYXNlSWRLZXkgeworcHVibGljOgorICAg
IHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBw
cmVmaXgoMCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2Rl
KCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrTWF4RGF0YWJhc2VJZFR5cGVCeXRl
KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKKworY2xhc3MgRGF0YWJhc2VGcmVl
TGlzdEtleSB7CitwdWJsaWM6CisgICAgRGF0YWJhc2VGcmVlTGlzdEtleSgpCisgICAgICAgIDog
bV9kYXRhYmFzZUlkKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0YWJhc2VGcmVl
TGlzdEtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAg
ICAgY29uc3QgY2hhciAqcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZp
eCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NF
UlQoIXByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVj
dFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBp
ZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBj
aGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlw
ZUJ5dGUgPT0ga0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxp
bWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQo
cCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZUlkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVj
dG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQpCisgICAgeworICAgICAgICBLZXlQ
cmVmaXggcHJlZml4KDAsIDAsIDApOworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4
LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0RhdGFiYXNlRnJlZUxp
c3RUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChkYXRhYmFzZUlk
KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50NjRfdCBkYXRhYmFzZUlk
KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAg
ICAgIHJldHVybiBtX2RhdGFiYXNlSWQ7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3Qg
RGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQo
bV9kYXRhYmFzZUlkID49IDApOworICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkIC0gb3RoZXIu
bV9kYXRhYmFzZUlkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fZGF0YWJhc2VJ
ZDsKK307CisKK2NsYXNzIERhdGFiYXNlTmFtZUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIERh
dGFiYXNlTmFtZUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsK
KyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwg
JnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAg
ICBBU1NFUlQoIXByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5t
X29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAg
ICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNp
Z25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0
ZSwgdHlwZUJ5dGUgPT0ga0RhdGFiYXNlTmFtZVR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dp
dGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9vcmlnaW4pOworICAgICAgICBpZiAoIXApCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW5n
dGgocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZU5hbWUpOworICAgIH0KKworICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBTdHJpbmcm
IGRhdGFiYXNlTmFtZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7
CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJl
dC5hcHBlbmQoZW5jb2RlQnl0ZShrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0
LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKG9yaWdpbikpOworICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgfQorCisgICAgU3RyaW5nIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3Jp
Z2luOyB9CisgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJh
c2VOYW1lOyB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBEYXRhYmFzZU5hbWVLZXkmIG90aGVy
KQorICAgIHsKKyAgICAgICAgaWYgKGludCB4ID0gY29kZVBvaW50Q29tcGFyZShtX29yaWdpbiwg
b3RoZXIubV9vcmlnaW4pKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIHJldHVybiBj
b2RlUG9pbnRDb21wYXJlKG1fZGF0YWJhc2VOYW1lLCBvdGhlci5tX2RhdGFiYXNlTmFtZSk7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIFN0cmluZyBtX29yaWdpbjsgLy8gRklYTUU6IFN0b3JlIGVu
Y29kZWQgc3RyaW5ncywgb3IganVzdCBwb2ludGVycy4KKyAgICBTdHJpbmcgbV9kYXRhYmFzZU5h
bWU7Cit9OworCitjbGFzcyBEYXRhYmFzZU1ldGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBlbnVt
IE1ldGFEYXRhVHlwZSB7CisgICAgICAgIGtPcmlnaW5OYW1lID0gMCwKKyAgICAgICAga0RhdGFi
YXNlTmFtZSA9IDEsCisgICAgICAgIGtVc2VyVmVyc2lvbiA9IDIsCisgICAgICAgIGtNYXhPYmpl
Y3RTdG9yZUlkID0gMworICAgIH07CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIE1ldGFEYXRhVHlwZSBtZXRhRGF0YVR5cGUpCisgICAgeworICAg
ICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5
dGUobWV0YURhdGFUeXBlKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKKworY2xh
c3MgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgT2JqZWN0U3RvcmVNZXRh
RGF0YUtleSgpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1fbWV0
YURhdGFUeXBlKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVj
b2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVNZXRh
RGF0YUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAg
ICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZp
eCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NF
UlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAgIGlm
IChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVkIGNo
YXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBl
Qnl0ZSA9PSBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHJlc3VsdC0+bV9vYmplY3RTdG9yZUlk
KTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX21ldGFEYXRhVHlwZSk7
CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgbWV0YURhdGFUeXBlKQorICAgIHsK
KyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgVmVj
dG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNv
ZGVCeXRlKGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0LmFwcGVu
ZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29k
ZVZhckludChtZXRhRGF0YVR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAg
ICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
b2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAg
ICB9CisgICAgaW50NjRfdCBtZXRhRGF0YVR5cGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1fbWV0YURhdGFUeXBlID49IDApOworICAgICAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGU7
CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSYg
b3RoZXIpCisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAg
ICAgICBBU1NFUlQobV9tZXRhRGF0YVR5cGUgPj0gMCk7CisgICAgICAgIGlmIChpbnQgeCA9IG1f
b2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVy
biB4OyAvLyBGSVhNRTogSXMgdGhpcyBjYXN0IHNhZmU/IEkuZS4sIHdpbGwgaXQgcHJlc2VydmUg
dGhlIHNpZ24/CisgICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURh
dGFUeXBlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsK
KyAgICBpbnQ2NF90IG1fbWV0YURhdGFUeXBlOyAvLyBGSVhNRTogTWFrZSB0aGlzIGEgYnl0ZS4K
K307CisKK2NsYXNzIEluZGV4TWV0YURhdGFLZXkgeworcHVibGljOgorICAgIEluZGV4TWV0YURh
dGFLZXkoKQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAgICAgICAgLCBtX2luZGV4
SWQoLTEpCisgICAgICAgICwgbV9tZXRhRGF0YVR5cGUoMCkKKyAgICB7CisgICAgfQorCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIEluZGV4TWV0YURhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZp
eCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFy
dCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQo
IXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4
SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNF
RCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0luZGV4TWV0YURhdGFUeXBlQnl0ZSk7CisgICAgICAg
IGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYg
KCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9pbmRleElkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUgPSAqcCsrOworICAgICAgICByZXR1cm4g
cDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCB1bnNpZ25lZCBj
aGFyIG1ldGFEYXRhVHlwZSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJh
c2VJZCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7
CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKSk7
CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICAg
ICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQoaW5kZXhJZCkpOworICAgICAgICByZXQuYXBwZW5k
KGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQor
CisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhNZXRhRGF0YUtleSYgb3RoZXIpCisgICAgewor
ICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9p
bmRleElkID49IDApOworCisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90
aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBpZiAo
aW50IHggPSBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4SWQpCisgICAgICAgICAgICByZXR1cm4g
eDsKKyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7
CisgICAgfQorCisgICAgaW50NjRfdCBpbmRleElkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2luZGV4SWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX2luZGV4SWQ7CisgICAgfQor
CisgICAgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUoKSBjb25zdCB7IHJldHVybiBtX21ldGFE
YXRhVHlwZTsgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAg
IGludDY0X3QgbV9pbmRleElkOworICAgIHVuc2lnbmVkIGNoYXIgbV9tZXRhRGF0YVR5cGU7Cit9
OworCitjbGFzcyBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RT
dG9yZUZyZWVMaXN0S2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgewor
ICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQs
IGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5KiByZXN1bHQpCisgICAg
eworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBjaGFyICpwID0gS2V5
UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlk
KTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgQVNT
RVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7Cisg
ICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtPYmplY3RTdG9yZUZy
ZWVMaXN0VHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1f
b2JqZWN0U3RvcmVJZCk7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBWZWN0b3I8Y2hh
cj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUo
a09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29k
ZVZhckludChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisg
ICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQ7Cisg
ICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYgb3Ro
ZXIpCisgICAgeworICAgICAgICAvLyBGSVhNRTogSXQgbWF5IHNlZW0gc3RyYW5nZSB0aGF0IHdl
J3JlIG5vdCBjb21wYXJpbmcgZGF0YWJhc2UgaWQncywKKyAgICAgICAgLy8gYnV0IHRoYXQgY29t
cGFyaXNvbiB3aWxsIGhhdmUgYmVlbiBtYWRlIGVhcmxpZXIuCisgICAgICAgIC8vIFdlIHNob3Vs
ZCBwcm9iYWJseSBtYWtlIHRoaXMgbW9yZSBjbGVhciwgdGhvdWdoLi4uCisgICAgICAgIEFTU0VS
VChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQg
LSBvdGhlci5tX29iamVjdFN0b3JlSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3Qg
bV9vYmplY3RTdG9yZUlkOworfTsKKworY2xhc3MgSW5kZXhGcmVlTGlzdEtleSB7CitwdWJsaWM6
CisgICAgSW5kZXhGcmVlTGlzdEtleSgpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQor
ICAgICAgICAsIG1faW5kZXhJZCgtMSkKKyAgICB7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4
RnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7Cisg
ICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZw
cmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
QVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29i
amVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAg
ICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwg
dHlwZUJ5dGUgPT0ga0luZGV4RnJlZUxpc3RUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxp
bWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJl
c3VsdC0+bV9pbmRleElkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsK
KyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0
LmFwcGVuZChlbmNvZGVCeXRlKGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0
LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgICAgICByZXQuYXBwZW5k
KGVuY29kZVZhckludChpbmRleElkKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisg
ICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhGcmVlTGlzdEtleSYgb3RoZXIpCisgICAgeworICAg
ICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9pbmRl
eElkID49IDApOworICAgICAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5t
X29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIG1f
aW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKKyAgICB9CisKKyAgICBpbnQ2NF90IG9iamVjdFN0
b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAw
KTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKKyAgICBpbnQ2NF90
IGluZGV4SWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsK
KyAgICAgICAgcmV0dXJuIG1faW5kZXhJZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRf
dCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7Cit9OworCitjbGFzcyBP
YmplY3RTdG9yZU5hbWVzS2V5IHsKK3B1YmxpYzoKKyAgICAvLyBGSVhNRTogV2UgbmV2ZXIgdXNl
IHRoaXMgdG8gbG9vayB1cCBvYmplY3Qgc3RvcmUgaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAg
IC8vIGlzIGtlcHQgaW4gdGhlIElEQkRhdGFiYXNlQmFja2VuZEltcGwuIENhbiB0aGUgbWFwcGlu
ZyBiZWNvbWUgdW5yZWxpYWJsZT8KKyAgICAvLyBDYW4gd2UgcmVtb3ZlIHRoaXM/CisgICAgc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGlt
aXQsIE9iamVjdFN0b3JlTmFtZXNLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZp
eCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFy
dCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQo
IXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4
SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNF
RCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSk7CisgICAg
ICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1bHQtPm1fb2Jq
ZWN0U3RvcmVOYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgb2JqZWN0U3RvcmVOYW1lKQorICAgIHsK
KyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICAgICAgVmVj
dG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNv
ZGVCeXRlKGtTY2hlbWFWZXJzaW9uVHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNv
ZGVCeXRlKGtPYmplY3RTdG9yZU5hbWVzVHlwZUJ5dGUpKTsKKyAgICAgICAgcmV0LmFwcGVuZChl
bmNvZGVTdHJpbmdXaXRoTGVuZ3RoKG9iamVjdFN0b3JlTmFtZSkpOworICAgICAgICByZXR1cm4g
cmV0OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlTmFtZXNLZXkm
IG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9vYmplY3RT
dG9yZU5hbWUsIG90aGVyLm1fb2JqZWN0U3RvcmVOYW1lKTsKKyAgICB9CisKKyAgICBTdHJpbmcg
b2JqZWN0U3RvcmVOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RTdG9yZU5hbWU7IH0KKwor
cHJpdmF0ZToKKyAgICBTdHJpbmcgbV9vYmplY3RTdG9yZU5hbWU7IC8vIEZJWE1FOiBTdG9yZSB0
aGUgZW5jb2RlZCBzdHJpbmcsIG9yIGp1c3QgcG9pbnRlcnMgdG8gaXQuCit9OworCitjbGFzcyBJ
bmRleE5hbWVzS2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleE5hbWVzS2V5KCkKKyAgICAgICAgOiBt
X29iamVjdFN0b3JlSWQoLTEpCisgICAgeworICAgIH0KKworICAgIC8vIEZJWE1FOiBXZSBuZXZl
ciB1c2UgdGhpcyB0byBsb29rIHVwIGluZGV4IGlkcywgYmVjYXVzZSBhIG1hcHBpbmcKKyAgICAv
LyBpcyBrZXB0IGF0IGEgaGlnaGVyIGxldmVsLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNv
ZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiBy
ZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBjb25zdCBj
aGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICAg
ICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChwcmVmaXgu
bV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsK
KyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAgaWYgKHAgPT0gbGlt
aXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0
ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtJ
bmRleE5hbWVzS2V5VHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQt
Pm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0
LT5tX2luZGV4TmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYg
aW5kZXhOYW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAw
LCAwKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAg
ICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtJbmRleE5hbWVzS2V5VHlwZUJ5dGUpKTsKKyAgICAg
ICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgICAgICByZXQu
YXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoaW5kZXhOYW1lKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhOYW1lc0tleSYgb3Ro
ZXIpCisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAg
ICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisg
ICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9p
bmRleE5hbWUsIG90aGVyLm1faW5kZXhOYW1lKTsKKyAgICB9CisKKyAgICBTdHJpbmcgaW5kZXhO
YW1lKCkgY29uc3QgeyByZXR1cm4gbV9pbmRleE5hbWU7IH0KKworcHJpdmF0ZToKKyAgICBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBTdHJpbmcgbV9pbmRleE5hbWU7Cit9OworCitjbGFz
cyBPYmplY3RTdG9yZURhdGFLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgT2JqZWN0U3RvcmVEYXRh
S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBj
b25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJl
Zml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlk
KTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPT0ga1NwZWNpYWxJbmRleE51bWJl
cik7CisgICAgICAgIGlmIChwID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRV
c2VyS2V5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNoYXI+IGVu
Y29kZWRVc2VyS2V5KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgVmVjdG9yPGNo
YXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVkVXNl
cktleSk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9y
PGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5JiB1c2VyS2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBlbmNvZGVJREJLZXkodXNlcktleSkpOworICAgIH0KKwor
ICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlRGF0YUtleSYgb3RoZXIpCisgICAgewor
ICAgICAgICByZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90
aGVyLm1fZW5jb2RlZFVzZXJLZXkpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SURCS2V5PiB1
c2VyS2V5KCkgY29uc3QKKyAgICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAg
ICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVkVXNlcktl
eS5lbmQoKSwga2V5KTsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBzdGF0aWMg
Y29uc3QgaW50NjRfdCBrU3BlY2lhbEluZGV4TnVtYmVyID0ga09iamVjdFN0b3JlRGF0YUluZGV4
SWQ7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVzZXJLZXk7Cit9Owor
CitjbGFzcyBFeGlzdHNFbnRyeUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIq
IGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBFeGlzdHNFbnRyeUtl
eSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICAgICAgY29u
c3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVmaXgpOworICAg
ICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZp
eC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7
CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IGtTcGVjaWFsSW5kZXhOdW1iZXIp
OworICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
cmV0dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNl
cktleSk7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5j
b2RlZEtleSkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwga1NwZWNpYWxJbmRleE51bWJlcik7CisgICAgICAgIFZlY3RvcjxjaGFyPiBy
ZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlZEtleSk7Cisg
ICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktl
eSYgdXNlcktleSkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsKKyAgICB9CisKKyAgICBpbnQgY29t
cGFyZShjb25zdCBFeGlzdHNFbnRyeUtleSYgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4g
Y29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1fZW5jb2RlZFVz
ZXJLZXkpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3QK
KyAgICB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2RlSURCS2V5
KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVkVXNlcktleS5lbmQoKSwga2V5KTsK
KyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBr
U3BlY2lhbEluZGV4TnVtYmVyID0ga0V4aXN0c0VudHJ5SW5kZXhJZDsKKworcHJpdmF0ZToKKyAg
ICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsKK307CisKK2NsYXNzIEluZGV4RGF0YUtl
eSB7CitwdWJsaWM6CisgICAgSW5kZXhEYXRhS2V5KCkKKyAgICAgICAgOiBtX2RhdGFiYXNlSWQo
LTEpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1faW5kZXhJZCgt
MSkKKyAgICAgICAgLCBtX3NlcXVlbmNlTnVtYmVyKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBz
dGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBs
aW1pdCwgSW5kZXhEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJl
Zml4OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxp
bWl0LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZp
eC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA+PSBr
TWluaW11bUluZGV4SWQpOworICAgICAgICByZXN1bHQtPm1fZGF0YWJhc2VJZCA9IHByZWZpeC5t
X2RhdGFiYXNlSWQ7CisgICAgICAgIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkID0gcHJlZml4Lm1f
b2JqZWN0U3RvcmVJZDsKKyAgICAgICAgcmVzdWx0LT5tX2luZGV4SWQgPSBwcmVmaXgubV9pbmRl
eElkOworICAgICAgICBwID0gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgbGltaXQsICZyZXN1bHQt
Pm1fZW5jb2RlZFVzZXJLZXkpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+bV9zZXF1
ZW5jZU51bWJlciA9IC0xOyAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoYW5nZSBpdCBzbyB0aGF0IGFs
bCBrZXlzIGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIuIFNob3VsZG4ndCBuZWVkIHRvIGhhbmRsZSB0
aGlzIGNhc2UuCisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIpOworICAg
IH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IFZlY3RvcjxjaGFy
PiYgZW5jb2RlZFVzZXJLZXksIGludDY0X3Qgc2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpOwor
ICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQu
YXBwZW5kKGVuY29kZWRVc2VyS2V5KTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQo
c2VxdWVuY2VOdW1iZXIpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0
aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIHVzZXJLZXksIGludDY0X3Qg
c2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSwgc2VxdWVuY2VO
dW1iZXIpOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5KGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQzMl9NQVgsIG1heElE
QktleSgpLCBJTlQ2NF9NQVgpOworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4
RGF0YUtleSYgb3RoZXIsIGJvb2wgaWdub3JlU2VxdWVuY2VOdW1iZXIpCisgICAgeworICAgICAg
ICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9y
ZUlkID49IDApOworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOworICAgICAgICBpZiAo
aW50IHggPSBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9l
bmNvZGVkVXNlcktleSkpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgaWYgKGlnbm9y
ZVNlcXVlbmNlTnVtYmVyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBt
X3NlcXVlbmNlTnVtYmVyIC0gb3RoZXIubV9zZXF1ZW5jZU51bWJlcjsKKyAgICB9CisKKyAgICBp
bnQ2NF90IGRhdGFiYXNlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJh
c2VJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBp
bnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fb2Jq
ZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKKyAgICB9
CisKKyAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
aW5kZXhJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1faW5kZXhJZDsKKyAgICB9CisKKyAgICBQ
YXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8
SURCS2V5PiBrZXk7CisgICAgICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmJlZ2lu
KCksIG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7CisgICAgICAgIHJldHVybiBrZXk7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGludDY0X3Qg
bV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworICAgIFZlY3RvcjxjaGFy
PiBtX2VuY29kZWRVc2VyS2V5OworICAgIGludDY0X3QgbV9zZXF1ZW5jZU51bWJlcjsKK307CisK
K25hbWVzcGFjZSB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlUeXBlPgoraW50IGRlY29kZUFuZENv
bXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7Cisg
ICAgS2V5VHlwZSBrZXlBOworICAgIEtleVR5cGUga2V5QjsKKworICAgIGNvbnN0IGNoYXIqIHB0
ckEgPSBLZXlUeXBlOjpkZWNvZGUoYS5iZWdpbigpLCBhLmVuZCgpLCAma2V5QSk7CisgICAgQVNT
RVJUX1VOVVNFRChwdHJBLCBwdHJBKTsKKyAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5VHlwZTo6
ZGVjb2RlKGIuYmVnaW4oKSwgYi5lbmQoKSwgJmtleUIpOworICAgIEFTU0VSVF9VTlVTRUQocHRy
QiwgcHRyQik7CisKKyAgICByZXR1cm4ga2V5QS5jb21wYXJlKGtleUIpOworfQorfQorCitzdGF0
aWMgaW50IHJlYWxDb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNs
aWNlJiBiLCBib29sIGluZGV4S2V5cyA9IGZhbHNlKQoreworICAgIGNvbnN0IGNoYXIqIHB0ckEg
PSBhLmJlZ2luKCk7CisgICAgY29uc3QgY2hhciogcHRyQiA9IGIuYmVnaW4oKTsKKyAgICBjb25z
dCBjaGFyKiBlbmRBID0gYS5lbmQoKTsKKyAgICBjb25zdCBjaGFyKiBlbmRCID0gYi5lbmQoKTsK
KworICAgIEtleVByZWZpeCBwcmVmaXhBOworICAgIEtleVByZWZpeCBwcmVmaXhCOworCisgICAg
cHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckEsIGVuZEEsICZwcmVmaXhBKTsKKyAgICBwdHJC
ID0gS2V5UHJlZml4OjpkZWNvZGUocHRyQiwgZW5kQiwgJnByZWZpeEIpOworICAgIEFTU0VSVChw
dHJBKTsKKyAgICBBU1NFUlQocHRyQik7CisKKyAgICBpZiAoaW50IHggPSBwcmVmaXhBLmNvbXBh
cmUocHJlZml4QikpCisgICAgICAgIHJldHVybiB4OworCisgICAgaWYgKHByZWZpeEEudHlwZSgp
ID09IEtleVByZWZpeDo6a0dsb2JhbE1ldGFEYXRhKSB7CisgICAgICAgIEFTU0VSVChwdHJBICE9
IGVuZEEpOworICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKKworICAgICAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5
dGVCID0gKnB0ckIrKzsKKworICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0
ZUIpCisgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICBpZiAodHlwZUJ5dGVBIDw9IDEp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrRGF0YWJh
c2VGcmVlTGlzdFR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8
RGF0YWJhc2VGcmVlTGlzdEtleT4oYSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0Rh
dGFiYXNlTmFtZVR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8
RGF0YWJhc2VOYW1lS2V5PihhLCBiKTsKKyAgICB9CisKKyAgICBpZiAocHJlZml4QS50eXBlKCkg
PT0gS2V5UHJlZml4OjprRGF0YWJhc2VNZXRhRGF0YSkgeworICAgICAgICBBU1NFUlQocHRyQSAh
PSBlbmRBKTsKKyAgICAgICAgQVNTRVJUKHB0ckIgIT0gZW5kQik7CisKKyAgICAgICAgdW5zaWdu
ZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVC
eXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgaWYgKGludCB4ID0gdHlwZUJ5dGVBIC0gdHlwZUJ5
dGVCKQorICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA8PSAz
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrT2Jq
ZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENv
bXBhcmU8T2JqZWN0U3RvcmVNZXRhRGF0YUtleT4oYSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0
ZUEgPT0ga0luZGV4TWV0YURhdGFUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVB
bmRDb21wYXJlPEluZGV4TWV0YURhdGFLZXk+KGEsIGIpOworICAgICAgICBpZiAodHlwZUJ5dGVB
ID09IGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gZGVj
b2RlQW5kQ29tcGFyZTxPYmplY3RTdG9yZUZyZWVMaXN0S2V5PihhLCBiKTsKKyAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBrSW5kZXhGcmVlTGlzdFR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJu
IGRlY29kZUFuZENvbXBhcmU8SW5kZXhGcmVlTGlzdEtleT4oYSwgYik7CisgICAgICAgIGlmICh0
eXBlQnl0ZUEgPT0ga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVy
biBkZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlTmFtZXNLZXk+KGEsIGIpOworICAgICAgICBp
ZiAodHlwZUJ5dGVBID09IGtJbmRleE5hbWVzS2V5VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1
cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRleE5hbWVzS2V5PihhLCBiKTsKKworICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgaWYgKHBy
ZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a09iamVjdFN0b3JlRGF0YSkgeworICAgICAgICBp
ZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBpZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAg
ICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlz
IGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFu
ZGxlZCB0aGlzIHdheS4KKworICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxPYmplY3RT
dG9yZURhdGFLZXk+KGEsIGIpOworICAgIH0KKyAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5
UHJlZml4OjprRXhpc3RzRW50cnkpIHsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJC
ID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5k
QSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAg
ICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1
c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAg
ICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8RXhpc3RzRW50cnlLZXk+KGEsIGIpOworICAgIH0K
KyAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprSW5kZXhEYXRhKSB7CisgICAg
ICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6
IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBi
ZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXlB
OworICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QjsKKworICAgICAgICBwdHJBID0g
SW5kZXhEYXRhS2V5OjpkZWNvZGUoYS5iZWdpbigpLCBlbmRBLCAmaW5kZXhEYXRhS2V5QSk7Cisg
ICAgICAgIHB0ckIgPSBJbmRleERhdGFLZXk6OmRlY29kZShiLmJlZ2luKCksIGVuZEIsICZpbmRl
eERhdGFLZXlCKTsKKyAgICAgICAgQVNTRVJUKHB0ckEpOworICAgICAgICBBU1NFUlQocHRyQik7
CisKKyAgICAgICAgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlciA9IGluZGV4S2V5czsKKyAgICAg
ICAgcmV0dXJuIGluZGV4RGF0YUtleUEuY29tcGFyZShpbmRleERhdGFLZXlCLCBpZ25vcmVTZXF1
ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0
dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUtleXMoY29uc3QgTGV2ZWxEQlNsaWNlJiBh
LCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7CisgICAgcmV0dXJuIHJlYWxDb21wYXJlKGEsIGIp
OworfQorCitzdGF0aWMgaW50IGNvbXBhcmVJbmRleEtleXMoY29uc3QgTGV2ZWxEQlNsaWNlJiBh
LCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7CisgICAgcmV0dXJuIHJlYWxDb21wYXJlKGEsIGIs
IHRydWUpOworfQorCitjbGFzcyBDb21wYXJhdG9yIDogcHVibGljIExldmVsREJDb21wYXJhdG9y
IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBjb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYg
YSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKSBjb25zdCB7IHJldHVybiByZWFsQ29tcGFyZShhLCBi
KTsgfQorICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJpZGJf
Y21wMSI7IH0KK307Cit9CisKK3N0YXRpYyBib29sIHNldFVwTWV0YWRhdGEoTGV2ZWxEQkRhdGFi
YXNlKiBkYikKK3sKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWV0YURhdGFLZXkgPSBTY2hlbWFW
ZXJzaW9uS2V5OjplbmNvZGUoKTsKKworICAgIGludDY0X3Qgc2NoZW1hVmVyc2lvbjsKKyAgICBp
ZiAoIWdldEludChkYiwgbWV0YURhdGFLZXksIHNjaGVtYVZlcnNpb24pKSB7CisgICAgICAgIHNj
aGVtYVZlcnNpb24gPSAwOworICAgICAgICBpZiAoIXB1dEludChkYiwgbWV0YURhdGFLZXksIHNj
aGVtYVZlcnNpb24pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8v
IEZJWE1FOiBFdmVudHVhbGx5LCB3ZSdsbCBuZWVkIHRvIGJlIGFibGUgdG8gdHJhbnNpdGlvbiBi
ZXR3ZWVuIHNjaGVtYXMuCisgICAgaWYgKHNjaGVtYVZlcnNpb24pCisgICAgICAgIHJldHVybiBm
YWxzZTsgLy8gRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhpcyB2ZXJzaW9uLgorCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK0lEQkxldmVsREJCYWNraW5nU3RvcmU6OklEQkxldmVsREJCYWNr
aW5nU3RvcmUoU3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCogZmFjdG9y
eSwgTGV2ZWxEQkRhdGFiYXNlKiBkYikKICAgICA6IG1faWRlbnRpZmllcihpZGVudGlmaWVyKQog
ICAgICwgbV9mYWN0b3J5KGZhY3RvcnkpCiAgICAgLCBtX2RiKGRiKQpAQCAtNDcsMTU3ICsxNDcz
LDExNDEgQEAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6fklEQkxldmVsREJCYWNraW5nU3RvcmUo
KQogICAgIG1fZmFjdG9yeS0+cmVtb3ZlSURCQmFja2luZ1N0b3JlKG1faWRlbnRpZmllcik7CiB9
CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpv
cGVuKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiwgaW50NjRfdCwgY29uc3QgU3RyaW5n
JiwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKikKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdp
biwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgaW50NjRfdCBtYXhpbXVtU2l6ZSwgY29uc3Qg
U3RyaW5nJiBmaWxlSWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiBmYWN0b3J5KQor
eworICAgIFN0cmluZyBwYXRoQmFzZSA9IHBhdGhCYXNlQXJnOworCisgICAgaWYgKHBhdGhCYXNl
LmlzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IFdl
IG5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZSBmb3IgaW5jb2duaXRvIGFuZCBEdW1wUmVuZGVyVHJl
ZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFtYWtlQWxsRGlyZWN0b3Jp
ZXMocGF0aEJhc2UpKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSBJbmRl
eGVkREIgZGF0YWJhc2UgcGF0aCAlcyIsIHBhdGhCYXNlLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBldmVudHVhbGx5IHVz
ZSB0aGUgc2FtZSBMZXZlbERCIGRhdGFiYXNlIGZvciBhbGwgb3JpZ2lucy4KKyAgICBTdHJpbmcg
cGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIubGV2ZWxkYiIpOworCisgICAgT3du
UHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yKG5ldyBDb21wYXJhdG9yKCkpOworICAg
IExldmVsREJEYXRhYmFzZSogZGIgPSBMZXZlbERCRGF0YWJhc2U6Om9wZW4ocGF0aCwgY29tcGFy
YXRvci5nZXQoKSk7CisgICAgaWYgKCFkYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBG
SVhNRTogSGFuZGxlIGNvbXBhcmF0b3IgbmFtZSBjaGFuZ2VzLgorCisgICAgUmVmUHRyPElEQkxl
dmVsREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZShhZG9wdFJlZihuZXcgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZShmaWxlSWRlbnRpZmllciwgZmFjdG9yeSwgZGIpKSk7CisgICAgYmFja2luZ1N0
b3JlLT5tX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yLnJlbGVhc2UoKTsKKworICAgIGlmICghc2V0
VXBNZXRhZGF0YShiYWNraW5nU3RvcmUtPm1fZGIuZ2V0KCkpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBiYWNraW5nU3RvcmUucmVsZWFzZSgpOworfQorCitib29sIElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYg
bmFtZSwgU3RyaW5nJiBmb3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBJREJMZXZlbERCQmFja2luZ1N0b3JlKCIiLCAwLCAwKSk7CisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFt
ZSk7CisKKyAgICBib29sIG9rID0gZ2V0SW50KG1fZGIuZ2V0KCksIGtleSwgZm91bmRJZCk7Cisg
ICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgb2sgPSBnZXRTdHJpbmco
bV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGZvdW5kSWQsIERhdGFiYXNl
TWV0YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIGZvdW5kVmVyc2lvbik7CisgICAgaWYgKCFvaykK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBp
bnQ2NF90IGdldE5ld0RhdGFiYXNlSWQoTGV2ZWxEQkRhdGFiYXNlKiBkYikKK3sKKyAgICBjb25z
dCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdGFydEtleSA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVu
Y29kZSgwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdG9wS2V5ID0gRGF0YWJh
c2VGcmVlTGlzdEtleTo6ZW5jb2RlKElOVDY0X01BWCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0
ZXJhdG9yPiBpdChkYi0+bmV3SXRlcmF0b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhmcmVlTGlz
dFN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGZyZWVM
aXN0U3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBp
dC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCku
ZW5kKCk7CisKKyAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAg
ICAgcCA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5
KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGJvb2wgb2sgPSBkYi0+cmVtb3ZlKGl0
LT5rZXkoKSk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgICAgICByZXR1
cm4gZnJlZUxpc3RLZXkuZGF0YWJhc2VJZCgpOworICAgIH0KKworICAgIC8vIElmIHdlIGdvdCBo
ZXJlLCB0aGVyZSB3YXMgbm8gZnJlZS1saXN0LgorICAgIGludDY0X3QgbWF4RGF0YWJhc2VJZCA9
IC0xOworICAgIGlmICghZ2V0SW50KGRiLCBNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUoKSwgbWF4
RGF0YWJhc2VJZCkpCisgICAgICAgIG1heERhdGFiYXNlSWQgPSAwOworCisgICAgQVNTRVJUKG1h
eERhdGFiYXNlSWQgPj0gMCk7CisKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQgPSBtYXhEYXRhYmFz
ZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBNYXhEYXRhYmFzZUlkS2V5OjplbmNv
ZGUoKSwgZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgcmV0
dXJuIGRhdGFiYXNlSWQ7CisKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpzZXRJ
REJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2ZXJz
aW9uLCBpbnQ2NF90JiByb3dJZCwgYm9vbCBpbnZhbGlkUm93SWQpCit7CisgICAgaWYgKGludmFs
aWRSb3dJZCkgeworICAgICAgICByb3dJZCA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSk7
CisKKyAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5j
b2RlKG1faWRlbnRpZmllciwgbmFtZSk7CisgICAgICAgIGlmICghcHV0SW50KG1fZGIuZ2V0KCks
IGtleSwgcm93SWQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlm
ICghcHV0U3RyaW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShyb3dJ
ZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6a1VzZXJWZXJzaW9uKSwgdmVyc2lvbikpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYsIFN0
cmluZyYsIGludDY0X3QmKQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RT
dG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0
b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZl
Y3Rvcjxib29sPiYgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MpCiB7Ci0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCAxLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9i
amVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBJTlQ2NF9NQVgsIDApOwor
CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0b3IoKSk7Cisg
ICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMo
aXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hh
ciAqcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyICpsaW1pdCA9IGl0
LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRh
S2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0
LCAmbWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaW50NjRfdCBv
YmplY3RTdG9yZUlkID0gbWV0YURhdGFLZXkub2JqZWN0U3RvcmVJZCgpOworCisgICAgICAgIFN0
cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwg
aXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAgIGlmICgh
aXQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVk
IERCIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0
cmluZyBrZXlQYXRoID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1
ZSgpLmVuZCgpKTsKKworICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICBpZiAoIWl0LT5pc1Zh
bGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJv
ci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBib29sIGF1dG9J
bmNyZW1lbnQgPSAqaXQtPnZhbHVlKCkuYmVnaW4oKTsKKworICAgICAgICBpdC0+bmV4dCgpOyAv
LyBJcyBldmljYXRibGUuCisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8gTGFzdCB2ZXJzaW9u
LgorICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
SW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIE1heGl1bSBpbmRleCBpZCBhbGxvY2F0ZWQu
CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJJ
bnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgZm91bmRJZHMuYXBwZW5kKG9iamVjdFN0b3JlSWQpOworICAgICAgICBm
b3VuZE5hbWVzLmFwcGVuZChvYmplY3RTdG9yZU5hbWUpOworICAgICAgICBmb3VuZEtleVBhdGhz
LmFwcGVuZChrZXlQYXRoKTsKKyAgICAgICAgZm91bmRBdXRvSW5jcmVtZW50RmxhZ3MuYXBwZW5k
KGF1dG9JbmNyZW1lbnQpOworICAgIH0KIH0KIAorc3RhdGljIGludDY0X3QgZ2V0TmV3T2JqZWN0
U3RvcmVJZChMZXZlbERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAg
Y29uc3QgVmVjdG9yPGNoYXI+IGZyZWVMaXN0U3RhcnRLZXkgPSBPYmplY3RTdG9yZUZyZWVMaXN0
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGZyZWVM
aXN0U3RvcEtleSA9IE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBJ
TlQ2NF9NQVgpOworCisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQoZGItPm5ld0l0ZXJh
dG9yKCkpOworICAgIGZvciAoaXQtPnNlZWsoZnJlZUxpc3RTdGFydEtleSk7IGl0LT5pc1ZhbGlk
KCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBmcmVlTGlzdFN0b3BLZXkpIDwgMDsgaXQtPm5l
eHQoKSkgeworICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIE9iamVj
dFN0b3JlRnJlZUxpc3RLZXkgZnJlZUxpc3RLZXk7CisgICAgICAgIHAgPSBPYmplY3RTdG9yZUZy
ZWVMaXN0S2V5OjpkZWNvZGUocCwgbGltaXQsICZmcmVlTGlzdEtleSk7CisgICAgICAgIEFTU0VS
VChwKTsKKworICAgICAgICBib29sIG9rID0gZGItPnJlbW92ZShpdC0+a2V5KCkpOworICAgICAg
ICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAgICAgICAgcmV0dXJuIGZyZWVMaXN0S2V5Lm9i
amVjdFN0b3JlSWQoKTsKKyAgICB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6c2V0
SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBpbnQ2NF90
JiwgYm9vbCkKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQ7CisgICAgY29uc3QgVmVjdG9y
PGNoYXI+IG1heE9iamVjdFN0b3JlSWRLZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6a01heE9iamVjdFN0b3JlSWQpOworICAg
IGlmICghZ2V0SW50KGRiLCBtYXhPYmplY3RTdG9yZUlkS2V5LCBtYXhPYmplY3RTdG9yZUlkKSkK
KyAgICAgICAgbWF4T2JqZWN0U3RvcmVJZCA9IDA7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQgPSBtYXhPYmplY3RTdG9yZUlkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYXhP
YmplY3RTdG9yZUlkS2V5LCBvYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBv
ayk7CisKKyAgICByZXR1cm4gb2JqZWN0U3RvcmVJZDsKK30KKworYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQsIGlu
dDY0X3QmIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgaW50NjRfdCBv
YmplY3RTdG9yZUlkID0gZ2V0TmV3T2JqZWN0U3RvcmVJZChtX2RiLmdldCgpLCBkYXRhYmFzZUlk
KTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApOworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBhdXRv
SW5jcmVtZW50S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDIpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBldmljdGFibGVLZXkg
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgMyk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDQpOworICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDUpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBuYW1lc0tleSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBuYW1lKTsKKworICAgIGJvb2wgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwgbmFtZUtleSwg
bmFtZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4
ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9
IHB1dFN0cmluZyhtX2RiLmdldCgpLCBrZXlQYXRoS2V5LCBrZXlQYXRoKTsKKyAgICBpZiAoIW9r
KSB7CisgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCks
IGF1dG9JbmNyZW1lbnRLZXksIGF1dG9JbmNyZW1lbnQpOworICAgIGlmICghb2spIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgZXZpY3RhYmxl
S2V5LCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoIkludGVybmFs
IEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBvayA9IHB1dEludChtX2RiLmdldCgpLCBsYXN0VmVyc2lvbktleSwgMSk7CisgICAgaWYgKCFv
aykgeworICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgp
LCBtYXhJbmRleElkS2V5LCBrTWluaW11bUluZGV4SWQpOworICAgIGlmICghb2spIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbmFtZXNLZXks
IG9iamVjdFN0b3JlSWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJbnRl
cm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgYXNzaWduZWRPYmplY3RTdG9yZUlkID0gb2JqZWN0U3RvcmVJZDsKKworICAgIHJldHVy
biB0cnVlOwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVjdFN0b3Jl
cyhpbnQ2NF90LCBWZWN0b3I8aW50NjRfdD4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3RvcjxTdHJp
bmc+JiwgVmVjdG9yPGJvb2w+JikKK3N0YXRpYyBib29sIGRlbGV0ZVJhbmdlKExldmVsREJEYXRh
YmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgYmVnaW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYg
ZW5kKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50Lgor
ICAgIC8vIEZJWE1FOiBMZXZlbERCIG1heSBiZSBhYmxlIHRvIHByb3ZpZGUgYSBidWxrIG9wZXJh
dGlvbiB0aGF0IHdlIGNhbiBkbyBmaXJzdC4KKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBp
dChkYi0+bmV3SXRlcmF0b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhiZWdpbik7IGl0LT5pc1Zh
bGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBlbmQpIDwgMDsgaXQtPm5leHQoKSkgewor
ICAgICAgICBpZiAoIWRiLT5yZW1vdmUoaXQtPmtleSgpKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpjcmVhdGVPYmplY3RTdG9yZShpbnQ2NF90LCBjb25zdCBTdHJpbmcmLCBjb25z
dCBTdHJpbmcmLCBib29sLCBpbnQ2NF90JikKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
ZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0g
ICAgcmV0dXJuIGZhbHNlOworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7CisgICAgZ2V0U3Ry
aW5nKG1fZGIuZ2V0KCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCAwKSwgb2JqZWN0U3RvcmVOYW1lKTsKKworICAgIGlmICghZGVsZXRl
UmFuZ2UobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIDApLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNikpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBS
ZXBvcnQgZXJyb3IuCisKKyAgICBwdXRTdHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVGcmVl
TGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpLCAiIik7CisgICAgbV9k
Yi0+cmVtb3ZlKE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZU5hbWUpKTsKKworICAgIGlmICghZGVsZXRlUmFuZ2UobV9kYi5nZXQoKSwgSW5kZXhGcmVl
TGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBJbmRleEZyZWVM
aXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKSkpCisg
ICAgICAgIHJldHVybjsgLy8gRklYTUU6IFJlcG9ydCBlcnJvci4KKyAgICBpZiAoIWRlbGV0ZVJh
bmdlKG1fZGIuZ2V0KCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAwLCAwKSwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIElOVDY0X01BWCwgMCkpKQorICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBS
ZXBvcnQgZXJyb3IuCisKKyAgICBjbGVhck9iamVjdFN0b3JlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQpOwogfQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0
b3JlKGludDY0X3QsIGludDY0X3QpCitTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBG
SVhNRTogSW1wbGVtZW50LgorICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gT2Jq
ZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsK
KyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKworICAgIGlmICghbV9kYi0+Z2V0KGxldmVsZGJLZXks
IGRhdGEpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb247
CisgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmJlZ2luKCksIGRhdGEuZW5k
KCksIHZlcnNpb24pOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAg
ICh2b2lkKSB2ZXJzaW9uOworCisgICAgcmV0dXJuIGRlY29kZVN0cmluZyhwLCBkYXRhLmVuZCgp
KTsKK30KKworbmFtZXNwYWNlIHsKK2NsYXNzIExldmVsREJSZWNvcmRJZGVudGlmaWVyIDogcHVi
bGljIElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4gY3JlYXRl
KGNvbnN0IFZlY3RvcjxjaGFyPiYgcHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSB7IHJldHVy
biBhZG9wdFJlZihuZXcgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIocHJpbWFyeUtleSwgdmVyc2lv
bikpOyB9CisgICAgc3RhdGljIFBhc3NSZWZQdHI8TGV2ZWxEQlJlY29yZElkZW50aWZpZXI+IGNy
ZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSWRlbnRpZmllcigpKTsg
fQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlL
ZXkuaXNFbXB0eSgpOyB9CisgICAgVmVjdG9yPGNoYXI+IHByaW1hcnlLZXkoKSBjb25zdCB7IHJl
dHVybiBtX3ByaW1hcnlLZXk7IH0KKyAgICB2b2lkIHNldFByaW1hcnlLZXkoY29uc3QgVmVjdG9y
PGNoYXI+JiBwcmltYXJ5S2V5KSB7IG1fcHJpbWFyeUtleSA9IHByaW1hcnlLZXk7IH0KKyAgICBp
bnQ2NF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtX3ZlcnNpb247IH0KKyAgICB2b2lkIHNl
dFZlcnNpb24oaW50NjRfdCB2ZXJzaW9uKSB7IG1fdmVyc2lvbiA9IHZlcnNpb247IH0KKworcHJp
dmF0ZToKKyAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmllcihjb25zdCBWZWN0b3I8Y2hhcj4mIHBy
aW1hcnlLZXksIGludDY0X3QgdmVyc2lvbikgOiBtX3ByaW1hcnlLZXkocHJpbWFyeUtleSksIG1f
dmVyc2lvbih2ZXJzaW9uKSB7IEFTU0VSVCghcHJpbWFyeUtleS5pc0VtcHR5KCkpOyB9CisgICAg
TGV2ZWxEQlJlY29yZElkZW50aWZpZXIoKSA6IG1fcHJpbWFyeUtleSgpLCBtX3ZlcnNpb24oLTEp
IHt9CisKKyAgICBWZWN0b3I8Y2hhcj4gbV9wcmltYXJ5S2V5OyAvLyBGSVhNRTogTWFrZSBpdCBt
b3JlIGNsZWFyIHRoYXQgdGhpcyBpcyB0aGUgKmVuY29kZWQqIHZlcnNpb24gb2YgdGhlIGtleS4K
KyAgICBpbnQ2NF90IG1fdmVyc2lvbjsKK307CiB9CiAKLVN0cmluZyBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJL
ZXkmKQorc3RhdGljIGludDY0X3QgZ2V0TmV3VmVyc2lvbk51bWJlcihMZXZlbERCRGF0YWJhc2Uq
IGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gU3Ry
aW5nKCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDQpOworCisg
ICAgaW50NjRfdCBsYXN0VmVyc2lvbiA9IC0xOworICAgIGlmICghZ2V0SW50KGRiLCBsYXN0VmVy
c2lvbktleSwgbGFzdFZlcnNpb24pKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBB
U1NFUlQobGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVy
c2lvbiArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbGFzdFZlcnNpb25LZXksIHZlcnNp
b24pOworICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgIEFTU0VSVCh2ZXJzaW9uID4g
bGFzdFZlcnNpb24pOyAvLyBGSVhNRTogVGhpbmsgYWJvdXQgaG93IHdlIHdhbnQgdG8gaGFuZGxl
IHRoZSBvdmVyZmxvdyBzY2VuYXJpby4KKworICAgIHJldHVybiB2ZXJzaW9uOwogfQogCi1ib29s
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGlu
dDY0X3QsIGNvbnN0IElEQktleSYsIGNvbnN0IFN0cmluZyYsIE9iamVjdFN0b3JlUmVjb3JkSWRl
bnRpZmllciopCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVj
b3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJL
ZXkmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KiByZWNvcmRJZGVudGlmaWVyKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhN
RTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBn
ZXROZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQp
OworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZWRhdGFLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworCisgICAg
VmVjdG9yPGNoYXI+IHY7CisgICAgdi5hcHBlbmQoZW5jb2RlVmFySW50KHZlcnNpb24pKTsKKyAg
ICB2LmFwcGVuZChlbmNvZGVTdHJpbmcodmFsdWUpKTsKKworICAgIGlmICghbV9kYi0+cHV0KG9i
amVjdFN0b3JlZGF0YUtleSwgdikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBleGlzdHNFbnRyeUtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsKKyAgICBpZiAoIW1fZGItPnB1dChleGlzdHNF
bnRyeUtleSwgZW5jb2RlSW50KHZlcnNpb24pKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3Rh
dGljX2Nhc3Q8TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAg
ICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5
KSk7CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7Cisg
ICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y2xlYXJP
YmplY3RTdG9yZShpbnQ2NF90LCBpbnQ2NF90KQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjbGVhck9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50Lgor
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCAwKS5lbmNvZGUoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtl
eSA9IEtleVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7
CisKKyAgICBkZWxldGVSYW5nZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7CiB9CiAK
IFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKCkK
IHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICBy
ZXR1cm4gMDsKKyAgICByZXR1cm4gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0ZSgpOwog
fQogCi12b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3Jk
KGludDY0X3QsIGludDY0X3QsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciopCit2
b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlUmVjb3JkKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBPYmplY3RTdG9yZVJl
Y29yZElkZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50
aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxE
QlJlY29yZElkZW50aWZpZXIqPihyZWNvcmRJZGVudGlmaWVyKTsKKyAgICBjb25zdCBWZWN0b3I8
Y2hhcj4ga2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisgICAgbV9k
Yi0+cmVtb3ZlKGtleSk7CiB9CiAKLWRvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0
QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90LCBpbnQ2NF90KQorZG91YmxlIElEQkxldmVsREJC
YWNraW5nU3RvcmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBG
SVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBz
dGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IE9i
amVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElE
QktleSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJh
dG9yKCkpOworCisgICAgaW50IG1heE51bWVyaWNLZXkgPSAwOworCisgICAgLy8gRklYTUU6IEJl
IG1vcmUgZWZmaWNpZW50OiBzZWVrIHRvIHNvbWV0aGluZyBhZnRlciB0aGUgb2JqZWN0IHN0b3Jl
IGRhdGEsIHRoZW4gcmV2ZXJzZS4KKworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+
aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4
dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAg
ICAgY29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgT2JqZWN0
U3RvcmVEYXRhS2V5IGRhdGFLZXk7CisgICAgICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRl
Y29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAg
aWYgKGRhdGFLZXkudXNlcktleSgpLT50eXBlKCkgPT0gSURCS2V5OjpOdW1iZXJUeXBlKSB7Cisg
ICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihkYXRhS2V5LnVzZXJL
ZXkoKS0+bnVtYmVyKCkpOworICAgICAgICAgICAgaWYgKG4gPiBtYXhOdW1lcmljS2V5KQorICAg
ICAgICAgICAgICAgIG1heE51bWVyaWNLZXkgPSBuOworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIG1heE51bWVyaWNLZXkgKyAxOwogfQogCi1ib29sIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5
JiwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIE9iamVjdFN0b3JlUmVjb3JkSWRlbnRp
ZmllciogZm91bmRSZWNvcmRJZGVudGlmaWVyKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbGV2ZWxkYktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisKKyAgICBp
ZiAoIW1fZGItPmdldChsZXZlbGRiS2V5LCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaW50NjRfdCB2ZXJzaW9uOworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4o
KSwgZGF0YS5lbmQoKSwgdmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExl
dmVsREJSZWNvcmRJZGVudGlmaWVyKiBsZXZlbERCUmVjb3JkSWRlbnRpZmllciA9IHN0YXRpY19j
YXN0PExldmVsREJSZWNvcmRJZGVudGlmaWVyKj4oZm91bmRSZWNvcmRJZGVudGlmaWVyKTsKKyAg
ICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShlbmNvZGVJREJLZXkoa2V5
KSk7CisgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7Cisg
ICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFj
aE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIE9iamVjdFN0b3JlUmVjb3JkQ2Fs
bGJhY2smKQorYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIE9iamVjdFN0
b3JlUmVjb3JkQ2FsbGJhY2smIGNhbGxiYWNrKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0
b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBtYXhJREJLZXkoKSk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChtX2Ri
LT5uZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFs
aWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkg
eworICAgICAgICBjb25zdCBjaGFyICpwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNv
bnN0IGNoYXIgKmxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworICAgICAgICBPYmplY3RTdG9yZURh
dGFLZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAs
IGxpbWl0LCAmZGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBSZWZQdHI8
SURCS2V5PiBwcmltYXJ5S2V5ID0gZGF0YUtleS51c2VyS2V5KCk7CisKKyAgICAgICAgaW50NjRf
dCB2ZXJzaW9uOworICAgICAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KGl0LT52YWx1
ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKCFx
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlZlB0cjxMZXZlbERCUmVj
b3JkSWRlbnRpZmllcj4gcmkgPSBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKGVuY29k
ZUlEQktleSgqcHJpbWFyeUtleSksIHZlcnNpb24pOworICAgICAgICBTdHJpbmcgaWRiVmFsdWUg
PSBkZWNvZGVTdHJpbmcocSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGNhbGxiYWNr
LmNhbGxiYWNrKHJpLmdldCgpLCBpZGJWYWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7
CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyhpbnQ2NF90LCBp
bnQ2NF90LCBWZWN0b3I8aW50NjRfdD4mLCBWZWN0b3I8U3RyaW5nPiYsIFZlY3RvcjxTdHJpbmc+
JiwgVmVjdG9yPGJvb2w+JikKK3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhl
cyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgVmVjdG9yPGludDY0
X3Q+JiBmb3VuZElkcywgVmVjdG9yPFN0cmluZz4mIGZvdW5kTmFtZXMsIFZlY3RvcjxTdHJpbmc+
JiBmb3VuZEtleVBhdGhzLCBWZWN0b3I8Ym9vbD4mIGZvdW5kVW5pcXVlRmxhZ3MpCiB7Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IHN0YXJ0S2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDAsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0g
SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAw
LCAwKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9y
KCkpOworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBh
cmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgIGNv
bnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgY2hhciogbGlt
aXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgSW5kZXhNZXRhRGF0YUtleSBtZXRhRGF0
YUtleTsKKyAgICAgICAgcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1l
dGFEYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGludDY0X3QgaW5kZXhJ
ZCA9IG1ldGFEYXRhS2V5LmluZGV4SWQoKTsKKyAgICAgICAgQVNTRVJUKCFtZXRhRGF0YUtleS5t
ZXRhRGF0YVR5cGUoKSk7CisKKyAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGRlY29kZVN0cmlu
ZyhpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisgICAgICAgIGl0LT5u
ZXh0KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBpbmRleFVuaXF1ZSA9ICppdC0+dmFsdWUoKS5iZWdp
bigpOworICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBrZXlQYXRoID0g
ZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKwor
ICAgICAgICBmb3VuZElkcy5hcHBlbmQoaW5kZXhJZCk7CisgICAgICAgIGZvdW5kTmFtZXMuYXBw
ZW5kKGluZGV4TmFtZSk7CisgICAgICAgIGZvdW5kS2V5UGF0aHMuYXBwZW5kKGtleVBhdGgpOwor
ICAgICAgICBmb3VuZFVuaXF1ZUZsYWdzLmFwcGVuZChpbmRleFVuaXF1ZSk7CisgICAgfQogfQog
Ci1ib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3QsIGludDY0
X3QsIGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYsIGJvb2wsIGludDY0X3QmKQorc3RhdGlj
IGludDY0X3QgZ2V0TmV3SW5kZXhJZChMZXZlbERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IHN0YXJ0S2V5ID0gSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gSW5k
ZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01B
WCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChkYi0+bmV3SXRlcmF0b3IoKSk7
CisgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtl
eXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9
IGl0LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBJbmRleEZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5
OworICAgICAgICBwID0gSW5kZXhGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxp
c3RLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgYm9vbCBvayA9IGRiLT5yZW1v
dmUoaXQtPmtleSgpKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgICAg
IEFTU0VSVChmcmVlTGlzdEtleS5pbmRleElkKCkgPj0ga01pbmltdW1JbmRleElkKTsKKyAgICAg
ICAgcmV0dXJuIGZyZWVMaXN0S2V5LmluZGV4SWQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1h
eEluZGV4SWQ7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRLZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNSk7Cisg
ICAgaWYgKCFnZXRJbnQoZGIsIG1heEluZGV4SWRLZXksIG1heEluZGV4SWQpKQorICAgICAgICBt
YXhJbmRleElkID0ga01pbmltdW1JbmRleElkOworCisgICAgaW50NjRfdCBpbmRleElkID0gbWF4
SW5kZXhJZCArIDE7CisgICAgYm9vbCBvayA9IHB1dEludChkYiwgbWF4SW5kZXhJZEtleSwgaW5k
ZXhJZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJu
IGluZGV4SWQ7Cit9CisKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYg
bmFtZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoLCBib29sIGlzVW5pcXVlLCBpbnQ2NF90JiBpbmRl
eElkKQoreworICAgIGluZGV4SWQgPSBnZXROZXdJbmRleElkKG1fZGIuZ2V0KCksIGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQpOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVLZXkgPSBJ
bmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHVuaXF1ZUtleSA9IEluZGV4TWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAxKTsKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAyKTsKKworICAgIGJvb2wgb2sgPSBw
dXRTdHJpbmcobV9kYi5nZXQoKSwgbmFtZUtleSwgbmFtZSk7CisgICAgaWYgKCFvaykgeworICAg
ICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCB1bmlxdWVL
ZXksIGlzVW5pcXVlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiSW50ZXJu
YWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIG9rID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIGtleVBhdGhLZXksIGtleVBhdGgpOworICAg
IGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9y
LiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CiB9
CiAKIHZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgoaW50NjRfdCwgaW50
NjRfdCwgaW50NjRfdCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IElt
cGxlbWVudC4KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudCBh
bmQgYWRkIGxheW91dCB0ZXN0LgorICAgIHJldHVybjsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFj
a2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRfdCwgaW50NjRfdCwgaW50NjRf
dCwgY29uc3QgSURCS2V5JiwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikKK2Jv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0SW5kZXhEYXRhRm9yUmVjb3JkKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYga2V5LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqIHJlY29yZElk
ZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1l
bnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChpbmRleElkID49IGtNaW5pbXVtSW5k
ZXhJZCk7CisgICAgY29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJ
ZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihy
ZWNvcmRJZGVudGlmaWVyKTsKKworICAgIGNvbnN0IGludDY0X3QgZ2xvYmFsU2VxdWVuY2VOdW1i
ZXIgPSBnZXROZXdWZXJzaW9uTnVtYmVyKG1fZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGdsb2Jh
bFNlcXVlbmNlTnVtYmVyKTsKKworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgIGRhdGEuYXBw
ZW5kKGVuY29kZVZhckludChsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+dmVyc2lvbigpKSk7Cisg
ICAgZGF0YS5hcHBlbmQobGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnByaW1hcnlLZXkoKSk7CisK
KyAgICByZXR1cm4gbV9kYi0+cHV0KGluZGV4RGF0YUtleSwgZGF0YSk7Cit9CisKK3N0YXRpYyBi
b29sIGZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZl
Y3RvcjxjaGFyPiYgdGFyZ2V0LCBWZWN0b3I8Y2hhcj4mIGZvdW5kS2V5KQoreworICAgIE93blB0
cjxMZXZlbERCSXRlcmF0b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKKyAgICBpdC0+c2Vlayh0
YXJnZXQpOworCisgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgIGl0LT5zZWVrVG9M
YXN0KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRh
cmdldCkgPj0gMCkgeworICAgICAgICBpdC0+cHJldigpOworICAgICAgICBpZiAoIWl0LT5pc1Zh
bGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm91bmRLZXku
Y2xlYXIoKTsKKyAgICBmb3VuZEtleS5hcHBlbmQoaXQtPmtleSgpLmJlZ2luKCksIGl0LT5rZXko
KS5lbmQoKSAtIGl0LT5rZXkoKS5iZWdpbigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JSZWNvcmQoaW50NjRf
dCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikK
IHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICBy
ZXR1cm4gZmFsc2U7CisgICAgLy8gRklYTUU6IFRoaXMgaXNuJ3QgbmVlZGVkIHNpbmNlIHdlIGlu
dmFsaWRhdGUgaW5kZXggZGF0YSB2aWEgdGhlIHZlcnNpb24gbnVtYmVyIG1lY2hhbmlzbS4KKyAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAotU3RyaW5nIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9i
amVjdFZpYUluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleSYpCitT
dHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5kZXgoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3Qg
SURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBs
ZW1lbnQuCi0gICAgcmV0dXJuIFN0cmluZygpOworICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlL
ZXkgPSBnZXRQcmltYXJ5S2V5VmlhSW5kZXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwga2V5KTsKKyAgICBpZiAoIXByaW1hcnlLZXkpCisgICAgICAgIHJldHVybiBTdHJpbmco
KTsKKworICAgIHJldHVybiBnZXRPYmplY3RTdG9yZVJlY29yZChkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAqcHJpbWFyeUtleSk7CiB9CiAKLVBhc3NSZWZQdHI8SURCS2V5PiBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCwgaW50NjRfdCwgaW50
NjRfdCwgY29uc3QgSURCS2V5JikKK3N0YXRpYyBib29sIHZlcnNpb25FeGlzdHMoTGV2ZWxEQkRh
dGFiYXNlKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgdmVyc2lvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkUHJpbWFyeUtleSkKIHsK
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1
cm4gMDsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBlbmNvZGVkUHJpbWFyeUtleSk7CisgICAgVmVj
dG9yPGNoYXI+IGRhdGE7CisKKyAgICBpZiAoIWRiLT5nZXQoa2V5LCBkYXRhKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGRlY29kZUludChkYXRhLmJlZ2luKCksIGRhdGEu
ZW5kKCkpID09IHZlcnNpb247CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5
RXhpc3RzSW5JbmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXkmKQor
UGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlW
aWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IGxldmVsZGJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIDApOworICAgIE93blB0cjxMZXZlbERCSXRlcmF0
b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9yKCkpOworICAgIGl0LT5zZWVrKGxldmVsZGJLZXkpOwor
CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZl
bGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpbnQ2NF90IHZl
cnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCku
YmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOworICAgICAgICBpZiAoIXApCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGVuY29kZWRQcmltYXJ5
S2V5OworICAgICAgICBlbmNvZGVkUHJpbWFyeUtleS5hcHBlbmQocCwgaXQtPnZhbHVlKCkuZW5k
KCkgLSBwKTsKKworICAgICAgICBpZiAoIXZlcnNpb25FeGlzdHMobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgdmVyc2lvbiwgZW5jb2RlZFByaW1hcnlLZXkpKSB7CisgICAg
ICAgICAgICAvLyBEZWxldGUgc3RhbGUgaW5kZXggZGF0YSBlbnRyeSBhbmQgY29udGludWUuCisg
ICAgICAgICAgICBtX2RiLT5yZW1vdmUoaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5uZXh0
KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlZlB0cjxJ
REJLZXk+IHByaW1hcnlLZXk7CisgICAgICAgIGRlY29kZUlEQktleShlbmNvZGVkUHJpbWFyeUtl
eS5iZWdpbigpLCBlbmNvZGVkUHJpbWFyeUtleS5lbmQoKSwgcHJpbWFyeUtleSk7CisgICAgICAg
IHJldHVybiBwcmltYXJ5S2V5LnJlbGVhc2UoKTsKKyAgICB9CiB9CiAKLVBhc3NSZWZQdHI8SURC
QmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RT
dG9yZUN1cnNvcihpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNv
cjo6RGlyZWN0aW9uKQorYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbklu
ZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAv
LyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFy
PiBsZXZlbERCS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwga2V5LCAwKTsKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCht
X2RiLT5uZXdJdGVyYXRvcigpKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIGl0
LT5zZWVrKGxldmVsREJLZXkpOworICAgIGlmIChpdC0+aXNWYWxpZCgpICYmICFjb21wYXJlSW5k
ZXhLZXlzKGl0LT5rZXkoKSwgbGV2ZWxEQktleSkpCisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKwor
ICAgIHJldHVybiBmb3VuZDsKIH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKGludDY0X3QsIGlu
dDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24p
CituYW1lc3BhY2UgeworY2xhc3MgQ3Vyc29ySW1wbENvbW1vbiA6IHB1YmxpYyBJREJCYWNraW5n
U3RvcmU6OkN1cnNvciB7CitwdWJsaWM6CisgICAgLy8gSURCQmFja2luZ1N0b3JlOjpDdXJzb3IK
KyAgICB2aXJ0dWFsIGJvb2wgY29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqKTsKKyAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXkoKSB7IHJldHVybiBtX2N1cnJlbnRLZXk7IH0K
KyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9j
dXJyZW50S2V5OyB9CisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSA9IDA7CisgICAgdmlydHVh
bCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
PiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSA9IDA7IC8vIEZJWE1FOiBJIGRvbid0IHRo
aW5rIHRoaXMgaXMgYWN0dWFsbHkgdXNlZCwgc28gZHJvcCBpdC4KKyAgICB2aXJ0dWFsIGludDY0
X3QgaW5kZXhEYXRhSWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3co
KSA9IDA7CisgICAgYm9vbCBmaXJzdFNlZWsoKTsKKworcHJvdGVjdGVkOgorICAgIEN1cnNvcklt
cGxDb21tb24oTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBsb3dLZXks
IGJvb2wgbG93T3BlbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBoaWdoS2V5LCBib29sIGhpZ2hPcGVu
LCBib29sIGZvcndhcmQpCisgICAgICAgIDogbV9kYihkYikKKyAgICAgICAgLCBtX2xvd0tleShs
b3dLZXkpCisgICAgICAgICwgbV9sb3dPcGVuKGxvd09wZW4pCisgICAgICAgICwgbV9oaWdoS2V5
KGhpZ2hLZXkpCisgICAgICAgICwgbV9oaWdoT3BlbihoaWdoT3BlbikKKyAgICAgICAgLCBtX2Zv
cndhcmQoZm9yd2FyZCkKKyAgICB7CisgICAgfQorICAgIHZpcnR1YWwgfkN1cnNvckltcGxDb21t
b24oKSB7fQorCisgICAgTGV2ZWxEQkRhdGFiYXNlKiBtX2RiOworICAgIE93blB0cjxMZXZlbERC
SXRlcmF0b3I+IG1faXRlcmF0b3I7CisgICAgVmVjdG9yPGNoYXI+IG1fbG93S2V5OworICAgIGJv
b2wgbV9sb3dPcGVuOworICAgIFZlY3RvcjxjaGFyPiBtX2hpZ2hLZXk7CisgICAgYm9vbCBtX2hp
Z2hPcGVuOworICAgIGJvb2wgbV9mb3J3YXJkOworICAgIFJlZlB0cjxJREJLZXk+IG1fY3VycmVu
dEtleTsKK307CisKK2Jvb2wgQ3Vyc29ySW1wbENvbW1vbjo6Zmlyc3RTZWVrKCkKIHsKLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gMDsK
KyAgICBtX2l0ZXJhdG9yID0gbV9kYi0+bmV3SXRlcmF0b3IoKTsKKworICAgIGlmIChtX2Zvcndh
cmQpCisgICAgICAgIG1faXRlcmF0b3ItPnNlZWsobV9sb3dLZXkpOworICAgIGVsc2UKKyAgICAg
ICAgbV9pdGVyYXRvci0+c2VlayhtX2hpZ2hLZXkpOworCisgICAgZm9yICg7OykgeworICAgICAg
ICBpZiAoIW1faXRlcmF0b3ItPmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1faGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5
cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmVJ
bmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPiAwKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2xvd09wZW4gJiYgY29t
cGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmICFtX2xvd09wZW4g
JiYgY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDwgMCkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAobV9mb3J3YXJkICYmIG1fbG93
T3BlbikgeworICAgICAgICAgICAgLy8gbG93S2V5IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2Uu
CisgICAgICAgICAgICBpZiAoY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9s
b3dLZXkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5uZXh0KCk7CisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
aWYgKCFtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbikgeworICAgICAgICAgICAgLy8gaGlnaEtleSBu
b3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgaWYgKGNvbXBhcmVJbmRleEtl
eXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPj0gMCkgeworICAgICAgICAgICAgICAg
IG1faXRlcmF0b3ItPnByZXYoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbG9hZEN1cnJlbnRSb3coKSkgeworICAg
ICAgICAgICAgaWYgKG1fZm9yd2FyZCkKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5uZXh0
KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+cHJldigp
OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CiB9CiAKLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxl
dmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2
NF90LCBjb25zdCBJREJLZXlSYW5nZSosIElEQkN1cnNvcjo6RGlyZWN0aW9uKQorYm9vbCBDdXJz
b3JJbXBsQ29tbW9uOjpjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSoga2V5KQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAw
OworICAgIC8vIEZJWE1FOiBUaGlzIHNoYXJlcyBhIGxvdCBvZiBjb2RlIHdpdGggZmlyc3RTZWVr
LgorCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAgICAg
bV9pdGVyYXRvci0+bmV4dCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2l0ZXJhdG9y
LT5wcmV2KCk7CisKKyAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5pc1ZhbGlkKCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVmVjdG9yPGNoYXI+IHRyYXNoOworICAgICAg
ICBpZiAoIW1fZGItPmdldChtX2l0ZXJhdG9yLT5rZXkoKSwgdHJhc2gpKQorICAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbiAmJiBjb21w
YXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApIC8vIGhpZ2gg
a2V5IG5vdCBpbmNsdWRlZCBpbiByYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBpZiAobV9mb3J3YXJkICYmICFtX2hpZ2hPcGVuICYmIGNvbXBhcmVJbmRleEtleXMobV9p
dGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPiAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoIW1fZm9yd2FyZCAmJiBtX2xvd09wZW4gJiYgY29tcGFyZUluZGV4S2V5
cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9sb3dLZXkpIDw9IDApIC8vIGxvdyBrZXkgbm90IGluY2x1
ZGVkIGluIHJhbmdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9m
b3J3YXJkICYmICFtX2xvd09wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXko
KSwgbV9sb3dLZXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBp
ZiAoIWxvYWRDdXJyZW50Um93KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBp
ZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAobV9mb3J3YXJkKSB7CisgICAgICAgICAgICAgICAg
aWYgKG1fY3VycmVudEtleS0+aXNMZXNzVGhhbihrZXkpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS0+
aXNMZXNzVGhhbihtX2N1cnJlbnRLZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBPYmV5
IHRoZSB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgKGFuZCB0ZXN0IGZvciBpdCEpCisKKyAgICAgICAg
YnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxPYmplY3RTdG9yZUN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCRGF0YWJh
c2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBW
ZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7
CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKGRiLCBs
b3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisg
ICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1
cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRp
ZmllcigpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBp
bnQ2NF90IGluZGV4RGF0YUlkKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0K
KyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKKworcHJpdmF0ZToKKyAgICBPYmpl
Y3RTdG9yZUN1cnNvckltcGwoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+
JiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBoaWdoS2V5LCBib29s
IGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgICAgIDogQ3Vyc29ySW1wbENvbW1vbihkYiwg
bG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3BlbiwgZm9yd2FyZCkKKyAgICB7CisgICAg
fQorCisgICAgU3RyaW5nIG1fY3VycmVudFZhbHVlOworfTsKKworYm9vbCBPYmplY3RTdG9yZUN1
cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBwID0gbV9pdGVy
YXRvci0+a2V5KCkuYmVnaW4oKTsKKyAgICBjb25zdCBjaGFyKiBrZXlMaW1pdCA9IG1faXRlcmF0
b3ItPmtleSgpLmVuZCgpOworCisgICAgT2JqZWN0U3RvcmVEYXRhS2V5IG9iamVjdFN0b3JlRGF0
YUtleTsKKyAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUocCwga2V5TGltaXQsICZv
YmplY3RTdG9yZURhdGFLZXkpOworICAgIEFTU0VSVChwKTsKKyAgICBpZiAoIXApCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIG1fY3VycmVudEtleSA9IG9iamVjdFN0b3JlRGF0YUtleS51
c2VyS2V5KCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgY29uc3QgY2hhciogcSA9IGRl
Y29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3ItPnZhbHVl
KCkuZW5kKCksIHZlcnNpb24pOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAodm9pZCkgdmVyc2lvbjsKKworICAgIG1fY3VycmVudFZhbHVl
ID0gZGVjb2RlU3RyaW5nKHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCkpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4S2V5Q3Vyc29ySW1wbCA6IHB1YmxpYyBDdXJzb3JJ
bXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRleEtleUN1cnNv
ckltcGw+IGNyZWF0ZShMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGxv
d0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJvb2wgaGln
aE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
SW5kZXhLZXlDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVu
LCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZpcnR1
YWwgU3RyaW5nIHZhbHVlKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIFN0cmluZygp
OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQktleT4gcHJpbWFyeUtleSgpIHsgcmV0dXJu
IG1fcHJpbWFyeUtleTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6
Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludDY0
X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAg
IHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIEluZGV4S2V5
Q3Vyc29ySW1wbChMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tl
eSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9w
ZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRiLCBsb3dLZXks
IGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAgICB9CisKKyAg
ICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cit9OworCitib29sIEluZGV4S2V5Q3Vyc29y
SW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0ZXJhdG9y
LT5rZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0gbV9pdGVyYXRvci0+
a2V5KCkuZW5kKCk7CisgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleTsKKyAgICBwID0gSW5k
ZXhEYXRhS2V5OjpkZWNvZGUocCwga2V5TGltaXQsICZpbmRleERhdGFLZXkpOworCisgICAgbV9j
dXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgaW5kZXhE
YXRhVmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3It
PnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgaW5kZXhEYXRhVmVy
c2lvbik7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcSA9IGRlY29kZUlEQktleShxLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCBt
X3ByaW1hcnlLZXkpOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtl
eS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgVmVjdG9yPGNoYXI+IHJl
c3VsdDsKKyAgICBpZiAoIW1fZGItPmdldChwcmltYXJ5TGV2ZWxEQktleSwgcmVzdWx0KSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9u
OworICAgIGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3Vs
dC5lbmQoKSwgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisgICAgQVNTRVJUKHQpOworICAgIGlm
ICghdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG9iamVjdFN0b3JlRGF0YVZl
cnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgeyAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBu
b3QgdmVyeSB3ZWxsIGNvdmVyZWQgYnkgdGhlIGxheW91dCB0ZXN0cy4KKyAgICAgICAgbV9kYi0+
cmVtb3ZlKG1faXRlcmF0b3ItPmtleSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRleEN1cnNvckltcGwgOiBwdWJsaWMg
Q3Vyc29ySW1wbENvbW1vbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8SW5kZXhD
dXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+
JiBsb3dLZXksIGJvb2wgbG93T3BlbiwgY29uc3QgVmVjdG9yPGNoYXI+JiBoaWdoS2V5LCBib29s
IGhpZ2hPcGVuLCBib29sIGZvcndhcmQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IEluZGV4Q3Vyc29ySW1wbChkYiwgbG93S2V5LCBsb3dPcGVuLCBoaWdoS2V5LCBoaWdoT3Bl
biwgZm9yd2FyZCkpOworICAgIH0KKworICAgIC8vIEN1cnNvckltcGxDb21tb24KKyAgICB2aXJ0
dWFsIFN0cmluZyB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAg
dmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVu
dGlmaWVyPiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50NjRfdCBpbmRleERhdGFJZCgpIHsgQVNT
RVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9CisgICAgYm9vbCBsb2FkQ3VycmVudFJvdygp
OworCitwcml2YXRlOgorICAgIEluZGV4Q3Vyc29ySW1wbChMZXZlbERCRGF0YWJhc2UqIGRiLCBj
b25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJz
b3JJbXBsQ29tbW9uKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3
YXJkKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBtX3ByaW1hcnlLZXk7Cisg
ICAgU3RyaW5nIG1fdmFsdWU7CisgICAgVmVjdG9yPGNoYXI+IG1fcHJpbWFyeUxldmVsREJLZXk7
Cit9OworCitib29sIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNv
bnN0IGNoYXIgKnAgPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIg
KmxpbWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7CisKKyAgICBJbmRleERhdGFLZXkgaW5k
ZXhEYXRhS2V5OworICAgIHAgPSBJbmRleERhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmluZGV4
RGF0YUtleSk7CisKKyAgICBtX2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOwor
CisgICAgY29uc3QgY2hhciAqcSA9IG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKTsKKyAgICBj
b25zdCBjaGFyICp2YWx1ZUxpbWl0ID0gbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKTsKKworICAg
IGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKKyAgICBxID0gZGVjb2RlVmFySW50KHEsIHZhbHVl
TGltaXQsIGluZGV4RGF0YVZlcnNpb24pOworICAgIEFTU0VSVChxKTsKKyAgICBpZiAoIXEpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBxID0gZGVjb2RlSURCS2V5KHEsIHZhbHVlTGltaXQs
IG1fcHJpbWFyeUtleSk7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgbV9wcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3JlRGF0YUtl
eTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5vYmplY3RT
dG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAg
ICBpZiAoIW1fZGItPmdldChtX3ByaW1hcnlMZXZlbERCS2V5LCByZXN1bHQpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNpb247CisgICAg
Y29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgp
LCBvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsKKyAgICBBU1NFUlQodCk7CisgICAgaWYgKCF0KQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRhVmVyc2lvbiAh
PSBpbmRleERhdGFWZXJzaW9uKSB7CisgICAgICAgIG1fZGItPnJlbW92ZShtX2l0ZXJhdG9yLT5r
ZXkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3ZhbHVlID0gZGVj
b2RlU3RyaW5nKHQsIHJlc3VsdC5lbmQoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30KKwor
c3RhdGljIGJvb2wgZmluZExhc3RJbmRleEtleUVxdWFsVG8oTGV2ZWxEQkRhdGFiYXNlKiBkYiwg
Y29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3RvcjxjaGFyPiYgZm91bmRLZXkpCit7Cisg
ICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQoZGItPm5ld0l0ZXJhdG9yKCkpOworICAgIGl0
LT5zZWVrKHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHdoaWxlIChpdC0+aXNWYWxpZCgpICYmICFjb21wYXJlSW5kZXhLZXlz
KGl0LT5rZXkoKSwgdGFyZ2V0KSkgeworICAgICAgICBmb3VuZEtleS5jbGVhcigpOworICAgICAg
ICBmb3VuZEtleS5hcHBlbmQoaXQtPmtleSgpLmJlZ2luKCksIGl0LT5rZXkoKS5lbmQoKSAtIGl0
LT5rZXkoKS5iZWdpbigpKTsKKyAgICAgICAgaXQtPm5leHQoKTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1
cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5n
ZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5n
ZS0+dXBwZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6
TkVYVF9OT19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAg
ICBib29sIGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIFZlY3RvcjxjaGFyPiBzdGFydEtleSwg
c3RvcEtleTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IE9i
amVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklE
QktleSgpKTsKKyAgICAgICAgbG93ZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgorICAg
IH0gZWxzZSB7CisgICAgICAgIHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnJhbmdlLT5sb3dlcigpKTsKKyAgICAgICAgbG93
ZXJPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3Vu
ZCkgeworICAgICAgICBzdG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOworICAgICAgICB1cHBlck9wZW4gPSB0
cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5l
ZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxl
c3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksIHN0b3BLZXkpKQorICAgICAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgeworICAgICAgICBzdG9wS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgKnJhbmdlLT51cHBlcigpKTsKKyAgICAgICAgdXBwZXJP
cGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxPYmplY3RTdG9y
ZUN1cnNvckltcGw+IGN1cnNvciA9IE9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6Y3JlYXRlKG1fZGIu
Z2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCk7
CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24p
Cit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPmxvd2VyKCk7CisgICAg
Ym9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVyKCk7CisgICAgYm9vbCBmb3J3
YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9fRFVQTElDQVRFIHx8IGRpcmVj
dGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBsb3dlck9wZW4sIHVwcGVyT3Bl
bjsKKyAgICBWZWN0b3I8Y2hhcj4gc3RhcnRLZXksIHN0b3BLZXk7CisKKyAgICBpZiAoIWxvd2Vy
Qm91bmQpIHsKKyAgICAgICAgc3RhcnRLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtaW5JREJLZXkoKSwgMCk7CisgICAgICAgIGxv
d2VyT3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBzdGFy
dEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsICpyYW5nZS0+bG93ZXIoKSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5s
b3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgc3Rv
cEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGlu
ZGV4SWQsIG1heElEQktleSgpLCAwKTsKKyAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7IC8vIElu
Y2x1ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQg
ZXhpc3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbihtX2RiLmdl
dCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsICpyYW5nZS0+dXBwZXIoKSwgMCk7CisgICAgICAgIGlmICghZmluZExhc3RJ
bmRleEtleUVxdWFsVG8obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpIC8vIFNlZWsgdG8g
dGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVlIGtleXMuCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2UtPnVwcGVyT3BlbigpOworICAg
IH0KKworICAgIFJlZlB0cjxJbmRleEtleUN1cnNvckltcGw+IGN1cnNvciA9IEluZGV4S2V5Q3Vy
c29ySW1wbDo6Y3JlYXRlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9wZW4sIHN0b3BLZXks
IHVwcGVyT3BlbiwgZm9yd2FyZCk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0U2VlaygpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOworfQorCitQYXNz
UmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpv
cGVuSW5kZXhDdXJzb3IoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJREJDdXJzb3I6OkRp
cmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgYm9vbCBsb3dlckJvdW5kID0gcmFuZ2UgJiYgcmFu
Z2UtPmxvd2VyKCk7CisgICAgYm9vbCB1cHBlckJvdW5kID0gcmFuZ2UgJiYgcmFuZ2UtPnVwcGVy
KCk7CisgICAgYm9vbCBmb3J3YXJkID0gKGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFRfTk9f
RFVQTElDQVRFIHx8IGRpcmVjdGlvbiA9PSBJREJDdXJzb3I6Ok5FWFQpOworCisgICAgYm9vbCBs
b3dlck9wZW4sIHVwcGVyT3BlbjsKKyAgICBWZWN0b3I8Y2hhcj4gc3RhcnRLZXksIHN0b3BLZXk7
CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgc3RhcnRLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtaW5JREJLZXko
KSwgMCk7CisgICAgICAgIGxvd2VyT3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKyAgICB9IGVs
c2UgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSwgMCk7CisgICAgICAgIGxv
d2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91
bmQpIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1heElEQktleSgpLCAwKTsKKyAgICAgICAgdXBwZXJP
cGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorCisgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBX
ZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgorICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RL
ZXlMZXNzVGhhbihtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOworICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+dXBwZXIoKSwgMCk7CisgICAg
ICAgIGlmICghZmluZExhc3RJbmRleEtleUVxdWFsVG8obV9kYi5nZXQoKSwgc3RvcEtleSwgc3Rv
cEtleSkpIC8vIFNlZWsgdG8gdGhlICpsYXN0KiBrZXkgaW4gdGhlIHNldCBvZiBub24tdW5pcXVl
IGtleXMuCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdXBwZXJPcGVuID0gcmFuZ2Ut
PnVwcGVyT3BlbigpOworICAgIH0KKworICAgIFJlZlB0cjxJbmRleEN1cnNvckltcGw+IGN1cnNv
ciA9IEluZGV4Q3Vyc29ySW1wbDo6Y3JlYXRlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBsb3dlck9w
ZW4sIHN0b3BLZXksIHVwcGVyT3BlbiwgZm9yd2FyZCk7CisgICAgaWYgKCFjdXJzb3ItPmZpcnN0
U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgp
OworfQorCituYW1lc3BhY2UgeworY2xhc3MgRHVtbXlUcmFuc2FjdGlvbiA6IHB1YmxpYyBJREJC
YWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgYmVn
aW4oKSB7fQorICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBy
b2xsYmFjaygpIHt9Cit9OwogfQogCiBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6VHJhbnNh
Y3Rpb24+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZVRyYW5zYWN0aW9uKCkKIHsKLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4g
MDsKKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBpbXBsZW1lbnQgYSB0cmFuc2FjdGlvbiBhYnN0
cmFjdGlvbiB0aGF0IGFsbG93cyBmb3Igcm9sbC1iYWNrcywgYW5kIHdyaXRlIHRlc3RzIGZvciBp
dC4KKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IER1bW15VHJhbnNhY3Rpb24oKSk7CiB9CiAKKy8v
IEZJWE1FOiBkZWxldGVEYXRhYmFzZSBzaG91bGQgYmUgcGFydCBvZiBJREJCYWNraW5nU3RvcmUu
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3Jl
LmggYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaAppbmRl
eCA4MzQyZmI5YmM1ZWEwODVhNWNiNWFkMWZmNDM3ODBlYzE2ODRlYTAwLi5hODY0N2RhYzIxNTNh
ZGU2NmQzN2I0ZjU4MDQxNTI1MTIxOGZjZTI2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaApAQCAtMzIsMTEgKzMyLDExIEBACiAjaW5jbHVk
ZSAiSURCQmFja2luZ1N0b3JlLmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogCi1uYW1lc3Bh
Y2UgbGV2ZWxkYiB7Ci1jbGFzcyBEQjsKLX0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3Mg
TGV2ZWxEQkNvbXBhcmF0b3I7CitjbGFzcyBMZXZlbERCRGF0YWJhc2U7CisKIGNsYXNzIElEQkxl
dmVsREJCYWNraW5nU3RvcmUgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlIHsKIHB1YmxpYzoKICAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IG9wZW4oU2VjdXJpdHlPcmlnaW4q
LCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlLCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25zdCBTdHJp
bmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqKTsKQEAgLTc0LDExICs3
NCwxMiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPFRyYW5zYWN0aW9uPiBjcmVh
dGVUcmFuc2FjdGlvbigpOwogCiBwcml2YXRlOgotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmUo
U3RyaW5nIGlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCosIGxldmVsZGI6OkRCKik7
CisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9y
eUJhY2tlbmRJbXBsKiwgTGV2ZWxEQkRhdGFiYXNlKik7CiAKICAgICBTdHJpbmcgbV9pZGVudGlm
aWVyOwogICAgIFJlZlB0cjxJREJGYWN0b3J5QmFja2VuZEltcGw+IG1fZmFjdG9yeTsKLSAgICBP
d25QdHI8bGV2ZWxkYjo6REI+IG1fZGI7CisgICAgT3duUHRyPExldmVsREJEYXRhYmFzZT4gbV9k
YjsKKyAgICBPd25QdHI8TGV2ZWxEQkNvbXBhcmF0b3I+IG1fY29tcGFyYXRvcjsKIH07CiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>90036</attachid>
            <date>2011-04-18 08:06:17 -0700</date>
            <delta_ts>2011-04-18 08:18:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57372-20110418160614.patch</filename>
            <type>text/plain</type>
            <size>131750</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBkZDg1NjQ0OGRjZjgzODZk
ZGU1NmY2ZDM3ODM5NGNkN2U0ODhmMDlkLi4xMzg1OWQ0MTQ4MmUyZTZmYjY1OGRmMjBmNDkzM2Zj
ZWVhMjQyYjc2IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTQgQEAKKzIwMTEtMDQtMTggIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBMZXZlbERC
IGJhY2tlbmQgZm9yIEluZGV4ZWREQgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTczNzIKKworICAgICAgICBBZGQgTGV2ZWxEQiB3cmFwcGVycyB0byBB
bmRyb2lkLm1rLgorCisgICAgICAgICogU291cmNlL0FuZHJvaWQubWs6CisKIDIwMTEtMDQtMTgg
IFBhdHJpY2sgR2Fuc3RlcmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgUGF2ZWwgRmVsZG1hbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9BbmRyb2lkLm1rIGIvU291
cmNlL0FuZHJvaWQubWsKaW5kZXggYzAxMTVjMTdlN2MyMWYyN2QzNGNiNTkyNzY3ZmIyYjFiZThh
ZDkwNi4uYjg2ODMwYTNkMmVlNTEzMjUxMTc5ZDM0OGYwZGFhZDI1M2FlNTgzNSAxMDA2NDQKLS0t
IGEvU291cmNlL0FuZHJvaWQubWsKKysrIGIvU291cmNlL0FuZHJvaWQubWsKQEAgLTExNiw2ICsx
MTYsNyBAQCBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfQ19JTkNMVURFUykgXAogCSQoTE9D
QUxfUEFUSCkvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhIFwKIAkkKExPQ0FMX1BBVEgp
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3JtcyBcCiAJJChMT0NBTF9QQVRIKS9X
ZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzIFwKKwkkKExPQ0FMX1BBVEgpL1dlYkNvcmUv
cGxhdGZvcm0vbGV2ZWxkYiBcCiAJJChMT0NBTF9QQVRIKS9XZWJDb3JlL3BsYXRmb3JtL21vY2sg
XAogCSQoTE9DQUxfUEFUSCkvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrIFwKIAkkKExPQ0FMX1BB
VEgpL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9hbmRyb2lkIFwKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL0FuZHJvaWQubWsgYi9Tb3VyY2UvV2ViQ29yZS9BbmRyb2lkLm1rCmluZGV4IGQ2
YTU3OTdmNjAzNWVmOGU0Yzk0ZmE3NTcyZTM0NjU4NWJhNDExOGEuLjg4YjlkYjExNDFlYjQwYjY2
MjAwY2ZhYjdjNGExOTBkYTdiY2IzZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0FuZHJv
aWQubWsKKysrIGIvU291cmNlL1dlYkNvcmUvQW5kcm9pZC5tawpAQCAtNjA0LDYgKzYwNCw5IEBA
IExPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX1NSQ19GSUxFUykgXAogCXBsYXRmb3JtL2ltYWdl
LWRlY29kZXJzL2dpZi9HSUZJbWFnZURlY29kZXIuY3BwIFwKIAlwbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9naWYvR0lGSW1hZ2VSZWFkZXIuY3BwIFwKIAlcCisJcGxhdGZvcm0vbGV2ZWxkYi9MZXZl
bERCRGF0YWJhc2UuY3BwIFwKKwlwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5jcHAg
XAorCVwKIAlwbGF0Zm9ybS9tb2NrL0RldmljZU9yaWVudGF0aW9uQ2xpZW50TW9jay5jcHAgXAog
CXBsYXRmb3JtL21vY2svR2VvbG9jYXRpb25DbGllbnRNb2NrLmNwcCBcCiAJcGxhdGZvcm0vbW9j
ay9HZW9sb2NhdGlvblNlcnZpY2VNb2NrLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9DTWFrZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDQx
MmYwNDQ2ZGM3NmU5ZTlmNjNkZGM4NjIyYjNjMzBhNmFhNGYyNTcuLmU0ZGY2MjVlMmEyNzRkOTNk
MTNlNDIxZmM3OTdhNDMzNmE1NmFiMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtl
TGlzdHMudHh0CisrKyBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0zOCw2ICsz
OCw3IEBAIFNFVChXZWJDb3JlX0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtXRUJDT1JFX0RJ
Un0vcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nIgogICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy93ZWJwIgorICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9sZXZlbGRi
IgogICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9tb2NrIgogICAgICIke1dFQkNPUkVfRElS
fS9wbGF0Zm9ybS9uZXR3b3JrIgogICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9zcWwiCkBA
IC0xNDQ5LDYgKzE0NTAsMTMgQEAgSUYgKEVOQUJMRV9EQVRBX1RSQU5TRkVSX0lURU1TKQogICAg
ICkKIEVORElGICgpCiAKK0lGIChFTkFCTEVfTEVWRUxEQikKKyAgICBMSVNUKEFQUEVORCBXZWJD
b3JlX1NPVVJDRVMKKyAgICAgICAgcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuY3Bw
CisgICAgICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNwcAorICAgICkKK0VO
RElGICgpCisKIElGIChFTkFCTEVfTUFUSE1MKQogICAgIExJU1QoQVBQRU5EIFdlYkNvcmVfU09V
UkNFUwogICAgICAgICBtYXRobWwvTWF0aE1MRWxlbWVudC5jcHAKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBjMzM0
M2Y5MTMyYWE3NGU0YmRjYmVmNTdjM2FlZjRjMDUzZDA0NGU0Li44MTc1YzIwMjdiNjRhNDZiODZk
NDAzMDhjZTNhZmRlODQ5ZWQzODRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VM
b2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTgxIEBACisyMDEx
LTA0LTE4ICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTGV2ZWxEQiBiYWNrZW5kIGZvciBJ
bmRleGVkREIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTU3MzcyCisKKyAgICAgICAgT25seSBhdmFpbGFibGUgYmVoaW5kIGEgcnVuLXRpbWUgZmxhZy4g
Q292ZXJlZCBieSBleGlzdGluZyBsYXlvdXQKKyAgICAgICAgdGVzdHMuCisKKyAgICAgICAgKiBB
bmRyb2lkLm1rOgorICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2Vm
aWxlLmFtOgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06CisgICAgICAgICogV2ViQ29y
ZS5neXAvV2ViQ29yZS5neXA6CisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIFdl
YkNvcmUucHJpOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIFdlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBwbGF0Zm9ybS9sZXZlbGRiL0xldmVs
REJDb21wYXJhdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkNvbXBhcmF0
b3I6On5MZXZlbERCQ29tcGFyYXRvcik6CisgICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZl
bERCRGF0YWJhc2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Om1ha2VTbGljZSk6Cisg
ICAgICAgIChXZWJDb3JlOjptYWtlTGV2ZWxEQlNsaWNlKToKKyAgICAgICAgKFdlYkNvcmU6Om1h
a2VWZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjpMZXZlbERCRGF0
YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkRhdGFiYXNlOjp+TGV2ZWxEQkRhdGFi
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJEYXRhYmFzZTo6b3Blbik6CisgICAgICAg
IChXZWJDb3JlOjpMZXZlbERCRGF0YWJhc2U6OnB1dCk6CisgICAgICAgIChXZWJDb3JlOjpMZXZl
bERCRGF0YWJhc2U6OnJlbW92ZSk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCRGF0YWJhc2U6
OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCRGF0YWJhc2U6Om5ld0l0ZXJhdG9yKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjp+TGV2ZWxEQkl0ZXJhdG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6TGV2ZWxEQkl0ZXJhdG9yKToKKyAgICAgICAg
KFdlYkNvcmU6Om1ha2VTbGljZSk6CisgICAgICAgIChXZWJDb3JlOjptYWtlTGV2ZWxEQlNsaWNl
KToKKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJJdGVyYXRvcjo6aXNWYWxpZCk6CisgICAgICAg
IChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OnNlZWtUb0xhc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGV2ZWxEQkl0ZXJhdG9yOjpzZWVrKToKKyAgICAgICAgKFdlYkNvcmU6OkxldmVsREJJdGVy
YXRvcjo6bmV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCSXRlcmF0b3I6OnByZXYpOgor
ICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQkl0ZXJhdG9yOjprZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6TGV2ZWxEQkl0ZXJhdG9yOjp2YWx1ZSk6CisgICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9M
ZXZlbERCSXRlcmF0b3IuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbGV2ZWxkYi9MZXZl
bERCU2xpY2UuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCU2xpY2U6OkxldmVs
REJTbGljZSk6CisgICAgICAgIChXZWJDb3JlOjpMZXZlbERCU2xpY2U6On5MZXZlbERCU2xpY2Up
OgorICAgICAgICAoV2ViQ29yZTo6TGV2ZWxEQlNsaWNlOjpiZWdpbik6CisgICAgICAgIChXZWJD
b3JlOjpMZXZlbERCU2xpY2U6OmVuZCk6CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFj
a2luZ1N0b3JlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmVuY29kZUJ5dGUpOgorICAgICAgICAo
V2ViQ29yZTo6bWF4SURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6Om1pbklEQktleSk6CisgICAg
ICAgIChXZWJDb3JlOjplbmNvZGVJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZGVjb2RlSW50KToK
KyAgICAgICAgKFdlYkNvcmU6OmVuY29kZVZhckludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWNv
ZGVWYXJJbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZW5jb2RlU3RyaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OmRlY29kZVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVTdHJpbmdXaXRo
TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZVN0cmluZ1dpdGhMZW5ndGgpOgorICAg
ICAgICAoV2ViQ29yZTo6ZW5jb2RlRG91YmxlKToKKyAgICAgICAgKFdlYkNvcmU6OmRlY29kZURv
dWJsZSk6CisgICAgICAgIChXZWJDb3JlOjplbmNvZGVJREJLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6ZGVjb2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OmV4dHJhY3RFbmNvZGVkSURCS2V5
KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXBhcmVFbmNvZGVkSURCS2V5cyk6CisgICAgICAgIChX
ZWJDb3JlOjpnZXRJbnQpOgorICAgICAgICAoV2ViQ29yZTo6cHV0SW50KToKKyAgICAgICAgKFdl
YkNvcmU6OmdldFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpwdXRTdHJpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpTY2hlbWFWZXJzaW9uS2V5OjplbmNvZGUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRhYmFzZUZyZWVMaXN0S2V5OjpEYXRhYmFzZUZyZWVM
aXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlzdEtl
eTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVlTGlz
dEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0YWJhc2VGcmVl
TGlzdEtleTo6ZGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRhdGFi
YXNlRnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpE
YXRhYmFzZU5hbWVLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkRh
dGFiYXNlTmFtZUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6RGF0
YWJhc2VOYW1lS2V5OjpvcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpEYXRh
YmFzZU5hbWVLZXk6OmRhdGFiYXNlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
OkRhdGFiYXNlTmFtZUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6
OkRhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVm
aXg6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkpOgorICAg
ICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUp
OgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpl
bmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6bWV0YURhdGFUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6OkluZGV4TWV0YURhdGFLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleE1ldGFEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAg
ICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhNZXRhRGF0YUtleTo6aW5kZXhJZCk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4TWV0YURhdGFLZXk6Om1ldGFEYXRhVHlwZSk6
CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6Ok9i
amVjdFN0b3JlRnJlZUxpc3RLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAg
KFdlYkNvcmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFyZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxpc3RLZXk6OkluZGV4RnJlZUxp
c3RLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpk
ZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpl
bmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpJbmRleEZyZWVMaXN0S2V5Ojpj
b21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6SW5kZXhGcmVlTGlzdEtleTo6
b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkluZGV4RnJlZUxp
c3RLZXk6OmluZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RTdG9y
ZU5hbWVzS2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmplY3RT
dG9yZU5hbWVzS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4OjpPYmpl
Y3RTdG9yZU5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6
T2JqZWN0U3RvcmVOYW1lc0tleTo6b2JqZWN0U3RvcmVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhOYW1lc0tleTo6SW5kZXhOYW1lc0tleSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6OkluZGV4TmFtZXNLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpJbmRleE5hbWVzS2V5OjppbmRleE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6T2JqZWN0U3RvcmVEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNv
cmU6OktleVByZWZpeDo6T2JqZWN0U3RvcmVEYXRhS2V5Ojp1c2VyS2V5KToKKyAgICAgICAgKFdl
YkNvcmU6OktleVByZWZpeDo6RXhpc3RzRW50cnlLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJD
b3JlOjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpFeGlzdHNFbnRyeUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlQcmVmaXg6OkV4aXN0c0VudHJ5S2V5Ojp1c2VyS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OktleVByZWZpeDo6SW5kZXhEYXRhS2V5OjpJbmRleERhdGFLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6S2V5UHJlZml4OjpJbmRleERhdGFLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpL
ZXlQcmVmaXg6OkluZGV4RGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OktleVBy
ZWZpeDo6SW5kZXhEYXRhS2V5OjplbmNvZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpJbmRleERhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpJbmRleERhdGFLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpJbmRleERhdGFLZXk6Om9iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5
UHJlZml4OjpJbmRleERhdGFLZXk6OmluZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJl
Zml4OjpJbmRleERhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6S2V5UHJlZml4
OjpyZWFsQ29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OmNvbXBhcmVLZXlz
KToKKyAgICAgICAgKFdlYkNvcmU6OktleVByZWZpeDo6Y29tcGFyZUluZGV4S2V5cyk6CisgICAg
ICAgIChXZWJDb3JlOjpLZXlQcmVmaXg6OkNvbXBhcmF0b3I6OmNvbXBhcmUpOgorICAgICAgICAo
V2ViQ29yZTo6S2V5UHJlZml4OjpDb21wYXJhdG9yOjpuYW1lKToKKyAgICAgICAgKFdlYkNvcmU6
OnNldFVwTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpvcGVuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5n
U3RvcmU6OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Omdl
dE5ld0RhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6c2V0SURCRGF0YWJhc2VNZXRhRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpnZXRPYmplY3RTdG9yZXMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3
T2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjcmVhdGVPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpkZWxldGVSYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9y
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RT
dG9yZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdWZXJzaW9uTnVtYmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVj
b3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNsZWFyT2Jq
ZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3Jl
YXRlSW52YWxpZFJlY29yZElkZW50aWZpZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RT
dG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JFYWNo
T2JqZWN0U3RvcmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6Z2V0SW5kZXhlcyk6CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdJbmRleElkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJl
Y29yZCk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbik6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleERhdGFGb3JS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2Jq
ZWN0VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6dmVyc2lvbkV4aXN0cyk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5J
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJz
b3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4
S2V5Q3Vyc29yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9w
ZW5JbmRleEN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpjcmVhdGVUcmFuc2FjdGlvbik6CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2lu
Z1N0b3JlLmg6CisKIDIwMTEtMDQtMTggIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RA
Z21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI4MzgwMy4KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYkNvcmUv
R05VbWFrZWZpbGUuYW0KaW5kZXggZDY4ZWMyN2UyYmFhNjczZjNkYmI5MjU4ODc0MzNlNTdkZjQ4
ZWY1OC4uNjM1NzVhZTkyYzhiYmEwODEwNmMyZThmMDEzNzEzOGY2ZjcwZWIyNiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05V
bWFrZWZpbGUuYW0KQEAgLTU2LDYgKzU2LDcgQEAgd2ViY29yZV9jcHBmbGFncyArPSBcCiAJLUkk
KHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvanBlZyBcCiAJ
LUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvd2VicCBc
CiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5n
IFwKKwktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiIFwKIAktSSQo
c3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrIFwKIAktSSQoc3JjZGlyKS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9zcWwgXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUu
bGlzdC5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggY2ZkODFk
YzI0YzM4MDc1YjZmMjZmNGZiZWZjNTk3NmYzNmJjODA0ZS4uYzQxM2RlZTcxNTYxMmE3MDY5MzY2
MjBiODkxM2ZhNjQ2YjMyY2Y1YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZp
bGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCkBAIC0y
NTA4LDYgKzI1MDgsMTIgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9MZW5ndGguY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9MZW5ndGguaCBc
CiAJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTGVuZ3RoU2l6ZS5oIFwKKwlTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJDb21wYXJhdG9yLmggXAorCVNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcCBcCisJU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuaCBcCisJU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuY3BwIFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5oIFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9sZXZlbGRiL0xldmVsREJTbGljZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9MaW5r
SGFzaC5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0xpbmtIYXNoLmggXAogCVNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL0xvY2FsaXplZFN0cmluZ3MuaCBcCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cCBiL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDg5MTQyMWUwZWM4YzdjOWNiY2Y4OWYzZGI4ZmViMTI3
NDcyZTA4NWYuLmJkNzA1OWE0YmIxMTkzYjNlNjg2MTRjZDU5OGQ4YTkzZTc0MjFkOTQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCkBAIC0xODQsNiArMTg0LDcgQEAKICAg
ICAgICcuLi9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy94Ym0nLAogICAgICAgJy4uL3BsYXRmb3Jt
L2ltYWdlLWRlY29kZXJzL3dlYnAnLAogICAgICAgJy4uL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJz
L3NraWEnLAorICAgICAgJy4uL3BsYXRmb3JtL2xldmVsZGInLAogICAgICAgJy4uL3BsYXRmb3Jt
L21vY2snLAogICAgICAgJy4uL3BsYXRmb3JtL25ldHdvcmsnLAogICAgICAgJy4uL3BsYXRmb3Jt
L25ldHdvcmsvY2hyb21pdW0nLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5n
eXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDI1NjgwZjE0MDU1YmY4MWVi
M2QyNWQ1ZDViYmFlNzM5ZGJkMjExMzMuLmE4ZDdiMmQzZjI2OWIxODhjYTI3NTkxZGRjYzY0OWZj
OTQ3OTY4YzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTg1OCw2ICs4NTgsMTIgQEAKICAgICAgICAg
ICAgICdwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybU9wZXJhdGlvbnMuaCcs
CiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ndGsvUGFzdGVib2FyZEhlbHBlci5o
JywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJDb21wYXJhdG9yLmgnLAor
ICAgICAgICAgICAgJ3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcCcsCisgICAg
ICAgICAgICAncGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuaCcsCisgICAgICAgICAg
ICAncGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuY3BwJywKKyAgICAgICAgICAgICdw
bGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5oJywKKyAgICAgICAgICAgICdwbGF0Zm9y
bS9sZXZlbGRiL0xldmVsREJTbGljZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9tYWMvQmxv
Y2tFeGNlcHRpb25zLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL21hYy9DbGlwYm9hcmRNYWMu
aCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vbWFjL0VtcHR5UHJvdG9jb2xEZWZpbml0aW9ucy5o
JywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUucHJpIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5wcmkKaW5kZXggNTAyMTc3MWEzN2I1N2RlNzg4MTcxYzY5MWVlMGY3MWZkYzRj
OGVjNi4uMzAxNzU3MGY2Y2U1YmY3YjZhN2QzM2JiYTE0OTA1YTVjNzQzMDFhMiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcmkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5wcmkKQEAgLTk3LDYgKzk3LDcgQEAgV0VCQ09SRV9JTkNMVURFUEFUSCA9IFwKICAgICAkJFNP
VVJDRV9ESVIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAgXAogICAgICQkU09VUkNF
X0RJUi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMgXAogICAgICQkU09VUkNF
X0RJUi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzIFwKKyAgICAkJFNPVVJDRV9ESVIv
V2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiIFwKICAgICAkJFNPVVJDRV9ESVIvV2ViQ29yZS9wbGF0
Zm9ybS9tb2NrIFwKICAgICAkJFNPVVJDRV9ESVIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrIFwK
ICAgICAkJFNPVVJDRV9ESVIvV2ViQ29yZS9wbGF0Zm9ybS9zcWwgXApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybwppbmRl
eCA4NzQ0MWFhZTMxM2YzM2IwMGVlMDFjZGQ1ZjE1MjdhYmMxNWE3MzY5Li5lMGIyNWQ3Y2Y5YTIz
YjAwYWNiMGYzZTEwN2JiNmU3ZWU3MzAzMTA5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLnBybworKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtMTAxMSw2ICsx
MDExLDEyIEBAIFNPVVJDRVMgKz0gXAogICAgIHBsYXRmb3JtL0xhbmd1YWdlLmNwcCBcCiAgICAg
cGxhdGZvcm0vTGVuZ3RoLmNwcCBcCiAgICAgcGxhdGZvcm0vdGV4dC9MaW5lRW5kaW5nLmNwcCBc
CisgICAgcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFyYXRvci5oIFwKKyAgICBwbGF0Zm9y
bS9sZXZlbGRiL0xldmVsREJEYXRhYmFzZS5jcHAgXAorICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2
ZWxEQkRhdGFiYXNlLmggXAorICAgIHBsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNw
cCBcCisgICAgcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaCBcCisgICAgcGxhdGZv
cm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaCBcCiAgICAgcGxhdGZvcm0vTGlua0hhc2guY3BwIFwK
ICAgICBwbGF0Zm9ybS9Mb2dnaW5nLmNwcCBcCiAgICAgcGxhdGZvcm0vTUlNRVR5cGVSZWdpc3Ry
eS5jcHAgXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCmluZGV4IDU2ZDkxOTdiZWY5YjJiOTA0MWNkNTYwOWNhZGRkMjdhMGQ0NjM4NjAuLjQ1
ODZkYTdhZGU4ZGIxMzQ4MzI3YzEwMWJlOWY1NjdlOTEyZGUwZmIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTI3OTAsNiArMjc5
MCwxMiBAQAogCQk4QUY0RTU1QzExREM1QTYzMDAwRUQzREUgLyogUGVyZm9ybWFuY2VUaW1pbmcu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhBRjRFNTU5
MTFEQzVBNjMwMDBFRDNERSAvKiBQZXJmb3JtYW5jZVRpbWluZy5oICovOyB9OwogCQk4QzZFQTYx
OTExRUY3RTA0MDBGRDhFRTMgLyogUnVudGltZUVuYWJsZWRGZWF0dXJlcy5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4QzZFQTYxNzExRUY3RTA0MDBG
RDhFRTMgLyogUnVudGltZUVuYWJsZWRGZWF0dXJlcy5jcHAgKi87IH07CiAJCThDNkVBNjFBMTFF
RjdFMDQwMEZEOEVFMyAvKiBSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4QzZFQTYxODExRUY3RTA0MDBGRDhFRTMg
LyogUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oICovOyB9OworCQk4Q0FERjJBOTEzNUM3QjM2MDA5
RUY0M0YgLyogTGV2ZWxEQkNvbXBhcmF0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDhDQURGMkEzMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCQ29t
cGFyYXRvci5oICovOyB9OworCQk4Q0FERjJBQTEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkRh
dGFiYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDhDQURGMkE0MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCRGF0YWJhc2UuY3BwICovOyB9Owor
CQk4Q0FERjJBQjEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkRhdGFiYXNlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Q0FERjJBNTEzNUM3QjM2MDA5
RUY0M0YgLyogTGV2ZWxEQkRhdGFiYXNlLmggKi87IH07CisJCThDQURGMkFDMTM1QzdCMzYwMDlF
RjQzRiAvKiBMZXZlbERCSXRlcmF0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gOENBREYyQTYxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJJdGVy
YXRvci5jcHAgKi87IH07CisJCThDQURGMkFEMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRl
cmF0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhD
QURGMkE3MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRlcmF0b3IuaCAqLzsgfTsKKwkJOENB
REYyQUUxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJTbGljZS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOENBREYyQTgxMzVDN0IzNjAwOUVGNDNGIC8q
IExldmVsREJTbGljZS5oICovOyB9OwogCQk4RjY3NTYxQjEyODhCMTdCMDA0N0FDQTMgLyogRXZl
bnRRdWV1ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
OEY2NzU2MTkxMjg4QjE3QjAwNDdBQ0EzIC8qIEV2ZW50UXVldWUuaCAqLzsgfTsKIAkJOEY2NzU2
MUMxMjg4QjE3QjAwNDdBQ0EzIC8qIEV2ZW50UXVldWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOEY2NzU2MUExMjg4QjE3QjAwNDdBQ0EzIC8qIEV2
ZW50UXVldWUuY3BwICovOyB9OwogCQk4RkFDNzc0RDExOTg3MkNCMDAxNUFFOTQgLyogSlNNYWlu
VGhyZWFkRXhlY1N0YXRlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDhGOTM0RDg0MTE4OUYxRUUwMDUwOEQ1RCAvKiBKU01haW5UaHJlYWRFeGVjU3Rh
dGUuY3BwICovOyB9OwpAQCAtOTM0OSw2ICs5MzU1LDEyIEBACiAJCThBRjRFNTVBMTFEQzVBNjMw
MDBFRDNERSAvKiBQZXJmb3JtYW5jZVRpbWluZy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0g
UGVyZm9ybWFuY2VUaW1pbmcuaWRsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4QzZF
QTYxNzExRUY3RTA0MDBGRDhFRTMgLyogUnVudGltZUVuYWJsZWRGZWF0dXJlcy5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmNw
cDsgcGF0aCA9IGdlbmVyaWMvUnVudGltZUVuYWJsZWRGZWF0dXJlcy5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCThDNkVBNjE4MTFFRjdFMDQwMEZEOEVFMyAvKiBSdW50aW1lRW5h
YmxlZEZlYXR1cmVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFJ1bnRpbWVF
bmFibGVkRmVhdHVyZXMuaDsgcGF0aCA9IGdlbmVyaWMvUnVudGltZUVuYWJsZWRGZWF0dXJlcy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Q0FERjJBMzEzNUM3QjM2MDA5RUY0M0Yg
LyogTGV2ZWxEQkNvbXBhcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
TGV2ZWxEQkNvbXBhcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOENBREYy
QTQxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRhYmFzZS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMZXZlbERCRGF0YWJhc2UuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQk4Q0FERjJBNTEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkRhdGFi
YXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExldmVsREJEYXRhYmFzZS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4Q0FERjJBNjEzNUM3QjM2MDA5RUY0M0Yg
LyogTGV2ZWxEQkl0ZXJhdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IExldmVsREJJdGVyYXRvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThD
QURGMkE3MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gTGV2ZWxEQkl0ZXJhdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCThDQURGMkE4MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCU2xpY2UuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGV2ZWxEQlNsaWNlLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCThGNjc1NjE5MTI4OEIxN0IwMDQ3QUNBMyAvKiBFdmVudFF1
ZXVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEV2ZW50UXVldWUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJOEY2NzU2MUExMjg4QjE3QjAwNDdBQ0EzIC8qIEV2
ZW50UXVldWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRXZlbnRR
dWV1ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCThGOTM0RDgzMTE4OUYxRUUw
MDUwOEQ1RCAvKiBKU01haW5UaHJlYWRFeGVjU3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gSlNNYWluVGhyZWFkRXhlY1N0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CkBAIC0xNTYxMyw2ICsxNTYyNSwxOSBAQAogCQkJbmFtZSA9IEZpbGVBUEk7CiAJCQlz
b3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQk4Q0FERjJBMjEzNUM3QjM2MDA5RUY0M0Yg
LyogbGV2ZWxkYiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJ
CQkJOENBREYyQTMxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJDb21wYXJhdG9yLmggKi8sCisJ
CQkJOENBREYyQTQxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRhYmFzZS5jcHAgKi8sCisJ
CQkJOENBREYyQTUxMzVDN0IzNjAwOUVGNDNGIC8qIExldmVsREJEYXRhYmFzZS5oICovLAorCQkJ
CThDQURGMkE2MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRlcmF0b3IuY3BwICovLAorCQkJ
CThDQURGMkE3MTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRlcmF0b3IuaCAqLywKKwkJCQk4
Q0FERjJBODEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQlNsaWNlLmggKi8sCisJCQkpOworCQkJ
cGF0aCA9IGxldmVsZGI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OwogCQk5MzMw
OUQ4NjA5OUU2NDkxMDA1NkU1ODEgLyogZWRpdGluZyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3Vw
OwogCQkJY2hpbGRyZW4gPSAoCkBAIC0xODYyNyw2ICsxODY1Miw3IEBACiAJCQkJQTVDOTc0Q0Ux
MTQ4NUZEQTAwNjZGMkFCIC8qIGNvY29hICovLAogCQkJCUIyQTAxNTkxMEFGNkNENTMwMDZCQ0Uw
RSAvKiBncmFwaGljcyAqLywKIAkJCQlBNTlFM0MxQjExNTgwRjM0MDA3MjkyOEUgLyogaXBob25l
ICovLAorCQkJCThDQURGMkEyMTM1QzdCMzYwMDlFRjQzRiAvKiBsZXZlbGRiICovLAogCQkJCTY1
ODJBMTQ4MDk5OTlENkMwMEJFRUI2RCAvKiBtYWMgKi8sCiAJCQkJNTlDNzdGMTAxMDU0NTkxQzAw
NTA2MTA0IC8qIG1vY2sgKi8sCiAJCQkJNjU2Qjg0RDcwQUVBMUNFOTAwQTA5NUI0IC8qIG5ldHdv
cmsgKi8sCkBAIC0yMjk2Niw2ICsyMjk5MiwxMCBAQAogCQkJCTkzRjE5OUVEMDgyNDVFNTkwMDFF
OUFCQyAvKiBYU0xUUHJvY2Vzc29yLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMUJFNTEyRTBDRjZD
NTEyMDAyRUE5NTkgLyogWFNMVFVuaWNvZGVTb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQk5NzdF
MkUwRjEyRjBGQzlDMDBDMTMzNzkgLyogWFNTRmlsdGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQk4
Q0FERjJBOTEzNUM3QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkNvbXBhcmF0b3IuaCBpbiBIZWFkZXJz
ICovLAorCQkJCThDQURGMkFCMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCRGF0YWJhc2UuaCBp
biBIZWFkZXJzICovLAorCQkJCThDQURGMkFEMTM1QzdCMzYwMDlFRjQzRiAvKiBMZXZlbERCSXRl
cmF0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCThDQURGMkFFMTM1QzdCMzYwMDlFRjQzRiAvKiBM
ZXZlbERCU2xpY2UuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjU2NzIsNiArMjU3MDIsOCBAQAogCQkJ
CTkzRjE5QjA1MDgyNDVFNTkwMDFFOUFCQyAvKiBYU0xUUHJvY2Vzc29yTGlieHNsdC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQlFMUJFNTEyRDBDRjZDNTEyMDAyRUE5NTkgLyogWFNMVFVuaWNvZGVT
b3J0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM3OSAvKiBY
U1NGaWx0ZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJOENBREYyQUExMzVDN0IzNjAwOUVGNDNG
IC8qIExldmVsREJEYXRhYmFzZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk4Q0FERjJBQzEzNUM3
QjM2MDA5RUY0M0YgLyogTGV2ZWxEQkl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsK
IAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFyYXRvci5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCQ29tcGFyYXRvci5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjA4YWMyNjFhMDM2YTVlZTZjMTJhODhlNjYwMzIxNTIwMTUzNTNlMjgKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJDb21w
YXJhdG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTGV2ZWxEQkNvbXBhcmF0
b3JfaAorI2RlZmluZSBMZXZlbERCQ29tcGFyYXRvcl9oCisKKyNpZiBFTkFCTEUoTEVWRUxEQikK
KworI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIExldmVsREJTbGljZTsKKworY2xhc3MgTGV2ZWxEQkNvbXBhcmF0b3IgeworcHVi
bGljOgorICAgIHZpcnR1YWwgfkxldmVsREJDb21wYXJhdG9yKCkge30KKworICAgIHZpcnR1YWwg
aW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiwgY29uc3QgTGV2ZWxEQlNsaWNlJikgY29u
c3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0ID0gMDsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2Vu
ZGlmIC8vIExldmVsREJDb21wYXJhdG9yX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2xldmVsZGIvTGV2ZWxEQkRhdGFiYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40NTg3NjMxMmFjZmJk
ZDUxMGU5NTkwNmFlMTVlMmY3MGI1YWJhNGEyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsMTU5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxldmVsREJEYXRhYmFz
ZS5oIgorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNpbmNsdWRlICJMZXZlbERCQ29tcGFyYXRv
ci5oIgorI2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxldmVsREJTbGlj
ZS5oIgorI2luY2x1ZGUgPGxldmVsZGIvY29tcGFyYXRvci5oPgorI2luY2x1ZGUgPGxldmVsZGIv
ZGIuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL3NsaWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2lu
Y2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0YXRpYyBsZXZlbGRiOjpTbGljZSBtYWtlU2xpY2UoY29uc3QgVmVjdG9yPGNoYXI+JiB2YWx1
ZSkKK3sKKyAgICByZXR1cm4gbGV2ZWxkYjo6U2xpY2UodmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworfQorCitzdGF0aWMgbGV2ZWxkYjo6U2xpY2UgbWFrZVNsaWNlKGNvbnN0IExldmVsREJT
bGljZSYgcykKK3sKKyAgICByZXR1cm4gbGV2ZWxkYjo6U2xpY2Uocy5iZWdpbigpLCBzLmVuZCgp
IC0gcy5iZWdpbigpKTsKK30KKworc3RhdGljIExldmVsREJTbGljZSBtYWtlTGV2ZWxEQlNsaWNl
KGNvbnN0IGxldmVsZGI6OlNsaWNlJiBzKQoreworICAgIHJldHVybiBMZXZlbERCU2xpY2Uocy5k
YXRhKCksIHMuZGF0YSgpICsgcy5zaXplKCkpOworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IG1h
a2VWZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHMpCit7CisgICAgVmVjdG9yPGNoYXI+IHJlczsK
KyAgICByZXMuYXBwZW5kKHMuY19zdHIoKSwgcy5sZW5ndGgoKSk7CisgICAgcmV0dXJuIHJlczsK
K30KKworbmFtZXNwYWNlIHsKK2NsYXNzIENvbXBhcmF0b3JBZGFwdGVyIDogcHVibGljIGxldmVs
ZGI6OkNvbXBhcmF0b3IgeworcHVibGljOgorICAgIENvbXBhcmF0b3JBZGFwdGVyKGNvbnN0IExl
dmVsREJDb21wYXJhdG9yKiBjb21wYXJhdG9yKQorICAgICAgICA6IG1fY29tcGFyYXRvcihjb21w
YXJhdG9yKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBDb21wYXJlKGNvbnN0IGxl
dmVsZGI6OlNsaWNlJiBhLCBjb25zdCBsZXZlbGRiOjpTbGljZSYgYikgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3ItPmNvbXBhcmUobWFrZUxldmVsREJTbGljZShhKSwg
bWFrZUxldmVsREJTbGljZShiKSk7CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBO
YW1lKCkgY29uc3QgeyByZXR1cm4gbV9jb21wYXJhdG9yLT5uYW1lKCk7IH0KKworICAgIC8vIEZJ
WE1FOiBTdXBwb3J0IHRoZSBtZXRob2RzIGJlbG93IGluIHRoZSBmdXR1cmUuCisgICAgdmlydHVh
bCB2b2lkIEZpbmRTaG9ydGVzdFNlcGFyYXRvcihzdGQ6OnN0cmluZyogc3RhcnQsIGNvbnN0IGxl
dmVsZGI6OlNsaWNlJiBsaW1pdCkgY29uc3QgeyB9CisgICAgdmlydHVhbCB2b2lkIEZpbmRTaG9y
dFN1Y2Nlc3NvcihzdGQ6OnN0cmluZyoga2V5KSBjb25zdCB7IH0KKworcHJpdmF0ZToKKyAgICBj
b25zdCBMZXZlbERCQ29tcGFyYXRvciogbV9jb21wYXJhdG9yOworfTsKK30KKworTGV2ZWxEQkRh
dGFiYXNlOjpMZXZlbERCRGF0YWJhc2UoKQorICAgIDogbV9kYigwKQoreworfQorCitMZXZlbERC
RGF0YWJhc2U6On5MZXZlbERCRGF0YWJhc2UoKQoreworfQorCitMZXZlbERCRGF0YWJhc2UqIExl
dmVsREJEYXRhYmFzZTo6b3Blbihjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBMZXZlbERC
Q29tcGFyYXRvciogY29tcGFyYXRvcikKK3sKKyAgICBPd25QdHI8Q29tcGFyYXRvckFkYXB0ZXI+
IGNvbXBhcmF0b3JBZGFwdGVyKG5ldyBDb21wYXJhdG9yQWRhcHRlcihjb21wYXJhdG9yKSk7CisK
KyAgICBMZXZlbERCRGF0YWJhc2UqIHJlc3VsdCA9IG5ldyBMZXZlbERCRGF0YWJhc2UoKTsKKwor
ICAgIGxldmVsZGI6Ok9wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXBhcmF0b3IgPSBj
b21wYXJhdG9yQWRhcHRlci5nZXQoKTsKKyAgICBvcHRpb25zLmNyZWF0ZV9pZl9taXNzaW5nID0g
dHJ1ZTsKKyAgICBsZXZlbGRiOjpEQiogZGI7CisgICAgbGV2ZWxkYjo6U3RhdHVzIHMgPSBsZXZl
bGRiOjpEQjo6T3BlbihvcHRpb25zLCBmaWxlTmFtZS51dGY4KCkuZGF0YSgpLCAmZGIpOworCisg
ICAgaWYgKCFzLm9rKCkpIHsKKyAgICAgICAgZGVsZXRlIHJlc3VsdDsKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorCisgICAgcmVzdWx0LT5tX2RiID0gV1RGOjphZG9wdFB0cihkYik7CisgICAg
cmVzdWx0LT5tX2NvbXBhcmF0b3JBZGFwdGVyID0gY29tcGFyYXRvckFkYXB0ZXIucmVsZWFzZSgp
OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sIExldmVsREJEYXRhYmFzZTo6cHV0
KGNvbnN0IExldmVsREJTbGljZSYga2V5LCBjb25zdCBWZWN0b3I8Y2hhcj4mIHZhbHVlKQorewor
ICAgIGxldmVsZGI6OldyaXRlT3B0aW9ucyB3cml0ZU9wdGlvbnM7CisgICAgd3JpdGVPcHRpb25z
LnN5bmMgPSBmYWxzZTsKKworICAgIHJldHVybiBtX2RiLT5QdXQod3JpdGVPcHRpb25zLCBtYWtl
U2xpY2Uoa2V5KSwgbWFrZVNsaWNlKHZhbHVlKSkub2soKTsKK30KKworYm9vbCBMZXZlbERCRGF0
YWJhc2U6OnJlbW92ZShjb25zdCBMZXZlbERCU2xpY2UmIGtleSkKK3sKKyAgICBsZXZlbGRiOjpX
cml0ZU9wdGlvbnMgd3JpdGVPcHRpb25zOworICAgIHdyaXRlT3B0aW9ucy5zeW5jID0gZmFsc2U7
CisKKyAgICByZXR1cm4gbV9kYi0+RGVsZXRlKHdyaXRlT3B0aW9ucywgbWFrZVNsaWNlKGtleSkp
Lm9rKCk7Cit9CisKK2Jvb2wgTGV2ZWxEQkRhdGFiYXNlOjpnZXQoY29uc3QgTGV2ZWxEQlNsaWNl
JiBrZXksIFZlY3RvcjxjaGFyPiYgdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0Owor
ICAgIGlmICghbV9kYi0+R2V0KGxldmVsZGI6OlJlYWRPcHRpb25zKCksIG1ha2VTbGljZShrZXkp
LCAmcmVzdWx0KS5vaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2YWx1ZSA9IG1h
a2VWZWN0b3IocmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTGV2ZWxEQkl0ZXJhdG9y
KiBMZXZlbERCRGF0YWJhc2U6Om5ld0l0ZXJhdG9yKCkKK3sKKyAgICBsZXZlbGRiOjpJdGVyYXRv
ciogaSA9IG1fZGItPk5ld0l0ZXJhdG9yKGxldmVsZGI6OlJlYWRPcHRpb25zKCkpOworICAgIGlm
ICghaSkgLy8gRklYTUU6IERvdWJsZSBjaGVjayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIGNoZWNr
IHRoaXMuCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBuZXcgTGV2ZWxEQkl0ZXJhdG9y
KGkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVW
RUxEQikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxE
QkRhdGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJEYXRh
YmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjQ3MWYzMzVhNzdlOTE2YjEzYjJmMThkZWEzMTVjYzcxZDkzYjM2
YjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xl
dmVsREJEYXRhYmFzZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExldmVsREJE
YXRhYmFzZV9oCisjZGVmaW5lIExldmVsREJEYXRhYmFzZV9oCisKKyNpZiBFTkFCTEUoTEVWRUxE
QikKKworI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8T3duUHRyLmg+Cisj
aW5jbHVkZSA8VmVjdG9yLmg+CisKK25hbWVzcGFjZSBsZXZlbGRiIHsKK2NsYXNzIENvbXBhcmF0
b3I7CitjbGFzcyBEQjsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMZXZlbERC
Q29tcGFyYXRvcjsKK2NsYXNzIExldmVsREJJdGVyYXRvcjsKK2NsYXNzIExldmVsREJTbGljZTsK
KworY2xhc3MgTGV2ZWxEQkRhdGFiYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTGV2ZWxEQkRh
dGFiYXNlKiBvcGVuKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IExldmVsREJDb21wYXJh
dG9yKik7CisgICAgfkxldmVsREJEYXRhYmFzZSgpOworCisgICAgYm9vbCBwdXQoY29uc3QgTGV2
ZWxEQlNsaWNlJiBrZXksIGNvbnN0IFZlY3RvcjxjaGFyPiYgdmFsdWUpOworICAgIGJvb2wgcmVt
b3ZlKGNvbnN0IExldmVsREJTbGljZSYga2V5KTsKKyAgICBib29sIGdldChjb25zdCBMZXZlbERC
U2xpY2UmIGtleSwgVmVjdG9yPGNoYXI+JiB2YWx1ZSk7CisgICAgTGV2ZWxEQkl0ZXJhdG9yKiBu
ZXdJdGVyYXRvcigpOworCitwcml2YXRlOgorICAgIExldmVsREJEYXRhYmFzZSgpOworCisgICAg
T3duUHRyPGxldmVsZGI6OkRCPiBtX2RiOworICAgIE93blB0cjxsZXZlbGRiOjpDb21wYXJhdG9y
PiBtX2NvbXBhcmF0b3JBZGFwdGVyOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gTGV2ZWxEQkRhdGFiYXNlX2gKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9y
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2xldmVsZGIvTGV2ZWxEQkl0ZXJhdG9yLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kZTBmMjg2YTIzMjMwZmJmMjZhOTIzNmE4OGJkMjhkZjM3YjcwMmVjCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERC
SXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgiCisKKyNpZiBFTkFCTEUoTEVWRUxEQikKKwor
I2luY2x1ZGUgPGxldmVsZGIvaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxsZXZlbGRiL3NsaWNlLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0
cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0xldmVsREJJdGVyYXRvcjo6fkxldmVs
REJJdGVyYXRvcigpCit7Cit9CisKK0xldmVsREJJdGVyYXRvcjo6TGV2ZWxEQkl0ZXJhdG9yKGxl
dmVsZGI6Okl0ZXJhdG9yKiBpdCkKKyAgICA6IG1faXRlcmF0b3IoaXQpCit7Cit9CisKK3N0YXRp
YyBsZXZlbGRiOjpTbGljZSBtYWtlU2xpY2UoY29uc3QgVmVjdG9yPGNoYXI+JiB2YWx1ZSkKK3sK
KyAgICByZXR1cm4gbGV2ZWxkYjo6U2xpY2UodmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
fQorCitzdGF0aWMgTGV2ZWxEQlNsaWNlIG1ha2VMZXZlbERCU2xpY2UobGV2ZWxkYjo6U2xpY2Ug
cykKK3sKKyAgICByZXR1cm4gTGV2ZWxEQlNsaWNlKHMuZGF0YSgpLCBzLmRhdGEoKSArIHMuc2l6
ZSgpKTsKK30KKworYm9vbCBMZXZlbERCSXRlcmF0b3I6OmlzVmFsaWQoKSBjb25zdAoreworICAg
IHJldHVybiBtX2l0ZXJhdG9yLT5WYWxpZCgpOworfQorCit2b2lkIExldmVsREJJdGVyYXRvcjo6
c2Vla1RvTGFzdCgpCit7CisgICAgbV9pdGVyYXRvci0+U2Vla1RvTGFzdCgpOworfQorCit2b2lk
IExldmVsREJJdGVyYXRvcjo6c2Vlayhjb25zdCBWZWN0b3I8Y2hhcj4mIHRhcmdldCkKK3sKKyAg
ICBtX2l0ZXJhdG9yLT5TZWVrKG1ha2VTbGljZSh0YXJnZXQpKTsKK30KKwordm9pZCBMZXZlbERC
SXRlcmF0b3I6Om5leHQoKQoreworICAgIG1faXRlcmF0b3ItPk5leHQoKTsKK30KKwordm9pZCBM
ZXZlbERCSXRlcmF0b3I6OnByZXYoKQoreworICAgIG1faXRlcmF0b3ItPlByZXYoKTsKK30KKwor
TGV2ZWxEQlNsaWNlIExldmVsREJJdGVyYXRvcjo6a2V5KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bWFrZUxldmVsREJTbGljZShtX2l0ZXJhdG9yLT5rZXkoKSk7Cit9CisKK0xldmVsREJTbGljZSBM
ZXZlbERCSXRlcmF0b3I6OnZhbHVlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFrZUxldmVsREJT
bGljZShtX2l0ZXJhdG9yLT52YWx1ZSgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9sZXZlbGRiL0xldmVsREJJdGVyYXRvci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZjljYmNhZmU3ZmVkNTUy
N2UyNjE4ZDZhZThjZjBiZjMwZmJmNzZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCSXRlcmF0b3IuaApAQCAtMCwwICsxLDY1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBMZXZlbERCSXRlcmF0b3JfaAorI2RlZmluZSBMZXZlbERCSXRlcmF0b3Jf
aAorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNpbmNsdWRlICJMZXZlbERCU2xpY2UuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPE93blB0ci5oPgorI2luY2x1ZGUg
PFZlY3Rvci5oPgorCituYW1lc3BhY2UgbGV2ZWxkYiB7CitjbGFzcyBJdGVyYXRvcjsKK30KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMZXZlbERCSXRlcmF0b3IgeworcHVibGljOgor
ICAgIH5MZXZlbERCSXRlcmF0b3IoKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworICAg
IHZvaWQgc2Vla1RvTGFzdCgpOworICAgIHZvaWQgc2Vlayhjb25zdCBWZWN0b3I8Y2hhcj4mIHRh
cmdldCk7CisgICAgdm9pZCBuZXh0KCk7CisgICAgdm9pZCBwcmV2KCk7CisgICAgTGV2ZWxEQlNs
aWNlIGtleSgpIGNvbnN0OworICAgIExldmVsREJTbGljZSB2YWx1ZSgpIGNvbnN0OworCitwcml2
YXRlOgorICAgIExldmVsREJJdGVyYXRvcihsZXZlbGRiOjpJdGVyYXRvciopOworICAgIGZyaWVu
ZCBjbGFzcyBMZXZlbERCRGF0YWJhc2U7CisKKyAgICBPd25QdHI8bGV2ZWxkYjo6SXRlcmF0b3I+
IG1faXRlcmF0b3I7Cit9OworCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIExldmVsREJJdGVyYXRvcl9oCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9sZXZlbGRiL0xldmVsREJTbGljZS5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xNWM1
NzZjYTVlY2Q3ZDczZTBlMjllNGM3YmU1YmIyMTY5MmRkZGRlCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbGV2ZWxkYi9MZXZlbERCU2xpY2UuaApAQCAtMCwwICsx
LDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBMZXZlbERCU2xpY2VfaAorI2RlZmluZSBMZXZlbERCU2xp
Y2VfaAorCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorI2luY2x1ZGUgPFZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExl
dmVsREJTbGljZSB7CitwdWJsaWM6CisgICAgTGV2ZWxEQlNsaWNlKGNvbnN0IGNoYXIqIGJlZ2lu
LCBjb25zdCBjaGFyKiBlbmQpCisgICAgICAgIDogbV9iZWdpbihiZWdpbikKKyAgICAgICAgLCBt
X2VuZChlbmQpCisgICAgeworICAgICAgICBBU1NFUlQobV9lbmQgPj0gbV9iZWdpbik7CisgICAg
fQorCisgICAgTGV2ZWxEQlNsaWNlKGNvbnN0IFZlY3RvcjxjaGFyPiYgdikKKyAgICAgICAgOiBt
X2JlZ2luKHYuZGF0YSgpKQorICAgICAgICAsIG1fZW5kKG1fYmVnaW4gKyB2LnNpemUoKSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChtX2VuZCA+PSBtX2JlZ2luKTsKKyAgICB9CisKKyAgICB+TGV2
ZWxEQlNsaWNlKCkKKyAgICB7CisgICAgfQorCisgICAgY29uc3QgY2hhciogYmVnaW4oKSBjb25z
dCB7IHJldHVybiBtX2JlZ2luOyB9CisgICAgY29uc3QgY2hhciogZW5kKCkgY29uc3QgeyByZXR1
cm4gbV9lbmQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtX2JlZ2luOworICAgIGNv
bnN0IGNoYXIqIG1fZW5kOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gTGV2ZWxEQlNsaWNlX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCmluZGV4IGMwNmVh
MDA0MjIxNTU2MTU4NDY2YzNiZDI2MGQ1NmYyMzBiZDM3YTAuLjQ5YTQ1NTRlMGY1ZjBmOTgwOTAy
MzA2YmY0MzM2ODU5YTk2NDEzZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2Uv
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJMZXZlbERCQmFja2luZ1N0b3JlLmNwcApAQCAtMjksMTIgKzI5LDE0MzggQEAKICNpZiBFTkFC
TEUoSU5ERVhFRF9EQVRBQkFTRSkKICNpZiBFTkFCTEUoTEVWRUxEQikKIAorI2luY2x1ZGUgIkFz
c2VydGlvbnMuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiSURCRmFjdG9y
eUJhY2tlbmRJbXBsLmgiCi0jaW5jbHVkZSA8bGV2ZWxkYi9kYi5oPgorI2luY2x1ZGUgIklEQktl
eVJhbmdlLmgiCisjaW5jbHVkZSAiTGV2ZWxEQkNvbXBhcmF0b3IuaCIKKyNpbmNsdWRlICJMZXZl
bERCRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJMZXZlbERCSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJM
ZXZlbERCU2xpY2UuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgPHN0
cmluZz4KKworI2lmbmRlZiBJTlQ2NF9NQVgKKy8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgbmVlZCB0
byByZWx5IG9uIHRoZXNlIG1hY3Jvcy4KKyNkZWZpbmUgSU5UNjRfTUFYIDB4N2ZmZmZmZmZmZmZm
ZmZmZkxMCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAweDdm
ZmZmZmZmTAorI2VuZGlmCisKKy8vIExldmVsREIgc3RvcmVzIGtleS92YWx1ZSBwYWlycy4gS2V5
cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIG9mIGJ5dGVzLCBub3JtYWxseSBvZiB0eXBlIFZlY3Rv
cjxjaGFyPi4KKy8vCisvLyBUaGUga2V5cyBpbiB0aGUgYmFja2luZyBzdG9yZSBhcmUgdmFyaWFi
bGUtbGVuZ3RoIHR1cGxlcyB3aXRoIGRpZmZlcmVudCB0eXBlcworLy8gb2YgZmllbGRzLiBFYWNo
IGtleSBpbiB0aGUgYmFja2luZyBzdG9yZSBzdGFydHMgd2l0aCBhIHRlcm5hcnkgcHJlZml4OiAo
ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQpLiBGb3IgZWFjaCwgMCBpcyBy
ZXNlcnZlZCBmb3IgbWV0YS1kYXRhLgorLy8gVGhlIHByZWZpeCBtYWtlcyBzdXJlIHRoYXQgZGF0
YSBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSwgb2JqZWN0IHN0b3JlLCBhbmQgaW5kZXggYXJlIGdy
b3VwZWQgdG9nZXRoZXIuIFRoZSBsb2NhbGl0eSBpcyBpbXBvcnRhbnQgZm9yIHBlcmZvcm1hbmNl
OiBjb21tb24KKy8vIG9wZXJhdGlvbnMgc2hvdWxkIG9ubHkgbmVlZCBhIG1pbmltYWwgbnVtYmVy
IG9mIHNlZWsgb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGFsbCB0aGUgbWV0YS1kYXRhIGZvciBh
IGRhdGFiYXNlIGlzIGdyb3VwZWQgdG9nZXRoZXIgc28gdGhhdCByZWFkaW5nIHRoYXQKKy8vIG1l
dGEtZGF0YSBvbmx5IHJlcXVpcmVzIG9uZSBzZWVrLgorLy8KKy8vIEVhY2gga2V5IHR5cGUgaGFz
IGEgY2xhc3MgKGluIHNxdWFyZSBicmFja2V0cyBiZWxvdykgd2hpY2gga25vd3MgaG93IHRvIGVu
Y29kZSwgZGVjb2RlLCBhbmQgY29tcGFyZSB0aGF0IGtleSB0eXBlLgorLy8KKy8vIEdsb2JhbCBt
ZXRhLWRhdGEgaGF2ZSBrZXlzIHdpdGggcHJlZml4ICgwLDAsMCksIGZvbGxvd2VkIGJ5IGEgdHlw
ZSBieXRlOgorLy8KKy8vICAgICA8MCwgMCwgMCwgMD4gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPT4gSW5kZXhlZERCL0xldmVsREIgc2NoZW1hIHZlcnNpb24gKDAg
Zm9yIG5vdykgW1NjaGVtYVZlcnNpb25LZXldCisvLyAgICAgPDAsIDAsIDAsIDE+ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRoZSBtYXhpbXVtIGRhdGFiYXNl
IGlkIGV2ZXIgYWxsb2NhdGVkIFtNYXhEYXRhYmFzZUlkS2V5XQorLy8gICAgIDwwLCAwLCAwLCAx
MDAsIGRhdGFiYXNlIGlkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBFeGlzdGVuY2Ug
aW1wbGllcyB0aGUgZGF0YWJhc2UgaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbRGF0YWJhc2VGcmVl
TGlzdEtleV0KKy8vICAgICA8MCwgMCwgMCwgMjAxLCB1dGYxNiBvcmlnaW4gbmFtZSwgdXRmMTYg
ZGF0YWJhc2UgbmFtZT4gPT4gRGF0YWJhc2UgaWQgW0RhdGFiYXNlTmFtZUtleV0KKy8vCisvLwor
Ly8gRGF0YWJhc2UgbWV0YS1kYXRhOgorLy8KKy8vICAgICBBZ2FpbiwgdGhlIHByZWZpeCBpcyBm
b2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAw
PiA9PiB1dGYxNiBvcmlnaW4gbmFtZSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDE+ID0+IHV0ZjE2IGRhdGFiYXNlIG5hbWUgW0RhdGFiYXNlTWV0YURh
dGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyPiA9PiB1dGYxNiB1c2VyIHZlcnNp
b24gZGF0YSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAs
IDM+ID0+IG1heGltdW0gb2JqZWN0IHN0b3JlIGlkIGV2ZXIgYWxsb2NhdGVkIFtEYXRhYmFzZU1l
dGFEYXRhS2V5XQorLy8KKy8vCisvLyBPYmplY3Qgc3RvcmUgbWV0YS1kYXRhOgorLy8KKy8vICAg
ICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVuIGEgdmFyaWFibGUt
bGVuZ3RoIGludGVnZXIsIGFuZCB0aGVuIGFub3RoZXIgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIg
KEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIGJ5dGUpLgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQs
IDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDA+ID0+IHV0ZjE2IG9iamVjdCBzdG9yZSBuYW1l
IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAs
IG9iamVjdCBzdG9yZSBpZCwgMT4gPT4gdXRmMTYga2V5IHBhdGggW09iamVjdFN0b3JlTWV0YURh
dGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAy
PiA9PiBoYXMgYXV0byBpbmNyZW1lbnQgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCisvLyAgICAg
PGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAzPiA9PiBpcyBldmljdGFi
bGUgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1
MCwgb2JqZWN0IHN0b3JlIGlkLCA0PiA9PiBsYXN0ICJ2ZXJzaW9uIiBudW1iZXIgW09iamVjdFN0
b3JlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0
b3JlIGlkLCA1PiA9PiBtYXhpbXVtIGluZGV4IGlkIGV2ZXIgYWxsb2NhdGVkIFtPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5XQorLy8KKy8vCisvLyBJbmRleCBtZXRhLWRhdGE6CisvLworLy8gICAgIFRo
ZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4gdHdvIHZhcmlhYmxlLWxl
bmd0aCBpbnRlZ2VycywgYW5kIHRoZW4gYW5vdGhlciB0eXBlIGJ5dGUuCisvLworLy8gICAgIDxk
YXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAwPiA9PiB1
dGYxNiBpbmRleCBuYW1lIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwg
MCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAxPiA9PiBhcmUgaW5kZXgga2V5
cyB1bmlxdWUgW0luZGV4TWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAx
MDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDI+ID0+IHV0ZjE2IGtleSBwYXRoIFtJbmRl
eE1ldGFEYXRhS2V5XQorLy8KKy8vCisvLyBPdGhlciBvYmplY3Qgc3RvcmUgYW5kIGluZGV4IG1l
dGEtZGF0YToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0
ZS4gVGhlIG9iamVjdCBzdG9yZSBhbmQgaW5kZXggaWQgYXJlIHZhcmlhYmxlIGxlbmd0aCBpbnRl
Z2VycywgdGhlIHV0ZjE2IHN0cmluZ3MgYXJlIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmdzLgorLy8K
Ky8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1MCwgb2JqZWN0IHN0b3JlIGlkPiAgICAgICAg
ICAgICAgICAgICA9PiBleGlzdGVuY2UgaW1wbGllcyB0aGUgb2JqZWN0IHN0b3JlIGlkIGlzIGlu
IHRoZSBmcmVlIGxpc3QgW09iamVjdFN0b3JlRnJlZUxpc3RLZXldCisvLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCAxNTEsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQ+ICAgICAgICAgPT4gZXhp
c3RlbmNlIGltcGxpZXMgdGhlIGluZGV4IGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0luZGV4RnJl
ZUxpc3RLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyMDAsIHV0ZjE2IG9iamVjdCBz
dG9yZSBuYW1lPiAgICAgICAgICAgPT4gb2JqZWN0IHN0b3JlIGlkIFtPYmplY3RTdG9yZU5hbWVz
S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAxLCBvYmplY3Qgc3RvcmUgaWQsIHV0
ZjE2IGluZGV4IG5hbWU+ID0+IGluZGV4IGlkIFtJbmRleE5hbWVzS2V5XQorLy8KKy8vCisvLyBP
YmplY3Qgc3RvcmUgZGF0YToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBh
IHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LgorLy8KKy8vICAg
ICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMSwgdXNlciBrZXk+ID0+ICJ2ZXJzaW9u
Iiwgc2VyaWFsaXplZCBzY3JpcHQgdmFsdWUgW09iamVjdFN0b3JlRGF0YUtleV0KKy8vCisvLwor
Ly8gIkV4aXN0cyIgZW50cnk6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkg
YSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4KKy8vCisvLyAg
ICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDIsIHVzZXIga2V5PiA9PiAidmVyc2lv
biIgW0V4aXN0c0VudHJ5S2V5XQorLy8KKy8vCisvLyBJbmRleCBkYXRhOgorLy8KKy8vICAgICBU
aGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4g
ZW5jb2RlZCBJREJLZXkuIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYSB2YXJpYWJsZSBsZW5ndGgg
aW50ZWdlci4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4
IGlkLCB1c2VyIGtleSwgc2VxdWVuY2UgbnVtYmVyPiA9PiAidmVyc2lvbiIsIHVzZXIga2V5IFtJ
bmRleERhdGFLZXldCisvLworLy8gICAgIChUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIHVzZWQgdG8g
YWxsb3cgdHdvIGVudHJpZXMgd2l0aCB0aGUgc2FtZSB1c2VyIGtleQorLy8gICAgIGluIG5vbi11
bmlxdWUgaW5kZXhlcy4gVGhlICJ2ZXJzaW9uIiBmaWVsZCBpcyB1c2VkIHRvIHdlZWQgb3V0IHN0
YWxlCisvLyAgICAgaW5kZXggZGF0YS4gV2hlbmV2ZXIgbmV3IG9iamVjdCBzdG9yZSBkYXRhIGlz
IGluc2VydGVkLCBpdCBnZXRzIGEgbmV3CisvLyAgICAgInZlcnNpb24iIG51bWJlciwgYW5kIG5l
dyBpbmRleCBkYXRhIGlzIHdyaXR0ZW4gd2l0aCB0aGlzIG51bWJlci4gV2hlbgorLy8gICAgIHRo
ZSBpbmRleCBpcyB1c2VkIGZvciBsb29rLXVwcywgZW50cmllcyBhcmUgdmFsaWRhdGVkIGFnYWlu
c3QgdGhlCisvLyAgICAgImV4aXN0cyIgZW50cmllcywgYW5kIHJlY29yZHMgd2l0aCBvbGQgInZl
cnNpb24iIG51bWJlcnMgYXJlIGRlbGV0ZWQKKy8vICAgICB3aGVuIHRoZXkgYXJlIGVuY291bnRl
cmVkIGluIGdldFByaW1hcnlLZXlWaWFJbmRleCwKKy8vICAgICBJbmRleEN1cnNvckltcGw6Omxv
YWRDdXJyZW50Um93LCBhbmQgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdykuCisK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdWxsVHlwZUJ5dGUgPSAwOworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleVN0cmluZ1R5cGVCeXRlID0gMTsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlEYXRlVHlwZUJ5dGUgPSAyOworc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bWJlclR5cGVCeXRlID0gMzsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjaGFyIGtJREJLZXlNaW5LZXlUeXBlQnl0ZSA9IDQ7CisKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjaGFyIGtNaW5pbXVtSW5kZXhJZCA9IDMwOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIga09iamVjdFN0b3JlRGF0YUluZGV4SWQgPSAxOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIga0V4aXN0c0VudHJ5SW5kZXhJZCA9IDI7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBjaGFyIGtTY2hlbWFWZXJzaW9uVHlwZUJ5dGUgPSAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNoYXIga01heERhdGFiYXNlSWRUeXBlQnl0ZSA9IDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQg
Y2hhciBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlID0gMTAwOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIga0RhdGFiYXNlTmFtZVR5cGVCeXRlID0gMjAxOworCitzdGF0aWMgY29uc3QgdW5z
aWduZWQgY2hhciBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlID0gNTA7CitzdGF0aWMgY29u
c3QgdW5zaWduZWQgY2hhciBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlID0gMTAwOworc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSA9IDE1MDsKK3N0
YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUgPSAxNTE7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlID0gMjAw
Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4TmFtZXNLZXlUeXBlQnl0ZSA9IDIw
MTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1JREJMZXZlbERCQmFja2luZ1N0b3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZElt
cGwqIGZhY3RvcnksIGxldmVsZGI6OkRCKiBkYikKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
Qnl0ZSh1bnNpZ25lZCBjaGFyIGMpCit7CisgICAgVmVjdG9yPGNoYXI+IHY7CisgICAgdi5hcHBl
bmQoYyk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gbWF4SURCS2V5
KCkKK3sKKyAgICByZXR1cm4gZW5jb2RlQnl0ZShrSURCS2V5TnVsbFR5cGVCeXRlKTsKK30KKwor
c3RhdGljIFZlY3RvcjxjaGFyPiBtaW5JREJLZXkoKQoreworICAgIHJldHVybiBlbmNvZGVCeXRl
KGtJREJLZXlNaW5LZXlUeXBlQnl0ZSk7Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
SW50KGludDY0X3QgbikKK3sKKyAgICBBU1NFUlQobiA+PSAwKTsKKyAgICBWZWN0b3I8Y2hhcj4g
cmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZG8geworICAgICAg
ICB1bnNpZ25lZCBjaGFyIGMgPSBuOworICAgICAgICByZXQuYXBwZW5kKGMpOworICAgICAgICBu
ID4+PSA4OworICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGlj
IGludDY0X3QgZGVjb2RlSW50KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpCit7
CisgICAgQVNTRVJUKGJlZ2luIDw9IGVuZCk7CisgICAgaW50NjRfdCByZXQgPSAwOworCisgICAg
d2hpbGUgKGJlZ2luIDwgZW5kKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICpiZWdpbisr
OworICAgICAgICByZXQgPSAocmV0IDw8IDgpIHwgYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0
OworfQorCitzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZVZhckludChpbnQ2NF90IG4pCit7Cisg
ICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KKwor
ICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbiAmIDB4N2Y7CisgICAgICAgIG4g
Pj49IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAxMjg7CisgICAgICAgIHJl
dC5hcHBlbmQoYyk7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitz
dGF0aWMgY29uc3QgY2hhciogZGVjb2RlVmFySW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIq
IGxpbWl0LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAgICBBU1NFUlQobGltaXQgPj0gcCk7Cisg
ICAgZm91bmRJbnQgPSAwOworCisgICAgZG8geworICAgICAgICBpZiAocCA+PSBsaW1pdCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGZvdW5kSW50ID0gKGZvdW5kSW50IDw8IDcp
IHwgKCpwICYgMHg3Zik7CisgICAgfSB3aGlsZSAoKnArKyAmIDEyOCk7CisgICAgcmV0dXJuIHA7
Cit9CisKK3N0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlU3RyaW5nKGNvbnN0IFN0cmluZyYgcykK
K3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0OyAvLyBGSVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9u
LgorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgeworICAg
ICAgICBVQ2hhciB1ID0gc1tpXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9IHUgPj4gODsK
KyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9IHU7CisgICAgICAgIHJldC5hcHBlbmQoaGkpOwor
ICAgICAgICByZXQuYXBwZW5kKGxvKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitz
dGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZyhjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQp
Cit7CisgICAgQVNTRVJUKGVuZCA+PSBwKTsKKyAgICBBU1NFUlQoISgoZW5kIC0gcCkgJSAyKSk7
CisKKyAgICBzaXplX3QgbGVuID0gKGVuZCAtIHApIC8gMjsKKyAgICBWZWN0b3I8VUNoYXI+IHZl
Y3RvcihsZW4pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAg
ICAgICB1bnNpZ25lZCBjaGFyIGhpID0gKnArKzsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9
ICpwKys7CisKKyAgICAgICAgdmVjdG9yW2ldID0gKGhpIDw8IDgpIHwgbG87CisgICAgfQorCisg
ICAgcmV0dXJuIFN0cmluZzo6YWRvcHQodmVjdG9yKTsKK30KKworc3RhdGljIFZlY3RvcjxjaGFy
PiBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IFN0cmluZyYgcykKK3sKKyAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkpOworICAgIHJldC5hcHBlbmQoZW5j
b2RlU3RyaW5nKHMpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlU3RyaW5nV2l0aExlbmd0aChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwg
U3RyaW5nJiBmb3VuZFN0cmluZykKK3sKKyAgICBBU1NFUlQobGltaXQgPj0gcCk7CisgICAgaW50
NjRfdCBsZW47CisgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgbGVuKTsKKyAgICBpZiAo
IXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwICsgbGVuICogMiA+IGxpbWl0KQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGZvdW5kU3RyaW5nID0gZGVjb2RlU3RyaW5nKHAsIHAgKyBs
ZW4gKiAyKTsKKyAgICBwICs9IGxlbiAqIDI7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlRG91YmxlKGRvdWJsZSB4KQoreworICAgIC8vIEZJWE1FOiBJdCB3
b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGJlIGJ5dGUgb3JkZXIgaW5kZXBlbmRlbnQuCisgICAg
Y29uc3QgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ4KTsKKyAgICBWZWN0b3I8
Y2hhcj4gdjsKKyAgICB2LmFwcGVuZChwLCBzaXplb2YoeCkpOworICAgIEFTU0VSVCh2LnNpemUo
KSA9PSBzaXplb2YoeCkpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlRG91YmxlKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBkb3VibGUqIGQp
Cit7CisgICAgaWYgKHAgKyBzaXplb2YoKmQpID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgY2hhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGQpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKCpkKTsgKytpKQorICAgICAgICAqeCsrID0gKnArKzsKKyAg
ICByZXR1cm4gcDsKK30KKworc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVJREJLZXkoY29uc3Qg
SURCS2V5JiBrZXkpCit7CisgICAgVmVjdG9yPGNoYXI+IHJldDsKKworICAgIHN3aXRjaCAoa2V5
LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpOdWxsVHlwZToKKyAgICAgICAgcmV0dXJuIGVu
Y29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0ZSk7CisgICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5
cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleVN0cmluZ1R5cGVCeXRlKTsKKyAg
ICAgICAgcmV0LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGtleS5zdHJpbmcoKSkpOwor
ICAgICAgICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpEYXRlVHlwZToKKyAgICAgICAg
cmV0ID0gZW5jb2RlQnl0ZShrSURCS2V5RGF0ZVR5cGVCeXRlKTsKKyAgICAgICAgcmV0LmFwcGVu
ZChlbmNvZGVEb3VibGUoa2V5LmRhdGUoKSkpOworICAgICAgICBBU1NFUlQocmV0LnNpemUoKSA9
PSA5KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToK
KyAgICAgICAgcmV0ID0gZW5jb2RlQnl0ZShrSURCS2V5TnVtYmVyVHlwZUJ5dGUpOworICAgICAg
ICByZXQuYXBwZW5kKGVuY29kZURvdWJsZShrZXkubnVtYmVyKCkpKTsKKyAgICAgICAgQVNTRVJU
KHJldC5zaXplKCkgPT0gOSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFZlY3RvcjxjaGFyPigpOworfQorCitzdGF0
aWMgY29uc3QgY2hhciogZGVjb2RlSURCS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxp
bWl0LCBSZWZQdHI8SURCS2V5PiYgZm91bmRLZXkpCit7CisgICAgQVNTRVJUKGxpbWl0ID49IHAp
OworICAgIGlmIChwID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVk
IGNoYXIgdHlwZSA9ICpwKys7CisgICAgU3RyaW5nIHM7CisgICAgZG91YmxlIGQ7CisKKyAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgICAgIC8v
IE51bGwuCisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdWxsKCk7CisgICAgICAg
IHJldHVybiBwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAgICAgICAvLyBT
dHJpbmcuCisgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCBzKTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5
ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Ug
a0lEQktleURhdGVUeXBlQnl0ZToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAgcCA9IGRlY29k
ZURvdWJsZShwLCBsaW1pdCwgJmQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7CisgICAgICAg
IHJldHVybiBwOworICAgIGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICAvLyBO
dW1iZXIuCisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAg
aWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5
OjpjcmVhdGVOdW1iZXIoZCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciog
ZXh0cmFjdEVuY29kZWRJREJLZXkoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0
LCBWZWN0b3I8Y2hhcj4qIHJlc3VsdCkKK3sKKyAgICBjb25zdCBjaGFyKiBwID0gc3RhcnQ7Cisg
ICAgaWYgKHAgPj0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgY2hh
ciB0eXBlID0gKnArKzsKKworICAgIGludDY0X3Qgc3RyaW5nTGVuOworCisgICAgc3dpdGNoICh0
eXBlKSB7CisgICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU1p
bktleVR5cGVCeXRlOgorICAgICAgICAqcmVzdWx0ID0gZW5jb2RlQnl0ZSh0eXBlKTsKKyAgICAg
ICAgcmV0dXJuIHA7CisgICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6CisgICAgICAgIC8v
IFN0cmluZy4KKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgc3RyaW5nTGVuKTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwICsg
c3RyaW5nTGVuICogMiA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
c3VsdC0+Y2xlYXIoKTsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQoc3RhcnQsIHAgLSBzdGFydCAr
IHN0cmluZ0xlbiAqIDIpOworICAgICAgICByZXR1cm4gcCArIHN0cmluZ0xlbiAqIDI7CisgICAg
Y2FzZSBrSURCS2V5RGF0ZVR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRl
OgorICAgICAgICAvLyBEYXRlIG9yIG51bWJlci4KKyAgICAgICAgaWYgKHAgKyBzaXplb2YoZG91
YmxlKSA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJlc3VsdC0+Y2xl
YXIoKTsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQoc3RhcnQsIDEgKyBzaXplb2YoZG91YmxlKSk7
CisgICAgICAgIHJldHVybiBwICsgc2l6ZW9mKGRvdWJsZSk7CisgICAgfQorICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVFbmNv
ZGVkSURCS2V5cyhjb25zdCBWZWN0b3I8Y2hhcj4mIGtleUEsIGNvbnN0IFZlY3RvcjxjaGFyPiYg
a2V5QikKK3sKKyAgICBBU1NFUlQoa2V5QS5zaXplKCkgPj0gMSk7CisgICAgQVNTRVJUKGtleUIu
c2l6ZSgpID49IDEpOworCisgICAgY29uc3QgY2hhciogcCA9IGtleUEuZGF0YSgpOworICAgIGNv
bnN0IGNoYXIqIGxpbWl0QSA9IHAgKyBrZXlBLnNpemUoKTsKKyAgICBjb25zdCBjaGFyKiBxID0g
a2V5Qi5kYXRhKCk7CisgICAgY29uc3QgY2hhciogbGltaXRCID0gcSArIGtleUIuc2l6ZSgpOwor
CisgICAgdW5zaWduZWQgY2hhciB0eXBlQSA9ICpwKys7CisgICAgdW5zaWduZWQgY2hhciB0eXBl
QiA9ICpxKys7CisKKyAgICBTdHJpbmcgcywgdDsKKyAgICBkb3VibGUgZCwgZTsKKworICAgIGlm
IChpbnQgeCA9IHR5cGVCIC0gdHlwZUEpIC8vIEZJWE1FOiBOb3RlIHRoZSBzdWJ0bGVuZXNzIQor
ICAgICAgICByZXR1cm4geDsKKworICAgIHN3aXRjaCAodHlwZUEpIHsKKyAgICBjYXNlIGtJREJL
ZXlOdWxsVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TWluS2V5VHlwZUJ5dGU6CisgICAgICAg
IC8vIE51bGwgdHlwZSBvciBtYXggdHlwZTsgbm8gcGF5bG9hZCB0byBjb21wYXJlLgorICAgICAg
ICByZXR1cm4gMDsKKyAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgLy8g
U3RyaW5nIHR5cGUuCisgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0
QSwgcyk7IC8vIEZJWE1FOiBDb21wYXJlIHdpdGhvdXQgYWN0dWFsbHkgZGVjb2RpbmcgdGhlIFN0
cmluZyEKKyAgICAgICAgQVNTRVJUKHApOworICAgICAgICBxID0gZGVjb2RlU3RyaW5nV2l0aExl
bmd0aChxLCBsaW1pdEIsIHQpOworICAgICAgICBBU1NFUlQocSk7CisgICAgICAgIHJldHVybiBj
b2RlUG9pbnRDb21wYXJlKHMsIHQpOworICAgIGNhc2Uga0lEQktleURhdGVUeXBlQnl0ZToKKyAg
ICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0ZToKKyAgICAgICAgLy8gRGF0ZSBvciBudW1iZXIu
CisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXRBLCAmZCk7CisgICAgICAgIEFTU0VS
VChwKTsKKyAgICAgICAgcSA9IGRlY29kZURvdWJsZShxLCBsaW1pdEIsICZlKTsKKyAgICAgICAg
QVNTRVJUKHEpOworICAgICAgICBpZiAoZCA8IGUpCisgICAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICAgIGlmIChkID4gZSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30K
Kworc3RhdGljIGJvb2wgZ2V0SW50KExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3Rvcjxj
aGFyPiYga2V5LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0
OworICAgIGlmICghZGItPmdldChrZXksIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGZvdW5kSW50ID0gZGVjb2RlSW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkp
OworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwdXRJbnQoTGV2ZWxEQkRhdGFi
YXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXksIGludDY0X3QgdmFsdWUpCit7CisgICAg
cmV0dXJuIGRiLT5wdXQoa2V5LCBlbmNvZGVJbnQodmFsdWUpKTsKK30KKworc3RhdGljIGJvb2wg
Z2V0U3RyaW5nKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBT
dHJpbmcmIGZvdW5kU3RyaW5nKQoreworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAgaWYg
KCFkYi0+Z2V0KGtleSwgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm91
bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHB1dFN0cmluZyhMZXZlbERCRGF0YWJh
c2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQorewor
ICAgIGlmICghZGItPnB1dChrZXksIGVuY29kZVN0cmluZyh2YWx1ZSkpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBLZXlQ
cmVmaXggeworcHVibGljOgorICAgIEtleVByZWZpeCgpCisgICAgICAgIDogbV9kYXRhYmFzZUlk
KGtJbnZhbGlkVHlwZSkKKyAgICAgICAgLCBtX29iamVjdFN0b3JlSWQoa0ludmFsaWRUeXBlKQor
ICAgICAgICAsIG1faW5kZXhJZChrSW52YWxpZFR5cGUpCisgICAgeworICAgIH0KKworICAgIEtl
eVByZWZpeChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkKQorICAgICAgICA6IG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICAgICAs
IG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhJZChpbmRl
eElkKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0
IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQpCisgICAg
eworICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9ICpzdGFydCsrOworCisgICAgICAgIGlu
dCBkYXRhYmFzZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgICAg
ICBpbnQgb2JqZWN0U3RvcmVJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsK
KyAgICAgICAgaW50IGluZGV4SWRCeXRlcyA9IChmaXJzdEJ5dGUgJiAweDMpICsgMTsKKworICAg
ICAgICBpZiAoc3RhcnQgKyBkYXRhYmFzZUlkQnl0ZXMgKyBvYmplY3RTdG9yZUlkQnl0ZXMgKyBp
bmRleElkQnl0ZXMgPiBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHJl
c3VsdC0+bV9kYXRhYmFzZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGRhdGFiYXNlSWRC
eXRlcyk7CisgICAgICAgIHN0YXJ0ICs9IGRhdGFiYXNlSWRCeXRlczsKKyAgICAgICAgcmVzdWx0
LT5tX29iamVjdFN0b3JlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgb2JqZWN0U3RvcmVJ
ZEJ5dGVzKTsKKyAgICAgICAgc3RhcnQgKz0gb2JqZWN0U3RvcmVJZEJ5dGVzOworICAgICAgICBy
ZXN1bHQtPm1faW5kZXhJZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBpbmRleElkQnl0ZXMp
OworICAgICAgICBzdGFydCArPSBpbmRleElkQnl0ZXM7CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0
OworICAgIH0KKworICAgIFZlY3RvcjxjaGFyPiBlbmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52YWxpZElkKTsKKyAgICAgICAgQVNTRVJUKG1f
b2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElkKTsKKyAgICAgICAgQVNTRVJUKG1faW5kZXhJZCAh
PSBrSW52YWxpZElkKTsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gZGF0YWJhc2VJZFN0cmluZyA9
IGVuY29kZUludChtX2RhdGFiYXNlSWQpOworICAgICAgICBWZWN0b3I8Y2hhcj4gb2JqZWN0U3Rv
cmVJZFN0cmluZyA9IGVuY29kZUludChtX29iamVjdFN0b3JlSWQpOworICAgICAgICBWZWN0b3I8
Y2hhcj4gaW5kZXhJZFN0cmluZyA9IGVuY29kZUludChtX2luZGV4SWQpOworCisgICAgICAgIEFT
U0VSVChkYXRhYmFzZUlkU3RyaW5nLnNpemUoKSA8PSA4KTsKKyAgICAgICAgQVNTRVJUKG9iamVj
dFN0b3JlSWRTdHJpbmcuc2l6ZSgpIDw9IDgpOworICAgICAgICBBU1NFUlQoaW5kZXhJZFN0cmlu
Zy5zaXplKCkgPD0gNCk7CisKKworICAgICAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9IChk
YXRhYmFzZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IDUgfCAob2JqZWN0U3RvcmVJZFN0cmluZy5z
aXplKCkgLSAxKSA8PCAyIHwgKGluZGV4SWRTdHJpbmcuc2l6ZSgpIC0gMSk7CisgICAgICAgIFZl
Y3RvcjxjaGFyPiByZXQ7CisgICAgICAgIHJldC5hcHBlbmQoZmlyc3RCeXRlKTsKKyAgICAgICAg
cmV0LmFwcGVuZChkYXRhYmFzZUlkU3RyaW5nKTsKKyAgICAgICAgcmV0LmFwcGVuZChvYmplY3RT
dG9yZUlkU3RyaW5nKTsKKyAgICAgICAgcmV0LmFwcGVuZChpbmRleElkU3RyaW5nKTsKKworICAg
ICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IEtleVByZWZp
eCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IGtJ
bnZhbGlkSWQpOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQp
OworICAgICAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOworCisgICAgICAgIGlm
IChtX2RhdGFiYXNlSWQgIT0gb3RoZXIubV9kYXRhYmFzZUlkKQorICAgICAgICAgICAgcmV0dXJu
IG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKKyAgICAgICAgaWYgKG1fb2JqZWN0
U3RvcmVJZCAhPSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4gbV9v
YmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOworICAgICAgICBpZiAobV9pbmRl
eElkICE9IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBv
dGhlci5tX2luZGV4SWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVudW0gVHlw
ZSB7CisgICAgICAgIGtHbG9iYWxNZXRhRGF0YSwKKyAgICAgICAga0RhdGFiYXNlTWV0YURhdGEs
CisgICAgICAgIGtPYmplY3RTdG9yZURhdGEsCisgICAgICAgIGtFeGlzdHNFbnRyeSwKKyAgICAg
ICAga0luZGV4RGF0YSwKKyAgICAgICAga0ludmFsaWRUeXBlCisgICAgfTsKKworICAgIFR5cGUg
dHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IGtJbnZh
bGlkSWQpOworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQpOwor
ICAgICAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOworCisgICAgICAgIGlmICgh
bV9kYXRhYmFzZUlkKQorICAgICAgICAgICAgcmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKKyAgICAg
ICAgaWYgKCFtX29iamVjdFN0b3JlSWQpCisgICAgICAgICAgICByZXR1cm4ga0RhdGFiYXNlTWV0
YURhdGE7CisgICAgICAgIGlmIChtX2luZGV4SWQgPT0ga09iamVjdFN0b3JlRGF0YUluZGV4SWQp
CisgICAgICAgICAgICByZXR1cm4ga09iamVjdFN0b3JlRGF0YTsKKyAgICAgICAgaWYgKG1faW5k
ZXhJZCA9PSBrRXhpc3RzRW50cnlJbmRleElkKQorICAgICAgICAgICAgcmV0dXJuIGtFeGlzdHNF
bnRyeTsKKyAgICAgICAgaWYgKG1faW5kZXhJZCA+PSBrTWluaW11bUluZGV4SWQpCisgICAgICAg
ICAgICByZXR1cm4ga0luZGV4RGF0YTsKKworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgcmV0dXJuIGtJbnZhbGlkVHlwZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1fZGF0
YWJhc2VJZDsKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5k
ZXhJZDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtJbnZhbGlkSWQgPSAtMTsKK307CisK
K2NsYXNzIFNjaGVtYVZlcnNpb25LZXkgeworcHVibGljOgorICAgIHN0YXRpYyBWZWN0b3I8Y2hh
cj4gZW5jb2RlKCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7Cisg
ICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5h
cHBlbmQoZW5jb2RlQnl0ZShrU2NoZW1hVmVyc2lvblR5cGVCeXRlKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgfQorfTsKKworY2xhc3MgTWF4RGF0YWJhc2VJZEtleSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4
IHByZWZpeCgwLCAwLCAwKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNv
ZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtNYXhEYXRhYmFzZUlkVHlwZUJ5
dGUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9OworCitjbGFzcyBEYXRhYmFzZUZy
ZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCkKKyAgICAgICAg
OiBtX2RhdGFiYXNlSWQoLTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZy
ZWVMaXN0S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAg
ICAgICBjb25zdCBjaGFyICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFT
U0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2Jq
ZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgICAg
IGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2lnbmVk
IGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0
eXBlQnl0ZSA9PSBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhcklu
dChwLCBsaW1pdCwgcmVzdWx0LT5tX2RhdGFiYXNlSWQpOworICAgIH0KKworICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCkKKyAgICB7CisgICAgICAgIEtl
eVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVm
aXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrRGF0YWJhc2VGcmVl
TGlzdFR5cGVCeXRlKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KGRhdGFiYXNl
SWQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRhdGFiYXNl
SWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKKyAg
ICAgICAgcmV0dXJuIG1fZGF0YWJhc2VJZDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25z
dCBEYXRhYmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAgICAgIHJldHVybiBtX2RhdGFiYXNlSWQgLSBvdGhl
ci5tX2RhdGFiYXNlSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFz
ZUlkOworfTsKKworY2xhc3MgRGF0YWJhc2VOYW1lS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
Y29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwg
RGF0YWJhc2VOYW1lS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4
OworICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0
LCAmcHJlZml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAg
ICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4
Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Cisg
ICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVC
eXRlLCB0eXBlQnl0ZSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9
PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlU3RyaW5n
V2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX29yaWdpbik7CisgICAgICAgIGlmICghcCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExl
bmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX2RhdGFiYXNlTmFtZSk7CisgICAgfQorCisgICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0IFN0cmlu
ZyYgZGF0YWJhc2VOYW1lKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAw
KTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAg
cmV0LmFwcGVuZChlbmNvZGVCeXRlKGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSkpOworICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob3JpZ2luKSk7CisgICAgICAgIHJldC5h
cHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgcmV0
dXJuIHJldDsKKyAgICB9CisKKyAgICBTdHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9v
cmlnaW47IH0KKyAgICBTdHJpbmcgZGF0YWJhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
YmFzZU5hbWU7IH0KKworICAgIGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNlTmFtZUtleSYgb3Ro
ZXIpCisgICAgeworICAgICAgICBpZiAoaW50IHggPSBjb2RlUG9pbnRDb21wYXJlKG1fb3JpZ2lu
LCBvdGhlci5tX29yaWdpbikpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgcmV0dXJu
IGNvZGVQb2ludENvbXBhcmUobV9kYXRhYmFzZU5hbWUsIG90aGVyLm1fZGF0YWJhc2VOYW1lKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fb3JpZ2luOyAvLyBGSVhNRTogU3RvcmUg
ZW5jb2RlZCBzdHJpbmdzLCBvciBqdXN0IHBvaW50ZXJzLgorICAgIFN0cmluZyBtX2RhdGFiYXNl
TmFtZTsKK307CisKK2NsYXNzIERhdGFiYXNlTWV0YURhdGFLZXkgeworcHVibGljOgorICAgIGVu
dW0gTWV0YURhdGFUeXBlIHsKKyAgICAgICAga09yaWdpbk5hbWUgPSAwLAorICAgICAgICBrRGF0
YWJhc2VOYW1lID0gMSwKKyAgICAgICAga1VzZXJWZXJzaW9uID0gMiwKKyAgICAgICAga01heE9i
amVjdFN0b3JlSWQgPSAzCisgICAgfTsKKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgTWV0YURhdGFUeXBlIG1ldGFEYXRhVHlwZSkKKyAgICB7Cisg
ICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIFZlY3Rv
cjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2Rl
Qnl0ZShtZXRhRGF0YVR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9OworCitj
bGFzcyBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IHsKK3B1YmxpYzoKKyAgICBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9t
ZXRhRGF0YVR5cGUoLTEpCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAg
ICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFT
U0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmpl
Y3RTdG9yZUlkKTsKKyAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICAgICAg
aWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdW5zaWduZWQg
Y2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5
cGVCeXRlID09IGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpOworICAgICAgICBpZiAocCA9
PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIGlmICghcCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocmVzdWx0LT5tX29iamVjdFN0b3Jl
SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBl
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBtZXRhRGF0YVR5cGUpCisgICAg
eworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBW
ZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5j
b2RlVmFySW50KG1ldGFEYXRhVHlwZSkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwor
ICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQo
bV9vYmplY3RTdG9yZUlkID49IDApOworICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwor
ICAgIH0KKyAgICBpbnQ2NF90IG1ldGFEYXRhVHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICBB
U1NFUlQobV9tZXRhRGF0YVR5cGUgPj0gMCk7CisgICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlw
ZTsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
JiBvdGhlcikKKyAgICB7CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Cisg
ICAgICAgIEFTU0VSVChtX21ldGFEYXRhVHlwZSA+PSAwKTsKKyAgICAgICAgaWYgKGludCB4ID0g
bV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0
dXJuIHg7IC8vIEZJWE1FOiBJcyB0aGlzIGNhc3Qgc2FmZT8gSS5lLiwgd2lsbCBpdCBwcmVzZXJ2
ZSB0aGUgc2lnbj8KKyAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRh
RGF0YVR5cGU7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlk
OworICAgIGludDY0X3QgbV9tZXRhRGF0YVR5cGU7IC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBieXRl
LgorfTsKKworY2xhc3MgSW5kZXhNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgSW5kZXhNZXRh
RGF0YUtleSgpCisgICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICAgICAsIG1faW5k
ZXhJZCgtMSkKKyAgICAgICAgLCBtX21ldGFEYXRhVHlwZSgwKQorICAgIHsKKyAgICB9CisKKyAg
ICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFy
KiBsaW1pdCwgSW5kZXhNZXRhRGF0YUtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJl
Zml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0
YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VS
VCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5k
ZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5V
U0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICAg
ICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRl
Y29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBp
ZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4SWQpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgcmVzdWx0LT5tX21ldGFEYXRhVHlwZSA9ICpwKys7CisgICAgICAgIHJldHVy
biBwOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVk
IGNoYXIgbWV0YURhdGFUeXBlKQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRh
YmFzZUlkLCAwLCAwKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUo
KTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUp
KTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChpbmRleElkKSk7CisgICAgICAgIHJldC5hcHBl
bmQoZW5jb2RlQnl0ZShtZXRhRGF0YVR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9
CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcikKKyAgICB7
CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVCht
X2luZGV4SWQgPj0gMCk7CisKKyAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0g
b3RoZXIubV9vYmplY3RTdG9yZUlkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIGlm
IChpbnQgeCA9IG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgICAgIHJldHVy
biB4OworICAgICAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRhVHlw
ZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1faW5kZXhJZDsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWV0
YURhdGFUeXBlOyB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Cisg
ICAgaW50NjRfdCBtX2luZGV4SWQ7CisgICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlwZTsK
K307CisKK2NsYXNzIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgeworcHVibGljOgorICAgIE9iamVj
dFN0b3JlRnJlZUxpc3RLZXkoKQorICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAgICB7
CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFy
dCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkqIHJlc3VsdCkKKyAg
ICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBL
ZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXAp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNl
SWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBB
U1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsK
KyAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3Jl
RnJlZUxpc3RUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKKyAgICB7CisgICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgICAgIFZlY3Rvcjxj
aGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0
ZShrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5j
b2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisK
KyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsK
KyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5JiBv
dGhlcikKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRoYXQg
d2UncmUgbm90IGNvbXBhcmluZyBkYXRhYmFzZSBpZCdzLAorICAgICAgICAvLyBidXQgdGhhdCBj
b21wYXJpc29uIHdpbGwgaGF2ZSBiZWVuIG1hZGUgZWFybGllci4KKyAgICAgICAgLy8gV2Ugc2hv
dWxkIHByb2JhYmx5IG1ha2UgdGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KKyAgICAgICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJ
ZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRf
dCBtX29iamVjdFN0b3JlSWQ7Cit9OworCitjbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKK3B1Ymxp
YzoKKyAgICBJbmRleEZyZWVMaXN0S2V5KCkKKyAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEp
CisgICAgICAgICwgbV9pbmRleElkKC0xKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY29u
c3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5k
ZXhGcmVlTGlzdEtleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeDsK
KyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwg
JnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1f
b2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAg
ICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuc2ln
bmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRl
LCB0eXBlQnl0ZSA9PSBrSW5kZXhGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICAgICAgaWYgKHAgPT0g
bGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgICAgICBpZiAoIXApCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwg
cmVzdWx0LT5tX2luZGV4SWQpOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDAp
OworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4RnJlZUxpc3RUeXBlQnl0ZSkpOworICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJldC5hcHBl
bmQoZW5jb2RlVmFySW50KGluZGV4SWQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisK
KyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleEZyZWVMaXN0S2V5JiBvdGhlcikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX2lu
ZGV4SWQgPj0gMCk7CisgICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVy
Lm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4g
bV9pbmRleElkIC0gb3RoZXIubV9pbmRleElkOworICAgIH0KKworICAgIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOworICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOworICAgIH0KKworICAgIGludDY0
X3QgaW5kZXhJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDAp
OworICAgICAgICByZXR1cm4gbV9pbmRleElkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2NF90IG1faW5kZXhJZDsKK307CisKK2NsYXNz
IE9iamVjdFN0b3JlTmFtZXNLZXkgeworcHVibGljOgorICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1
c2UgdGhpcyB0byBsb29rIHVwIG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisg
ICAgLy8gaXMga2VwdCBpbiB0aGUgSURCRGF0YWJhc2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBw
aW5nIGJlY29tZSB1bnJlbGlhYmxlPworICAgIC8vIENhbiB3ZSByZW1vdmUgdGhpcz8KKyAgICBz
dGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBs
aW1pdCwgT2JqZWN0U3RvcmVOYW1lc0tleSogcmVzdWx0KQorICAgIHsKKyAgICAgICAgS2V5UHJl
Zml4IHByZWZpeDsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0
YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VS
VCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5k
ZXhJZCk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgICAgICBBU1NFUlRfVU5V
U0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKTsKKyAg
ICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9v
YmplY3RTdG9yZU5hbWUpOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCisgICAg
eworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgICAgICBW
ZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa1NjaGVtYVZlcnNpb25UeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSkpOworICAgICAgICByZXQuYXBwZW5k
KGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob2JqZWN0U3RvcmVOYW1lKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tl
eSYgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVj
dFN0b3JlTmFtZSwgb3RoZXIubV9vYmplY3RTdG9yZU5hbWUpOworICAgIH0KKworICAgIFN0cmlu
ZyBvYmplY3RTdG9yZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX29iamVjdFN0b3JlTmFtZTsgfQor
Citwcml2YXRlOgorICAgIFN0cmluZyBtX29iamVjdFN0b3JlTmFtZTsgLy8gRklYTUU6IFN0b3Jl
IHRoZSBlbmNvZGVkIHN0cmluZywgb3IganVzdCBwb2ludGVycyB0byBpdC4KK307CisKK2NsYXNz
IEluZGV4TmFtZXNLZXkgeworcHVibGljOgorICAgIEluZGV4TmFtZXNLZXkoKQorICAgICAgICA6
IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAgICB7CisgICAgfQorCisgICAgLy8gRklYTUU6IFdlIG5l
dmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgaW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGluZworICAg
IC8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TmFtZXNLZXkq
IHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAgIGNvbnN0
IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAg
ICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUKHByZWZp
eC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQp
OworICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOworICAgICAgICBpZiAocCA9PSBs
aW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVC
eXRlID0gKnArKzsKKyAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0g
a0luZGV4TmFtZXNLZXlUeXBlQnl0ZSk7CisgICAgICAgIGlmIChwID09IGxpbWl0KQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3Vs
dC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1
bHQtPm1faW5kZXhOYW1lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5n
JiBpbmRleE5hbWUpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQs
IDAsIDApOworICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4TmFtZXNLZXlUeXBlQnl0ZSkpOworICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7CisgICAgICAgIHJl
dC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChpbmRleE5hbWUpKTsKKyAgICAgICAgcmV0
dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE5hbWVzS2V5JiBv
dGhlcikKKyAgICB7CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAg
ICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkK
KyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZSht
X2luZGV4TmFtZSwgb3RoZXIubV9pbmRleE5hbWUpOworICAgIH0KKworICAgIFN0cmluZyBpbmRl
eE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4TmFtZTsgfQorCitwcml2YXRlOgorICAgIGlu
dDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIFN0cmluZyBtX2luZGV4TmFtZTsKK307CisKK2Ns
YXNzIE9iamVjdFN0b3JlRGF0YUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIq
IGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURh
dGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgICAg
IGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEFTU0VSVChw
cmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3Jl
SWQpOworICAgICAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4TnVt
YmVyKTsKKyAgICAgICAgaWYgKHAgPT0gZW5kKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1fZW5jb2Rl
ZFVzZXJLZXkpOworICAgIH0KKworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4g
ZW5jb2RlZFVzZXJLZXkpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgICAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZWRV
c2VyS2V5KTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0YXRpYyBWZWN0
b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmIHVzZXJLZXkpCisgICAgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSk7CisgICAgfQor
CisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlcikKKyAgICB7
CisgICAgICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwg
b3RoZXIubV9lbmNvZGVkVXNlcktleSk7CisgICAgfQorCisgICAgUGFzc1JlZlB0cjxJREJLZXk+
IHVzZXJLZXkoKSBjb25zdAorICAgIHsKKyAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OworICAg
ICAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2Vy
S2V5LmVuZCgpLCBrZXkpOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHN0YXRp
YyBjb25zdCBpbnQ2NF90IGtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrT2JqZWN0U3RvcmVEYXRhSW5k
ZXhJZDsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsKK307
CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hh
ciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIEV4aXN0c0VudHJ5
S2V5KiByZXN1bHQpCisgICAgeworICAgICAgICBLZXlQcmVmaXggcHJlZml4OworICAgICAgICBj
b25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlQocHJl
Zml4Lm1fZGF0YWJhc2VJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlk
KTsKKyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPT0ga1NwZWNpYWxJbmRleE51bWJl
cik7CisgICAgICAgIGlmIChwID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRV
c2VyS2V5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBl
bmNvZGVkS2V5KQorICAgIHsKKyAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+
IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVkS2V5KTsK
KyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
S2V5JiB1c2VyS2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBlbmNvZGVJREJLZXkodXNlcktleSkpOworICAgIH0KKworICAgIGludCBj
b21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVy
biBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVk
VXNlcktleSk7CisgICAgfQorCisgICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25z
dAorICAgIHsKKyAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OworICAgICAgICBkZWNvZGVJREJL
ZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkp
OworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90
IGtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrRXhpc3RzRW50cnlJbmRleElkOworCitwcml2YXRlOgor
ICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5OworfTsKKworY2xhc3MgSW5kZXhEYXRh
S2V5IHsKK3B1YmxpYzoKKyAgICBJbmRleERhdGFLZXkoKQorICAgICAgICA6IG1fZGF0YWJhc2VJ
ZCgtMSkKKyAgICAgICAgLCBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgICAgICwgbV9pbmRleElk
KC0xKQorICAgICAgICAsIG1fc2VxdWVuY2VOdW1iZXIoLTEpCisgICAgeworICAgIH0KKworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCkKKyAgICB7CisgICAgICAgIEtleVByZWZpeCBw
cmVmaXg7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwg
bGltaXQsICZwcmVmaXgpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgICAgICBBU1NFUlQocHJl
Zml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID49
IGtNaW5pbXVtSW5kZXhJZCk7CisgICAgICAgIHJlc3VsdC0+bV9kYXRhYmFzZUlkID0gcHJlZml4
Lm1fZGF0YWJhc2VJZDsKKyAgICAgICAgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQgPSBwcmVmaXgu
bV9vYmplY3RTdG9yZUlkOworICAgICAgICByZXN1bHQtPm1faW5kZXhJZCA9IHByZWZpeC5tX2lu
ZGV4SWQ7CisgICAgICAgIHAgPSBleHRyYWN0RW5jb2RlZElEQktleShwLCBsaW1pdCwgJnJlc3Vs
dC0+bV9lbmNvZGVkVXNlcktleSk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBpZiAocCA9PSBsaW1pdCkgeworICAgICAgICAgICAgcmVzdWx0LT5tX3Nl
cXVlbmNlTnVtYmVyID0gLTE7IC8vIEZJWE1FOiBXZSBzaG91bGQgY2hhbmdlIGl0IHNvIHRoYXQg
YWxsIGtleXMgaGF2ZSBhIHNlcXVlbmNlIG51bWJlci4gU2hvdWxkbid0IG5lZWQgdG8gaGFuZGxl
IHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9zZXF1ZW5jZU51bWJlcik7Cisg
ICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNo
YXI+JiBlbmNvZGVkVXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7
CisgICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgICAgIHJl
dC5hcHBlbmQoZW5jb2RlZFVzZXJLZXkpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZhcklu
dChzZXF1ZW5jZU51bWJlcikpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0
YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYgdXNlcktleSwgaW50NjRf
dCBzZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpLCBzZXF1ZW5j
ZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhLZXko
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCisgICAgeworICAgICAg
ICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDMyX01BWCwgbWF4
SURCS2V5KCksIElOVDY0X01BWCk7CisgICAgfQorCisgICAgaW50IGNvbXBhcmUoY29uc3QgSW5k
ZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlcikKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX29iamVjdFN0
b3JlSWQgPj0gMCk7CisgICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7CisgICAgICAgIGlm
IChpbnQgeCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5t
X2VuY29kZWRVc2VyS2V5KSkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBpZiAoaWdu
b3JlU2VxdWVuY2VOdW1iZXIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJu
IG1fc2VxdWVuY2VOdW1iZXIgLSBvdGhlci5tX3NlcXVlbmNlTnVtYmVyOworICAgIH0KKworICAg
IGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9kYXRh
YmFzZUlkID49IDApOworICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkOworICAgIH0KKworICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQobV9v
YmplY3RTdG9yZUlkID49IDApOworICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOworICAg
IH0KKworICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQo
bV9pbmRleElkID49IDApOworICAgICAgICByZXR1cm4gbV9pbmRleElkOworICAgIH0KKworICAg
IFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3QKKyAgICB7CisgICAgICAgIFJlZlB0
cjxJREJLZXk+IGtleTsKKyAgICAgICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVn
aW4oKSwgbV9lbmNvZGVkVXNlcktleS5lbmQoKSwga2V5KTsKKyAgICAgICAgcmV0dXJuIGtleTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgaW50NjRf
dCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7CisgICAgVmVjdG9yPGNo
YXI+IG1fZW5jb2RlZFVzZXJLZXk7CisgICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVyOworfTsK
KworbmFtZXNwYWNlIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEtleVR5cGU+CitpbnQgZGVjb2RlQW5k
Q29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sK
KyAgICBLZXlUeXBlIGtleUE7CisgICAgS2V5VHlwZSBrZXlCOworCisgICAgY29uc3QgY2hhciog
cHRyQSA9IEtleVR5cGU6OmRlY29kZShhLmJlZ2luKCksIGEuZW5kKCksICZrZXlBKTsKKyAgICBB
U1NFUlRfVU5VU0VEKHB0ckEsIHB0ckEpOworICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBLZXlUeXBl
OjpkZWNvZGUoYi5iZWdpbigpLCBiLmVuZCgpLCAma2V5Qik7CisgICAgQVNTRVJUX1VOVVNFRChw
dHJCLCBwdHJCKTsKKworICAgIHJldHVybiBrZXlBLmNvbXBhcmUoa2V5Qik7Cit9Cit9CisKK3N0
YXRpYyBpbnQgcmVhbENvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERC
U2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzID0gZmFsc2UpCit7CisgICAgY29uc3QgY2hhciogcHRy
QSA9IGEuYmVnaW4oKTsKKyAgICBjb25zdCBjaGFyKiBwdHJCID0gYi5iZWdpbigpOworICAgIGNv
bnN0IGNoYXIqIGVuZEEgPSBhLmVuZCgpOworICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBiLmVuZCgp
OworCisgICAgS2V5UHJlZml4IHByZWZpeEE7CisgICAgS2V5UHJlZml4IHByZWZpeEI7CisKKyAg
ICBwdHJBID0gS2V5UHJlZml4OjpkZWNvZGUocHRyQSwgZW5kQSwgJnByZWZpeEEpOworICAgIHB0
ckIgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJCLCBlbmRCLCAmcHJlZml4Qik7CisgICAgQVNTRVJU
KHB0ckEpOworICAgIEFTU0VSVChwdHJCKTsKKworICAgIGlmIChpbnQgeCA9IHByZWZpeEEuY29t
cGFyZShwcmVmaXhCKSkKKyAgICAgICAgcmV0dXJuIHg7CisKKyAgICBpZiAocHJlZml4QS50eXBl
KCkgPT0gS2V5UHJlZml4OjprR2xvYmFsTWV0YURhdGEpIHsKKyAgICAgICAgQVNTRVJUKHB0ckEg
IT0gZW5kQSk7CisgICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOworCisgICAgICAgIHVuc2ln
bmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckErKzsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBl
Qnl0ZUIgPSAqcHRyQisrOworCisgICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVC
eXRlQikKKyAgICAgICAgICAgIHJldHVybiB4OworCisgICAgICAgIGlmICh0eXBlQnl0ZUEgPD0g
MSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtEYXRh
YmFzZUZyZWVMaXN0VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFy
ZTxEYXRhYmFzZUZyZWVMaXN0S2V5PihhLCBiKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBr
RGF0YWJhc2VOYW1lVHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFy
ZTxEYXRhYmFzZU5hbWVLZXk+KGEsIGIpOworICAgIH0KKworICAgIGlmIChwcmVmaXhBLnR5cGUo
KSA9PSBLZXlQcmVmaXg6OmtEYXRhYmFzZU1ldGFEYXRhKSB7CisgICAgICAgIEFTU0VSVChwdHJB
ICE9IGVuZEEpOworICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKKworICAgICAgICB1bnNp
Z25lZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlw
ZUJ5dGVCID0gKnB0ckIrKzsKKworICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBl
Qnl0ZUIpCisgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAgICBpZiAodHlwZUJ5dGVBIDw9
IDMpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtP
YmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5k
Q29tcGFyZTxPYmplY3RTdG9yZU1ldGFEYXRhS2V5PihhLCBiKTsKKyAgICAgICAgaWYgKHR5cGVC
eXRlQSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29k
ZUFuZENvbXBhcmU8SW5kZXhNZXRhRGF0YUtleT4oYSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0
ZUEgPT0ga09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBk
ZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlRnJlZUxpc3RLZXk+KGEsIGIpOworICAgICAgICBp
ZiAodHlwZUJ5dGVBID09IGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1
cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRleEZyZWVMaXN0S2V5PihhLCBiKTsKKyAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKQorICAgICAgICAgICAgcmV0
dXJuIGRlY29kZUFuZENvbXBhcmU8T2JqZWN0U3RvcmVOYW1lc0tleT4oYSwgYik7CisgICAgICAg
IGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4TmFtZXNLZXlUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJl
dHVybiBkZWNvZGVBbmRDb21wYXJlPEluZGV4TmFtZXNLZXk+KGEsIGIpOworCisgICAgICAgIHJl
dHVybiAwOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICBpZiAo
cHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprT2JqZWN0U3RvcmVEYXRhKSB7CisgICAgICAg
IGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAg
ICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRo
aXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBo
YW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVj
dFN0b3JlRGF0YUtleT4oYSwgYik7CisgICAgfQorICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBL
ZXlQcmVmaXg6OmtFeGlzdHNFbnRyeSkgeworICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0
ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocHRyQSA9PSBl
bmRBKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQor
ICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5n
IHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKworICAg
ICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxFeGlzdHNFbnRyeUtleT4oYSwgYik7CisgICAg
fQorICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtJbmRleERhdGEpIHsKKyAg
ICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgIHJldHVybiAtMTsK
KyAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhN
RTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRv
IGJlIGhhbmRsZWQgdGhpcyB3YXkuCisKKyAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtl
eUE7CisgICAgICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXlCOworCisgICAgICAgIHB0ckEg
PSBJbmRleERhdGFLZXk6OmRlY29kZShhLmJlZ2luKCksIGVuZEEsICZpbmRleERhdGFLZXlBKTsK
KyAgICAgICAgcHRyQiA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKGIuYmVnaW4oKSwgZW5kQiwgJmlu
ZGV4RGF0YUtleUIpOworICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgIEFTU0VSVChwdHJC
KTsKKworICAgICAgICBib29sIGlnbm9yZVNlcXVlbmNlTnVtYmVyID0gaW5kZXhLZXlzOworICAg
ICAgICByZXR1cm4gaW5kZXhEYXRhS2V5QS5jb21wYXJlKGluZGV4RGF0YUtleUIsIGlnbm9yZVNl
cXVlbmNlTnVtYmVyKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICBy
ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXJlS2V5cyhjb25zdCBMZXZlbERCU2xpY2Um
IGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sKKyAgICByZXR1cm4gcmVhbENvbXBhcmUoYSwg
Yik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUluZGV4S2V5cyhjb25zdCBMZXZlbERCU2xpY2Um
IGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sKKyAgICByZXR1cm4gcmVhbENvbXBhcmUoYSwg
YiwgdHJ1ZSk7Cit9CisKK2NsYXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgTGV2ZWxEQkNvbXBhcmF0
b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNl
JiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpIGNvbnN0IHsgcmV0dXJuIHJlYWxDb21wYXJlKGEs
IGIpOyB9CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gImlk
Yl9jbXAxIjsgfQorfTsKK30KKworc3RhdGljIGJvb2wgc2V0VXBNZXRhZGF0YShMZXZlbERCRGF0
YWJhc2UqIGRiKQoreworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtZXRhRGF0YUtleSA9IFNjaGVt
YVZlcnNpb25LZXk6OmVuY29kZSgpOworCisgICAgaW50NjRfdCBzY2hlbWFWZXJzaW9uOworICAg
IGlmICghZ2V0SW50KGRiLCBtZXRhRGF0YUtleSwgc2NoZW1hVmVyc2lvbikpIHsKKyAgICAgICAg
c2NoZW1hVmVyc2lvbiA9IDA7CisgICAgICAgIGlmICghcHV0SW50KGRiLCBtZXRhRGF0YUtleSwg
c2NoZW1hVmVyc2lvbikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
Ly8gRklYTUU6IEV2ZW50dWFsbHksIHdlJ2xsIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFuc2l0aW9u
IGJldHdlZW4gc2NoZW1hcy4KKyAgICBpZiAoc2NoZW1hVmVyc2lvbikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOyAvLyBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZlcnNpb24uCisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6SURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiBmYWN0
b3J5LCBMZXZlbERCRGF0YWJhc2UqIGRiKQogICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIp
CiAgICAgLCBtX2ZhY3RvcnkoZmFjdG9yeSkKICAgICAsIG1fZGIoZGIpCkBAIC00NywxNTcgKzE0
NzMsMTE0MSBAQCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjp+SURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZSgpCiAgICAgbV9mYWN0b3J5LT5yZW1vdmVJREJCYWNraW5nU3RvcmUobV9pZGVudGlmaWVyKTsK
IH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om9wZW4oU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmLCBpbnQ2NF90LCBjb25zdCBTdHJp
bmcmLCBJREJGYWN0b3J5QmFja2VuZEltcGwqKQorUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+
IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3Jp
Z2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlQXJnLCBpbnQ2NF90IG1heGltdW1TaXplLCBjb25z
dCBTdHJpbmcmIGZpbGVJZGVudGlmaWVyLCBJREJGYWN0b3J5QmFja2VuZEltcGwqIGZhY3Rvcnkp
Cit7CisgICAgU3RyaW5nIHBhdGhCYXNlID0gcGF0aEJhc2VBcmc7CisKKyAgICBpZiAocGF0aEJh
c2UuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTog
V2UgbmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlIGZvciBpbmNvZ25pdG8gYW5kIER1bXBSZW5kZXJU
cmVlLgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIW1ha2VBbGxEaXJlY3Rv
cmllcyhwYXRoQmFzZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIElu
ZGV4ZWREQiBkYXRhYmFzZSBwYXRoICVzIiwgcGF0aEJhc2UudXRmOCgpLmRhdGEoKSk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGV2ZW50dWFsbHkg
dXNlIHRoZSBzYW1lIExldmVsREIgZGF0YWJhc2UgZm9yIGFsbCBvcmlnaW5zLgorICAgIFN0cmlu
ZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdp
bi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisKKyAgICBP
d25QdHI8TGV2ZWxEQkNvbXBhcmF0b3I+IGNvbXBhcmF0b3IobmV3IENvbXBhcmF0b3IoKSk7Cisg
ICAgTGV2ZWxEQkRhdGFiYXNlKiBkYiA9IExldmVsREJEYXRhYmFzZTo6b3BlbihwYXRoLCBjb21w
YXJhdG9yLmdldCgpKTsKKyAgICBpZiAoIWRiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8v
IEZJWE1FOiBIYW5kbGUgY29tcGFyYXRvciBuYW1lIGNoYW5nZXMuCisKKyAgICBSZWZQdHI8SURC
TGV2ZWxEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJREJMZXZlbERC
QmFja2luZ1N0b3JlKGZpbGVJZGVudGlmaWVyLCBmYWN0b3J5LCBkYikpKTsKKyAgICBiYWNraW5n
U3RvcmUtPm1fY29tcGFyYXRvciA9IGNvbXBhcmF0b3IucmVsZWFzZSgpOworCisgICAgaWYgKCFz
ZXRVcE1ldGFkYXRhKGJhY2tpbmdTdG9yZS0+bV9kYi5nZXQoKSkpCisgICAgICAgIHJldHVybiAw
OworCisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5yZWxlYXNlKCk7Cit9CisKK2Jvb2wgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5n
JiBuYW1lLCBTdHJpbmcmIGZvdW5kVmVyc2lvbiwgaW50NjRfdCYgZm91bmRJZCkKIHsKLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gYWRv
cHRSZWYobmV3IElEQkxldmVsREJCYWNraW5nU3RvcmUoIiIsIDAsIDApKTsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBu
YW1lKTsKKworICAgIGJvb2wgb2sgPSBnZXRJbnQobV9kYi5nZXQoKSwga2V5LCBmb3VuZElkKTsK
KyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBvayA9IGdldFN0cmlu
ZyhtX2RiLmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoZm91bmRJZCwgRGF0YWJh
c2VNZXRhRGF0YUtleTo6a1VzZXJWZXJzaW9uKSwgZm91bmRWZXJzaW9uKTsKKyAgICBpZiAoIW9r
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj
IGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChMZXZlbERCRGF0YWJhc2UqIGRiKQoreworICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBmcmVlTGlzdFN0YXJ0S2V5ID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6
ZW5jb2RlKDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBmcmVlTGlzdFN0b3BLZXkgPSBEYXRh
YmFzZUZyZWVMaXN0S2V5OjplbmNvZGUoSU5UNjRfTUFYKTsKKworICAgIE93blB0cjxMZXZlbERC
SXRlcmF0b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKGZyZWVM
aXN0U3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgZnJl
ZUxpc3RTdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9
IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyICpsaW1pdCA9IGl0LT5rZXko
KS5lbmQoKTsKKworICAgICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5OworICAg
ICAgICBwID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxpc3RL
ZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgYm9vbCBvayA9IGRiLT5yZW1vdmUo
aXQtPmtleSgpKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgICAgIHJl
dHVybiBmcmVlTGlzdEtleS5kYXRhYmFzZUlkKCk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ290
IGhlcmUsIHRoZXJlIHdhcyBubyBmcmVlLWxpc3QuCisgICAgaW50NjRfdCBtYXhEYXRhYmFzZUlk
ID0gLTE7CisgICAgaWYgKCFnZXRJbnQoZGIsIE1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpLCBt
YXhEYXRhYmFzZUlkKSkKKyAgICAgICAgbWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBBU1NFUlQo
bWF4RGF0YWJhc2VJZCA+PSAwKTsKKworICAgIGludDY0X3QgZGF0YWJhc2VJZCA9IG1heERhdGFi
YXNlSWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIE1heERhdGFiYXNlSWRLZXk6OmVu
Y29kZSgpLCBkYXRhYmFzZUlkKTsKKyAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAgICBy
ZXR1cm4gZGF0YWJhc2VJZDsKKworfQorCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNl
dElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZl
cnNpb24sIGludDY0X3QmIHJvd0lkLCBib29sIGludmFsaWRSb3dJZCkKK3sKKyAgICBpZiAoaW52
YWxpZFJvd0lkKSB7CisgICAgICAgIHJvd0lkID0gZ2V0TmV3RGF0YWJhc2VJZChtX2RiLmdldCgp
KTsKKworICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5Ojpl
bmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKKyAgICAgICAgaWYgKCFwdXRJbnQobV9kYi5nZXQo
KSwga2V5LCByb3dJZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
aWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJv
d0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprVXNlclZlcnNpb24pLCB2ZXJzaW9uKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiwg
U3RyaW5nJiwgaW50NjRfdCYpCit2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldE9iamVj
dFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYgZm91bmRJZHMsIFZl
Y3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmRLZXlQYXRocywg
VmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykKIHsKLSAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAg
Y29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIDEsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0g
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIElOVDY0X01BWCwgMCk7
CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChtX2RiLT5uZXdJdGVyYXRvcigpKTsK
KyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5
cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgeworICAgICAgICBjb25zdCBj
aGFyICpwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxpbWl0ID0g
aXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURh
dGFLZXk7CisgICAgICAgIHAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpkZWNvZGUocCwgbGlt
aXQsICZtZXRhRGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBpbnQ2NF90
IG9iamVjdFN0b3JlSWQgPSBtZXRhRGF0YUtleS5vYmplY3RTdG9yZUlkKCk7CisKKyAgICAgICAg
U3RyaW5nIG9iamVjdFN0b3JlTmFtZSA9IGRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5iZWdpbigp
LCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgaWYg
KCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4
ZWQgREIgZXJyb3IuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAg
U3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZh
bHVlKCkuZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAgIGlmICghaXQtPmlz
VmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVy
cm9yLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2wgYXV0
b0luY3JlbWVudCA9ICppdC0+dmFsdWUoKS5iZWdpbigpOworCisgICAgICAgIGl0LT5uZXh0KCk7
IC8vIElzIGV2aWNhdGJsZS4KKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdC0+bmV4dCgpOyAvLyBMYXN0IHZlcnNp
b24uCisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8gTWF4aXVtIGluZGV4IGlkIGFsbG9jYXRl
ZC4KKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
IkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBmb3VuZElkcy5hcHBlbmQob2JqZWN0U3RvcmVJZCk7CisgICAgICAg
IGZvdW5kTmFtZXMuYXBwZW5kKG9iamVjdFN0b3JlTmFtZSk7CisgICAgICAgIGZvdW5kS2V5UGF0
aHMuYXBwZW5kKGtleVBhdGgpOworICAgICAgICBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncy5hcHBl
bmQoYXV0b0luY3JlbWVudCk7CisgICAgfQogfQogCitzdGF0aWMgaW50NjRfdCBnZXROZXdPYmpl
Y3RTdG9yZUlkKExldmVsREJEYXRhYmFzZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCkKK3sKKyAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdGFydEtleSA9IE9iamVjdFN0b3JlRnJlZUxp
c3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJl
ZUxpc3RTdG9wS2V5ID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IElOVDY0X01BWCk7CisKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChkYi0+bmV3SXRl
cmF0b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhmcmVlTGlzdFN0YXJ0S2V5KTsgaXQtPmlzVmFs
aWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGZyZWVMaXN0U3RvcEtleSkgPCAwOyBpdC0+
bmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAg
ICAgICAgY29uc3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgT2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3Jl
RnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsKKyAgICAgICAgQVNT
RVJUKHApOworCisgICAgICAgIGJvb2wgb2sgPSBkYi0+cmVtb3ZlKGl0LT5rZXkoKSk7CisgICAg
ICAgIEFTU0VSVF9VTlVTRUQob2ssIG9rKTsKKworICAgICAgICByZXR1cm4gZnJlZUxpc3RLZXku
b2JqZWN0U3RvcmVJZCgpOworICAgIH0KIAotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpz
ZXRJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmluZyYsIGludDY0
X3QmLCBib29sKQorICAgIGludDY0X3QgbWF4T2JqZWN0U3RvcmVJZDsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprTWF4T2JqZWN0U3RvcmVJZCk7Cisg
ICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG1heE9iamVjdFN0b3JlSWQp
KQorICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0gMDsKKworICAgIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCA9IG1heE9iamVjdFN0b3JlSWQgKyAxOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIG1h
eE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVF9VTlVTRUQob2ss
IG9rKTsKKworICAgIHJldHVybiBvYmplY3RTdG9yZUlkOworfQorCitib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCwg
aW50NjRfdCYgYXNzaWduZWRPYmplY3RTdG9yZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQ2NF90
IG9iamVjdFN0b3JlSWQgPSBnZXROZXdPYmplY3RTdG9yZUlkKG1fZGIuZ2V0KCksIGRhdGFiYXNl
SWQpOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVLZXkgPSBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgY29uc3Qg
VmVjdG9yPGNoYXI+IGtleVBhdGhLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGF1
dG9JbmNyZW1lbnRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGV2aWN0YWJsZUtl
eSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCAzKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7Cisg
ICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heEluZGV4SWRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNSk7CisgICAgY29uc3QgVmVj
dG9yPGNoYXI+IG5hbWVzS2V5ID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG5hbWUpOworCisgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBuYW1lS2V5
LCBuYW1lKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5k
ZXhlZCBEQiBlcnJvci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9r
ID0gcHV0U3RyaW5nKG1fZGIuZ2V0KCksIGtleVBhdGhLZXksIGtleVBhdGgpOworICAgIGlmICgh
b2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQo
KSwgYXV0b0luY3JlbWVudEtleSwgYXV0b0luY3JlbWVudCk7CisgICAgaWYgKCFvaykgeworICAg
ICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBldmljdGFi
bGVLZXksIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIExPR19FUlJPUigiSW50ZXJu
YWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIGxhc3RWZXJzaW9uS2V5LCAxKTsKKyAgICBpZiAo
IW9rKSB7CisgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0
KCksIG1heEluZGV4SWRLZXksIGtNaW5pbXVtSW5kZXhJZCk7CisgICAgaWYgKCFvaykgeworICAg
ICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBvayA9IHB1dEludChtX2RiLmdldCgpLCBuYW1lc0tl
eSwgb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoIklu
dGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBhc3NpZ25lZE9iamVjdFN0b3JlSWQgPSBvYmplY3RTdG9yZUlkOworCisgICAgcmV0
dXJuIHRydWU7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3Rv
cmVzKGludDY0X3QsIFZlY3RvcjxpbnQ2NF90PiYsIFZlY3RvcjxTdHJpbmc+JiwgVmVjdG9yPFN0
cmluZz4mLCBWZWN0b3I8Ym9vbD4mKQorc3RhdGljIGJvb2wgZGVsZXRlUmFuZ2UoTGV2ZWxEQkRh
dGFiYXNlKiBkYiwgY29uc3QgVmVjdG9yPGNoYXI+JiBiZWdpbiwgY29uc3QgVmVjdG9yPGNoYXI+
JiBlbmQpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQu
CisgICAgLy8gRklYTUU6IExldmVsREIgbWF5IGJlIGFibGUgdG8gcHJvdmlkZSBhIGJ1bGsgb3Bl
cmF0aW9uIHRoYXQgd2UgY2FuIGRvIGZpcnN0LgorICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+
IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKKyAgICBmb3IgKGl0LT5zZWVrKGJlZ2luKTsgaXQtPmlz
VmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGVuZCkgPCAwOyBpdC0+bmV4dCgpKSB7
CisgICAgICAgIGlmICghZGItPnJlbW92ZShpdC0+a2V5KCkpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QsIGNvbnN0IFN0cmluZyYsIGNv
bnN0IFN0cmluZyYsIGJvb2wsIGludDY0X3QmKQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4K
LSAgICByZXR1cm4gZmFsc2U7CisgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZTsKKyAgICBnZXRT
dHJpbmcobV9kYi5nZXQoKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIDApLCBvYmplY3RTdG9yZU5hbWUpOworCisgICAgaWYgKCFkZWxl
dGVSYW5nZShtX2RiLmdldCgpLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA2KSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KKworICAgIHB1dFN0cmluZyhtX2RiLmdldCgpLCBPYmplY3RTdG9yZUZy
ZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCksICIiKTsKKyAgICBt
X2RiLT5yZW1vdmUoT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlTmFtZSkpOworCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBJbmRleEZy
ZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIEluZGV4RnJl
ZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgpKSkK
KyAgICAgICAgcmV0dXJuOyAvLyBGSVhNRTogUmVwb3J0IGVycm9yLgorICAgIGlmICghZGVsZXRl
UmFuZ2UobV9kYi5nZXQoKSwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIDAsIDApLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYLCAwKSkpCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6
IFJlcG9ydCBlcnJvci4KKworICAgIGNsZWFyT2JqZWN0U3RvcmUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCk7CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0
U3RvcmUoaW50NjRfdCwgaW50NjRfdCkKK1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpn
ZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IEZJWE1FOiBJbXBsZW1lbnQuCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBP
YmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkp
OworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworCisgICAgaWYgKCFtX2RiLT5nZXQobGV2ZWxkYktl
eSwgZGF0YSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGludDY0X3QgdmVyc2lv
bjsKKyAgICBjb25zdCBjaGFyKiBwID0gZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwgZGF0YS5l
bmQoKSwgdmVyc2lvbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7Cisg
ICAgKHZvaWQpIHZlcnNpb247CisKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nKHAsIGRhdGEuZW5k
KCkpOworfQorCituYW1lc3BhY2UgeworY2xhc3MgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIgOiBw
dWJsaWMgSURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIgeworcHVi
bGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiBjcmVh
dGUoY29uc3QgVmVjdG9yPGNoYXI+JiBwcmltYXJ5S2V5LCBpbnQ2NF90IHZlcnNpb24pIHsgcmV0
dXJuIGFkb3B0UmVmKG5ldyBMZXZlbERCUmVjb3JkSWRlbnRpZmllcihwcmltYXJ5S2V5LCB2ZXJz
aW9uKSk7IH0KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMZXZlbERCUmVjb3JkSWRlbnRpZmllcj4g
Y3JlYXRlKCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IExldmVsREJSZWNvcmRJZGVudGlmaWVyKCkp
OyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJpbWFy
eUtleS5pc0VtcHR5KCk7IH0KKyAgICBWZWN0b3I8Y2hhcj4gcHJpbWFyeUtleSgpIGNvbnN0IHsg
cmV0dXJuIG1fcHJpbWFyeUtleTsgfQorICAgIHZvaWQgc2V0UHJpbWFyeUtleShjb25zdCBWZWN0
b3I8Y2hhcj4mIHByaW1hcnlLZXkpIHsgbV9wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsgfQorICAg
IGludDY0X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorICAgIHZvaWQg
c2V0VmVyc2lvbihpbnQ2NF90IHZlcnNpb24pIHsgbV92ZXJzaW9uID0gdmVyc2lvbjsgfQorCitw
cml2YXRlOgorICAgIExldmVsREJSZWNvcmRJZGVudGlmaWVyKGNvbnN0IFZlY3RvcjxjaGFyPiYg
cHJpbWFyeUtleSwgaW50NjRfdCB2ZXJzaW9uKSA6IG1fcHJpbWFyeUtleShwcmltYXJ5S2V5KSwg
bV92ZXJzaW9uKHZlcnNpb24pIHsgQVNTRVJUKCFwcmltYXJ5S2V5LmlzRW1wdHkoKSk7IH0KKyAg
ICBMZXZlbERCUmVjb3JkSWRlbnRpZmllcigpIDogbV9wcmltYXJ5S2V5KCksIG1fdmVyc2lvbigt
MSkge30KKworICAgIFZlY3RvcjxjaGFyPiBtX3ByaW1hcnlLZXk7IC8vIEZJWE1FOiBNYWtlIGl0
IG1vcmUgY2xlYXIgdGhhdCB0aGlzIGlzIHRoZSAqZW5jb2RlZCogdmVyc2lvbiBvZiB0aGUga2V5
LgorICAgIGludDY0X3QgbV92ZXJzaW9uOworfTsKIH0KIAotU3RyaW5nIElEQkxldmVsREJCYWNr
aW5nU3RvcmU6OmdldE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QsIGludDY0X3QsIGNvbnN0IElE
QktleSYpCitzdGF0aWMgaW50NjRfdCBnZXROZXdWZXJzaW9uTnVtYmVyKExldmVsREJEYXRhYmFz
ZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBT
dHJpbmcoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGFzdFZlcnNpb25LZXkgPSBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgNCk7CisK
KyAgICBpbnQ2NF90IGxhc3RWZXJzaW9uID0gLTE7CisgICAgaWYgKCFnZXRJbnQoZGIsIGxhc3RW
ZXJzaW9uS2V5LCBsYXN0VmVyc2lvbikpCisgICAgICAgIGxhc3RWZXJzaW9uID0gMDsKKworICAg
IEFTU0VSVChsYXN0VmVyc2lvbiA+PSAwKTsKKworICAgIGludDY0X3QgdmVyc2lvbiA9IGxhc3RW
ZXJzaW9uICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBsYXN0VmVyc2lvbktleSwgdmVy
c2lvbik7CisgICAgQVNTRVJUX1VOVVNFRChvaywgb2spOworCisgICAgQVNTRVJUKHZlcnNpb24g
PiBsYXN0VmVyc2lvbik7IC8vIEZJWE1FOiBUaGluayBhYm91dCBob3cgd2Ugd2FudCB0byBoYW5k
bGUgdGhlIG92ZXJmbG93IHNjZW5hcmlvLgorCisgICAgcmV0dXJuIHZlcnNpb247CiB9CiAKLWJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCwg
aW50NjRfdCwgY29uc3QgSURCS2V5JiwgY29uc3QgU3RyaW5nJiwgT2JqZWN0U3RvcmVSZWNvcmRJ
ZGVudGlmaWVyKikKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6cHV0T2JqZWN0U3RvcmVS
ZWNvcmQoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElE
QktleSYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXIqIHJlY29yZElkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJ
WE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGludDY0X3QgdmVyc2lvbiA9
IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG9iamVjdFN0b3JlZGF0YUtleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CisKKyAg
ICBWZWN0b3I8Y2hhcj4gdjsKKyAgICB2LmFwcGVuZChlbmNvZGVWYXJJbnQodmVyc2lvbikpOwor
ICAgIHYuYXBwZW5kKGVuY29kZVN0cmluZyh2YWx1ZSkpOworCisgICAgaWYgKCFtX2RiLT5wdXQo
b2JqZWN0U3RvcmVkYXRhS2V5LCB2KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29u
c3QgVmVjdG9yPGNoYXI+IGV4aXN0c0VudHJ5S2V5ID0gRXhpc3RzRW50cnlLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIGlmICghbV9kYi0+cHV0KGV4aXN0
c0VudHJ5S2V5LCBlbmNvZGVJbnQodmVyc2lvbikpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBMZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBz
dGF0aWNfY2FzdDxMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOwor
ICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShr
ZXkpKTsKKyAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0VmVyc2lvbih2ZXJzaW9uKTsK
KyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVh
ck9iamVjdFN0b3JlKGludDY0X3QsIGludDY0X3QpCit2b2lkIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmNsZWFyT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQu
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDApLmVuY29kZSgpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9w
S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxLCAwKS5lbmNvZGUo
KTsKKworICAgIGRlbGV0ZVJhbmdlKG1fZGIuZ2V0KCksIHN0YXJ0S2V5LCBzdG9wS2V5KTsKIH0K
IAogUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmll
cj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW52YWxpZFJlY29yZElkZW50aWZpZXIo
KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAg
IHJldHVybiAwOworICAgIHJldHVybiBMZXZlbERCUmVjb3JkSWRlbnRpZmllcjo6Y3JlYXRlKCk7
CiB9CiAKLXZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNv
cmQoaW50NjRfdCwgaW50NjRfdCwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKikK
K3ZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3Jl
UmVjb3JkSWRlbnRpZmllciogcmVjb3JkSWRlbnRpZmllcikKIHsKLSAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRl
bnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZl
bERCUmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBrZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKKyAgICBt
X2RiLT5yZW1vdmUoa2V5KTsKIH0KIAotZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6Om5l
eHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QsIGludDY0X3QpCitkb3VibGUgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6bmV4dEF1dG9JbmNyZW1lbnROdW1iZXIoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgbWluSURCS2V5KCkpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWF4
SURCS2V5KCkpOworCisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3SXRl
cmF0b3IoKSk7CisKKyAgICBpbnQgbWF4TnVtZXJpY0tleSA9IDA7CisKKyAgICAvLyBGSVhNRTog
QmUgbW9yZSBlZmZpY2llbnQ6IHNlZWsgdG8gc29tZXRoaW5nIGFmdGVyIHRoZSBvYmplY3Qgc3Rv
cmUgZGF0YSwgdGhlbiByZXZlcnNlLgorCisgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0
LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5u
ZXh0KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAg
ICAgICBjb25zdCBjaGFyICpsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBPYmpl
Y3RTdG9yZURhdGFLZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YUtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAg
ICBpZiAoZGF0YUtleS51c2VyS2V5KCktPnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpIHsK
KyAgICAgICAgICAgIGludDY0X3QgbiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGRhdGFLZXkudXNl
cktleSgpLT5udW1iZXIoKSk7CisgICAgICAgICAgICBpZiAobiA+IG1heE51bWVyaWNLZXkpCisg
ICAgICAgICAgICAgICAgbWF4TnVtZXJpY0tleSA9IG47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gbWF4TnVtZXJpY0tleSArIDE7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBJREJL
ZXkmLCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqKQorYm9vbCBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVu
dGlmaWVyKiBmb3VuZFJlY29yZElkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKworICAg
IGlmICghbV9kYi0+Z2V0KGxldmVsZGJLZXksIGRhdGEpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpbnQ2NF90IHZlcnNpb247CisgICAgaWYgKCFkZWNvZGVWYXJJbnQoZGF0YS5iZWdp
bigpLCBkYXRhLmVuZCgpLCB2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxldmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGlj
X2Nhc3Q8TGV2ZWxEQlJlY29yZElkZW50aWZpZXIqPihmb3VuZFJlY29yZElkZW50aWZpZXIpOwor
ICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShr
ZXkpKTsKKyAgICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0VmVyc2lvbih2ZXJzaW9uKTsK
KyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JF
YWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCwgaW50NjRfdCwgT2JqZWN0U3RvcmVSZWNvcmRD
YWxsYmFjayYpCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmZvckVhY2hPYmplY3RTdG9y
ZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgT2JqZWN0
U3RvcmVSZWNvcmRDYWxsYmFjayYgY2FsbGJhY2spCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgpKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
c3RvcEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIG1heElEQktleSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1f
ZGItPm5ld0l0ZXJhdG9yKCkpOworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNW
YWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgp
KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAg
Y29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7CisgICAgICAgIE9iamVjdFN0b3Jl
RGF0YUtleSBkYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUo
cCwgbGltaXQsICZkYXRhS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIFJlZlB0
cjxJREJLZXk+IHByaW1hcnlLZXkgPSBkYXRhS2V5LnVzZXJLZXkoKTsKKworICAgICAgICBpbnQ2
NF90IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQoaXQtPnZh
bHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOworICAgICAgICBpZiAo
IXEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVmUHRyPExldmVsREJS
ZWNvcmRJZGVudGlmaWVyPiByaSA9IExldmVsREJSZWNvcmRJZGVudGlmaWVyOjpjcmVhdGUoZW5j
b2RlSURCS2V5KCpwcmltYXJ5S2V5KSwgdmVyc2lvbik7CisgICAgICAgIFN0cmluZyBpZGJWYWx1
ZSA9IGRlY29kZVN0cmluZyhxLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgY2FsbGJh
Y2suY2FsbGJhY2socmkuZ2V0KCksIGlkYlZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKIH0KIAotdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3Qs
IGludDY0X3QsIFZlY3RvcjxpbnQ2NF90PiYsIFZlY3RvcjxTdHJpbmc+JiwgVmVjdG9yPFN0cmlu
Zz4mLCBWZWN0b3I8Ym9vbD4mKQordm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRl
eGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8aW50
NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0cmlu
Zz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKIHsKLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkg
PSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCArIDEs
IDAsIDApOworCisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0
b3IoKSk7CisgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29t
cGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKKyAgICAgICAg
Y29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBs
aW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFE
YXRhS2V5OworICAgICAgICBwID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAm
bWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisKKyAgICAgICAgaW50NjRfdCBpbmRl
eElkID0gbWV0YURhdGFLZXkuaW5kZXhJZCgpOworICAgICAgICBBU1NFUlQoIW1ldGFEYXRhS2V5
Lm1ldGFEYXRhVHlwZSgpKTsKKworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3Ry
aW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKyAgICAgICAgaXQt
Pm5leHQoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0df
RVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICBib29sIGluZGV4VW5pcXVlID0gKml0LT52YWx1ZSgpLmJl
Z2luKCk7CisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkg
eworICAgICAgICAgICAgTE9HX0VSUk9SKCJJbnRlcm5hbCBJbmRleGVkIERCIGVycm9yLiIpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGtleVBhdGgg
PSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOwor
CisgICAgICAgIGZvdW5kSWRzLmFwcGVuZChpbmRleElkKTsKKyAgICAgICAgZm91bmROYW1lcy5h
cHBlbmQoaW5kZXhOYW1lKTsKKyAgICAgICAgZm91bmRLZXlQYXRocy5hcHBlbmQoa2V5UGF0aCk7
CisgICAgICAgIGZvdW5kVW5pcXVlRmxhZ3MuYXBwZW5kKGluZGV4VW5pcXVlKTsKKyAgICB9CiB9
CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlSW5kZXgoaW50NjRfdCwgaW50
NjRfdCwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50NjRfdCYpCitzdGF0
aWMgaW50NjRfdCBnZXROZXdJbmRleElkKExldmVsREJEYXRhYmFzZSogZGIsIGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBJ
bmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRf
TUFYKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigp
KTsKKyAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJl
S2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkgeworICAgICAgICBjb25z
dCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0
ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RL
ZXk7CisgICAgICAgIHAgPSBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUocCwgbGltaXQsICZmcmVl
TGlzdEtleSk7CisgICAgICAgIEFTU0VSVChwKTsKKworICAgICAgICBib29sIG9rID0gZGItPnJl
bW92ZShpdC0+a2V5KCkpOworICAgICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CisKKyAgICAg
ICAgQVNTRVJUKGZyZWVMaXN0S2V5LmluZGV4SWQoKSA+PSBrTWluaW11bUluZGV4SWQpOworICAg
ICAgICByZXR1cm4gZnJlZUxpc3RLZXkuaW5kZXhJZCgpOworICAgIH0KKworICAgIGludDY0X3Qg
bWF4SW5kZXhJZDsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtleSA9IE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsK
KyAgICBpZiAoIWdldEludChkYiwgbWF4SW5kZXhJZEtleSwgbWF4SW5kZXhJZCkpCisgICAgICAg
IG1heEluZGV4SWQgPSBrTWluaW11bUluZGV4SWQ7CisKKyAgICBpbnQ2NF90IGluZGV4SWQgPSBt
YXhJbmRleElkICsgMTsKKyAgICBib29sIG9rID0gcHV0SW50KGRiLCBtYXhJbmRleElkS2V5LCBp
bmRleElkKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1
cm4gaW5kZXhJZDsKK30KKworYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRl
eChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGludDY0X3QmIGlu
ZGV4SWQpCit7CisgICAgaW5kZXhJZCA9IGdldE5ld0luZGV4SWQobV9kYi5nZXQoKSwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCk7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbmFtZUtleSA9
IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gdW5pcXVlS2V5ID0gSW5kZXhNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDEpOworICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIDIpOworCisgICAgYm9vbCBvayA9
IHB1dFN0cmluZyhtX2RiLmdldCgpLCBuYW1lS2V5LCBuYW1lKTsKKyAgICBpZiAoIW9rKSB7Cisg
ICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIHVuaXF1
ZUtleSwgaXNVbmlxdWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJbnRl
cm5hbCBJbmRleGVkIERCIGVycm9yLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgb2sgPSBwdXRTdHJpbmcobV9kYi5nZXQoKSwga2V5UGF0aEtleSwga2V5UGF0aCk7Cisg
ICAgaWYgKCFvaykgeworICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJy
b3IuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsK
IH0KIAogdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2NF90LCBp
bnQ2NF90LCBpbnQ2NF90KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTog
SW1wbGVtZW50LgorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50
IGFuZCBhZGQgbGF5b3V0IHRlc3QuCisgICAgcmV0dXJuOwogfQogCi1ib29sIElEQkxldmVsREJC
YWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2
NF90LCBjb25zdCBJREJLZXkmLCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIqKQor
Ym9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3QgSURCS2V5JiBrZXksIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciogcmVjb3Jk
SWRlbnRpZmllcikKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IEltcGxl
bWVudC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVNTRVJUKGluZGV4SWQgPj0ga01pbmltdW1J
bmRleElkKTsKKyAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29y
ZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+
KHJlY29yZElkZW50aWZpZXIpOworCisgICAgY29uc3QgaW50NjRfdCBnbG9iYWxTZXF1ZW5jZU51
bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4RGF0YUtleSA9IEluZGV4RGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgZ2xv
YmFsU2VxdWVuY2VOdW1iZXIpOworCisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgZGF0YS5h
cHBlbmQoZW5jb2RlVmFySW50KGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpKTsK
KyAgICBkYXRhLmFwcGVuZChsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsK
KworICAgIHJldHVybiBtX2RiLT5wdXQoaW5kZXhEYXRhS2V5LCBkYXRhKTsKK30KKworc3RhdGlj
IGJvb2wgZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW4oTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3Qg
VmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3RvcjxjaGFyPiYgZm91bmRLZXkpCit7CisgICAgT3du
UHRyPExldmVsREJJdGVyYXRvcj4gaXQoZGItPm5ld0l0ZXJhdG9yKCkpOworICAgIGl0LT5zZWVr
KHRhcmdldCk7CisKKyAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgaXQtPnNlZWtU
b0xhc3QoKTsKKyAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChjb21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwg
dGFyZ2V0KSA+PSAwKSB7CisgICAgICAgIGl0LT5wcmV2KCk7CisgICAgICAgIGlmICghaXQtPmlz
VmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3VuZEtl
eS5jbGVhcigpOworICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtl
eSgpLmVuZCgpIC0gaXQtPmtleSgpLmJlZ2luKCkpOworICAgIHJldHVybiB0cnVlOwogfQogCiBi
b29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZUluZGV4RGF0YUZvclJlY29yZChpbnQ2
NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBjb25zdCBPYmplY3RTdG9yZVJlY29yZElkZW50aWZpZXIq
KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAg
IHJldHVybiBmYWxzZTsKKyAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBuZWVkZWQgc2luY2Ugd2Ug
aW52YWxpZGF0ZSBpbmRleCBkYXRhIHZpYSB0aGUgdmVyc2lvbiBudW1iZXIgbWVjaGFuaXNtLgor
ICAgIHJldHVybiB0cnVlOwogfQogCi1TdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0
T2JqZWN0VmlhSW5kZXgoaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5JikK
K1N0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRPYmplY3RWaWFJbmRleChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmIGtleSkKIHsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gRklYTUU6IElt
cGxlbWVudC4KLSAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgUmVmUHRyPElEQktleT4gcHJpbWFy
eUtleSA9IGdldFByaW1hcnlLZXlWaWFJbmRleChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCBrZXkpOworICAgIGlmICghcHJpbWFyeUtleSkKKyAgICAgICAgcmV0dXJuIFN0cmlu
ZygpOworCisgICAgcmV0dXJuIGdldE9iamVjdFN0b3JlUmVjb3JkKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsICpwcmltYXJ5S2V5KTsKIH0KIAotUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVs
REJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChpbnQ2NF90LCBpbnQ2NF90LCBp
bnQ2NF90LCBjb25zdCBJREJLZXkmKQorc3RhdGljIGJvb2wgdmVyc2lvbkV4aXN0cyhMZXZlbERC
RGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCB2ZXJzaW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRQcmltYXJ5S2V5KQog
ewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJl
dHVybiAwOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZWRQcmltYXJ5S2V5KTsKKyAgICBW
ZWN0b3I8Y2hhcj4gZGF0YTsKKworICAgIGlmICghZGItPmdldChrZXksIGRhdGEpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZGVjb2RlSW50KGRhdGEuYmVnaW4oKSwgZGF0
YS5lbmQoKSkgPT0gdmVyc2lvbjsKIH0KIAotYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpr
ZXlFeGlzdHNJbkluZGV4KGludDY0X3QsIGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleSYp
CitQYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtl
eVZpYUluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gbGV2ZWxkYktleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgMCk7CisgICAgT3duUHRyPExldmVsREJJdGVy
YXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0b3IoKSk7CisgICAgaXQtPnNlZWsobGV2ZWxkYktleSk7
CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBpZiAoY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIGxl
dmVsZGJLZXkpID4gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGludDY0X3Qg
dmVyc2lvbjsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChpdC0+dmFsdWUo
KS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7CisgICAgICAgIGlmICghcCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlZFByaW1h
cnlLZXk7CisgICAgICAgIGVuY29kZWRQcmltYXJ5S2V5LmFwcGVuZChwLCBpdC0+dmFsdWUoKS5l
bmQoKSAtIHApOworCisgICAgICAgIGlmICghdmVyc2lvbkV4aXN0cyhtX2RiLmdldCgpLCBkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBlbmNvZGVkUHJpbWFyeUtleSkpIHsKKyAg
ICAgICAgICAgIC8vIERlbGV0ZSBzdGFsZSBpbmRleCBkYXRhIGVudHJ5IGFuZCBjb250aW51ZS4K
KyAgICAgICAgICAgIG1fZGItPnJlbW92ZShpdC0+a2V5KCkpOworICAgICAgICAgICAgaXQtPm5l
eHQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUmVmUHRy
PElEQktleT4gcHJpbWFyeUtleTsKKyAgICAgICAgZGVjb2RlSURCS2V5KGVuY29kZWRQcmltYXJ5
S2V5LmJlZ2luKCksIGVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKKyAgICAg
ICAgcmV0dXJuIHByaW1hcnlLZXkucmVsZWFzZSgpOworICAgIH0KIH0KIAotUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVj
dFN0b3JlQ3Vyc29yKGludDY0X3QsIGludDY0X3QsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vy
c29yOjpEaXJlY3Rpb24pCitib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0lu
SW5kZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJuIDA7CisgICAgY29uc3QgVmVjdG9yPGNo
YXI+IGxldmVsREJLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBpbmRleElkLCBrZXksIDApOworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0
KG1fZGItPm5ld0l0ZXJhdG9yKCkpOworCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAg
aXQtPnNlZWsobGV2ZWxEQktleSk7CisgICAgaWYgKGl0LT5pc1ZhbGlkKCkgJiYgIWNvbXBhcmVJ
bmRleEtleXMoaXQtPmtleSgpLCBsZXZlbERCS2V5KSkKKyAgICAgICAgZm91bmQgPSB0cnVlOwor
CisgICAgcmV0dXJuIGZvdW5kOwogfQogCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yPiBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoaW50NjRfdCwg
aW50NjRfdCwgaW50NjRfdCwgY29uc3QgSURCS2V5UmFuZ2UqLCBJREJDdXJzb3I6OkRpcmVjdGlv
bikKK25hbWVzcGFjZSB7CitjbGFzcyBDdXJzb3JJbXBsQ29tbW9uIDogcHVibGljIElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yIHsKK3B1YmxpYzoKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNv
cgorICAgIHZpcnR1YWwgYm9vbCBjb250aW51ZUZ1bmN0aW9uKGNvbnN0IElEQktleSopOworICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSgpIHsgcmV0dXJuIG1fY3VycmVudEtleTsg
fQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBt
X2N1cnJlbnRLZXk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpID0gMDsKKyAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpID0gMDsgLy8gRklYTUU6IEkgZG9uJ3Qg
dGhpbmsgdGhpcyBpcyBhY3R1YWxseSB1c2VkLCBzbyBkcm9wIGl0LgorICAgIHZpcnR1YWwgaW50
NjRfdCBpbmRleERhdGFJZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJv
dygpID0gMDsKKyAgICBib29sIGZpcnN0U2VlaygpOworCitwcm90ZWN0ZWQ6CisgICAgQ3Vyc29y
SW1wbENvbW1vbihMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGxvd0tl
eSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJvb2wgaGlnaE9w
ZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBtX2RiKGRiKQorICAgICAgICAsIG1fbG93S2V5
KGxvd0tleSkKKyAgICAgICAgLCBtX2xvd09wZW4obG93T3BlbikKKyAgICAgICAgLCBtX2hpZ2hL
ZXkoaGlnaEtleSkKKyAgICAgICAgLCBtX2hpZ2hPcGVuKGhpZ2hPcGVuKQorICAgICAgICAsIG1f
Zm9yd2FyZChmb3J3YXJkKQorICAgIHsKKyAgICB9CisgICAgdmlydHVhbCB+Q3Vyc29ySW1wbENv
bW1vbigpIHt9CisKKyAgICBMZXZlbERCRGF0YWJhc2UqIG1fZGI7CisgICAgT3duUHRyPExldmVs
REJJdGVyYXRvcj4gbV9pdGVyYXRvcjsKKyAgICBWZWN0b3I8Y2hhcj4gbV9sb3dLZXk7CisgICAg
Ym9vbCBtX2xvd09wZW47CisgICAgVmVjdG9yPGNoYXI+IG1faGlnaEtleTsKKyAgICBib29sIG1f
aGlnaE9wZW47CisgICAgYm9vbCBtX2ZvcndhcmQ7CisgICAgUmVmUHRyPElEQktleT4gbV9jdXJy
ZW50S2V5OworfTsKKworYm9vbCBDdXJzb3JJbXBsQ29tbW9uOjpmaXJzdFNlZWsoKQogewotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVybiAw
OworICAgIG1faXRlcmF0b3IgPSBtX2RiLT5uZXdJdGVyYXRvcigpOworCisgICAgaWYgKG1fZm9y
d2FyZCkKKyAgICAgICAgbV9pdGVyYXRvci0+c2VlayhtX2xvd0tleSk7CisgICAgZWxzZQorICAg
ICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1faGlnaEtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAg
ICAgIGlmICghbV9pdGVyYXRvci0+aXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9oaWdoT3BlbiAmJiBjb21wYXJlSW5kZXhL
ZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2hpZ2hLZXkpID49IDApCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGlnaE9wZW4gJiYgY29tcGFy
ZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBj
b21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtX2ZvcndhcmQgJiYgIW1fbG93T3Bl
biAmJiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPCAwKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX2ZvcndhcmQgJiYgbV9s
b3dPcGVuKSB7CisgICAgICAgICAgICAvLyBsb3dLZXkgbm90IGluY2x1ZGVkIGluIHRoZSByYW5n
ZS4KKyAgICAgICAgICAgIGlmIChjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBt
X2xvd0tleSkgPD0gMCkgeworICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPm5leHQoKTsKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICBpZiAoIW1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuKSB7CisgICAgICAgICAgICAvLyBoaWdoS2V5
IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCisgICAgICAgICAgICBpZiAoY29tcGFyZUluZGV4
S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+PSAwKSB7CisgICAgICAgICAgICAg
ICAgbV9pdGVyYXRvci0+cHJldigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJvdygpKSB7Cisg
ICAgICAgICAgICBpZiAobV9mb3J3YXJkKQorICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPm5l
eHQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2l0ZXJhdG9yLT5wcmV2
KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KIH0KIAotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0X3QsIGludDY0X3QsIGlu
dDY0X3QsIGNvbnN0IElEQktleVJhbmdlKiwgSURCQ3Vyc29yOjpEaXJlY3Rpb24pCitib29sIEN1
cnNvckltcGxDb21tb246OmNvbnRpbnVlRnVuY3Rpb24oY29uc3QgSURCS2V5KiBrZXkpCiB7Ci0g
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIEZJWE1FOiBJbXBsZW1lbnQuCi0gICAgcmV0dXJu
IDA7CisgICAgLy8gRklYTUU6IFRoaXMgc2hhcmVzIGEgbG90IG9mIGNvZGUgd2l0aCBmaXJzdFNl
ZWsuCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChtX2ZvcndhcmQpCisgICAgICAgICAg
ICBtX2l0ZXJhdG9yLT5uZXh0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1faXRlcmF0
b3ItPnByZXYoKTsKKworICAgICAgICBpZiAoIW1faXRlcmF0b3ItPmlzVmFsaWQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gdHJhc2g7CisgICAg
ICAgIGlmICghbV9kYi0+Z2V0KG1faXRlcmF0b3ItPmtleSgpLCB0cmFzaCkpCisgICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG1fZm9yd2FyZCAmJiBtX2hpZ2hPcGVuICYmIGNv
bXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1faGlnaEtleSkgPj0gMCkgLy8gaGln
aCBrZXkgbm90IGluY2x1ZGVkIGluIHJhbmdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGlmIChtX2ZvcndhcmQgJiYgIW1faGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyht
X2l0ZXJhdG9yLT5rZXkoKSwgbV9oaWdoS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIGlmICghbV9mb3J3YXJkICYmIG1fbG93T3BlbiAmJiBjb21wYXJlSW5kZXhL
ZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2xvd0tleSkgPD0gMCkgLy8gbG93IGtleSBub3QgaW5j
bHVkZWQgaW4gcmFuZ2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFt
X2ZvcndhcmQgJiYgIW1fbG93T3BlbiAmJiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtl
eSgpLCBtX2xvd0tleSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAg
IGlmICghbG9hZEN1cnJlbnRSb3coKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
IGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChtX2ZvcndhcmQpIHsKKyAgICAgICAgICAgICAg
ICBpZiAobV9jdXJyZW50S2V5LT5pc0xlc3NUaGFuKGtleSkpCisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5
LT5pc0xlc3NUaGFuKG1fY3VycmVudEtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IE9i
ZXkgdGhlIHVuaXF1ZW5lc3MgY29uc3RyYWludCAoYW5kIHRlc3QgZm9yIGl0ISkKKworICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsIDogcHVibGljIEN1cnNvckltcGxDb21tb24geworcHVibGljOgorICAgIHN0
YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJEYXRh
YmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0
IFZlY3RvcjxjaGFyPiYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUN1cnNvckltcGwoZGIs
IGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpKTsKKyAgICB9CisK
KyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSB7IHJl
dHVybiBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5n
U3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gb2JqZWN0U3RvcmVSZWNvcmRJZGVu
dGlmaWVyKCkgeyBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFs
IGludDY0X3QgaW5kZXhEYXRhSWQoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsg
fQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOworCitwcml2YXRlOgorICAgIE9i
amVjdFN0b3JlQ3Vyc29ySW1wbChMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJv
b2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICAgICAgOiBDdXJzb3JJbXBsQ29tbW9uKGRi
LCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hPcGVuLCBmb3J3YXJkKQorICAgIHsKKyAg
ICB9CisKKyAgICBTdHJpbmcgbV9jdXJyZW50VmFsdWU7Cit9OworCitib29sIE9iamVjdFN0b3Jl
Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3coKQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBtX2l0
ZXJhdG9yLT5rZXkoKS5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGtleUxpbWl0ID0gbV9pdGVy
YXRvci0+a2V5KCkuZW5kKCk7CisKKyAgICBPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVE
YXRhS2V5OworICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1pdCwg
Jm9iamVjdFN0b3JlRGF0YUtleSk7CisgICAgQVNTRVJUKHApOworICAgIGlmICghcCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9jdXJyZW50S2V5ID0gb2JqZWN0U3RvcmVEYXRhS2V5
LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiBxID0g
ZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFs
dWUoKS5lbmQoKSwgdmVyc2lvbik7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICh2b2lkKSB2ZXJzaW9uOworCisgICAgbV9jdXJyZW50VmFs
dWUgPSBkZWNvZGVTdHJpbmcocSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgSW5kZXhLZXlDdXJzb3JJbXBsIDogcHVibGljIEN1cnNv
ckltcGxDb21tb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4S2V5Q3Vy
c29ySW1wbD4gY3JlYXRlKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYg
bG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYgaGlnaEtleSwgYm9vbCBo
aWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBJbmRleEtleUN1cnNvckltcGwoZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9w
ZW4sIGZvcndhcmQpKTsKKyAgICB9CisKKyAgICAvLyBDdXJzb3JJbXBsQ29tbW9uCisgICAgdmly
dHVhbCBTdHJpbmcgdmFsdWUoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gU3RyaW5n
KCk7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgeyByZXR1
cm4gbV9wcmltYXJ5S2V5OyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiBvYmplY3RTdG9yZVJlY29yZElkZW50aWZp
ZXIoKSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50
NjRfdCBpbmRleERhdGFJZCgpIHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiAwOyB9Cisg
ICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3ByaXZhdGU6CisgICAgSW5kZXhL
ZXlDdXJzb3JJbXBsKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgbG93
S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IFZlY3RvcjxjaGFyPiYgaGlnaEtleSwgYm9vbCBoaWdo
T3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1cnNvckltcGxDb21tb24oZGIsIGxvd0tl
eSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZvcndhcmQpCisgICAgeworICAgIH0KKwor
ICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtleTsKK307CisKK2Jvb2wgSW5kZXhLZXlDdXJz
b3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0
b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9y
LT5rZXkoKS5lbmQoKTsKKyAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5OworICAgIHAgPSBJ
bmRleERhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1pdCwgJmluZGV4RGF0YUtleSk7CisKKyAgICBt
X2N1cnJlbnRLZXkgPSBpbmRleERhdGFLZXkudXNlcktleSgpOworCisgICAgaW50NjRfdCBpbmRl
eERhdGFWZXJzaW9uOworICAgIGNvbnN0IGNoYXIqIHEgPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRv
ci0+dmFsdWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCBpbmRleERhdGFW
ZXJzaW9uKTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBxID0gZGVjb2RlSURCS2V5KHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCks
IG1fcHJpbWFyeUtleSk7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgVmVjdG9yPGNoYXI+IHByaW1hcnlMZXZlbERCS2V5ID0gT2JqZWN0
U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRh
S2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisKKyAgICBWZWN0b3I8Y2hhcj4g
cmVzdWx0OworICAgIGlmICghbV9kYi0+Z2V0KHByaW1hcnlMZXZlbERCS2V5LCByZXN1bHQpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNp
b247CisgICAgY29uc3QgY2hhciogdCA9IGRlY29kZVZhckludChyZXN1bHQuYmVnaW4oKSwgcmVz
dWx0LmVuZCgpLCBvYmplY3RTdG9yZURhdGFWZXJzaW9uKTsKKyAgICBBU1NFUlQodCk7CisgICAg
aWYgKCF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAob2JqZWN0U3RvcmVEYXRh
VmVyc2lvbiAhPSBpbmRleERhdGFWZXJzaW9uKSB7IC8vIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5
IG5vdCB2ZXJ5IHdlbGwgY292ZXJlZCBieSB0aGUgbGF5b3V0IHRlc3RzLgorICAgICAgICBtX2Ri
LT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEluZGV4Q3Vyc29ySW1wbCA6IHB1Ymxp
YyBDdXJzb3JJbXBsQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRl
eEN1cnNvckltcGw+IGNyZWF0ZShMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hh
cj4mIGxvd0tleSwgYm9vbCBsb3dPcGVuLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGhpZ2hLZXksIGJv
b2wgaGlnaE9wZW4sIGJvb2wgZm9yd2FyZCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgSW5kZXhDdXJzb3JJbXBsKGRiLCBsb3dLZXksIGxvd09wZW4sIGhpZ2hLZXksIGhpZ2hP
cGVuLCBmb3J3YXJkKSk7CisgICAgfQorCisgICAgLy8gQ3Vyc29ySW1wbENvbW1vbgorICAgIHZp
cnR1YWwgU3RyaW5nIHZhbHVlKCkgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpPYmplY3RTdG9yZVJlY29yZElk
ZW50aWZpZXI+IG9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcigpIHsgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBpbnQ2NF90IGluZGV4RGF0YUlkKCkgeyBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICBib29sIGxvYWRDdXJyZW50Um93
KCk7CisKK3ByaXZhdGU6CisgICAgSW5kZXhDdXJzb3JJbXBsKExldmVsREJEYXRhYmFzZSogZGIs
IGNvbnN0IFZlY3RvcjxjaGFyPiYgbG93S2V5LCBib29sIGxvd09wZW4sIGNvbnN0IFZlY3Rvcjxj
aGFyPiYgaGlnaEtleSwgYm9vbCBoaWdoT3BlbiwgYm9vbCBmb3J3YXJkKQorICAgICAgICA6IEN1
cnNvckltcGxDb21tb24oZGIsIGxvd0tleSwgbG93T3BlbiwgaGlnaEtleSwgaGlnaE9wZW4sIGZv
cndhcmQpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJLZXk+IG1fcHJpbWFyeUtleTsK
KyAgICBTdHJpbmcgbV92YWx1ZTsKKyAgICBWZWN0b3I8Y2hhcj4gbV9wcmltYXJ5TGV2ZWxEQktl
eTsKK307CisKK2Jvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAg
Y29uc3QgY2hhciAqcCA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hh
ciAqbGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAgIEluZGV4RGF0YUtleSBp
bmRleERhdGFLZXk7CisgICAgcCA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmaW5k
ZXhEYXRhS2V5KTsKKworICAgIG1fY3VycmVudEtleSA9IGluZGV4RGF0YUtleS51c2VyS2V5KCk7
CisKKyAgICBjb25zdCBjaGFyICpxID0gbV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpOworICAg
IGNvbnN0IGNoYXIgKnZhbHVlTGltaXQgPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpOworCisg
ICAgaW50NjRfdCBpbmRleERhdGFWZXJzaW9uOworICAgIHEgPSBkZWNvZGVWYXJJbnQocSwgdmFs
dWVMaW1pdCwgaW5kZXhEYXRhVmVyc2lvbik7CisgICAgQVNTRVJUKHEpOworICAgIGlmICghcSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHEgPSBkZWNvZGVJREJLZXkocSwgdmFsdWVMaW1p
dCwgbV9wcmltYXJ5S2V5KTsKKyAgICBBU1NFUlQocSk7CisgICAgaWYgKCFxKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBtX3ByaW1hcnlMZXZlbERCS2V5ID0gT2JqZWN0U3RvcmVEYXRh
S2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVj
dFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0Owor
ICAgIGlmICghbV9kYi0+Z2V0KG1fcHJpbWFyeUxldmVsREJLZXksIHJlc3VsdCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKKyAg
ICBjb25zdCBjaGFyKiB0ID0gZGVjb2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5k
KCksIG9iamVjdFN0b3JlRGF0YVZlcnNpb24pOworICAgIEFTU0VSVCh0KTsKKyAgICBpZiAoIXQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChvYmplY3RTdG9yZURhdGFWZXJzaW9u
ICE9IGluZGV4RGF0YVZlcnNpb24pIHsKKyAgICAgICAgbV9kYi0+cmVtb3ZlKG1faXRlcmF0b3It
PmtleSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fdmFsdWUgPSBk
ZWNvZGVTdHJpbmcodCwgcmVzdWx0LmVuZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQor
CitzdGF0aWMgYm9vbCBmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhMZXZlbERCRGF0YWJhc2UqIGRi
LCBjb25zdCBWZWN0b3I8Y2hhcj4mIHRhcmdldCwgVmVjdG9yPGNoYXI+JiBmb3VuZEtleSkKK3sK
KyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChkYi0+bmV3SXRlcmF0b3IoKSk7CisgICAg
aXQtPnNlZWsodGFyZ2V0KTsKKworICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYgIWNvbXBhcmVJbmRleEtl
eXMoaXQtPmtleSgpLCB0YXJnZXQpKSB7CisgICAgICAgIGZvdW5kS2V5LmNsZWFyKCk7CisgICAg
ICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpIC0g
aXQtPmtleSgpLmJlZ2luKCkpOworICAgICAgICBpdC0+bmV4dCgpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSURC
Q3Vyc29yOjpEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJh
bmdlICYmIHJhbmdlLT5sb3dlcigpOworICAgIGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJh
bmdlLT51cHBlcigpOworICAgIGJvb2wgZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSURCQ3Vyc29y
OjpORVhUX05PX0RVUExJQ0FURSB8fCBkaXJlY3Rpb24gPT0gSURCQ3Vyc29yOjpORVhUKTsKKwor
ICAgIGJvb2wgbG93ZXJPcGVuLCB1cHBlck9wZW47CisgICAgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5
LCBzdG9wS2V5OworCisgICAgaWYgKCFsb3dlckJvdW5kKSB7CisgICAgICAgIHN0YXJ0S2V5ID0g
T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbWlu
SURCS2V5KCkpOworICAgICAgICBsb3dlck9wZW4gPSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCisg
ICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPmxvd2VyKCkpOworICAgICAgICBs
b3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CisgICAgfQorCisgICAgaWYgKCF1cHBlckJv
dW5kKSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7CisgICAgICAgIHVwcGVyT3BlbiA9
IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KKworICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8gV2Ug
bmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5
TGVzc1RoYW4obV9kYi5nZXQoKSwgc3RvcEtleSwgc3RvcEtleSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICAgIHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAqcmFuZ2UtPnVwcGVyKCkpOworICAgICAgICB1cHBl
ck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPE9iamVjdFN0
b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpjcmVhdGUobV9k
Yi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3YXJk
KTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6RGlyZWN0aW9uIGRpcmVjdGlv
bikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAg
ICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBib29sIGZv
cndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9OT19EVVBMSUNBVEUgfHwgZGly
ZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29sIGxvd2VyT3BlbiwgdXBwZXJP
cGVuOworICAgIFZlY3RvcjxjaGFyPiBzdGFydEtleSwgc3RvcEtleTsKKworICAgIGlmICghbG93
ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1pbklEQktleSgpLCAwKTsKKyAgICAgICAg
bG93ZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorICAgIH0gZWxzZSB7CisgICAgICAgIHN0
YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgKnJhbmdlLT5sb3dlcigpLCAwKTsKKyAgICAgICAgbG93ZXJPcGVuID0gcmFuZ2Ut
Pmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJCb3VuZCkgeworICAgICAgICBz
dG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCwgbWF4SURCS2V5KCksIDApOworICAgICAgICB1cHBlck9wZW4gPSBmYWxzZTsgLy8g
SW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8vIFdlIG5lZWQgYSBrZXkgdGhh
dCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuKG1fZGIu
Z2V0KCksIHN0b3BLZXksIHN0b3BLZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICBzdG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpLCAwKTsKKyAgICAgICAgaWYgKCFmaW5kTGFz
dEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkgLy8gU2VlayB0
byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlxdWUga2V5cy4KKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7Cisg
ICAgfQorCisgICAgUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhLZXlD
dXJzb3JJbXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2VyT3Blbiwgc3RvcEtl
eSwgdXBwZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om9wZW5JbmRleEN1cnNvcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElEQkN1cnNvcjo6
RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiBy
YW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBw
ZXIoKTsKKyAgICBib29sIGZvcndhcmQgPSAoZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVF9O
T19EVVBMSUNBVEUgfHwgZGlyZWN0aW9uID09IElEQkN1cnNvcjo6TkVYVCk7CisKKyAgICBib29s
IGxvd2VyT3BlbiwgdXBwZXJPcGVuOworICAgIFZlY3RvcjxjaGFyPiBzdGFydEtleSwgc3RvcEtl
eTsKKworICAgIGlmICghbG93ZXJCb3VuZCkgeworICAgICAgICBzdGFydEtleSA9IEluZGV4RGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1pbklEQktl
eSgpLCAwKTsKKyAgICAgICAgbG93ZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgorICAgIH0g
ZWxzZSB7CisgICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT5sb3dlcigpLCAwKTsKKyAgICAgICAg
bG93ZXJPcGVuID0gcmFuZ2UtPmxvd2VyT3BlbigpOworICAgIH0KKworICAgIGlmICghdXBwZXJC
b3VuZCkgeworICAgICAgICBzdG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWF4SURCS2V5KCksIDApOworICAgICAgICB1cHBl
ck9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisKKyAgICAgICAgaWYgKCFmb3J3YXJkKSB7IC8v
IFdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVz
dEtleUxlc3NUaGFuKG1fZGIuZ2V0KCksIHN0b3BLZXksIHN0b3BLZXkpKQorICAgICAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICAgICAgdXBwZXJPcGVuID0gZmFsc2U7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgICBzdG9wS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpLCAwKTsKKyAg
ICAgICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCBz
dG9wS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlx
dWUga2V5cy4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB1cHBlck9wZW4gPSByYW5n
ZS0+dXBwZXJPcGVuKCk7CisgICAgfQorCisgICAgUmVmUHRyPEluZGV4Q3Vyc29ySW1wbD4gY3Vy
c29yID0gSW5kZXhDdXJzb3JJbXBsOjpjcmVhdGUobV9kYi5nZXQoKSwgc3RhcnRLZXksIGxvd2Vy
T3Blbiwgc3RvcEtleSwgdXBwZXJPcGVuLCBmb3J3YXJkKTsKKyAgICBpZiAoIWN1cnNvci0+Zmly
c3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNl
KCk7Cit9CisKK25hbWVzcGFjZSB7CitjbGFzcyBEdW1teVRyYW5zYWN0aW9uIDogcHVibGljIElE
QkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24geworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBi
ZWdpbigpIHt9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpIHt9CisgICAgdmlydHVhbCB2b2lk
IHJvbGxiYWNrKCkge30KK307CiB9CiAKIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlVHJhbnNhY3Rpb24oKQogewot
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBGSVhNRTogSW1wbGVtZW50LgotICAgIHJldHVy
biAwOworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGltcGxlbWVudCBhIHRyYW5zYWN0aW9uIGFi
c3RyYWN0aW9uIHRoYXQgYWxsb3dzIGZvciByb2xsLWJhY2tzLCBhbmQgd3JpdGUgdGVzdHMgZm9y
IGl0LgorICAgIHJldHVybiBhZG9wdFJlZihuZXcgRHVtbXlUcmFuc2FjdGlvbigpKTsKIH0KIAor
Ly8gRklYTUU6IGRlbGV0ZURhdGFiYXNlIHNob3VsZCBiZSBwYXJ0IG9mIElEQkJhY2tpbmdTdG9y
ZS4KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3Rv
cmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCmlu
ZGV4IDgzNDJmYjliYzVlYTA4NWE1Y2I1YWQxZmY0Mzc4MGVjMTY4NGVhMDAuLmE4NjQ3ZGFjMjE1
M2FkZTY2ZDM3YjRmNTgwNDE1MjUxMjE4ZmNlMjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCkBAIC0zMiwxMSArMzIsMTEgQEAKICNpbmNs
dWRlICJJREJCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CiAKLW5hbWVz
cGFjZSBsZXZlbGRiIHsKLWNsYXNzIERCOwotfQogbmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFz
cyBMZXZlbERCQ29tcGFyYXRvcjsKK2NsYXNzIExldmVsREJEYXRhYmFzZTsKKwogY2xhc3MgSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZSA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmUgewogcHVibGljOgog
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gb3BlbihTZWN1cml0eU9yaWdp
biosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UsIGludDY0X3QgbWF4aW11bVNpemUsIGNvbnN0IFN0
cmluZyYgZmlsZUlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1wbCopOwpAQCAtNzQsMTEg
Kzc0LDEyIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNy
ZWF0ZVRyYW5zYWN0aW9uKCk7CiAKIHByaXZhdGU6Ci0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiwgbGV2ZWxkYjo6REIq
KTsKKyAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlKFN0cmluZyBpZGVudGlmaWVyLCBJREJGYWN0
b3J5QmFja2VuZEltcGwqLCBMZXZlbERCRGF0YWJhc2UqKTsKIAogICAgIFN0cmluZyBtX2lkZW50
aWZpZXI7CiAgICAgUmVmUHRyPElEQkZhY3RvcnlCYWNrZW5kSW1wbD4gbV9mYWN0b3J5OwotICAg
IE93blB0cjxsZXZlbGRiOjpEQj4gbV9kYjsKKyAgICBPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPiBt
X2RiOworICAgIE93blB0cjxMZXZlbERCQ29tcGFyYXRvcj4gbV9jb21wYXJhdG9yOwogfTsKIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="82752"
          type_id="1"
          status="+"
          setter="steveblock"
    />
          </attachment>
      

    </bug>

</bugzilla>