<?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>59452</bug_id>
          
          <creation_ts>2011-04-26 07:15:56 -0700</creation_ts>
          <short_desc>IndexedDB: Move LevelDB key coding routines to separate file</short_desc>
          <delta_ts>2011-04-27 04:11:48 -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>Other</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Hans Wennborg">hans</reporter>
          <assigned_to name="Hans Wennborg">hans</assigned_to>
          <cc>andreip</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dgrogan</cc>
    
    <cc>tonyg</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>392430</commentid>
    <comment_count>0</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-26 07:15:56 -0700</bug_when>
    <thetext>IndexedDB: Move LevelDB key coding routines to separate file</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392434</commentid>
    <comment_count>1</comment_count>
      <attachid>91100</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-26 07:22:48 -0700</bug_when>
    <thetext>Created attachment 91100
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392436</commentid>
    <comment_count>2</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-26 07:25:36 -0700</bug_when>
    <thetext>It&apos;s a large patch, but it&apos;s really just moving a large chunk of code from one file to another, and making the functions and classes members of IDBLevelDBCoding.

I&apos;m not sure about the use of namespaces within WebKit, but if a reviewer agrees, maybe it would be nicer to have the IDBLevelDBCoding class be a namespace instead, and just do &quot;using namespace IDBLevelDBCoding;&quot; where it&apos;s used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>392542</commentid>
    <comment_count>3</comment_count>
      <attachid>91100</attachid>
    <who name="Tony Gentilcore">tonyg</who>
    <bug_when>2011-04-26 10:16:08 -0700</bug_when>
    <thetext>Comment on attachment 91100
Patch

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

&gt; I&apos;m not sure about the use of namespaces within WebKit, but if a reviewer agrees, maybe it would be nicer to have the IDBLevelDBCoding class be a namespace instead, and just do &quot;using namespace IDBLevelDBCoding;&quot; where it&apos;s used.

Namespaces are used very conservatively in WebKit, but there are some in inspector, graphics, audio, xpath. There&apos;s even one for leveldb already. This code is already using the class as a namespace (it has lots of classes, static methods, no members and can&apos;t be instantiated). So I agree that it would be a lot cleaner to make a namespace. Would you mind making the change?

&gt; Source/WebCore/WebCore.gypi:5526
&gt; +            &apos;storage/IDBLevelDBCoding.h&apos;,

Should these also be added to WebCore/GNUMakefile.list.am?

&gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:154
&gt; +#endif

These macros are still in IDBLevelDBBackingStore.cpp. They should only be in one place, right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393457</commentid>
    <comment_count>4</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-27 02:31:09 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 91100 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=91100&amp;action=review
&gt; 
&gt; &gt; I&apos;m not sure about the use of namespaces within WebKit, but if a reviewer agrees, maybe it would be nicer to have the IDBLevelDBCoding class be a namespace instead, and just do &quot;using namespace IDBLevelDBCoding;&quot; where it&apos;s used.
&gt; 
&gt; Namespaces are used very conservatively in WebKit, but there are some in inspector, graphics, audio, xpath. There&apos;s even one for leveldb already. This code is already using the class as a namespace (it has lots of classes, static methods, no members and can&apos;t be instantiated). So I agree that it would be a lot cleaner to make a namespace. Would you mind making the change?

Sure. Done.

&gt; 
&gt; &gt; Source/WebCore/WebCore.gypi:5526
&gt; &gt; +            &apos;storage/IDBLevelDBCoding.h&apos;,
&gt; 
&gt; Should these also be added to WebCore/GNUMakefile.list.am?

Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:154
&gt; &gt; +#endif
&gt; 
&gt; These macros are still in IDBLevelDBBackingStore.cpp. They should only be in one place, right?

They&apos;re used in both files at the moment :S</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393458</commentid>
    <comment_count>5</comment_count>
      <attachid>91258</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-27 02:31:39 -0700</bug_when>
    <thetext>Created attachment 91258
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393472</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-04-27 03:29:53 -0700</bug_when>
    <thetext>Attachment 91258 did not build on chromium:
Build output: http://queues.webkit.org/results/8510908</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>393479</commentid>
    <comment_count>7</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-27 04:11:48 -0700</bug_when>
    <thetext>Committed r85045: &lt;http://trac.webkit.org/changeset/85045&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91100</attachid>
            <date>2011-04-26 07:22:48 -0700</date>
            <delta_ts>2011-04-27 02:31:32 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-59452-20110426152238.patch</filename>
            <type>text/plain</type>
            <size>142790</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODQ4OTcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA2ZTNkOTM2MTBjYTM0N2Mz
ZGI1M2VhMDNkNjM2YmM1ZDRlODA0OWU1Li42NTFhNmQ4MzEwYjlhMWZkZjAyNTBmM2MyYjY3MTdi
YWQxOTE0ZTBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQyIEBACisyMDExLTA0LTI2ICBIYW5z
IFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgSW5kZXhlZERCOiBNb3ZlIExldmVsREIga2V5IGNvZGlu
ZyByb3V0aW5lcyB0byBzZXBhcmF0ZSBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01OTQ1MgorCisgICAgICAgIE1vdmUgYWxsIHJvdXRpbmVzIGNv
bmNlcm5lZCB3aXRoIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgY29tcGFyaXNvbiBvZgorICAgICAg
ICBMZXZlbERCIGtleXMgZnJvbSBJREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCB0byBhIHNlcGFy
YXRlIGZpbGU6CisgICAgICAgIElEQkxldmVsREJDb2RpbmcuY3BwLgorCisgICAgICAgIFRoaXMg
bWFrZXMgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgZWFzaWVyIHRvIHdvcmsgd2l0aCwgYW5k
IHdpbGwKKyAgICAgICAgYWxsb3cgZm9yIHVuaXQgdGVzdGluZyBvZiB0aGUgY29kaW5nIHJvdXRp
bmVzLgorCisgICAgICAgIE5vIG5ldyBmdW5jdGlvbmFsaXR5LCBubyBuZXcgdGVzdHMuCisKKyAg
ICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2lu
Z1N0b3JlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3Jl
OjpwdXRJbnQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNv
cmU6OnB1dFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlS2V5cyk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wYXJlSW5kZXhLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBhcmF0
b3I6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6c2V0VXBNZXRhZGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRh
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVz
KToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld09iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJlcik6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9i
amVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQpOgorICAgICAgICAoV2ViQ29y
ZTo6dmVyc2lvbkV4aXN0cyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcik6Cisg
ICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVCeXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6Om1heElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjptaW5JREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6ZW5jb2RlSW50KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29k
ZUludCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVWYXJJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlVmFySW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmVuY29kZVN0cmluZyk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVTdHJpbmcpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlU3RyaW5nV2l0aExlbmd0aCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmVuY29kZURvdWJsZSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVEb3VibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUlEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpleHRyYWN0RW5jb2RlZElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjpjb21wYXJlRW5jb2RlZElEQktleXMpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkNvZGluZzo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjpLZXlQcmVmaXg6OktleVByZWZpeCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4Ojp0eXBlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJDb2Rpbmc6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJMZXZlbERCQ29kaW5nOjpNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJhc2VG
cmVlTGlzdEtleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZUZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6Y29tcGFyZSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU5hbWVLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZU5hbWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
RGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
Q29kaW5nOjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Om1ldGFE
YXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rp
bmc6OkluZGV4TWV0YURhdGFLZXk6OkluZGV4TWV0YURhdGFLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleE1ldGFEYXRhS2V5Ojpjb21w
YXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFL
ZXk6OmluZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpkZWNvZGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtl
eTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0
b3JlRnJlZUxpc3RLZXk6Om9iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpJbmRleEZyZWVMaXN0
S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RL
ZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZy
ZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
SW5kZXhGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
Q29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVOYW1lc0tleTo6ZGVjb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTmFtZXNL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RT
dG9yZU5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rp
bmc6OkluZGV4TmFtZXNLZXk6OkluZGV4TmFtZXNLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkNvZGluZzo6SW5kZXhOYW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TmFtZXNLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleE5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3Jl
RGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpP
YmplY3RTdG9yZURhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6RXhpc3RzRW50cnlLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5Ojp1c2VyS2V5KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6SW5kZXhEYXRhS2V5
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6ZGVj
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtl
eTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Oklu
ZGV4RGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjpJbmRleERhdGFLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6aW5kZXhJZCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAq
IHN0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtleTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtleTo6ZGF0YWJhc2VOYW1lKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6Om1ldGFE
YXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9y
ZU5hbWVzS2V5OjpvYmplY3RTdG9yZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhOYW1lc0tleTo6aW5kZXhOYW1lKToKKwogMjAxMS0wNC0yNiAgRGF2aWQg
TGV2aW4gIDxsZXZpbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBC
YXJ0aC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCAxYWM5ODY3ZmIyZmU2ZDBhYWQzMzU4ZTAxODU1MjNm
ODYwZTM1MjE5Li40MWFkYTY4MjgwMTc5OTJkZmZkYWFhOWJkZGFlYjM3OGU1YWZkNjAxIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXBpCkBAIC01NTIyLDYgKzU1MjIsOCBAQAogICAgICAgICAgICAgJ3N0b3JhZ2Uv
SURCS2V5UGF0aEJhY2tlbmRJbXBsLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFu
Z2UuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQktleVJhbmdlLmgnLAorICAgICAgICAg
ICAgJ3N0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5jcHAnLAorICAgICAgICAgICAgJ3N0b3JhZ2Uv
SURCTGV2ZWxEQkNvZGluZy5oJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQkxldmVsREJCYWNr
aW5nU3RvcmUuY3BwJywKICAgICAgICAgICAgICdzdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3Rv
cmUuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJPYmplY3RTdG9yZS5jcHAnLApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKaW5kZXgg
MDlkNjY3ZmJkNWY1OWUxY2U0ODU0NjYzYTExNzJiYTQ2N2NjY2Q1Yy4uNzY2M2QwNGMyZTc1YzNl
ZjJlZTNmNjBjYjY0MGM5ZDk5YzI2M2ExNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVk
ZSAiRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgIklEQkZhY3RvcnlCYWNrZW5kSW1wbC5oIgogI2lu
Y2x1ZGUgIklEQktleVJhbmdlLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkNvZGluZy5oIgogI2lu
Y2x1ZGUgIkxldmVsREJDb21wYXJhdG9yLmgiCiAjaW5jbHVkZSAiTGV2ZWxEQkRhdGFiYXNlLmgi
CiAjaW5jbHVkZSAiTGV2ZWxEQkl0ZXJhdG9yLmgiCkBAIC00Nyw0MzYgKzQ4LDIxIEBACiAjZGVm
aW5lIElOVDMyX01BWCAweDdmZmZmZmZmTAogI2VuZGlmCiAKLS8vIExldmVsREIgc3RvcmVzIGtl
eS92YWx1ZSBwYWlycy4gS2V5cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIG9mIGJ5dGVzLCBub3Jt
YWxseSBvZiB0eXBlIFZlY3RvcjxjaGFyPi4KLS8vCi0vLyBUaGUga2V5cyBpbiB0aGUgYmFja2lu
ZyBzdG9yZSBhcmUgdmFyaWFibGUtbGVuZ3RoIHR1cGxlcyB3aXRoIGRpZmZlcmVudCB0eXBlcwot
Ly8gb2YgZmllbGRzLiBFYWNoIGtleSBpbiB0aGUgYmFja2luZyBzdG9yZSBzdGFydHMgd2l0aCBh
IHRlcm5hcnkgcHJlZml4OiAoZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQp
LiBGb3IgZWFjaCwgMCBpcyByZXNlcnZlZCBmb3IgbWV0YS1kYXRhLgotLy8gVGhlIHByZWZpeCBt
YWtlcyBzdXJlIHRoYXQgZGF0YSBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSwgb2JqZWN0IHN0b3Jl
LCBhbmQgaW5kZXggYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBsb2NhbGl0eSBpcyBpbXBvcnRh
bnQgZm9yIHBlcmZvcm1hbmNlOiBjb21tb24KLS8vIG9wZXJhdGlvbnMgc2hvdWxkIG9ubHkgbmVl
ZCBhIG1pbmltYWwgbnVtYmVyIG9mIHNlZWsgb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGFsbCB0
aGUgbWV0YS1kYXRhIGZvciBhIGRhdGFiYXNlIGlzIGdyb3VwZWQgdG9nZXRoZXIgc28gdGhhdCBy
ZWFkaW5nIHRoYXQKLS8vIG1ldGEtZGF0YSBvbmx5IHJlcXVpcmVzIG9uZSBzZWVrLgotLy8KLS8v
IEVhY2gga2V5IHR5cGUgaGFzIGEgY2xhc3MgKGluIHNxdWFyZSBicmFja2V0cyBiZWxvdykgd2hp
Y2gga25vd3MgaG93IHRvIGVuY29kZSwgZGVjb2RlLCBhbmQgY29tcGFyZSB0aGF0IGtleSB0eXBl
LgotLy8KLS8vIEdsb2JhbCBtZXRhLWRhdGEgaGF2ZSBrZXlzIHdpdGggcHJlZml4ICgwLDAsMCks
IGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlOgotLy8KLS8vICAgICA8MCwgMCwgMCwgMD4gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gSW5kZXhlZERCL0xldmVsREIg
c2NoZW1hIHZlcnNpb24gKDAgZm9yIG5vdykgW1NjaGVtYVZlcnNpb25LZXldCi0vLyAgICAgPDAs
IDAsIDAsIDE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRo
ZSBtYXhpbXVtIGRhdGFiYXNlIGlkIGV2ZXIgYWxsb2NhdGVkIFtNYXhEYXRhYmFzZUlkS2V5XQot
Ly8gICAgIDwwLCAwLCAwLCAxMDAsIGRhdGFiYXNlIGlkPiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA9PiBFeGlzdGVuY2UgaW1wbGllcyB0aGUgZGF0YWJhc2UgaWQgaXMgaW4gdGhlIGZyZWUg
bGlzdCBbRGF0YWJhc2VGcmVlTGlzdEtleV0KLS8vICAgICA8MCwgMCwgMCwgMjAxLCB1dGYxNiBv
cmlnaW4gbmFtZSwgdXRmMTYgZGF0YWJhc2UgbmFtZT4gPT4gRGF0YWJhc2UgaWQgW0RhdGFiYXNl
TmFtZUtleV0KLS8vCi0vLwotLy8gRGF0YWJhc2UgbWV0YS1kYXRhOgotLy8KLS8vICAgICBBZ2Fp
biwgdGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4KLS8vCi0vLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCAwPiA9PiB1dGYxNiBvcmlnaW4gbmFtZSBbRGF0YWJhc2VNZXRhRGF0
YUtleV0KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE+ID0+IHV0ZjE2IGRhdGFiYXNlIG5h
bWUgW0RhdGFiYXNlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyPiA9
PiB1dGYxNiB1c2VyIHZlcnNpb24gZGF0YSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KLS8vICAgICA8
ZGF0YWJhc2UgaWQsIDAsIDAsIDM+ID0+IG1heGltdW0gb2JqZWN0IHN0b3JlIGlkIGV2ZXIgYWxs
b2NhdGVkIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBPYmplY3Qgc3RvcmUgbWV0
YS1kYXRhOgotLy8KLS8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRl
LCB0aGVuIGEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIsIGFuZCB0aGVuIGFub3RoZXIgdmFyaWFi
bGUtbGVuZ3RoIGludGVnZXIgKEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIGJ5dGUpLgotLy8KLS8v
ICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDA+ID0+IHV0ZjE2
IG9iamVjdCBzdG9yZSBuYW1lIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQotLy8gICAgIDxkYXRh
YmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMT4gPT4gdXRmMTYga2V5IHBhdGgg
W09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwg
b2JqZWN0IHN0b3JlIGlkLCAyPiA9PiBoYXMgYXV0byBpbmNyZW1lbnQgW09iamVjdFN0b3JlTWV0
YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlk
LCAzPiA9PiBpcyBldmljdGFibGUgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCA0PiA9PiBsYXN0ICJ2ZXJzaW9u
IiBudW1iZXIgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAw
LCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCA1PiA9PiBtYXhpbXVtIGluZGV4IGlkIGV2ZXIgYWxs
b2NhdGVkIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBJbmRleCBtZXRhLWRh
dGE6Ci0vLwotLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRo
ZW4gdHdvIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycywgYW5kIHRoZW4gYW5vdGhlciB0eXBlIGJ5
dGUuCi0vLwotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQs
IGluZGV4IGlkLCAwPiA9PiB1dGYxNiBpbmRleCBuYW1lIFtJbmRleE1ldGFEYXRhS2V5XQotLy8g
ICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAx
PiA9PiBhcmUgaW5kZXgga2V5cyB1bmlxdWUgW0luZGV4TWV0YURhdGFLZXldCi0vLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDI+ID0+IHV0
ZjE2IGtleSBwYXRoIFtJbmRleE1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBPdGhlciBvYmplY3Qg
c3RvcmUgYW5kIGluZGV4IG1ldGEtZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZpeCBpcyBmb2xs
b3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIG9iamVjdCBzdG9yZSBhbmQgaW5kZXggaWQgYXJlIHZh
cmlhYmxlIGxlbmd0aCBpbnRlZ2VycywgdGhlIHV0ZjE2IHN0cmluZ3MgYXJlIHZhcmlhYmxlIGxl
bmd0aCBzdHJpbmdzLgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1MCwgb2JqZWN0
IHN0b3JlIGlkPiAgICAgICAgICAgICAgICAgICA9PiBleGlzdGVuY2UgaW1wbGllcyB0aGUgb2Jq
ZWN0IHN0b3JlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW09iamVjdFN0b3JlRnJlZUxpc3RLZXld
Ci0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTEsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXgg
aWQ+ICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIGluZGV4IGlkIGlzIGluIHRoZSBm
cmVlIGxpc3QgW0luZGV4RnJlZUxpc3RLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAy
MDAsIHV0ZjE2IG9iamVjdCBzdG9yZSBuYW1lPiAgICAgICAgICAgPT4gb2JqZWN0IHN0b3JlIGlk
IFtPYmplY3RTdG9yZU5hbWVzS2V5XQotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAxLCBv
YmplY3Qgc3RvcmUgaWQsIHV0ZjE2IGluZGV4IG5hbWU+ID0+IGluZGV4IGlkIFtJbmRleE5hbWVz
S2V5XQotLy8KLS8vCi0vLyBPYmplY3Qgc3RvcmUgZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZp
eCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVuY29kZWQg
SURCS2V5LgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMSwgdXNl
ciBrZXk+ID0+ICJ2ZXJzaW9uIiwgc2VyaWFsaXplZCBzY3JpcHQgdmFsdWUgW09iamVjdFN0b3Jl
RGF0YUtleV0KLS8vCi0vLwotLy8gIkV4aXN0cyIgZW50cnk6Ci0vLwotLy8gICAgIFRoZSBwcmVm
aXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVk
IElEQktleS4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDIsIHVz
ZXIga2V5PiA9PiAidmVyc2lvbiIgW0V4aXN0c0VudHJ5S2V5XQotLy8KLS8vCi0vLyBJbmRleCBk
YXRhOgotLy8KLS8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBU
aGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMg
YSB2YXJpYWJsZSBsZW5ndGggaW50ZWdlci4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCBvYmpl
Y3Qgc3RvcmUgaWQsIGluZGV4IGlkLCB1c2VyIGtleSwgc2VxdWVuY2UgbnVtYmVyPiA9PiAidmVy
c2lvbiIsIHVzZXIga2V5IFtJbmRleERhdGFLZXldCi0vLwotLy8gICAgIChUaGUgc2VxdWVuY2Ug
bnVtYmVyIGlzIHVzZWQgdG8gYWxsb3cgdHdvIGVudHJpZXMgd2l0aCB0aGUgc2FtZSB1c2VyIGtl
eQotLy8gICAgIGluIG5vbi11bmlxdWUgaW5kZXhlcy4gVGhlICJ2ZXJzaW9uIiBmaWVsZCBpcyB1
c2VkIHRvIHdlZWQgb3V0IHN0YWxlCi0vLyAgICAgaW5kZXggZGF0YS4gV2hlbmV2ZXIgbmV3IG9i
amVjdCBzdG9yZSBkYXRhIGlzIGluc2VydGVkLCBpdCBnZXRzIGEgbmV3Ci0vLyAgICAgInZlcnNp
b24iIG51bWJlciwgYW5kIG5ldyBpbmRleCBkYXRhIGlzIHdyaXR0ZW4gd2l0aCB0aGlzIG51bWJl
ci4gV2hlbgotLy8gICAgIHRoZSBpbmRleCBpcyB1c2VkIGZvciBsb29rLXVwcywgZW50cmllcyBh
cmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlCi0vLyAgICAgImV4aXN0cyIgZW50cmllcywgYW5kIHJl
Y29yZHMgd2l0aCBvbGQgInZlcnNpb24iIG51bWJlcnMgYXJlIGRlbGV0ZWQKLS8vICAgICB3aGVu
IHRoZXkgYXJlIGVuY291bnRlcmVkIGluIGdldFByaW1hcnlLZXlWaWFJbmRleCwKLS8vICAgICBJ
bmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93LCBhbmQgSW5kZXhLZXlDdXJzb3JJbXBsOjps
b2FkQ3VycmVudFJvdykuCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdWxs
VHlwZUJ5dGUgPSAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleVN0cmluZ1R5
cGVCeXRlID0gMTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlEYXRlVHlwZUJ5
dGUgPSAyOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bWJlclR5cGVCeXRl
ID0gMzsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlNaW5LZXlUeXBlQnl0ZSA9
IDQ7Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtNaW5pbXVtSW5kZXhJZCA9IDMwOwot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlRGF0YUluZGV4SWQgPSAxOwot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0V4aXN0c0VudHJ5SW5kZXhJZCA9IDI7Ci0KLXN0
YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtTY2hlbWFWZXJzaW9uVHlwZUJ5dGUgPSAwOwotc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga01heERhdGFiYXNlSWRUeXBlQnl0ZSA9IDE7Ci1zdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlID0gMTAwOwot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0RhdGFiYXNlTmFtZVR5cGVCeXRlID0gMjAxOwot
Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRl
ID0gNTA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhNZXRhRGF0YVR5cGVCeXRl
ID0gMTAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlRnJlZUxpc3RU
eXBlQnl0ZSA9IDE1MDsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleEZyZWVMaXN0
VHlwZUJ5dGUgPSAxNTE7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVO
YW1lc1R5cGVCeXRlID0gMjAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4TmFt
ZXNLZXlUeXBlQnl0ZSA9IDIwMTsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgVmVj
dG9yPGNoYXI+IGVuY29kZUJ5dGUodW5zaWduZWQgY2hhciBjKQotewotICAgIFZlY3RvcjxjaGFy
PiB2OwotICAgIHYuYXBwZW5kKGMpOwotICAgIHJldHVybiB2OwotfQotCi1zdGF0aWMgVmVjdG9y
PGNoYXI+IG1heElEQktleSgpCi17Ci0gICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxU
eXBlQnl0ZSk7Ci19Ci0KLXN0YXRpYyBWZWN0b3I8Y2hhcj4gbWluSURCS2V5KCkKLXsKLSAgICBy
ZXR1cm4gZW5jb2RlQnl0ZShrSURCS2V5TWluS2V5VHlwZUJ5dGUpOwotfQotCi1zdGF0aWMgVmVj
dG9yPGNoYXI+IGVuY29kZUludChpbnQ2NF90IG4pCi17Ci0gICAgQVNTRVJUKG4gPj0gMCk7Ci0g
ICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KLQot
ICAgIGRvIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbjsKLSAgICAgICAgcmV0LmFwcGVu
ZChjKTsKLSAgICAgICAgbiA+Pj0gODsKLSAgICB9IHdoaWxlIChuKTsKLQotICAgIHJldHVybiBy
ZXQ7Ci19Ci0KLXN0YXRpYyBpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29u
c3QgY2hhciogZW5kKQotewotICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOwotICAgIGludDY0X3Qg
cmV0ID0gMDsKLQotICAgIHdoaWxlIChiZWdpbiA8IGVuZCkgewotICAgICAgICB1bnNpZ25lZCBj
aGFyIGMgPSAqYmVnaW4rKzsKLSAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVWYXJJbnQo
aW50NjRfdCBuKQotewotICAgIFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMg
YXQgY3JlYXRpb24uCi0KLSAgICBkbyB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAw
eDdmOwotICAgICAgICBuID4+PSA3OwotICAgICAgICBpZiAobikKLSAgICAgICAgICAgIGMgfD0g
MTI4OwotICAgICAgICByZXQuYXBwZW5kKGMpOwotICAgIH0gd2hpbGUgKG4pOwotCi0gICAgcmV0
dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFy
ICpwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQpCi17Ci0gICAgQVNTRVJU
KGxpbWl0ID49IHApOwotICAgIGZvdW5kSW50ID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgaWYg
KHAgPj0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBmb3VuZEludCA9
IChmb3VuZEludCA8PCA3KSB8ICgqcCAmIDB4N2YpOwotICAgIH0gd2hpbGUgKCpwKysgJiAxMjgp
OwotICAgIHJldHVybiBwOwotfQotCi1zdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhj
b25zdCBTdHJpbmcmIHMpCi17Ci0gICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUg
dGhpcyBhdCBjcmVhdGlvbi4KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzLmxlbmd0
aCgpOyArK2kpIHsKLSAgICAgICAgVUNoYXIgdSA9IHNbaV07Ci0gICAgICAgIHVuc2lnbmVkIGNo
YXIgaGkgPSB1ID4+IDg7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSB1OwotICAgICAgICBy
ZXQuYXBwZW5kKGhpKTsKLSAgICAgICAgcmV0LmFwcGVuZChsbyk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHJldDsKLX0KLQotc3RhdGljIFN0cmluZyBkZWNvZGVTdHJpbmcoY29uc3QgY2hhciogcCwg
Y29uc3QgY2hhciogZW5kKQotewotICAgIEFTU0VSVChlbmQgPj0gcCk7Ci0gICAgQVNTRVJUKCEo
KGVuZCAtIHApICUgMikpOwotCi0gICAgc2l6ZV90IGxlbiA9IChlbmQgLSBwKSAvIDI7Ci0gICAg
VmVjdG9yPFVDaGFyPiB2ZWN0b3IobGVuKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bGVuOyArK2kpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9ICpwKys7Ci0gICAgICAgIHVu
c2lnbmVkIGNoYXIgbG8gPSAqcCsrOwotCi0gICAgICAgIHZlY3RvcltpXSA9IChoaSA8PCA4KSB8
IGxvOwotICAgIH0KLQotICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KHZlY3Rvcik7Ci19Ci0KLXN0
YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlU3RyaW5nV2l0aExlbmd0aChjb25zdCBTdHJpbmcmIHMp
Ci17Ci0gICAgVmVjdG9yPGNoYXI+IHJldCA9IGVuY29kZVZhckludChzLmxlbmd0aCgpKTsKLSAg
ICByZXQuYXBwZW5kKGVuY29kZVN0cmluZyhzKSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgoY29uc3QgY2hhciogcCwgY29u
c3QgY2hhciogbGltaXQsIFN0cmluZyYgZm91bmRTdHJpbmcpCi17Ci0gICAgQVNTRVJUKGxpbWl0
ID49IHApOwotICAgIGludDY0X3QgbGVuOwotICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQs
IGxlbik7Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocCArIGxlbiAq
IDIgPiBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3VuZFN0cmluZyA9IGRlY29k
ZVN0cmluZyhwLCBwICsgbGVuICogMik7Ci0gICAgcCArPSBsZW4gKiAyOwotICAgIHJldHVybiBw
OwotfQotCi1zdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZURvdWJsZShkb3VibGUgeCkKLXsKLSAg
ICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBiZSBieXRlIG9yZGVyIGlu
ZGVwZW5kZW50LgotICAgIGNvbnN0IGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigm
eCk7Ci0gICAgVmVjdG9yPGNoYXI+IHY7Ci0gICAgdi5hcHBlbmQocCwgc2l6ZW9mKHgpKTsKLSAg
ICBBU1NFUlQodi5zaXplKCkgPT0gc2l6ZW9mKHgpKTsKLSAgICByZXR1cm4gdjsKLX0KLQotc3Rh
dGljIGNvbnN0IGNoYXIqIGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBs
aW1pdCwgZG91YmxlKiBkKQotewotICAgIGlmIChwICsgc2l6ZW9mKCpkKSA+IGxpbWl0KQotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIGNoYXIqIHggPSByZWludGVycHJldF9jYXN0PGNoYXIqPihk
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZigqZCk7ICsraSkKLSAgICAgICAg
KngrKyA9ICpwKys7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlSURCS2V5KGNvbnN0IElEQktleSYga2V5KQotewotICAgIFZlY3RvcjxjaGFyPiByZXQ7Ci0K
LSAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Ci0g
ICAgICAgIHJldHVybiBlbmNvZGVCeXRlKGtJREJLZXlOdWxsVHlwZUJ5dGUpOwotICAgIGNhc2Ug
SURCS2V5OjpTdHJpbmdUeXBlOgotICAgICAgICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlTdHJp
bmdUeXBlQnl0ZSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChr
ZXkuc3RyaW5nKCkpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBjYXNlIElEQktleTo6RGF0
ZVR5cGU6Ci0gICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7Ci0g
ICAgICAgIHJldC5hcHBlbmQoZW5jb2RlRG91YmxlKGtleS5kYXRlKCkpKTsKLSAgICAgICAgQVNT
RVJUKHJldC5zaXplKCkgPT0gOSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgY2FzZSBJREJL
ZXk6Ok51bWJlclR5cGU6Ci0gICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleU51bWJlclR5
cGVCeXRlKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKSk7
Ci0gICAgICAgIEFTU0VSVChyZXQuc2l6ZSgpID09IDkpOwotICAgICAgICByZXR1cm4gcmV0Owot
ICAgIH0KLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBWZWN0b3I8Y2hh
cj4oKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZUlEQktleShjb25zdCBjaGFyKiBw
LCBjb25zdCBjaGFyKiBsaW1pdCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KQotewotICAgIEFT
U0VSVChsaW1pdCA+PSBwKTsKLSAgICBpZiAocCA+PSBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOwotICAgIFN0cmluZyBzOwotICAgIGRv
dWJsZSBkOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBrSURCS2V5TnVsbFR5cGVC
eXRlOgotICAgICAgICAvLyBOdWxsLgotICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRl
TnVsbCgpOwotICAgICAgICByZXR1cm4gcDsKLSAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0
ZToKLSAgICAgICAgLy8gU3RyaW5nLgotICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0
aChwLCBsaW1pdCwgcyk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOwotICAgICAgICByZXR1
cm4gcDsKLSAgICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6Ci0gICAgICAgIC8vIERhdGUuCi0g
ICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKLSAgICAgICAgaWYgKCFwKQot
ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVE
YXRlKGQpOwotICAgICAgICByZXR1cm4gcDsKLSAgICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0
ZToKLSAgICAgICAgLy8gTnVtYmVyLgotICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0
LCAmZCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBm
b3VuZEtleSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKGQpOwotICAgICAgICByZXR1cm4gcDsKLSAg
ICB9Ci0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3Rh
dGljIGNvbnN0IGNoYXIqIGV4dHJhY3RFbmNvZGVkSURCS2V5KGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBsaW1pdCwgVmVjdG9yPGNoYXI+KiByZXN1bHQpCi17Ci0gICAgY29uc3QgY2hh
ciogcCA9IHN0YXJ0OwotICAgIGlmIChwID49IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9ICpwKys7Ci0KLSAgICBpbnQ2NF90IHN0cmluZ0xlbjsK
LQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga0lEQktleU51bGxUeXBlQnl0ZToKLSAg
ICBjYXNlIGtJREJLZXlNaW5LZXlUeXBlQnl0ZToKLSAgICAgICAgKnJlc3VsdCA9IGVuY29kZUJ5
dGUodHlwZSk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVC
eXRlOgotICAgICAgICAvLyBTdHJpbmcuCi0gICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGlt
aXQsIHN0cmluZ0xlbik7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICBpZiAocCArIHN0cmluZ0xlbiAqIDIgPiBsaW1pdCkKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICByZXN1bHQtPmNsZWFyKCk7Ci0gICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0
YXJ0LCBwIC0gc3RhcnQgKyBzdHJpbmdMZW4gKiAyKTsKLSAgICAgICAgcmV0dXJuIHAgKyBzdHJp
bmdMZW4gKiAyOwotICAgIGNhc2Uga0lEQktleURhdGVUeXBlQnl0ZToKLSAgICBjYXNlIGtJREJL
ZXlOdW1iZXJUeXBlQnl0ZToKLSAgICAgICAgLy8gRGF0ZSBvciBudW1iZXIuCi0gICAgICAgIGlm
IChwICsgc2l6ZW9mKGRvdWJsZSkgPiBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
ICAgICByZXN1bHQtPmNsZWFyKCk7Ci0gICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0YXJ0LCAxICsg
c2l6ZW9mKGRvdWJsZSkpOwotICAgICAgICByZXR1cm4gcCArIHNpemVvZihkb3VibGUpOwotICAg
IH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGlj
IGludCBjb21wYXJlRW5jb2RlZElEQktleXMoY29uc3QgVmVjdG9yPGNoYXI+JiBrZXlBLCBjb25z
dCBWZWN0b3I8Y2hhcj4mIGtleUIpCi17Ci0gICAgQVNTRVJUKGtleUEuc2l6ZSgpID49IDEpOwot
ICAgIEFTU0VSVChrZXlCLnNpemUoKSA+PSAxKTsKLQotICAgIGNvbnN0IGNoYXIqIHAgPSBrZXlB
LmRhdGEoKTsKLSAgICBjb25zdCBjaGFyKiBsaW1pdEEgPSBwICsga2V5QS5zaXplKCk7Ci0gICAg
Y29uc3QgY2hhciogcSA9IGtleUIuZGF0YSgpOwotICAgIGNvbnN0IGNoYXIqIGxpbWl0QiA9IHEg
KyBrZXlCLnNpemUoKTsKLQotICAgIHVuc2lnbmVkIGNoYXIgdHlwZUEgPSAqcCsrOwotICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUIgPSAqcSsrOwotCi0gICAgU3RyaW5nIHMsIHQ7Ci0gICAgZG91Ymxl
IGQsIGU7Ci0KLSAgICBpZiAoaW50IHggPSB0eXBlQiAtIHR5cGVBKSAvLyBGSVhNRTogTm90ZSB0
aGUgc3VidGxlbmVzcyEKLSAgICAgICAgcmV0dXJuIHg7Ci0KLSAgICBzd2l0Y2ggKHR5cGVBKSB7
Ci0gICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgotICAgIGNhc2Uga0lEQktleU1pbktleVR5
cGVCeXRlOgotICAgICAgICAvLyBOdWxsIHR5cGUgb3IgbWF4IHR5cGU7IG5vIHBheWxvYWQgdG8g
Y29tcGFyZS4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5
dGU6Ci0gICAgICAgIC8vIFN0cmluZyB0eXBlLgotICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0
aExlbmd0aChwLCBsaW1pdEEsIHMpOyAvLyBGSVhNRTogQ29tcGFyZSB3aXRob3V0IGFjdHVhbGx5
IGRlY29kaW5nIHRoZSBTdHJpbmchCi0gICAgICAgIEFTU0VSVChwKTsKLSAgICAgICAgcSA9IGRl
Y29kZVN0cmluZ1dpdGhMZW5ndGgocSwgbGltaXRCLCB0KTsKLSAgICAgICAgQVNTRVJUKHEpOwot
ICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShzLCB0KTsKLSAgICBjYXNlIGtJREJLZXlE
YXRlVHlwZUJ5dGU6Ci0gICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6Ci0gICAgICAgIC8v
IERhdGUgb3IgbnVtYmVyLgotICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0QSwgJmQp
OwotICAgICAgICBBU1NFUlQocCk7Ci0gICAgICAgIHEgPSBkZWNvZGVEb3VibGUocSwgbGltaXRC
LCAmZSk7Ci0gICAgICAgIEFTU0VSVChxKTsKLSAgICAgICAgaWYgKGQgPCBlKQotICAgICAgICAg
ICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoZCA+IGUpCi0gICAgICAgICAgICByZXR1cm4gMTsK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBib29sIGdldEludChMZXZlbERCRGF0YWJhc2UqIGRi
LCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleSwgaW50NjRfdCYgZm91bmRJbnQpCiB7CiAgICAgVmVj
dG9yPGNoYXI+IHJlc3VsdDsKICAgICBpZiAoIWRiLT5nZXQoa2V5LCByZXN1bHQpKQogICAgICAg
ICByZXR1cm4gZmFsc2U7CiAKLSAgICBmb3VuZEludCA9IGRlY29kZUludChyZXN1bHQuYmVnaW4o
KSwgcmVzdWx0LmVuZCgpKTsKKyAgICBmb3VuZEludCA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29k
ZUludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0K
IAogc3RhdGljIGJvb2wgcHV0SW50KExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3Rvcjxj
aGFyPiYga2V5LCBpbnQ2NF90IHZhbHVlKQogewotICAgIHJldHVybiBkYi0+cHV0KGtleSwgZW5j
b2RlSW50KHZhbHVlKSk7CisgICAgcmV0dXJuIGRiLT5wdXQoa2V5LCBJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVJbnQodmFsdWUpKTsKIH0KIAogc3RhdGljIGJvb2wgZ2V0U3RyaW5nKExldmVsREJE
YXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBTdHJpbmcmIGZvdW5kU3RyaW5n
KQpAQCAtNDg1LDk2NSArNzEsMzYgQEAgc3RhdGljIGJvb2wgZ2V0U3RyaW5nKExldmVsREJEYXRh
YmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBTdHJpbmcmIGZvdW4KICAgICBpZiAo
IWRiLT5nZXQoa2V5LCByZXN1bHQpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBmb3Vu
ZFN0cmluZyA9IGRlY29kZVN0cmluZyhyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKKyAg
ICBmb3VuZFN0cmluZyA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29kZVN0cmluZyhyZXN1bHQuYmVn
aW4oKSwgcmVzdWx0LmVuZCgpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGJvb2wg
cHV0U3RyaW5nKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXksIGNv
bnN0IFN0cmluZyYgdmFsdWUpCiB7Ci0gICAgaWYgKCFkYi0+cHV0KGtleSwgZW5jb2RlU3RyaW5n
KHZhbHVlKSkpCisgICAgaWYgKCFkYi0+cHV0KGtleSwgSURCTGV2ZWxEQkNvZGluZzo6ZW5jb2Rl
U3RyaW5nKHZhbHVlKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gdHJ1ZTsK
IH0KIAotbmFtZXNwYWNlIHsKLWNsYXNzIEtleVByZWZpeCB7Ci1wdWJsaWM6Ci0gICAgS2V5UHJl
Zml4KCkKLSAgICAgICAgOiBtX2RhdGFiYXNlSWQoa0ludmFsaWRUeXBlKQotICAgICAgICAsIG1f
b2JqZWN0U3RvcmVJZChrSW52YWxpZFR5cGUpCi0gICAgICAgICwgbV9pbmRleElkKGtJbnZhbGlk
VHlwZSkKLSAgICB7Ci0gICAgfQotCi0gICAgS2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCi0gICAgICAgIDogbV9kYXRh
YmFzZUlkKGRhdGFiYXNlSWQpCi0gICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3Jl
SWQpCi0gICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCi0gICAgewotICAgIH0KLQotICAgIHN0
YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxp
bWl0LCBLZXlQcmVmaXgqIHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIGlmIChzdGFydCA9PSBsaW1p
dCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RC
eXRlID0gKnN0YXJ0Kys7Ci0KLSAgICAgICAgaW50IGRhdGFiYXNlSWRCeXRlcyA9ICgoZmlyc3RC
eXRlID4+IDUpICYgMHg3KSArIDE7Ci0gICAgICAgIGludCBvYmplY3RTdG9yZUlkQnl0ZXMgPSAo
KGZpcnN0Qnl0ZSA+PiAyKSAmIDB4NykgKyAxOwotICAgICAgICBpbnQgaW5kZXhJZEJ5dGVzID0g
KGZpcnN0Qnl0ZSAmIDB4MykgKyAxOwotCi0gICAgICAgIGlmIChzdGFydCArIGRhdGFiYXNlSWRC
eXRlcyArIG9iamVjdFN0b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyA+IGxpbWl0KQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJ
bnQoc3RhcnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzKTsKLSAgICAgICAgc3RhcnQgKz0gZGF0
YWJhc2VJZEJ5dGVzOwotICAgICAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IGRlY29kZUlu
dChzdGFydCwgc3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0ZXMpOwotICAgICAgICBzdGFydCArPSBv
YmplY3RTdG9yZUlkQnl0ZXM7Ci0gICAgICAgIHJlc3VsdC0+bV9pbmRleElkID0gZGVjb2RlSW50
KHN0YXJ0LCBzdGFydCArIGluZGV4SWRCeXRlcyk7Ci0gICAgICAgIHN0YXJ0ICs9IGluZGV4SWRC
eXRlczsKLQotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgfQotCi0gICAgVmVjdG9yPGNoYXI+
IGVuY29kZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IGtJ
bnZhbGlkSWQpOwotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQp
OwotICAgICAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOwotCi0gICAgICAgIFZl
Y3RvcjxjaGFyPiBkYXRhYmFzZUlkU3RyaW5nID0gZW5jb2RlSW50KG1fZGF0YWJhc2VJZCk7Ci0g
ICAgICAgIFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZUlkU3RyaW5nID0gZW5jb2RlSW50KG1fb2Jq
ZWN0U3RvcmVJZCk7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiBpbmRleElkU3RyaW5nID0gZW5jb2Rl
SW50KG1faW5kZXhJZCk7Ci0KLSAgICAgICAgQVNTRVJUKGRhdGFiYXNlSWRTdHJpbmcuc2l6ZSgp
IDw9IDgpOwotICAgICAgICBBU1NFUlQob2JqZWN0U3RvcmVJZFN0cmluZy5zaXplKCkgPD0gOCk7
Ci0gICAgICAgIEFTU0VSVChpbmRleElkU3RyaW5nLnNpemUoKSA8PSA0KTsKLQotCi0gICAgICAg
IHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKGRhdGFiYXNlSWRTdHJpbmcuc2l6ZSgpIC0gMSkg
PDwgNSB8IChvYmplY3RTdG9yZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IDIgfCAoaW5kZXhJZFN0
cmluZy5zaXplKCkgLSAxKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldDsKLSAgICAgICAgcmV0
LmFwcGVuZChmaXJzdEJ5dGUpOwotICAgICAgICByZXQuYXBwZW5kKGRhdGFiYXNlSWRTdHJpbmcp
OwotICAgICAgICByZXQuYXBwZW5kKG9iamVjdFN0b3JlSWRTdHJpbmcpOwotICAgICAgICByZXQu
YXBwZW5kKGluZGV4SWRTdHJpbmcpOwotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0g
ICAgaW50IGNvbXBhcmUoY29uc3QgS2V5UHJlZml4JiBvdGhlcikgY29uc3QKLSAgICB7Ci0gICAg
ICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgIT0ga0ludmFsaWRJZCk7Ci0gICAgICAgIEFTU0VSVCht
X29iamVjdFN0b3JlSWQgIT0ga0ludmFsaWRJZCk7Ci0gICAgICAgIEFTU0VSVChtX2luZGV4SWQg
IT0ga0ludmFsaWRJZCk7Ci0KLSAgICAgICAgaWYgKG1fZGF0YWJhc2VJZCAhPSBvdGhlci5tX2Rh
dGFiYXNlSWQpCi0gICAgICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkIC0gb3RoZXIubV9kYXRh
YmFzZUlkOwotICAgICAgICBpZiAobV9vYmplY3RTdG9yZUlkICE9IG90aGVyLm1fb2JqZWN0U3Rv
cmVJZCkKLSAgICAgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVj
dFN0b3JlSWQ7Ci0gICAgICAgIGlmIChtX2luZGV4SWQgIT0gb3RoZXIubV9pbmRleElkKQotICAg
ICAgICAgICAgcmV0dXJuIG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAga0dsb2JhbE1ldGFEYXRh
LAotICAgICAgICBrRGF0YWJhc2VNZXRhRGF0YSwKLSAgICAgICAga09iamVjdFN0b3JlRGF0YSwK
LSAgICAgICAga0V4aXN0c0VudHJ5LAotICAgICAgICBrSW5kZXhEYXRhLAotICAgICAgICBrSW52
YWxpZFR5cGUKLSAgICB9OwotCi0gICAgVHlwZSB0eXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAg
IEFTU0VSVChtX2RhdGFiYXNlSWQgIT0ga0ludmFsaWRJZCk7Ci0gICAgICAgIEFTU0VSVChtX29i
amVjdFN0b3JlSWQgIT0ga0ludmFsaWRJZCk7Ci0gICAgICAgIEFTU0VSVChtX2luZGV4SWQgIT0g
a0ludmFsaWRJZCk7Ci0KLSAgICAgICAgaWYgKCFtX2RhdGFiYXNlSWQpCi0gICAgICAgICAgICBy
ZXR1cm4ga0dsb2JhbE1ldGFEYXRhOwotICAgICAgICBpZiAoIW1fb2JqZWN0U3RvcmVJZCkKLSAg
ICAgICAgICAgIHJldHVybiBrRGF0YWJhc2VNZXRhRGF0YTsKLSAgICAgICAgaWYgKG1faW5kZXhJ
ZCA9PSBrT2JqZWN0U3RvcmVEYXRhSW5kZXhJZCkKLSAgICAgICAgICAgIHJldHVybiBrT2JqZWN0
U3RvcmVEYXRhOwotICAgICAgICBpZiAobV9pbmRleElkID09IGtFeGlzdHNFbnRyeUluZGV4SWQp
Ci0gICAgICAgICAgICByZXR1cm4ga0V4aXN0c0VudHJ5OwotICAgICAgICBpZiAobV9pbmRleElk
ID49IGtNaW5pbXVtSW5kZXhJZCkKLSAgICAgICAgICAgIHJldHVybiBrSW5kZXhEYXRhOwotCi0g
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4ga0ludmFsaWRUeXBl
OwotICAgIH0KLQotICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOwotICAgIGludDY0X3QgbV9vYmpl
Y3RTdG9yZUlkOwotICAgIGludDY0X3QgbV9pbmRleElkOwotCi0gICAgc3RhdGljIGNvbnN0IGlu
dDY0X3Qga0ludmFsaWRJZCA9IC0xOwotfTsKLQotY2xhc3MgU2NoZW1hVmVyc2lvbktleSB7Ci1w
dWJsaWM6Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKQotICAgIHsKLSAgICAgICAg
S2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHBy
ZWZpeC5lbmNvZGUoKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtTY2hlbWFWZXJz
aW9uVHlwZUJ5dGUpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19OwotCi1jbGFzcyBN
YXhEYXRhYmFzZUlkS2V5IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZSgpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOwotICAgICAgICBW
ZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa01heERhdGFiYXNlSWRUeXBlQnl0ZSkpOwotICAgICAgICByZXR1cm4gcmV0Owot
ICAgIH0KLX07Ci0KLWNsYXNzIERhdGFiYXNlRnJlZUxpc3RLZXkgewotcHVibGljOgotICAgIERh
dGFiYXNlRnJlZUxpc3RLZXkoKQotICAgICAgICA6IG1fZGF0YWJhc2VJZCgtMSkKLSAgICB7Ci0g
ICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogbGltaXQsIERhdGFiYXNlRnJlZUxpc3RLZXkqIHJlc3VsdCkKLSAgICB7Ci0g
ICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnAgPSBLZXlQcmVm
aXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXApCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFzZUlkKTsK
LSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICAgICAgQVNTRVJU
KCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7Ci0gICAg
ICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtEYXRhYmFzZUZyZWVMaXN0
VHlwZUJ5dGUpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fZGF0YWJh
c2VJZCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKLSAg
ICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICAgICAgcmV0LmFw
cGVuZChlbmNvZGVCeXRlKGtEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUpKTsKLSAgICAgICAgcmV0
LmFwcGVuZChlbmNvZGVWYXJJbnQoZGF0YWJhc2VJZCkpOwotICAgICAgICByZXR1cm4gcmV0Owot
ICAgIH0KLQotICAgIGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBB
U1NFUlQobV9kYXRhYmFzZUlkID49IDApOwotICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkOwot
ICAgIH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNlRnJlZUxpc3RLZXkmIG90aGVy
KSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKLSAgICAg
ICAgcmV0dXJuIG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKLSAgICB9Ci0KLXBy
aXZhdGU6Ci0gICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Ci19OwotCi1jbGFzcyBEYXRhYmFzZU5h
bWVLZXkgewotcHVibGljOgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCkKLSAg
ICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBL
ZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXAp
Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFz
ZUlkKTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICAgICAg
QVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAgaWYgKHAgPT0gbGltaXQpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7
Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtEYXRhYmFzZU5h
bWVUeXBlQnl0ZSk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1bHQt
Pm1fb3JpZ2luKTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAg
ICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1bHQtPm1fZGF0
YWJhc2VOYW1lKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShjb25z
dCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUpCi0gICAgewotICAg
ICAgICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOwotICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0
ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0RhdGFi
YXNlTmFtZVR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExl
bmd0aChvcmlnaW4pKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVuZ3Ro
KGRhdGFiYXNlTmFtZSkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIFN0cmlu
ZyBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQotICAgIFN0cmluZyBkYXRhYmFz
ZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlTmFtZTsgfQotCi0gICAgaW50IGNvbXBh
cmUoY29uc3QgRGF0YWJhc2VOYW1lS2V5JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIGlmIChpbnQg
eCA9IGNvZGVQb2ludENvbXBhcmUobV9vcmlnaW4sIG90aGVyLm1fb3JpZ2luKSkKLSAgICAgICAg
ICAgIHJldHVybiB4OwotICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX2RhdGFiYXNl
TmFtZSwgb3RoZXIubV9kYXRhYmFzZU5hbWUpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBTdHJp
bmcgbV9vcmlnaW47IC8vIEZJWE1FOiBTdG9yZSBlbmNvZGVkIHN0cmluZ3MsIG9yIGp1c3QgcG9p
bnRlcnMuCi0gICAgU3RyaW5nIG1fZGF0YWJhc2VOYW1lOwotfTsKLQotY2xhc3MgRGF0YWJhc2VN
ZXRhRGF0YUtleSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBNZXRhRGF0YVR5cGUgewotICAgICAgICBr
T3JpZ2luTmFtZSA9IDAsCi0gICAgICAgIGtEYXRhYmFzZU5hbWUgPSAxLAotICAgICAgICBrVXNl
clZlcnNpb24gPSAyLAotICAgICAgICBrTWF4T2JqZWN0U3RvcmVJZCA9IDMKLSAgICB9OwotCi0g
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBNZXRhRGF0
YVR5cGUgbWV0YURhdGFUeXBlKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRh
YmFzZUlkLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUo
KTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKG1ldGFEYXRhVHlwZSkpOwotICAgICAg
ICByZXR1cm4gcmV0OwotICAgIH0KLX07Ci0KLWNsYXNzIE9iamVjdFN0b3JlTWV0YURhdGFLZXkg
ewotcHVibGljOgotICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkoKQotICAgICAgICA6IG1fb2Jq
ZWN0U3RvcmVJZCgtMSkKLSAgICAgICAgLCBtX21ldGFEYXRhVHlwZSgtMSkKLSAgICB7Ci0gICAg
fQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29u
c3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXkqIHJlc3VsdCkKLSAgICB7Ci0g
ICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVm
aXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXApCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOwot
ICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgICAgICBBU1NFUlQo
IXByZWZpeC5tX2luZGV4SWQpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgICAg
IHJldHVybiAwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKLSAgICAg
ICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3JlTWV0YURh
dGFUeXBlQnl0ZSk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RT
dG9yZUlkKTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAg
IEFTU0VSVChyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUpOwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0
b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXgo
ZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5j
b2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrT2JqZWN0U3RvcmVNZXRhRGF0
YVR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3Jl
SWQpKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQobWV0YURhdGFUeXBlKSk7Ci0g
ICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkg
Y29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAg
ICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQ7Ci0gICAgfQotICAgIGludDY0X3QgbWV0YURhdGFU
eXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX21ldGFEYXRhVHlwZSA+PSAwKTsK
LSAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlOwotICAgIH0KLQotICAgIGludCBjb21wYXJl
KGNvbnN0IE9iamVjdFN0b3JlTWV0YURhdGFLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICAgICAgQVNTRVJUKG1fbWV0YURhdGFUeXBl
ID49IDApOwotICAgICAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29i
amVjdFN0b3JlSWQpCi0gICAgICAgICAgICByZXR1cm4geDsgLy8gRklYTUU6IElzIHRoaXMgY2Fz
dCBzYWZlPyBJLmUuLCB3aWxsIGl0IHByZXNlcnZlIHRoZSBzaWduPwotICAgICAgICByZXR1cm4g
bV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRhVHlwZTsKLSAgICB9Ci0KLXByaXZhdGU6
Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgaW50NjRfdCBtX21ldGFEYXRhVHlw
ZTsgLy8gRklYTUU6IE1ha2UgdGhpcyBhIGJ5dGUuCi19OwotCi1jbGFzcyBJbmRleE1ldGFEYXRh
S2V5IHsKLXB1YmxpYzoKLSAgICBJbmRleE1ldGFEYXRhS2V5KCkKLSAgICAgICAgOiBtX29iamVj
dFN0b3JlSWQoLTEpCi0gICAgICAgICwgbV9pbmRleElkKC0xKQotICAgICAgICAsIG1fbWV0YURh
dGFUeXBlKDApCi0gICAgewotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUo
Y29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE1ldGFEYXRhS2V5KiBy
ZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAgICAgICBjb25zdCBj
aGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAgICAg
ICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgu
bV9kYXRhYmFzZUlkKTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsK
LSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAgaWYgKHAgPT0gbGlt
aXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0
ZSA9ICpwKys7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtJ
bmRleE1ldGFEYXRhVHlwZUJ5dGUpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAg
ICAgIHJldHVybiAwOwotICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQt
Pm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhJZCk7
Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocCA9
PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXN1bHQtPm1fbWV0YURh
dGFUeXBlID0gKnArKzsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgc3RhdGljIFZl
Y3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUpCi0gICAgewot
ICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOwotICAgICAgICBWZWN0
b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVuY29k
ZUJ5dGUoa0luZGV4TWV0YURhdGFUeXBlQnl0ZSkpOwotICAgICAgICByZXQuYXBwZW5kKGVuY29k
ZVZhckludChvYmplY3RTdG9yZUlkKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50
KGluZGV4SWQpKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKG1ldGFEYXRhVHlwZSkp
OwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IElu
ZGV4TWV0YURhdGFLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3Rv
cmVJZCA+PSAwKTsKLSAgICAgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKLQotICAgICAgICBp
ZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCi0gICAg
ICAgICAgICByZXR1cm4geDsKLSAgICAgICAgaWYgKGludCB4ID0gbV9pbmRleElkIC0gb3RoZXIu
bV9pbmRleElkKQotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIHJldHVybiBtX21ldGFE
YXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFUeXBlOwotICAgIH0KLQotICAgIGludDY0X3QgaW5k
ZXhJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDApOwotICAg
ICAgICByZXR1cm4gbV9pbmRleElkOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGNoYXIgbWV0YURh
dGFUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9tZXRhRGF0YVR5cGU7IH0KLQotcHJpdmF0ZToKLSAg
ICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBpbnQ2NF90IG1faW5kZXhJZDsKLSAgICB1
bnNpZ25lZCBjaGFyIG1fbWV0YURhdGFUeXBlOwotfTsKLQotY2xhc3MgT2JqZWN0U3RvcmVGcmVl
TGlzdEtleSB7Ci1wdWJsaWM6Ci0gICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSgpCi0gICAgICAg
IDogbV9vYmplY3RTdG9yZUlkKC0xKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3Qg
Y2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0
U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0KQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZp
eDsKLSAgICAgICAgY29uc3QgY2hhciAqcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1p
dCwgJnByZWZpeCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
ICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4
Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Ci0g
ICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVC
eXRlLCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKTsKLSAgICAgICAg
aWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGRl
Y29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgIH0KLQot
ICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFz
ZUlkLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsK
LSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5
dGUpKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOwot
ICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCgp
IGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOwotICAg
ICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwotICAgIH0KLQotICAgIGludCBjb21wYXJlKGNv
bnN0IE9iamVjdFN0b3JlRnJlZUxpc3RLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgLy8gRklY
TUU6IEl0IG1heSBzZWVtIHN0cmFuZ2UgdGhhdCB3ZSdyZSBub3QgY29tcGFyaW5nIGRhdGFiYXNl
IGlkJ3MsCi0gICAgICAgIC8vIGJ1dCB0aGF0IGNvbXBhcmlzb24gd2lsbCBoYXZlIGJlZW4gbWFk
ZSBlYXJsaWVyLgotICAgICAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgbWFrZSB0aGlzIG1vcmUg
Y2xlYXIsIHRob3VnaC4uLgotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOwot
ICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOwot
ICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLX07Ci0KLWNs
YXNzIEluZGV4RnJlZUxpc3RLZXkgewotcHVibGljOgotICAgIEluZGV4RnJlZUxpc3RLZXkoKQot
ICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKLSAgICAgICAgLCBtX2luZGV4SWQoLTEpCi0g
ICAgewotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciog
c3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpCi0gICAg
ewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5
UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAgICAgICAgaWYgKCFwKQot
ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlk
KTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICAgICAgQVNT
RVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7Ci0g
ICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtJbmRleEZyZWVMaXN0
VHlwZUJ5dGUpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3Rv
cmVJZCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBy
ZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhJZCk7Ci0gICAgfQot
Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKLSAgICB7Ci0gICAgICAgIEtleVBy
ZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQg
PSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrSW5kZXhG
cmVlTGlzdFR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVj
dFN0b3JlSWQpKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQoaW5kZXhJZCkpOwot
ICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4
RnJlZUxpc3RLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJ
ZCA+PSAwKTsKLSAgICAgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKLSAgICAgICAgaWYgKGlu
dCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQotICAgICAgICAg
ICAgcmV0dXJuIHg7Ci0gICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4SWQ7
Ci0gICAgfQotCi0gICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3QKLSAgICB7Ci0gICAg
ICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgICAgIHJldHVybiBtX29iamVj
dFN0b3JlSWQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBpbmRleElkKCkgY29uc3QKLSAgICB7Ci0g
ICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7Ci0gICAgICAgIHJldHVybiBtX2luZGV4SWQ7
Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOwotICAgIGlu
dDY0X3QgbV9pbmRleElkOwotfTsKLQotY2xhc3MgT2JqZWN0U3RvcmVOYW1lc0tleSB7Ci1wdWJs
aWM6Ci0gICAgLy8gRklYTUU6IFdlIG5ldmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgb2JqZWN0IHN0
b3JlIGlkcywgYmVjYXVzZSBhIG1hcHBpbmcKLSAgICAvLyBpcyBrZXB0IGluIHRoZSBJREJEYXRh
YmFzZUJhY2tlbmRJbXBsLiBDYW4gdGhlIG1hcHBpbmcgYmVjb21lIHVucmVsaWFibGU/Ci0gICAg
Ly8gQ2FuIHdlIHJlbW92ZSB0aGlzPwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU5hbWVzS2V5KiBy
ZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAgICAgICBjb25zdCBj
aGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAgICAg
ICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgu
bV9kYXRhYmFzZUlkKTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsK
LSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAgaWYgKHAgPT0gbGlt
aXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0
ZSA9ICpwKys7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtP
YmplY3RTdG9yZU5hbWVzVHlwZUJ5dGUpOwotICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0
aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlTmFtZSk7Ci0gICAgfQotCi0g
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBT
dHJpbmcmIG9iamVjdFN0b3JlTmFtZSkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXgo
ZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5j
b2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrU2NoZW1hVmVyc2lvblR5cGVC
eXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrT2JqZWN0U3RvcmVOYW1lc1R5
cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChvYmpl
Y3RTdG9yZU5hbWUpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpbnQgY29t
cGFyZShjb25zdCBPYmplY3RTdG9yZU5hbWVzS2V5JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIHJl
dHVybiBjb2RlUG9pbnRDb21wYXJlKG1fb2JqZWN0U3RvcmVOYW1lLCBvdGhlci5tX29iamVjdFN0
b3JlTmFtZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG1fb2JqZWN0U3RvcmVOYW1lOyB9Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fb2Jq
ZWN0U3RvcmVOYW1lOyAvLyBGSVhNRTogU3RvcmUgdGhlIGVuY29kZWQgc3RyaW5nLCBvciBqdXN0
IHBvaW50ZXJzIHRvIGl0LgotfTsKLQotY2xhc3MgSW5kZXhOYW1lc0tleSB7Ci1wdWJsaWM6Ci0g
ICAgSW5kZXhOYW1lc0tleSgpCi0gICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQotICAgIHsK
LSAgICB9Ci0KLSAgICAvLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBpbmRl
eCBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCi0gICAgLy8gaXMga2VwdCBhdCBhIGhpZ2hlciBsZXZl
bC4KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25z
dCBjaGFyKiBsaW1pdCwgSW5kZXhOYW1lc0tleSogcmVzdWx0KQotICAgIHsKLSAgICAgICAgS2V5
UHJlZml4IHByZWZpeDsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2Rl
KHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFT
U0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1f
aW5kZXhJZCk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRf
VU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrSW5kZXhOYW1lc0tleVR5cGVCeXRlKTsKLSAg
ICAgICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcCA9
IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgICAg
ICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGRlY29kZVN0
cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9pbmRleE5hbWUpOwotICAgIH0KLQot
ICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIGluZGV4TmFtZSkKLSAgICB7Ci0gICAgICAg
IEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxjaGFy
PiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShr
SW5kZXhOYW1lc0tleVR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50
KG9iamVjdFN0b3JlSWQpKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVu
Z3RoKGluZGV4TmFtZSkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBj
b21wYXJlKGNvbnN0IEluZGV4TmFtZXNLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgQVNTRVJU
KG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9y
ZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAg
ICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKG1faW5kZXhOYW1lLCBvdGhlci5tX2luZGV4TmFt
ZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGluZGV4TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5k
ZXhOYW1lOyB9Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAg
U3RyaW5nIG1faW5kZXhOYW1lOwotfTsKLQotY2xhc3MgT2JqZWN0U3RvcmVEYXRhS2V5IHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBlbmQsIE9iamVjdFN0b3JlRGF0YUtleSogcmVzdWx0KQotICAgIHsKLSAgICAg
ICAgS2V5UHJlZml4IHByZWZpeDsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6
ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXApCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOwotICAgICAg
ICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgu
bV9pbmRleElkID09IGtTcGVjaWFsSW5kZXhOdW1iZXIpOwotICAgICAgICBpZiAocCA9PSBlbmQp
Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVkSURC
S2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNlcktleSk7Ci0gICAgfQotCi0gICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiBlbmNvZGVkVXNlcktleSkKLSAgICB7Ci0gICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga1NwZWNpYWxJ
bmRleE51bWJlcik7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7
Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlZFVzZXJLZXkpOwotCi0gICAgICAgIHJldHVybiBy
ZXQ7Ci0gICAgfQotCi0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5j
b2RlSURCS2V5KHVzZXJLZXkpKTsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBPYmpl
Y3RTdG9yZURhdGFLZXkmIG90aGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVFbmNv
ZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5KTsKLSAg
ICB9Ci0KLSAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0Ci0gICAgewotICAg
ICAgICBSZWZQdHI8SURCS2V5PiBrZXk7Ci0gICAgICAgIGRlY29kZUlEQktleShtX2VuY29kZWRV
c2VyS2V5LmJlZ2luKCksIG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7Ci0gICAgICAgIHJl
dHVybiBrZXk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NwZWNpYWxJbmRl
eE51bWJlciA9IGtPYmplY3RTdG9yZURhdGFJbmRleElkOwotCi1wcml2YXRlOgotICAgIFZlY3Rv
cjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5OwotfTsKLQotY2xhc3MgRXhpc3RzRW50cnlLZXkgewot
cHVibGljOgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQs
IGNvbnN0IGNoYXIqIGVuZCwgRXhpc3RzRW50cnlLZXkqIHJlc3VsdCkKLSAgICB7Ci0gICAgICAg
IEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRl
Y29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKLSAgICAgICAg
QVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1f
aW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4TnVtYmVyKTsKLSAgICAgICAgaWYgKHAgPT0gZW5kKQot
ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktl
eShwLCBlbmQsICZyZXN1bHQtPm1fZW5jb2RlZFVzZXJLZXkpOwotICAgIH0KLQotICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRLZXkpCi0gICAgewotICAgICAgICBL
ZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhO
dW1iZXIpOwotICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZWRLZXkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0K
LQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIHVzZXJLZXkpCi0gICAgewotICAgICAg
ICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktleSh1
c2VyS2V5KSk7Ci0gICAgfQotCi0gICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkm
IG90aGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2Vu
Y29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5KTsKLSAgICB9Ci0KLSAgICBQYXNz
UmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0Ci0gICAgewotICAgICAgICBSZWZQdHI8SURC
S2V5PiBrZXk7Ci0gICAgICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmJlZ2luKCks
IG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAg
fQotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NwZWNpYWxJbmRleE51bWJlciA9IGtFeGlz
dHNFbnRyeUluZGV4SWQ7Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVz
ZXJLZXk7Ci19OwotCi1jbGFzcyBJbmRleERhdGFLZXkgewotcHVibGljOgotICAgIEluZGV4RGF0
YUtleSgpCi0gICAgICAgIDogbV9kYXRhYmFzZUlkKC0xKQotICAgICAgICAsIG1fb2JqZWN0U3Rv
cmVJZCgtMSkKLSAgICAgICAgLCBtX2luZGV4SWQoLTEpCi0gICAgICAgICwgbV9zZXF1ZW5jZU51
bWJlcigtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShj
b25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4RGF0YUtleSogcmVzdWx0
KQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeDsKLSAgICAgICAgY29uc3QgY2hhciog
cCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgICAgIGlm
ICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0
YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICAg
ICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPj0ga01pbmltdW1JbmRleElkKTsKLSAgICAgICAg
cmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBwcmVmaXgubV9kYXRhYmFzZUlkOwotICAgICAgICByZXN1
bHQtPm1fb2JqZWN0U3RvcmVJZCA9IHByZWZpeC5tX29iamVjdFN0b3JlSWQ7Ci0gICAgICAgIHJl
c3VsdC0+bV9pbmRleElkID0gcHJlZml4Lm1faW5kZXhJZDsKLSAgICAgICAgcCA9IGV4dHJhY3RF
bmNvZGVkSURCS2V5KHAsIGxpbWl0LCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKLSAgICAg
ICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChwID09IGxpbWl0
KSB7Ci0gICAgICAgICAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIgPSAtMTsgLy8gRklYTUU6
IFdlIHNob3VsZCBjaGFuZ2UgaXQgc28gdGhhdCBhbGwga2V5cyBoYXZlIGEgc2VxdWVuY2UgbnVt
YmVyLiBTaG91bGRuJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLgotICAgICAgICAgICAgcmV0
dXJuIHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwg
cmVzdWx0LT5tX3NlcXVlbmNlTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNo
YXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRVc2VyS2V5LCBpbnQ2NF90
IHNlcXVlbmNlTnVtYmVyKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9
IHByZWZpeC5lbmNvZGUoKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVkVXNlcktleSk7Ci0g
ICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KHNlcXVlbmNlTnVtYmVyKSk7Ci0gICAgICAg
IHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5JiB1c2VyS2V5LCBpbnQ2NF90IHNlcXVlbmNlTnVtYmVyKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBl
bmNvZGVJREJLZXkodXNlcktleSksIHNlcXVlbmNlTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBzdGF0
aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1heEtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgSU5UMzJfTUFYLCBtYXhJREJLZXkoKSwgSU5UNjRfTUFYKTsKLSAgICB9
Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleERhdGFLZXkmIG90aGVyLCBib29sIGlnbm9y
ZVNlcXVlbmNlTnVtYmVyKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAw
KTsKLSAgICAgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICAgICAgQVNTRVJU
KG1faW5kZXhJZCA+PSAwKTsKLSAgICAgICAgaWYgKGludCB4ID0gY29tcGFyZUVuY29kZWRJREJL
ZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1fZW5jb2RlZFVzZXJLZXkpKQotICAgICAgICAg
ICAgcmV0dXJuIHg7Ci0gICAgICAgIGlmIChpZ25vcmVTZXF1ZW5jZU51bWJlcikKLSAgICAgICAg
ICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gbV9zZXF1ZW5jZU51bWJlciAtIG90aGVyLm1f
c2VxdWVuY2VOdW1iZXI7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkYXRhYmFzZUlkKCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7Ci0gICAgICAgIHJldHVy
biBtX2RhdGFiYXNlSWQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgICAg
IHJldHVybiBtX29iamVjdFN0b3JlSWQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBpbmRleElkKCkg
Y29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7Ci0gICAgICAgIHJl
dHVybiBtX2luZGV4SWQ7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXko
KSBjb25zdAotICAgIHsKLSAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OwotICAgICAgICBkZWNv
ZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgp
LCBrZXkpOwotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQ2
NF90IG1fZGF0YWJhc2VJZDsKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBpbnQ2
NF90IG1faW5kZXhJZDsKLSAgICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsKLSAgICBp
bnQ2NF90IG1fc2VxdWVuY2VOdW1iZXI7Ci19OwotCi1uYW1lc3BhY2UgewotdGVtcGxhdGU8dHlw
ZW5hbWUgS2V5VHlwZT4KLWludCBkZWNvZGVBbmRDb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYg
YSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKQotewotICAgIEtleVR5cGUga2V5QTsKLSAgICBLZXlU
eXBlIGtleUI7Ci0KLSAgICBjb25zdCBjaGFyKiBwdHJBID0gS2V5VHlwZTo6ZGVjb2RlKGEuYmVn
aW4oKSwgYS5lbmQoKSwgJmtleUEpOwotICAgIEFTU0VSVF9VTlVTRUQocHRyQSwgcHRyQSk7Ci0g
ICAgY29uc3QgY2hhciogcHRyQiA9IEtleVR5cGU6OmRlY29kZShiLmJlZ2luKCksIGIuZW5kKCks
ICZrZXlCKTsKLSAgICBBU1NFUlRfVU5VU0VEKHB0ckIsIHB0ckIpOwotCi0gICAgcmV0dXJuIGtl
eUEuY29tcGFyZShrZXlCKTsKLX0KLX0KLQotc3RhdGljIGludCByZWFsQ29tcGFyZShjb25zdCBM
ZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYiwgYm9vbCBpbmRleEtleXMgPSBm
YWxzZSkKLXsKLSAgICBjb25zdCBjaGFyKiBwdHJBID0gYS5iZWdpbigpOwotICAgIGNvbnN0IGNo
YXIqIHB0ckIgPSBiLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhciogZW5kQSA9IGEuZW5kKCk7Ci0g
ICAgY29uc3QgY2hhciogZW5kQiA9IGIuZW5kKCk7Ci0KLSAgICBLZXlQcmVmaXggcHJlZml4QTsK
LSAgICBLZXlQcmVmaXggcHJlZml4QjsKLQotICAgIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShw
dHJBLCBlbmRBLCAmcHJlZml4QSk7Ci0gICAgcHRyQiA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckIs
IGVuZEIsICZwcmVmaXhCKTsKLSAgICBBU1NFUlQocHRyQSk7Ci0gICAgQVNTRVJUKHB0ckIpOwot
Ci0gICAgaWYgKGludCB4ID0gcHJlZml4QS5jb21wYXJlKHByZWZpeEIpKQotICAgICAgICByZXR1
cm4geDsKLQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtHbG9iYWxNZXRh
RGF0YSkgewotICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsKLSAgICAgICAgQVNTRVJUKHB0
ckIgIT0gZW5kQik7Ci0KLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsr
OwotICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQiA9ICpwdHJCKys7Ci0KLSAgICAgICAg
aWYgKGludCB4ID0gdHlwZUJ5dGVBIC0gdHlwZUJ5dGVCKQotICAgICAgICAgICAgcmV0dXJuIHg7
Ci0KLSAgICAgICAgaWYgKHR5cGVCeXRlQSA8PSAxKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSkKLSAgICAg
ICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPERhdGFiYXNlRnJlZUxpc3RLZXk+KGEsIGIp
OwotICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSkKLSAgICAg
ICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPERhdGFiYXNlTmFtZUtleT4oYSwgYik7Ci0g
ICAgfQotCi0gICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a0RhdGFiYXNlTWV0
YURhdGEpIHsKLSAgICAgICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7Ci0gICAgICAgIEFTU0VSVChw
dHJCICE9IGVuZEIpOwotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckEr
KzsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOwotCi0gICAgICAg
IGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikKLSAgICAgICAgICAgIHJldHVybiB4
OwotCi0gICAgICAgIGlmICh0eXBlQnl0ZUEgPD0gMykKLSAgICAgICAgICAgIHJldHVybiAwOwot
Ci0gICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkK
LSAgICAgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk+KGEsIGIpOwotICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtJbmRleE1ldGFEYXRhVHlwZUJ5
dGUpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRleE1ldGFEYXRhS2V5
PihhLCBiKTsKLSAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVGcmVlTGlzdFR5
cGVCeXRlKQotICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8T2JqZWN0U3RvcmVG
cmVlTGlzdEtleT4oYSwgYik7Ci0gICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4RnJlZUxp
c3RUeXBlQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPEluZGV4RnJl
ZUxpc3RLZXk+KGEsIGIpOwotICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtPYmplY3RTdG9yZU5h
bWVzVHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxPYmplY3RT
dG9yZU5hbWVzS2V5PihhLCBiKTsKLSAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrSW5kZXhOYW1l
c0tleVR5cGVCeXRlKQotICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8SW5kZXhO
YW1lc0tleT4oYSwgYik7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgIH0KLQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6
OmtPYmplY3RTdG9yZURhdGEpIHsKLSAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09
IGVuZEIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkK
LSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKLSAgICAg
ICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2Vy
IGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCi0KLSAgICAgICAg
cmV0dXJuIGRlY29kZUFuZENvbXBhcmU8T2JqZWN0U3RvcmVEYXRhS2V5PihhLCBiKTsKLSAgICB9
Ci0gICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a0V4aXN0c0VudHJ5KSB7Ci0g
ICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQotICAgICAgICAgICAgcmV0
dXJuIDA7Ci0gICAgICAgIGlmIChwdHJBID09IGVuZEEpCi0gICAgICAgICAgICByZXR1cm4gLTE7
Ci0gICAgICAgIGlmIChwdHJCID09IGVuZEIpCi0gICAgICAgICAgICByZXR1cm4gMTsgLy8gRklY
TUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0
byBiZSBoYW5kbGVkIHRoaXMgd2F5LgotCi0gICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJl
PEV4aXN0c0VudHJ5S2V5PihhLCBiKTsKLSAgICB9Ci0gICAgaWYgKHByZWZpeEEudHlwZSgpID09
IEtleVByZWZpeDo6a0luZGV4RGF0YSkgewotICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0
ckIgPT0gZW5kQikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocHRyQSA9PSBl
bmRBKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQot
ICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5n
IHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KLQotICAg
ICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5QTsKLSAgICAgICAgSW5kZXhEYXRhS2V5IGlu
ZGV4RGF0YUtleUI7Ci0KLSAgICAgICAgcHRyQSA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKGEuYmVn
aW4oKSwgZW5kQSwgJmluZGV4RGF0YUtleUEpOwotICAgICAgICBwdHJCID0gSW5kZXhEYXRhS2V5
OjpkZWNvZGUoYi5iZWdpbigpLCBlbmRCLCAmaW5kZXhEYXRhS2V5Qik7Ci0gICAgICAgIEFTU0VS
VChwdHJBKTsKLSAgICAgICAgQVNTRVJUKHB0ckIpOwotCi0gICAgICAgIGJvb2wgaWdub3JlU2Vx
dWVuY2VOdW1iZXIgPSBpbmRleEtleXM7Ci0gICAgICAgIHJldHVybiBpbmRleERhdGFLZXlBLmNv
bXBhcmUoaW5kZXhEYXRhS2V5QiwgaWdub3JlU2VxdWVuY2VOdW1iZXIpOwotICAgIH0KLQotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNv
bXBhcmVLZXlzKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKQog
ewotICAgIHJldHVybiByZWFsQ29tcGFyZShhLCBiKTsKKyAgICByZXR1cm4gSURCTGV2ZWxEQkNv
ZGluZzo6Y29tcGFyZShhLCBiKTsKIH0KIAogc3RhdGljIGludCBjb21wYXJlSW5kZXhLZXlzKGNv
bnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKQogewotICAgIHJldHVy
biByZWFsQ29tcGFyZShhLCBiLCB0cnVlKTsKKyAgICByZXR1cm4gSURCTGV2ZWxEQkNvZGluZzo6
Y29tcGFyZShhLCBiLCB0cnVlKTsKIH0KIAogY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBMZXZl
bERCQ29tcGFyYXRvciB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBpbnQgY29tcGFyZShjb25zdCBM
ZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikgY29uc3QgeyByZXR1cm4gcmVh
bENvbXBhcmUoYSwgYik7IH0KKyAgICB2aXJ0dWFsIGludCBjb21wYXJlKGNvbnN0IExldmVsREJT
bGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiKSBjb25zdCB7IHJldHVybiBJREJMZXZlbERC
Q29kaW5nOjpjb21wYXJlKGEsIGIpOyB9CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkg
Y29uc3QgeyByZXR1cm4gImlkYl9jbXAxIjsgfQogfTsKLX0KIAogc3RhdGljIGJvb2wgc2V0VXBN
ZXRhZGF0YShMZXZlbERCRGF0YWJhc2UqIGRiKQogewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBt
ZXRhRGF0YUtleSA9IFNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSgpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBtZXRhRGF0YUtleSA9IElEQkxldmVsREJDb2Rpbmc6OlNjaGVtYVZlcnNpb25LZXk6
OmVuY29kZSgpOwogCiAgICAgaW50NjRfdCBzY2hlbWFWZXJzaW9uOwogICAgIGlmICghZ2V0SW50
KGRiLCBtZXRhRGF0YUtleSwgc2NoZW1hVmVyc2lvbikpIHsKQEAgLTE1MDYsMTMgKzE2MywxMyBA
QCBQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Bl
bihTZWN1cml0eU9yaWdpbiogc2VjdXJpdAogCiBib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6
OmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKGNvbnN0IFN0cmluZyYgbmFtZSwgU3RyaW5nJiBm
b3VuZFZlcnNpb24sIGludDY0X3QmIGZvdW5kSWQpCiB7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IGtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7CisgICAg
Y29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtl
eTo6ZW5jb2RlKG1faWRlbnRpZmllciwgbmFtZSk7CiAKICAgICBib29sIG9rID0gZ2V0SW50KG1f
ZGIuZ2V0KCksIGtleSwgZm91bmRJZCk7CiAgICAgaWYgKCFvaykKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogCi0gICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJhc2VNZXRhRGF0YUtl
eTo6ZW5jb2RlKGZvdW5kSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIGZv
dW5kVmVyc2lvbik7CisgICAgb2sgPSBnZXRTdHJpbmcobV9kYi5nZXQoKSwgSURCTGV2ZWxEQkNv
ZGluZzo6RGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGZvdW5kSWQsIElEQkxldmVsREJDb2Rp
bmc6OkRhdGFiYXNlTWV0YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIGZvdW5kVmVyc2lvbik7CiAg
ICAgaWYgKCFvaykKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0xNTIxLDE2ICsxNzgsMTYg
QEAgYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRhRGF0
YShjb25zdCBTdHJpbmcmIG5hbWUsIFN0cmkKIAogc3RhdGljIGludDY0X3QgZ2V0TmV3RGF0YWJh
c2VJZChMZXZlbERCRGF0YWJhc2UqIGRiKQogewotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBmcmVl
TGlzdFN0YXJ0S2V5ID0gRGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKDApOwotICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBmcmVlTGlzdFN0b3BLZXkgPSBEYXRhYmFzZUZyZWVMaXN0S2V5OjplbmNv
ZGUoSU5UNjRfTUFYKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdGFydEtleSA9
IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29kZSgwKTsKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gZnJlZUxpc3RTdG9wS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6RGF0
YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKElOVDY0X01BWCk7CiAKICAgICBPd25QdHI8TGV2ZWxE
Qkl0ZXJhdG9yPiBpdChkYi0+bmV3SXRlcmF0b3IoKSk7CiAgICAgZm9yIChpdC0+c2VlayhmcmVl
TGlzdFN0YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIGZy
ZWVMaXN0U3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnAg
PSBpdC0+a2V5KCkuYmVnaW4oKTsKICAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5
KCkuZW5kKCk7CiAKLSAgICAgICAgRGF0YWJhc2VGcmVlTGlzdEtleSBmcmVlTGlzdEtleTsKLSAg
ICAgICAgcCA9IERhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0
S2V5KTsKKyAgICAgICAgSURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleSBmcmVl
TGlzdEtleTsKKyAgICAgICAgcCA9IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RL
ZXk6OmRlY29kZShwLCBsaW1pdCwgJmZyZWVMaXN0S2V5KTsKICAgICAgICAgQVNTRVJUKHApOwog
CiAgICAgICAgIGJvb2wgb2sgPSBkYi0+cmVtb3ZlKGl0LT5rZXkoKSk7CkBAIC0xNTQxLDEzICsx
OTgsMTMgQEAgc3RhdGljIGludDY0X3QgZ2V0TmV3RGF0YWJhc2VJZChMZXZlbERCRGF0YWJhc2Uq
IGRiKQogCiAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZXJlIHdhcyBubyBmcmVlLWxpc3QuCiAg
ICAgaW50NjRfdCBtYXhEYXRhYmFzZUlkID0gLTE7Ci0gICAgaWYgKCFnZXRJbnQoZGIsIE1heERh
dGFiYXNlSWRLZXk6OmVuY29kZSgpLCBtYXhEYXRhYmFzZUlkKSkKKyAgICBpZiAoIWdldEludChk
YiwgSURCTGV2ZWxEQkNvZGluZzo6TWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIG1heERhdGFi
YXNlSWQpKQogICAgICAgICBtYXhEYXRhYmFzZUlkID0gMDsKIAogICAgIEFTU0VSVChtYXhEYXRh
YmFzZUlkID49IDApOwogCiAgICAgaW50NjRfdCBkYXRhYmFzZUlkID0gbWF4RGF0YWJhc2VJZCAr
IDE7Ci0gICAgYm9vbCBvayA9IHB1dEludChkYiwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCks
IGRhdGFiYXNlSWQpOworICAgIGJvb2wgb2sgPSBwdXRJbnQoZGIsIElEQkxldmVsREJDb2Rpbmc6
Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpLCBkYXRhYmFzZUlkKTsKICAgICBBU1NFUlRfVU5V
U0VEKG9rLCBvayk7CiAKICAgICByZXR1cm4gZGF0YWJhc2VJZDsKQEAgLTE1NTksMTIgKzIxNiwx
MiBAQCBib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEo
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdAogICAgIGlmIChpbnZhbGlkUm93SWQpIHsKICAg
ICAgICAgcm93SWQgPSBnZXROZXdEYXRhYmFzZUlkKG1fZGIuZ2V0KCkpOwogCi0gICAgICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZShtX2lkZW50aWZp
ZXIsIG5hbWUpOworICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gSURCTGV2ZWxEQkNv
ZGluZzo6RGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKICAgICAg
ICAgaWYgKCFwdXRJbnQobV9kYi5nZXQoKSwga2V5LCByb3dJZCkpCiAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFwdXRTdHJpbmcobV9kYi5nZXQoKSwgRGF0YWJh
c2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjprVXNlclZl
cnNpb24pLCB2ZXJzaW9uKSkKKyAgICBpZiAoIXB1dFN0cmluZyhtX2RiLmdldCgpLCBJREJMZXZl
bERCQ29kaW5nOjpEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIElEQkxldmVsREJD
b2Rpbmc6OkRhdGFiYXNlTWV0YURhdGFLZXk6OmtVc2VyVmVyc2lvbiksIHZlcnNpb24pKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1NzIsMjggKzIyOSwy
OCBAQCBib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEo
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdAogCiB2b2lkIElEQkxldmVsREJCYWNraW5nU3Rv
cmU6OmdldE9iamVjdFN0b3JlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIFZlY3RvcjxpbnQ2NF90PiYg
Zm91bmRJZHMsIFZlY3RvcjxTdHJpbmc+JiBmb3VuZE5hbWVzLCBWZWN0b3I8U3RyaW5nPiYgZm91
bmRLZXlQYXRocywgVmVjdG9yPGJvb2w+JiBmb3VuZEF1dG9JbmNyZW1lbnRGbGFncykKIHsKLSAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgMSwgMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkg
PSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYLCAw
KTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgMSwgMCk7CisgICAgY29u
c3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYLCAwKTsKIAogICAgIE93blB0
cjxMZXZlbERCSXRlcmF0b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9yKCkpOwogICAgIGZvciAoaXQt
PnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwg
c3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBpdC0+
a2V5KCkuYmVnaW4oKTsKICAgICAgICAgY29uc3QgY2hhciAqbGltaXQgPSBpdC0+a2V5KCkuZW5k
KCk7CiAKLSAgICAgICAgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSBtZXRhRGF0YUtleTsKLSAgICAg
ICAgcCA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRh
S2V5KTsKKyAgICAgICAgSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleSBt
ZXRhRGF0YUtleTsKKyAgICAgICAgcCA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJm1ldGFEYXRhS2V5KTsKICAgICAgICAgQVNTRVJU
KHApOwogCiAgICAgICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCA9IG1ldGFEYXRhS2V5Lm9iamVj
dFN0b3JlSWQoKTsKIAotICAgICAgICBTdHJpbmcgb2JqZWN0U3RvcmVOYW1lID0gZGVjb2RlU3Ry
aW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKyAgICAgICAgU3Ry
aW5nIG9iamVjdFN0b3JlTmFtZSA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29kZVN0cmluZyhpdC0+
dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CiAKICAgICAgICAgaXQtPm5leHQo
KTsKICAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CiAgICAgICAgICAgICBMT0dfRVJST1Io
IkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIH0KLSAgICAgICAgU3RyaW5nIGtleVBhdGggPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCku
YmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICBTdHJpbmcga2V5UGF0aCA9IElE
QkxldmVsREJDb2Rpbmc6OmRlY29kZVN0cmluZyhpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFs
dWUoKS5lbmQoKSk7CiAKICAgICAgICAgaXQtPm5leHQoKTsKICAgICAgICAgaWYgKCFpdC0+aXNW
YWxpZCgpKSB7CkBAIC0xNjI5LDE2ICsyODYsMTYgQEAgdm9pZCBJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpnZXRPYmplY3RTdG9yZXMoaW50NjRfdCBkYXRhYmFzZUlkLCBWZWN0b3I8aW50NjRfdD4K
IAogc3RhdGljIGludDY0X3QgZ2V0TmV3T2JqZWN0U3RvcmVJZChMZXZlbERCRGF0YWJhc2UqIGRi
LCBpbnQ2NF90IGRhdGFiYXNlSWQpCiB7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGZyZWVMaXN0
U3RhcnRLZXkgPSBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgMCk7
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGZyZWVMaXN0U3RvcEtleSA9IE9iamVjdFN0b3JlRnJl
ZUxpc3RLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBJTlQ2NF9NQVgpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBmcmVlTGlzdFN0YXJ0S2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVG
cmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFy
PiBmcmVlTGlzdFN0b3BLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYKTsKIAogICAgIE93blB0cjxMZXZlbERC
SXRlcmF0b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKICAgICBmb3IgKGl0LT5zZWVrKGZyZWVM
aXN0U3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgZnJl
ZUxpc3RTdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKICAgICAgICAgY29uc3QgY2hhciogcCA9
IGl0LT5rZXkoKS5iZWdpbigpOwogICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXko
KS5lbmQoKTsKIAotICAgICAgICBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IGZyZWVMaXN0S2V5Owot
ICAgICAgICBwID0gT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJl
ZUxpc3RLZXkpOworICAgICAgICBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0
S2V5IGZyZWVMaXN0S2V5OworICAgICAgICBwID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3Rv
cmVGcmVlTGlzdEtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZnJlZUxpc3RLZXkpOwogICAgICAgICBB
U1NFUlQocCk7CiAKICAgICAgICAgYm9vbCBvayA9IGRiLT5yZW1vdmUoaXQtPmtleSgpKTsKQEAg
LTE2NDgsNyArMzA1LDcgQEAgc3RhdGljIGludDY0X3QgZ2V0TmV3T2JqZWN0U3RvcmVJZChMZXZl
bERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQpCiAgICAgfQogCiAgICAgaW50NjRf
dCBtYXhPYmplY3RTdG9yZUlkOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhPYmplY3RTdG9y
ZUlkS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIERhdGFiYXNl
TWV0YURhdGFLZXk6OmtNYXhPYmplY3RTdG9yZUlkKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
bWF4T2JqZWN0U3RvcmVJZEtleSA9IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU1ldGFEYXRh
S2V5OjprTWF4T2JqZWN0U3RvcmVJZCk7CiAgICAgaWYgKCFnZXRJbnQoZGIsIG1heE9iamVjdFN0
b3JlSWRLZXksIG1heE9iamVjdFN0b3JlSWQpKQogICAgICAgICBtYXhPYmplY3RTdG9yZUlkID0g
MDsKIApAQCAtMTY2MywxMyArMzIwLDEzIEBAIGJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6
Y3JlYXRlT2JqZWN0U3RvcmUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmCiB7CiAg
ICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gZ2V0TmV3T2JqZWN0U3RvcmVJZChtX2RiLmdldCgp
LCBkYXRhYmFzZUlkKTsKIAotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApOwot
ICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDEpOwotICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBhdXRvSW5jcmVtZW50S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2Rl
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDIpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBl
dmljdGFibGVLZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgMyk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5
ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIDQpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhJbmRleElkS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDUpOwotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lc0tleSA9IE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBuYW1lKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbmFtZUtleSA9IElE
QkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9
IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCAxKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gYXV0b0luY3Jl
bWVudEtleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAyKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
ZXZpY3RhYmxlS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDMpOworICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBsYXN0VmVyc2lvbktleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA0KTsKKyAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA1KTsKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gbmFtZXNLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9y
ZU5hbWVzS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgbmFtZSk7CiAKICAgICBib29sIG9rID0gcHV0
U3RyaW5nKG1fZGIuZ2V0KCksIG5hbWVLZXksIG5hbWUpOwogICAgIGlmICghb2spIHsKQEAgLTE3
MDEsNyArMzU4LDcgQEAgYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjcmVhdGVPYmplY3RT
dG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgIH0KIAotICAgIG9rID0gcHV0SW50KG1fZGIuZ2V0KCksIG1heEluZGV4SWRLZXks
IGtNaW5pbXVtSW5kZXhJZCk7CisgICAgb2sgPSBwdXRJbnQobV9kYi5nZXQoKSwgbWF4SW5kZXhJ
ZEtleSwgSURCTGV2ZWxEQkNvZGluZzo6a01pbmltdW1JbmRleElkKTsKICAgICBpZiAoIW9rKSB7
CiAgICAgICAgIExPR19FUlJPUigiSW50ZXJuYWwgSW5kZXhlZCBEQiBlcnJvci4iKTsKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwpAQCAtMTczMywxNyArMzkwLDE3IEBAIHN0YXRpYyBib29sIGRlbGV0
ZVJhbmdlKExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgYmVnaW4sIGNv
bnN0IFZlCiB2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQogewogICAgIFN0cmluZyBv
YmplY3RTdG9yZU5hbWU7Ci0gICAgZ2V0U3RyaW5nKG1fZGIuZ2V0KCksIE9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgb2JqZWN0U3Rv
cmVOYW1lKTsKKyAgICBnZXRTdHJpbmcobV9kYi5nZXQoKSwgSURCTGV2ZWxEQkNvZGluZzo6T2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDAp
LCBvYmplY3RTdG9yZU5hbWUpOwogCi0gICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
MCksIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCA2KSkpCisgICAgaWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBJREJMZXZlbERCQ29k
aW5nOjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgMCksIElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCA2KSkpCiAgICAgICAgIHJldHVybjsgLy8gRklY
TUU6IFJlcG9ydCBlcnJvci4KIAotICAgIHB1dFN0cmluZyhtX2RiLmdldCgpLCBPYmplY3RTdG9y
ZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCksICIiKTsKLSAg
ICBtX2RiLT5yZW1vdmUoT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlTmFtZSkpOworICAgIHB1dFN0cmluZyhtX2RiLmdldCgpLCBJREJMZXZlbERCQ29k
aW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCksICIiKTsKKyAgICBtX2RiLT5yZW1vdmUoSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3Rv
cmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlTmFtZSkpOwogCi0gICAg
aWYgKCFkZWxldGVSYW5nZShtX2RiLmdldCgpLCBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCksIEluZGV4RnJlZUxpc3RLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgpKSkKKyAgICBpZiAoIWRlbGV0ZVJhbmdl
KG1fZGIuZ2V0KCksIElEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXk6OmVuY29kZShk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhGcmVl
TGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01BWCkpKQog
ICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCi0gICAgaWYgKCFkZWxldGVS
YW5nZShtX2RiLmdldCgpLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgMCwgMCksIEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgsIDApKSkKKyAgICBpZiAoIWRlbGV0ZVJhbmdlKG1fZGIu
Z2V0KCksIElEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKSwgSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01BWCwgMCkpKQog
ICAgICAgICByZXR1cm47IC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IuCiAKICAgICBjbGVhck9iamVj
dFN0b3JlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwpAQCAtMTc1MSwxOSArNDA4LDE5IEBA
IHZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjCiAKIFN0cmluZyBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpnZXRPYmplY3RTdG9yZVJlY29yZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXkpCiB7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGxl
dmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBrZXkpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gSURCTGV2
ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwga2V5KTsKICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKIAogICAgIGlmICghbV9kYi0+
Z2V0KGxldmVsZGJLZXksIGRhdGEpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICBp
bnQ2NF90IHZlcnNpb247Ci0gICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmJl
Z2luKCksIGRhdGEuZW5kKCksIHZlcnNpb24pOworICAgIGNvbnN0IGNoYXIqIHAgPSBJREJMZXZl
bERCQ29kaW5nOjpkZWNvZGVWYXJJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCB2ZXJzaW9u
KTsKICAgICBpZiAoIXApCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAgICAodm9pZCkgdmVy
c2lvbjsKIAotICAgIHJldHVybiBkZWNvZGVTdHJpbmcocCwgZGF0YS5lbmQoKSk7CisgICAgcmV0
dXJuIElEQkxldmVsREJDb2Rpbmc6OmRlY29kZVN0cmluZyhwLCBkYXRhLmVuZCgpKTsKIH0KIAog
bmFtZXNwYWNlIHsKQEAgLTE3ODksNyArNDQ2LDcgQEAgcHJpdmF0ZToKIAogc3RhdGljIGludDY0
X3QgZ2V0TmV3VmVyc2lvbk51bWJlcihMZXZlbERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
bGFzdFZlcnNpb25LZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgNCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9u
S2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDQpOwogCiAgICAgaW50NjRfdCBsYXN0VmVyc2lvbiA9
IC0xOwogICAgIGlmICghZ2V0SW50KGRiLCBsYXN0VmVyc2lvbktleSwgbGFzdFZlcnNpb24pKQpA
QCAtMTgwOSwyOSArNDY2LDI5IEBAIHN0YXRpYyBpbnQ2NF90IGdldE5ld1ZlcnNpb25OdW1iZXIo
TGV2ZWxEQkRhdGFiYXNlKiBkYiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2CiBib29sIElEQkxl
dmVsREJCYWNraW5nU3RvcmU6OnB1dE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgU3RyaW5n
JiB2YWx1ZSwgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyKiByZWNvcmRJZGVudGlmaWVyKQog
ewogICAgIGludDY0X3QgdmVyc2lvbiA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwg
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG9iamVj
dFN0b3JlZGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGtleSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG9iamVjdFN0b3JlZGF0
YUtleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CiAKICAgICBWZWN0b3I8Y2hhcj4gdjsKLSAgICB2
LmFwcGVuZChlbmNvZGVWYXJJbnQodmVyc2lvbikpOwotICAgIHYuYXBwZW5kKGVuY29kZVN0cmlu
Zyh2YWx1ZSkpOworICAgIHYuYXBwZW5kKElEQkxldmVsREJDb2Rpbmc6OmVuY29kZVZhckludCh2
ZXJzaW9uKSk7CisgICAgdi5hcHBlbmQoSURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlU3RyaW5nKHZh
bHVlKSk7CiAKICAgICBpZiAoIW1fZGItPnB1dChvYmplY3RTdG9yZWRhdGFLZXksIHYpKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhpc3RzRW50cnlL
ZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtl
eSk7Ci0gICAgaWYgKCFtX2RiLT5wdXQoZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJzaW9u
KSkpCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGV4aXN0c0VudHJ5S2V5ID0gSURCTGV2ZWxEQkNv
ZGluZzo6RXhpc3RzRW50cnlLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBr
ZXkpOworICAgIGlmICghbV9kYi0+cHV0KGV4aXN0c0VudHJ5S2V5LCBJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVJbnQodmVyc2lvbikpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBMZXZl
bERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2Fz
dDxMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOwotICAgIGxldmVs
REJSZWNvcmRJZGVudGlmaWVyLT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShrZXkpKTsKKyAg
ICBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+c2V0UHJpbWFyeUtleShJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVJREJLZXkoa2V5KSk7CiAgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZl
cnNpb24odmVyc2lvbik7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCkKIHsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBLZXlQ
cmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCkuZW5jb2RlKCk7Ci0gICAgY29uc3Qg
VmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBLZXlQcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCArIDEsIDApLmVuY29kZSgpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IElE
QkxldmVsREJDb2Rpbmc6OktleVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKS5l
bmNvZGUoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IElEQkxldmVsREJDb2Rp
bmc6OktleVByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCkuZW5jb2RlKCk7
CiAKICAgICBkZWxldGVSYW5nZShtX2RiLmdldCgpLCBzdGFydEtleSwgc3RvcEtleSk7CiB9CkBA
IC0xODQ0LDE0ICs1MDEsMTQgQEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0
b3JlUmVjb3JkSWRlbnRpZmllcj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZToKIHZvaWQgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IE9iamVjdFN0b3JlUmVjb3JkSWRlbnRp
ZmllciogcmVjb3JkSWRlbnRpZmllcikKIHsKICAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRp
ZmllciogbGV2ZWxEQlJlY29yZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERC
UmVjb3JkSWRlbnRpZmllcio+KHJlY29yZElkZW50aWZpZXIpOwotICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBrZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsKKyAgICBjb25z
dCBWZWN0b3I8Y2hhcj4ga2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5
OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgbGV2ZWxEQlJlY29yZElkZW50aWZp
ZXItPnByaW1hcnlLZXkoKSk7CiAgICAgbV9kYi0+cmVtb3ZlKGtleSk7CiB9CiAKIGRvdWJsZSBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKLSAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBt
YXhJREJLZXkoKSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gSURCTGV2ZWxE
QkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgSURCTGV2ZWxEQkNvZGluZzo6bWluSURCS2V5KCkpOworICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBzdG9wS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSURCTGV2ZWxEQkNvZGluZzo6bWF4SURCS2V5
KCkpOwogCiAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0b3Io
KSk7CiAKQEAgLTE4NjMsOCArNTIwLDggQEAgZG91YmxlIElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjQKICAgICAg
ICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5iZWdpbigpOwogICAgICAgICBjb25zdCBjaGFy
ICpsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKIAotICAgICAgICBPYmplY3RTdG9yZURhdGFLZXkg
ZGF0YUtleTsKLSAgICAgICAgcCA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0
LCAmZGF0YUtleSk7CisgICAgICAgIElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtl
eSBkYXRhS2V5OworICAgICAgICBwID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRh
S2V5OjpkZWNvZGUocCwgbGltaXQsICZkYXRhS2V5KTsKICAgICAgICAgQVNTRVJUKHApOwogCiAg
ICAgICAgIGlmIChkYXRhS2V5LnVzZXJLZXkoKS0+dHlwZSgpID09IElEQktleTo6TnVtYmVyVHlw
ZSkgewpAQCAtMTg3OSw0NCArNTM2LDQ0IEBAIGRvdWJsZSBJREJMZXZlbERCQmFja2luZ1N0b3Jl
OjpuZXh0QXV0b0luY3JlbWVudE51bWJlcihpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0CiAKIGJv
b2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5PYmplY3RTdG9yZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIE9i
amVjdFN0b3JlUmVjb3JkSWRlbnRpZmllciogZm91bmRSZWNvcmRJZGVudGlmaWVyKQogewotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBsZXZlbGRiS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5KTsKKyAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gbGV2ZWxkYktleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7CiAgICAgVmVjdG9yPGNoYXI+IGRh
dGE7CiAKICAgICBpZiAoIW1fZGItPmdldChsZXZlbGRiS2V5LCBkYXRhKSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCiAgICAgaW50NjRfdCB2ZXJzaW9uOwotICAgIGlmICghZGVjb2RlVmFySW50
KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgdmVyc2lvbikpCisgICAgaWYgKCFJREJMZXZlbERC
Q29kaW5nOjpkZWNvZGVWYXJJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCB2ZXJzaW9uKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgTGV2ZWxEQlJlY29yZElkZW50aWZpZXIqIGxl
dmVsREJSZWNvcmRJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8TGV2ZWxEQlJlY29yZElkZW50aWZp
ZXIqPihmb3VuZFJlY29yZElkZW50aWZpZXIpOwotICAgIGxldmVsREJSZWNvcmRJZGVudGlmaWVy
LT5zZXRQcmltYXJ5S2V5KGVuY29kZUlEQktleShrZXkpKTsKKyAgICBsZXZlbERCUmVjb3JkSWRl
bnRpZmllci0+c2V0UHJpbWFyeUtleShJREJMZXZlbERCQ29kaW5nOjplbmNvZGVJREJLZXkoa2V5
KSk7CiAgICAgbGV2ZWxEQlJlY29yZElkZW50aWZpZXItPnNldFZlcnNpb24odmVyc2lvbik7CiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFj
aE9iamVjdFN0b3JlUmVjb3JkKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZVJlY29yZENhbGxiYWNrJiBjYWxsYmFjaykKIHsKLSAgICBjb25zdCBW
ZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+
IHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCBtYXhJREJLZXkoKSk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0g
SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgSURCTGV2ZWxEQkNvZGluZzo6bWluSURCS2V5KCkpOworICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSURCTGV2ZWxEQkNvZGluZzo6
bWF4SURCS2V5KCkpOwogCiAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQobV9kYi0+bmV3
SXRlcmF0b3IoKSk7CiAgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkg
JiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKICAg
ICAgICAgY29uc3QgY2hhciAqcCA9IGl0LT5rZXkoKS5iZWdpbigpOwogICAgICAgICBjb25zdCBj
aGFyICpsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKLSAgICAgICAgT2JqZWN0U3RvcmVEYXRhS2V5
IGRhdGFLZXk7Ci0gICAgICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShwLCBsaW1p
dCwgJmRhdGFLZXkpOworICAgICAgICBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURhdGFL
ZXkgZGF0YUtleTsKKyAgICAgICAgcCA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0
YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YUtleSk7CiAgICAgICAgIEFTU0VSVChwKTsKIAog
ICAgICAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5ID0gZGF0YUtleS51c2VyS2V5KCk7CiAK
ICAgICAgICAgaW50NjRfdCB2ZXJzaW9uOwotICAgICAgICBjb25zdCBjaGFyKiBxID0gZGVjb2Rl
VmFySW50KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsK
KyAgICAgICAgY29uc3QgY2hhciogcSA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29kZVZhckludChp
dC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7CiAgICAgICAg
IGlmICghcSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBSZWZQdHI8TGV2
ZWxEQlJlY29yZElkZW50aWZpZXI+IHJpID0gTGV2ZWxEQlJlY29yZElkZW50aWZpZXI6OmNyZWF0
ZShlbmNvZGVJREJLZXkoKnByaW1hcnlLZXkpLCB2ZXJzaW9uKTsKLSAgICAgICAgU3RyaW5nIGlk
YlZhbHVlID0gZGVjb2RlU3RyaW5nKHEsIGl0LT52YWx1ZSgpLmVuZCgpKTsKKyAgICAgICAgUmVm
UHRyPExldmVsREJSZWNvcmRJZGVudGlmaWVyPiByaSA9IExldmVsREJSZWNvcmRJZGVudGlmaWVy
OjpjcmVhdGUoSURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlSURCS2V5KCpwcmltYXJ5S2V5KSwgdmVy
c2lvbik7CisgICAgICAgIFN0cmluZyBpZGJWYWx1ZSA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29k
ZVN0cmluZyhxLCBpdC0+dmFsdWUoKS5lbmQoKSk7CiAKICAgICAgICAgY2FsbGJhY2suY2FsbGJh
Y2socmkuZ2V0KCksIGlkYlZhbHVlKTsKICAgICB9CkBAIC0xOTI2LDIyICs1ODMsMjIgQEAgYm9v
bCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpmb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF8KIAogdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJ
bmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBWZWN0b3I8
aW50NjRfdD4mIGZvdW5kSWRzLCBWZWN0b3I8U3RyaW5nPiYgZm91bmROYW1lcywgVmVjdG9yPFN0
cmluZz4mIGZvdW5kS2V5UGF0aHMsIFZlY3Rvcjxib29sPiYgZm91bmRVbmlxdWVGbGFncykKIHsK
LSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCwgMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNo
YXI+IHN0b3BLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCArIDEsIDAsIDApOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IElE
QkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCAwLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IElEQkxl
dmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkICsgMSwgMCwgMCk7CiAKICAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdChtX2Ri
LT5uZXdJdGVyYXRvcigpKTsKICAgICBmb3IgKGl0LT5zZWVrKHN0YXJ0S2V5KTsgaXQtPmlzVmFs
aWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpIDwgMDsgaXQtPm5leHQoKSkg
ewogICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJlZ2luKCk7CiAgICAgICAgIGNv
bnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwogCi0gICAgICAgIEluZGV4TWV0YURh
dGFLZXkgbWV0YURhdGFLZXk7Ci0gICAgICAgIHAgPSBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUo
cCwgbGltaXQsICZtZXRhRGF0YUtleSk7CisgICAgICAgIElEQkxldmVsREJDb2Rpbmc6OkluZGV4
TWV0YURhdGFLZXkgbWV0YURhdGFLZXk7CisgICAgICAgIHAgPSBJREJMZXZlbERCQ29kaW5nOjpJ
bmRleE1ldGFEYXRhS2V5OjpkZWNvZGUocCwgbGltaXQsICZtZXRhRGF0YUtleSk7CiAgICAgICAg
IEFTU0VSVChwKTsKIAogICAgICAgICBpbnQ2NF90IGluZGV4SWQgPSBtZXRhRGF0YUtleS5pbmRl
eElkKCk7CiAgICAgICAgIEFTU0VSVCghbWV0YURhdGFLZXkubWV0YURhdGFUeXBlKCkpOwogCi0g
ICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4o
KSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gSURCTGV2
ZWxEQkNvZGluZzo6ZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgp
LmVuZCgpKTsKICAgICAgICAgaXQtPm5leHQoKTsKICAgICAgICAgaWYgKCFpdC0+aXNWYWxpZCgp
KSB7CiAgICAgICAgICAgICBMT0dfRVJST1IoIkludGVybmFsIEluZGV4ZWQgREIgZXJyb3IuIik7
CkBAIC0xOTU1LDcgKzYxMiw3IEBAIHZvaWQgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0SW5k
ZXhlcyhpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJCiAgICAgICAgICAg
ICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcga2V5UGF0aCA9IGRlY29kZVN0
cmluZyhpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisgICAgICAgIFN0
cmluZyBrZXlQYXRoID0gSURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgp
LmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKIAogICAgICAgICBmb3VuZElkcy5hcHBlbmQo
aW5kZXhJZCk7CiAgICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKGluZGV4TmFtZSk7CkBAIC0xOTY2
LDI5ICs2MjMsMjkgQEAgdm9pZCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUkKIAogc3RhdGljIGludDY0X3Qg
Z2V0TmV3SW5kZXhJZChMZXZlbERCRGF0YWJhc2UqIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCkKIHsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkg
PSBJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBJbmRleEZyZWVMaXN0S2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKTsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gc3RhcnRLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNo
YXI+IHN0b3BLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgSU5UNjRfTUFYKTsKIAogICAgIE93blB0cjxMZXZl
bERCSXRlcmF0b3I+IGl0KGRiLT5uZXdJdGVyYXRvcigpKTsKICAgICBmb3IgKGl0LT5zZWVrKHN0
YXJ0S2V5KTsgaXQtPmlzVmFsaWQoKSAmJiBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkp
IDwgMDsgaXQtPm5leHQoKSkgewogICAgICAgICBjb25zdCBjaGFyKiBwID0gaXQtPmtleSgpLmJl
Z2luKCk7CiAgICAgICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwogCi0g
ICAgICAgIEluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RLZXk7Ci0gICAgICAgIHAgPSBJbmRleEZy
ZWVMaXN0S2V5OjpkZWNvZGUocCwgbGltaXQsICZmcmVlTGlzdEtleSk7CisgICAgICAgIElEQkxl
dmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXkgZnJlZUxpc3RLZXk7CisgICAgICAgIHAgPSBJ
REJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUocCwgbGltaXQsICZmcmVl
TGlzdEtleSk7CiAgICAgICAgIEFTU0VSVChwKTsKIAogICAgICAgICBib29sIG9rID0gZGItPnJl
bW92ZShpdC0+a2V5KCkpOwogICAgICAgICBBU1NFUlRfVU5VU0VEKG9rLCBvayk7CiAKLSAgICAg
ICAgQVNTRVJUKGZyZWVMaXN0S2V5LmluZGV4SWQoKSA+PSBrTWluaW11bUluZGV4SWQpOworICAg
ICAgICBBU1NFUlQoZnJlZUxpc3RLZXkuaW5kZXhJZCgpID49IElEQkxldmVsREJDb2Rpbmc6OmtN
aW5pbXVtSW5kZXhJZCk7CiAgICAgICAgIHJldHVybiBmcmVlTGlzdEtleS5pbmRleElkKCk7CiAg
ICAgfQogCiAgICAgaW50NjRfdCBtYXhJbmRleElkOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBt
YXhJbmRleElkS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBtYXhJbmRleElkS2V5
ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFi
YXNlSWQsIG9iamVjdFN0b3JlSWQsIDUpOwogICAgIGlmICghZ2V0SW50KGRiLCBtYXhJbmRleElk
S2V5LCBtYXhJbmRleElkKSkKLSAgICAgICAgbWF4SW5kZXhJZCA9IGtNaW5pbXVtSW5kZXhJZDsK
KyAgICAgICAgbWF4SW5kZXhJZCA9IElEQkxldmVsREJDb2Rpbmc6OmtNaW5pbXVtSW5kZXhJZDsK
IAogICAgIGludDY0X3QgaW5kZXhJZCA9IG1heEluZGV4SWQgKyAxOwogICAgIGJvb2wgb2sgPSBw
dXRJbnQoZGIsIG1heEluZGV4SWRLZXksIGluZGV4SWQpOwpAQCAtMjAwMiw5ICs2NTksOSBAQCBi
b29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KGludDY0X3QgZGF0YWJhc2VJ
ZCwgaW50NjRfdCBvYmplY3RTdG9yZQogewogICAgIGluZGV4SWQgPSBnZXROZXdJbmRleElkKG1f
ZGIuZ2V0KCksIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwogCi0gICAgY29uc3QgVmVjdG9y
PGNoYXI+IG5hbWVLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwgMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHVuaXF1ZUtl
eSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCAxKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IEluZGV4TWV0
YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAyKTsK
KyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbmFtZUtleSA9IElEQkxldmVsREJDb2Rpbmc6OkluZGV4
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAw
KTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gdW5pcXVlS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6
SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIDEpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlQYXRoS2V5ID0gSURCTGV2ZWxEQkNv
ZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQsIDIpOwogCiAgICAgYm9vbCBvayA9IHB1dFN0cmluZyhtX2RiLmdldCgpLCBuYW1l
S2V5LCBuYW1lKTsKICAgICBpZiAoIW9rKSB7CkBAIC0yMDM1LDE0ICs2OTIsMTQgQEAgdm9pZCBJ
REJMZXZlbERCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2
NF90KQogCiBib29sIElEQkxldmVsREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29y
ZChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBJREJLZXkmIGtleSwgY29uc3QgT2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVy
KiByZWNvcmRJZGVudGlmaWVyKQogewotICAgIEFTU0VSVChpbmRleElkID49IGtNaW5pbXVtSW5k
ZXhJZCk7CisgICAgQVNTRVJUKGluZGV4SWQgPj0gSURCTGV2ZWxEQkNvZGluZzo6a01pbmltdW1J
bmRleElkKTsKICAgICBjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllciogbGV2ZWxEQlJlY29y
ZElkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBMZXZlbERCUmVjb3JkSWRlbnRpZmllcio+
KHJlY29yZElkZW50aWZpZXIpOwogCiAgICAgY29uc3QgaW50NjRfdCBnbG9iYWxTZXF1ZW5jZU51
bWJlciA9IGdldE5ld1ZlcnNpb25OdW1iZXIobV9kYi5nZXQoKSwgZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4RGF0YUtleSA9IEluZGV4RGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgZ2xv
YmFsU2VxdWVuY2VOdW1iZXIpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBpbmRleERhdGFLZXkg
PSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleElkLCBrZXksIGdsb2JhbFNlcXVlbmNlTnVtYmVyKTsKIAogICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOwotICAgIGRhdGEuYXBwZW5kKGVuY29kZVZhckludChsZXZlbERCUmVj
b3JkSWRlbnRpZmllci0+dmVyc2lvbigpKSk7CisgICAgZGF0YS5hcHBlbmQoSURCTGV2ZWxEQkNv
ZGluZzo6ZW5jb2RlVmFySW50KGxldmVsREJSZWNvcmRJZGVudGlmaWVyLT52ZXJzaW9uKCkpKTsK
ICAgICBkYXRhLmFwcGVuZChsZXZlbERCUmVjb3JkSWRlbnRpZmllci0+cHJpbWFyeUtleSgpKTsK
IAogICAgIHJldHVybiBtX2RiLT5wdXQoaW5kZXhEYXRhS2V5LCBkYXRhKTsKQEAgLTIwODcsMTgg
Kzc0NCwxOCBAQCBTdHJpbmcgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0VmlhSW5k
ZXgoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iagogCiBzdGF0aWMgYm9vbCB2ZXJzaW9u
RXhpc3RzKExldmVsREJEYXRhYmFzZSogZGIsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IHZlcnNpb24sIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2Rl
ZFByaW1hcnlLZXkpCiB7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IEV4aXN0c0VudHJ5
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlZFByaW1hcnlLZXkp
OworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXkgPSBJREJMZXZlbERCQ29kaW5nOjpFeGlzdHNF
bnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZWRQcmltYXJ5
S2V5KTsKICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKIAogICAgIGlmICghZGItPmdldChrZXksIGRh
dGEpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gZGVjb2RlSW50KGRhdGEu
YmVnaW4oKSwgZGF0YS5lbmQoKSkgPT0gdmVyc2lvbjsKKyAgICByZXR1cm4gSURCTGV2ZWxEQkNv
ZGluZzo6ZGVjb2RlSW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSkgPT0gdmVyc2lvbjsKIH0K
IAogUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlL
ZXlWaWFJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIGtleSkKIHsKLSAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gbGV2ZWxkYktleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIGtleSwgMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJL
ZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXksIDApOwogICAgIE93blB0cjxMZXZlbERCSXRlcmF0
b3I+IGl0KG1fZGItPm5ld0l0ZXJhdG9yKCkpOwogICAgIGl0LT5zZWVrKGxldmVsZGJLZXkpOwog
CkBAIC0yMTA5LDcgKzc2Niw3IEBAIFBhc3NSZWZQdHI8SURCS2V5PiBJREJMZXZlbERCQmFja2lu
Z1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgoaW50NjRfdCBkYXRhYmFzCiAgICAgICAgICAg
ICByZXR1cm4gMDsKIAogICAgICAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAgICAgIGNvbnN0IGNo
YXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5k
KCksIHZlcnNpb24pOworICAgICAgICBjb25zdCBjaGFyKiBwID0gSURCTGV2ZWxEQkNvZGluZzo6
ZGVjb2RlVmFySW50KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpLCB2ZXJz
aW9uKTsKICAgICAgICAgaWYgKCFwKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIFZl
Y3RvcjxjaGFyPiBlbmNvZGVkUHJpbWFyeUtleTsKQEAgLTIxMjMsMTQgKzc4MCwxNCBAQCBQYXNz
UmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0UHJpbWFyeUtleVZpYUlu
ZGV4KGludDY0X3QgZGF0YWJhcwogICAgICAgICB9CiAKICAgICAgICAgUmVmUHRyPElEQktleT4g
cHJpbWFyeUtleTsKLSAgICAgICAgZGVjb2RlSURCS2V5KGVuY29kZWRQcmltYXJ5S2V5LmJlZ2lu
KCksIGVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKKyAgICAgICAgSURCTGV2
ZWxEQkNvZGluZzo6ZGVjb2RlSURCS2V5KGVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGVuY29k
ZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKICAgICAgICAgcmV0dXJuIHByaW1hcnlL
ZXkucmVsZWFzZSgpOwogICAgIH0KIH0KIAogYm9vbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpr
ZXlFeGlzdHNJbkluZGV4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5KQogewotICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBsZXZlbERCS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5LCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbGV2
ZWxEQktleSA9IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleSwgMCk7CiAgICAgT3duUHRyPExldmVsREJJ
dGVyYXRvcj4gaXQobV9kYi0+bmV3SXRlcmF0b3IoKSk7CiAKICAgICBib29sIGZvdW5kID0gZmFs
c2U7CkBAIC0yMzAxLDggKzk1OCw4IEBAIGJvb2wgT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpsb2Fk
Q3VycmVudFJvdygpCiAgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2lu
KCk7CiAgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsK
IAotICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7Ci0gICAgcCA9IE9i
amVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKHAsIGtleUxpbWl0LCAmb2JqZWN0U3RvcmVEYXRhS2V5
KTsKKyAgICBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVE
YXRhS2V5OworICAgIHAgPSBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURhdGFLZXk6OmRl
Y29kZShwLCBrZXlMaW1pdCwgJm9iamVjdFN0b3JlRGF0YUtleSk7CiAgICAgQVNTRVJUKHApOwog
ICAgIGlmICghcCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjMxMCwxMyArOTY3LDEzIEBA
IGJvb2wgT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCiAgICAgbV9jdXJy
ZW50S2V5ID0gb2JqZWN0U3RvcmVEYXRhS2V5LnVzZXJLZXkoKTsKIAogICAgIGludDY0X3QgdmVy
c2lvbjsKLSAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVl
KCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7CisgICAgY29u
c3QgY2hhciogcSA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29kZVZhckludChtX2l0ZXJhdG9yLT52
YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOwogICAg
IEFTU0VSVChxKTsKICAgICBpZiAoIXEpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAodm9p
ZCkgdmVyc2lvbjsKIAotICAgIG1fY3VycmVudFZhbHVlID0gZGVjb2RlU3RyaW5nKHEsIG1faXRl
cmF0b3ItPnZhbHVlKCkuZW5kKCkpOworICAgIG1fY3VycmVudFZhbHVlID0gSURCTGV2ZWxEQkNv
ZGluZzo6ZGVjb2RlU3RyaW5nKHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCkpOwogCiAgICAg
cmV0dXJuIHRydWU7CiB9CkBAIC0yMzQ4LDMwICsxMDA1LDMwIEBAIGJvb2wgSW5kZXhLZXlDdXJz
b3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCiB7CiAgICAgY29uc3QgY2hhciogcCA9IG1faXRlcmF0
b3ItPmtleSgpLmJlZ2luKCk7CiAgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9y
LT5rZXkoKS5lbmQoKTsKLSAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5OwotICAgIHAgPSBJ
bmRleERhdGFLZXk6OmRlY29kZShwLCBrZXlMaW1pdCwgJmluZGV4RGF0YUtleSk7CisgICAgSURC
TGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleTsKKyAgICBwID0gSURCTGV2
ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5OjpkZWNvZGUocCwga2V5TGltaXQsICZpbmRleERhdGFL
ZXkpOwogCiAgICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsKIAogICAg
IGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKLSAgICBjb25zdCBjaGFyKiBxID0gZGVjb2RlVmFy
SW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQo
KSwgaW5kZXhEYXRhVmVyc2lvbik7CisgICAgY29uc3QgY2hhciogcSA9IElEQkxldmVsREJDb2Rp
bmc6OmRlY29kZVZhckludChtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCksIG1faXRlcmF0b3It
PnZhbHVlKCkuZW5kKCksIGluZGV4RGF0YVZlcnNpb24pOwogICAgIEFTU0VSVChxKTsKICAgICBp
ZiAoIXEpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHEgPSBkZWNvZGVJREJLZXkocSwg
bV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgbV9wcmltYXJ5S2V5KTsKKyAgICBxID0gSURCTGV2
ZWxEQkNvZGluZzo6ZGVjb2RlSURCS2V5KHEsIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCksIG1f
cHJpbWFyeUtleSk7CiAgICAgQVNTRVJUKHEpOwogICAgIGlmICghcSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwogCi0gICAgVmVjdG9yPGNoYXI+IHByaW1hcnlMZXZlbERCS2V5ID0gT2JqZWN0U3Rv
cmVEYXRhS2V5OjplbmNvZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRhS2V5
Lm9iamVjdFN0b3JlSWQoKSwgKm1fcHJpbWFyeUtleSk7CisgICAgVmVjdG9yPGNoYXI+IHByaW1h
cnlMZXZlbERCS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNv
ZGUoaW5kZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQo
KSwgKm1fcHJpbWFyeUtleSk7CiAKICAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwogICAgIGlmICgh
bV9kYi0+Z2V0KHByaW1hcnlMZXZlbERCS2V5LCByZXN1bHQpKQogICAgICAgICByZXR1cm4gZmFs
c2U7CiAKICAgICBpbnQ2NF90IG9iamVjdFN0b3JlRGF0YVZlcnNpb247Ci0gICAgY29uc3QgY2hh
ciogdCA9IGRlY29kZVZhckludChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBvYmplY3RT
dG9yZURhdGFWZXJzaW9uKTsKKyAgICBjb25zdCBjaGFyKiB0ID0gSURCTGV2ZWxEQkNvZGluZzo6
ZGVjb2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3JlRGF0
YVZlcnNpb24pOwogICAgIEFTU0VSVCh0KTsKICAgICBpZiAoIXQpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKQEAgLTI0MTQsOCArMTA3MSw4IEBAIGJvb2wgSW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3Vy
cmVudFJvdygpCiAgICAgY29uc3QgY2hhciAqcCA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7
CiAgICAgY29uc3QgY2hhciAqbGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKIAotICAg
IEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7Ci0gICAgcCA9IEluZGV4RGF0YUtleTo6ZGVjb2Rl
KHAsIGxpbWl0LCAmaW5kZXhEYXRhS2V5KTsKKyAgICBJREJMZXZlbERCQ29kaW5nOjpJbmRleERh
dGFLZXkgaW5kZXhEYXRhS2V5OworICAgIHAgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFL
ZXk6OmRlY29kZShwLCBsaW1pdCwgJmluZGV4RGF0YUtleSk7CiAKICAgICBtX2N1cnJlbnRLZXkg
PSBpbmRleERhdGFLZXkudXNlcktleSgpOwogCkBAIC0yNDIzLDIzICsxMDgwLDIzIEBAIGJvb2wg
SW5kZXhDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCiAgICAgY29uc3QgY2hhciAqdmFsdWVM
aW1pdCA9IG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCk7CiAKICAgICBpbnQ2NF90IGluZGV4RGF0
YVZlcnNpb247Ci0gICAgcSA9IGRlY29kZVZhckludChxLCB2YWx1ZUxpbWl0LCBpbmRleERhdGFW
ZXJzaW9uKTsKKyAgICBxID0gSURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlVmFySW50KHEsIHZhbHVl
TGltaXQsIGluZGV4RGF0YVZlcnNpb24pOwogICAgIEFTU0VSVChxKTsKICAgICBpZiAoIXEpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBxID0gZGVjb2RlSURCS2V5KHEsIHZhbHVlTGltaXQs
IG1fcHJpbWFyeUtleSk7CisgICAgcSA9IElEQkxldmVsREJDb2Rpbmc6OmRlY29kZUlEQktleShx
LCB2YWx1ZUxpbWl0LCBtX3ByaW1hcnlLZXkpOwogICAgIEFTU0VSVChxKTsKICAgICBpZiAoIXEp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fcHJpbWFyeUxldmVsREJLZXkgPSBPYmpl
Y3RTdG9yZURhdGFLZXk6OmVuY29kZShpbmRleERhdGFLZXkuZGF0YWJhc2VJZCgpLCBpbmRleERh
dGFLZXkub2JqZWN0U3RvcmVJZCgpLCAqbV9wcmltYXJ5S2V5KTsKKyAgICBtX3ByaW1hcnlMZXZl
bERCS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW5k
ZXhEYXRhS2V5LmRhdGFiYXNlSWQoKSwgaW5kZXhEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSwgKm1f
cHJpbWFyeUtleSk7CiAKICAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwogICAgIGlmICghbV9kYi0+
Z2V0KG1fcHJpbWFyeUxldmVsREJLZXksIHJlc3VsdCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
IAogICAgIGludDY0X3Qgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbjsKLSAgICBjb25zdCBjaGFyKiB0
ID0gZGVjb2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIG9iamVjdFN0b3Jl
RGF0YVZlcnNpb24pOworICAgIGNvbnN0IGNoYXIqIHQgPSBJREJMZXZlbERCQ29kaW5nOjpkZWNv
ZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgb2JqZWN0U3RvcmVEYXRhVmVy
c2lvbik7CiAgICAgQVNTRVJUKHQpOwogICAgIGlmICghdCkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwpAQCAtMjQ0OSw3ICsxMTA2LDcgQEAgYm9vbCBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50
Um93KCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIG1fdmFsdWUgPSBkZWNv
ZGVTdHJpbmcodCwgcmVzdWx0LmVuZCgpKTsKKyAgICBtX3ZhbHVlID0gSURCTGV2ZWxEQkNvZGlu
Zzo6ZGVjb2RlU3RyaW5nKHQsIHJlc3VsdC5lbmQoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAK
QEAgLTI0ODIsMTUgKzExMzksMTUgQEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc28KICAgICBWZWN0
b3I8Y2hhcj4gc3RhcnRLZXksIHN0b3BLZXk7CiAKICAgICBpZiAoIWxvd2VyQm91bmQpIHsKLSAg
ICAgICAgc3RhcnRLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7CisgICAgICAgIHN0YXJ0S2V5ID0gSURCTGV2ZWxE
QkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgSURCTGV2ZWxEQkNvZGluZzo6bWluSURCS2V5KCkpOwogICAgICAgICBsb3dlck9wZW4g
PSB0cnVlOyAvLyBOb3QgaW5jbHVkZWQuCiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhcnRLZXkg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAq
cmFuZ2UtPmxvd2VyKCkpOworICAgICAgICBzdGFydEtleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9i
amVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5n
ZS0+bG93ZXIoKSk7CiAgICAgICAgIGxvd2VyT3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKICAg
ICB9CiAKICAgICBpZiAoIXVwcGVyQm91bmQpIHsKLSAgICAgICAgc3RvcEtleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1heElEQktleSgp
KTsKKyAgICAgICAgc3RvcEtleSA9IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElEQkxldmVsREJDb2Rpbmc6Om1h
eElEQktleSgpKTsKICAgICAgICAgdXBwZXJPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVkLgog
CiAgICAgICAgIGlmICghZm9yd2FyZCkgeyAvLyBXZSBuZWVkIGEga2V5IHRoYXQgZXhpc3RzLgpA
QCAtMjQ5OSw3ICsxMTU2LDcgQEAgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4g
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlQ3Vyc28KICAgICAgICAgICAg
IHVwcGVyT3BlbiA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3Rv
cEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAgIHN0b3BLZXkgPSBJREJMZXZlbERCQ29kaW5n
OjpPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAq
cmFuZ2UtPnVwcGVyKCkpOwogICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7
CiAgICAgfQogCkBAIC0yNTIwLDE1ICsxMTc3LDE1IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0
b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihp
CiAgICAgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5LCBzdG9wS2V5OwogCiAgICAgaWYgKCFsb3dlckJv
dW5kKSB7Ci0gICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWluSURCS2V5KCksIDApOworICAgICAgICBzdGFy
dEtleSA9IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIElEQkxldmVsREJDb2Rpbmc6Om1pbklEQktleSgpLCAw
KTsKICAgICAgICAgbG93ZXJPcGVuID0gZmFsc2U7IC8vIEluY2x1ZGVkLgogICAgIH0gZWxzZSB7
Ci0gICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT5sb3dlcigpLCAwKTsKKyAgICAgICAgc3RhcnRL
ZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxvd2VyKCksIDApOwogICAgICAgICBsb3dl
ck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CiAgICAgfQogCiAgICAgaWYgKCF1cHBlckJvdW5k
KSB7Ci0gICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBtYXhJREJLZXkoKSwgMCk7CisgICAgICAgIHN0b3BLZXkg
PSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleElkLCBJREJMZXZlbERCQ29kaW5nOjptYXhJREJLZXkoKSwgMCk7CiAg
ICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KIAogICAgICAgICBpZiAoIWZv
cndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KQEAgLTI1MzcsNyArMTE5NCw3
IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5n
U3RvcmU6Om9wZW5JbmRleEtleUN1cnNvcihpCiAgICAgICAgICAgICB1cHBlck9wZW4gPSBmYWxz
ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPnVw
cGVyKCksIDApOworICAgICAgICBzdG9wS2V5ID0gSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51
cHBlcigpLCAwKTsKICAgICAgICAgaWYgKCFmaW5kTGFzdEluZGV4S2V5RXF1YWxUbyhtX2RiLmdl
dCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkgLy8gU2VlayB0byB0aGUgKmxhc3QqIGtleSBpbiB0aGUg
c2V0IG9mIG5vbi11bmlxdWUga2V5cy4KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB1
cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CkBAIC0yNTYwLDE1ICsxMjE3LDE1IEBAIFBh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6
Om9wZW5JbmRleEN1cnNvcihpbnQ2CiAgICAgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5LCBzdG9wS2V5
OwogCiAgICAgaWYgKCFsb3dlckJvdW5kKSB7Ci0gICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWluSURCS2V5
KCksIDApOworICAgICAgICBzdGFydEtleSA9IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtl
eTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIElEQkxldmVsREJD
b2Rpbmc6Om1pbklEQktleSgpLCAwKTsKICAgICAgICAgbG93ZXJPcGVuID0gZmFsc2U7IC8vIElu
Y2x1ZGVkLgogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXJ0S2V5ID0gSW5kZXhEYXRhS2V5Ojpl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT5sb3dlcigp
LCAwKTsKKyAgICAgICAgc3RhcnRLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAqcmFuZ2UtPmxvd2Vy
KCksIDApOwogICAgICAgICBsb3dlck9wZW4gPSByYW5nZS0+bG93ZXJPcGVuKCk7CiAgICAgfQog
CiAgICAgaWYgKCF1cHBlckJvdW5kKSB7Ci0gICAgICAgIHN0b3BLZXkgPSBJbmRleERhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtYXhJREJLZXkoKSwg
MCk7CisgICAgICAgIHN0b3BLZXkgPSBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBJREJMZXZlbERCQ29kaW5n
OjptYXhJREJLZXkoKSwgMCk7CiAgICAgICAgIHVwcGVyT3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRl
ZC4KIAogICAgICAgICBpZiAoIWZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0
cy4KQEAgLTI1NzcsNyArMTIzNCw3IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcihpbnQ2CiAgICAgICAg
ICAgICB1cHBlck9wZW4gPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAg
IHN0b3BLZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkLCAqcmFuZ2UtPnVwcGVyKCksIDApOworICAgICAgICBzdG9wS2V5ID0gSURCTGV2
ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpLCAwKTsKICAgICAgICAgaWYgKCFmaW5kTGFzdElu
ZGV4S2V5RXF1YWxUbyhtX2RiLmdldCgpLCBzdG9wS2V5LCBzdG9wS2V5KSkgLy8gU2VlayB0byB0
aGUgKmxhc3QqIGtleSBpbiB0aGUgc2V0IG9mIG5vbi11bmlxdWUga2V5cy4KICAgICAgICAgICAg
IHJldHVybiAwOwogICAgICAgICB1cHBlck9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2RpbmcuY3BwIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yYmVk
OTZjZGFlMjA5Y2Y1ZGFkNzM2OTk1Y2FmNWVmYzA5Zjg1YWMxCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcApAQCAtMCwwICsxLDEy
NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkNv
ZGluZy5oIgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisjaWYgRU5BQkxFKExFVkVM
REIpCisKKyNpbmNsdWRlICJJREJLZXkuaCIKKyNpbmNsdWRlICJMZXZlbERCU2xpY2UuaCIKKwor
Ly8gTGV2ZWxEQiBzdG9yZXMga2V5L3ZhbHVlIHBhaXJzLiBLZXlzIGFuZCB2YWx1ZXMgYXJlIHN0
cmluZ3Mgb2YgYnl0ZXMsIG5vcm1hbGx5IG9mIHR5cGUgVmVjdG9yPGNoYXI+LgorLy8KKy8vIFRo
ZSBrZXlzIGluIHRoZSBiYWNraW5nIHN0b3JlIGFyZSB2YXJpYWJsZS1sZW5ndGggdHVwbGVzIHdp
dGggZGlmZmVyZW50IHR5cGVzCisvLyBvZiBmaWVsZHMuIEVhY2gga2V5IGluIHRoZSBiYWNraW5n
IHN0b3JlIHN0YXJ0cyB3aXRoIGEgdGVybmFyeSBwcmVmaXg6IChkYXRhYmFzZSBpZCwgb2JqZWN0
IHN0b3JlIGlkLCBpbmRleCBpZCkuIEZvciBlYWNoLCAwIGlzIHJlc2VydmVkIGZvciBtZXRhLWRh
dGEuCisvLyBUaGUgcHJlZml4IG1ha2VzIHN1cmUgdGhhdCBkYXRhIGZvciBhIHNwZWNpZmljIGRh
dGFiYXNlLCBvYmplY3Qgc3RvcmUsIGFuZCBpbmRleCBhcmUgZ3JvdXBlZCB0b2dldGhlci4gVGhl
IGxvY2FsaXR5IGlzIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2U6IGNvbW1vbgorLy8gb3BlcmF0
aW9ucyBzaG91bGQgb25seSBuZWVkIGEgbWluaW1hbCBudW1iZXIgb2Ygc2VlayBvcGVyYXRpb25z
LiBGb3IgZXhhbXBsZSwgYWxsIHRoZSBtZXRhLWRhdGEgZm9yIGEgZGF0YWJhc2UgaXMgZ3JvdXBl
ZCB0b2dldGhlciBzbyB0aGF0IHJlYWRpbmcgdGhhdAorLy8gbWV0YS1kYXRhIG9ubHkgcmVxdWly
ZXMgb25lIHNlZWsuCisvLworLy8gRWFjaCBrZXkgdHlwZSBoYXMgYSBjbGFzcyAoaW4gc3F1YXJl
IGJyYWNrZXRzIGJlbG93KSB3aGljaCBrbm93cyBob3cgdG8gZW5jb2RlLCBkZWNvZGUsIGFuZCBj
b21wYXJlIHRoYXQga2V5IHR5cGUuCisvLworLy8gR2xvYmFsIG1ldGEtZGF0YSBoYXZlIGtleXMg
d2l0aCBwcmVmaXggKDAsMCwwKSwgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGU6CisvLworLy8gICAg
IDwwLCAwLCAwLCAwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9
PiBJbmRleGVkREIvTGV2ZWxEQiBzY2hlbWEgdmVyc2lvbiAoMCBmb3Igbm93KSBbU2NoZW1hVmVy
c2lvbktleV0KKy8vICAgICA8MCwgMCwgMCwgMT4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgPT4gVGhlIG1heGltdW0gZGF0YWJhc2UgaWQgZXZlciBhbGxvY2F0ZWQg
W01heERhdGFiYXNlSWRLZXldCisvLyAgICAgPDAsIDAsIDAsIDEwMCwgZGF0YWJhc2UgaWQ+ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgID0+IEV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBkYXRhYmFz
ZSBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtEYXRhYmFzZUZyZWVMaXN0S2V5XQorLy8gICAgIDww
LCAwLCAwLCAyMDEsIHV0ZjE2IG9yaWdpbiBuYW1lLCB1dGYxNiBkYXRhYmFzZSBuYW1lPiA9PiBE
YXRhYmFzZSBpZCBbRGF0YWJhc2VOYW1lS2V5XQorLy8KKy8vCisvLyBEYXRhYmFzZSBtZXRhLWRh
dGE6CisvLworLy8gICAgIEFnYWluLCB0aGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBi
eXRlLgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDA+ID0+IHV0ZjE2IG9yaWdpbiBu
YW1lIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMT4g
PT4gdXRmMTYgZGF0YWJhc2UgbmFtZSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDI+ID0+IHV0ZjE2IHVzZXIgdmVyc2lvbiBkYXRhIFtEYXRhYmFzZU1l
dGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMz4gPT4gbWF4aW11bSBvYmpl
Y3Qgc3RvcmUgaWQgZXZlciBhbGxvY2F0ZWQgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLworLy8K
Ky8vIE9iamVjdCBzdG9yZSBtZXRhLWRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9s
bG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4gYSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciwgYW5k
IHRoZW4gYW5vdGhlciB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciAoRklYTUU6IHRoaXMgc2hvdWxk
IGJlIGEgYnl0ZSkuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBz
dG9yZSBpZCwgMD4gPT4gdXRmMTYgb2JqZWN0IHN0b3JlIG5hbWUgW09iamVjdFN0b3JlTWV0YURh
dGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAx
PiA9PiB1dGYxNiBrZXkgcGF0aCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDI+ID0+IGhhcyBhdXRvIGluY3Jl
bWVudCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAs
IDUwLCBvYmplY3Qgc3RvcmUgaWQsIDM+ID0+IGlzIGV2aWN0YWJsZSBbT2JqZWN0U3RvcmVNZXRh
RGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQs
IDQ+ID0+IGxhc3QgInZlcnNpb24iIG51bWJlciBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8v
ICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDU+ID0+IG1heGlt
dW0gaW5kZXggaWQgZXZlciBhbGxvY2F0ZWQgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCisvLwor
Ly8KKy8vIEluZGV4IG1ldGEtZGF0YToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dl
ZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiB0d28gdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzLCBhbmQg
dGhlbiBhbm90aGVyIHR5cGUgYnl0ZS4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAx
MDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDA+ID0+IHV0ZjE2IGluZGV4IG5hbWUgW0lu
ZGV4TWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBz
dG9yZSBpZCwgaW5kZXggaWQsIDE+ID0+IGFyZSBpbmRleCBrZXlzIHVuaXF1ZSBbSW5kZXhNZXRh
RGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlk
LCBpbmRleCBpZCwgMj4gPT4gdXRmMTYga2V5IHBhdGggW0luZGV4TWV0YURhdGFLZXldCisvLwor
Ly8KKy8vIE90aGVyIG9iamVjdCBzdG9yZSBhbmQgaW5kZXggbWV0YS1kYXRhOgorLy8KKy8vICAg
ICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgb2JqZWN0IHN0b3Jl
IGFuZCBpbmRleCBpZCBhcmUgdmFyaWFibGUgbGVuZ3RoIGludGVnZXJzLCB0aGUgdXRmMTYgc3Ry
aW5ncyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MuCisvLworLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgMTUwLCBvYmplY3Qgc3RvcmUgaWQ+ICAgICAgICAgICAgICAgICAgID0+IGV4aXN0
ZW5jZSBpbXBsaWVzIHRoZSBvYmplY3Qgc3RvcmUgaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbT2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1MSwgb2Jq
ZWN0IHN0b3JlIGlkLCBpbmRleCBpZD4gICAgICAgICA9PiBleGlzdGVuY2UgaW1wbGllcyB0aGUg
aW5kZXggaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbSW5kZXhGcmVlTGlzdEtleV0KKy8vICAgICA8
ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMCwgdXRmMTYgb2JqZWN0IHN0b3JlIG5hbWU+ICAgICAgICAg
ICA9PiBvYmplY3Qgc3RvcmUgaWQgW09iamVjdFN0b3JlTmFtZXNLZXldCisvLyAgICAgPGRhdGFi
YXNlIGlkLCAwLCAwLCAyMDEsIG9iamVjdCBzdG9yZSBpZCwgdXRmMTYgaW5kZXggbmFtZT4gPT4g
aW5kZXggaWQgW0luZGV4TmFtZXNLZXldCisvLworLy8KKy8vIE9iamVjdCBzdG9yZSBkYXRhOgor
Ly8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNl
ciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2Jq
ZWN0IHN0b3JlIGlkLCAxLCB1c2VyIGtleT4gPT4gInZlcnNpb24iLCBzZXJpYWxpemVkIHNjcmlw
dCB2YWx1ZSBbT2JqZWN0U3RvcmVEYXRhS2V5XQorLy8KKy8vCisvLyAiRXhpc3RzIiBlbnRyeToK
Ky8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVz
ZXIga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LgorLy8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIG9i
amVjdCBzdG9yZSBpZCwgMiwgdXNlciBrZXk+ID0+ICJ2ZXJzaW9uIiBbRXhpc3RzRW50cnlLZXld
CisvLworLy8KKy8vIEluZGV4IGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93
ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4gVGhl
IHNlcXVlbmNlIG51bWJlciBpcyBhIHZhcmlhYmxlIGxlbmd0aCBpbnRlZ2VyLgorLy8KKy8vICAg
ICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIHVzZXIga2V5LCBzZXF1
ZW5jZSBudW1iZXI+ID0+ICJ2ZXJzaW9uIiwgdXNlciBrZXkgW0luZGV4RGF0YUtleV0KKy8vCisv
LyAgICAgKFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgdXNlZCB0byBhbGxvdyB0d28gZW50cmllcyB3
aXRoIHRoZSBzYW1lIHVzZXIga2V5CisvLyAgICAgaW4gbm9uLXVuaXF1ZSBpbmRleGVzLiBUaGUg
InZlcnNpb24iIGZpZWxkIGlzIHVzZWQgdG8gd2VlZCBvdXQgc3RhbGUKKy8vICAgICBpbmRleCBk
YXRhLiBXaGVuZXZlciBuZXcgb2JqZWN0IHN0b3JlIGRhdGEgaXMgaW5zZXJ0ZWQsIGl0IGdldHMg
YSBuZXcKKy8vICAgICAidmVyc2lvbiIgbnVtYmVyLCBhbmQgbmV3IGluZGV4IGRhdGEgaXMgd3Jp
dHRlbiB3aXRoIHRoaXMgbnVtYmVyLiBXaGVuCisvLyAgICAgdGhlIGluZGV4IGlzIHVzZWQgZm9y
IGxvb2stdXBzLCBlbnRyaWVzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUKKy8vICAgICAiZXhp
c3RzIiBlbnRyaWVzLCBhbmQgcmVjb3JkcyB3aXRoIG9sZCAidmVyc2lvbiIgbnVtYmVycyBhcmUg
ZGVsZXRlZAorLy8gICAgIHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQgaW4gZ2V0UHJpbWFyeUtl
eVZpYUluZGV4LAorLy8gICAgIEluZGV4Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3csIGFuZCBJ
bmRleEtleUN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KS4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjb25zdCB1bnNpZ25lZCBjaGFyIElEQkxldmVsREJDb2Rpbmc6OmtNaW5pbXVtSW5kZXhJ
ZCA9IDMwOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TnVsbFR5cGVCeXRl
ID0gMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlTdHJpbmdUeXBlQnl0ZSA9
IDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5RGF0ZVR5cGVCeXRlID0gMjsK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdW1iZXJUeXBlQnl0ZSA9IDM7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSURCS2V5TWluS2V5VHlwZUJ5dGUgPSA0OworCitz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVEYXRhSW5kZXhJZCA9IDE7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrRXhpc3RzRW50cnlJbmRleElkID0gMjsKKworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1NjaGVtYVZlcnNpb25UeXBlQnl0ZSA9IDA7CitzdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTWF4RGF0YWJhc2VJZFR5cGVCeXRlID0gMTsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUgPSAxMDA7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUgPSAyMDE7CisK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUg
PSA1MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUg
PSAxMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVGcmVlTGlzdFR5
cGVCeXRlID0gMTUwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4RnJlZUxpc3RU
eXBlQnl0ZSA9IDE1MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZU5h
bWVzVHlwZUJ5dGUgPSAyMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhOYW1l
c0tleVR5cGVCeXRlID0gMjAxOworCisjaWZuZGVmIElOVDY0X01BWAorLy8gRklYTUU6IFdlIHNo
b3VsZG4ndCBuZWVkIHRvIHJlbHkgb24gdGhlc2UgbWFjcm9zLgorI2RlZmluZSBJTlQ2NF9NQVgg
MHg3ZmZmZmZmZmZmZmZmZmZmTEwKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUg
SU5UMzJfTUFYIDB4N2ZmZmZmZmZMCisjZW5kaWYKKworCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxE
QkNvZGluZzo6ZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyIGMpCit7CisgICAgVmVjdG9yPGNoYXI+
IHY7CisgICAgdi5hcHBlbmQoYyk7CisgICAgcmV0dXJuIHY7Cit9CisKK1ZlY3RvcjxjaGFyPiBJ
REJMZXZlbERCQ29kaW5nOjptYXhJREJLZXkoKQoreworICAgIHJldHVybiBlbmNvZGVCeXRlKGtJ
REJLZXlOdWxsVHlwZUJ5dGUpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6
bWluSURCS2V5KCkKK3sKKyAgICByZXR1cm4gZW5jb2RlQnl0ZShrSURCS2V5TWluS2V5VHlwZUJ5
dGUpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlSW50KGludDY0
X3QgbikKK3sKKyAgICBBU1NFUlQobiA+PSAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0OyAvLyBG
SVhNRTogU2l6ZSB0aGlzIGF0IGNyZWF0aW9uLgorCisgICAgZG8geworICAgICAgICB1bnNpZ25l
ZCBjaGFyIGMgPSBuOworICAgICAgICByZXQuYXBwZW5kKGMpOworICAgICAgICBuID4+PSA4Owor
ICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50NjRfdCBJREJMZXZl
bERCQ29kaW5nOjpkZWNvZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkK
K3sKKyAgICBBU1NFUlQoYmVnaW4gPD0gZW5kKTsKKyAgICBpbnQ2NF90IHJldCA9IDA7CisKKyAg
ICB3aGlsZSAoYmVnaW4gPCBlbmQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKmJlZ2lu
Kys7CisgICAgICAgIHJldCA9IChyZXQgPDwgOCkgfCBjOworICAgIH0KKworICAgIHJldHVybiBy
ZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBJREJMZXZlbERCQ29kaW5nOjplbmNvZGVWYXJJbnQoaW50
NjRfdCBuKQoreworICAgIFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQg
Y3JlYXRpb24uCisKKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAweDdm
OworICAgICAgICBuID4+PSA3OworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGMgfD0gMTI4
OworICAgICAgICByZXQuYXBwZW5kKGMpOworICAgIH0gd2hpbGUgKG4pOworCisgICAgcmV0dXJu
IHJldDsKK30KKworY29uc3QgY2hhciogSURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlVmFySW50KGNv
bnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIqIGxpbWl0LCBpbnQ2NF90JiBmb3VuZEludCkKK3sKKyAg
ICBBU1NFUlQobGltaXQgPj0gcCk7CisgICAgZm91bmRJbnQgPSAwOworCisgICAgZG8geworICAg
ICAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGZv
dW5kSW50ID0gKGZvdW5kSW50IDw8IDcpIHwgKCpwICYgMHg3Zik7CisgICAgfSB3aGlsZSAoKnAr
KyAmIDEyOCk7CisgICAgcmV0dXJuIHA7Cit9CisKK1ZlY3RvcjxjaGFyPiBJREJMZXZlbERCQ29k
aW5nOjplbmNvZGVTdHJpbmcoY29uc3QgU3RyaW5nJiBzKQoreworICAgIFZlY3RvcjxjaGFyPiBy
ZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3JlYXRpb24uCisKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFVDaGFyIHUgPSBzW2ldOwor
ICAgICAgICB1bnNpZ25lZCBjaGFyIGhpID0gdSA+PiA4OworICAgICAgICB1bnNpZ25lZCBjaGFy
IGxvID0gdTsKKyAgICAgICAgcmV0LmFwcGVuZChoaSk7CisgICAgICAgIHJldC5hcHBlbmQobG8p
OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK1N0cmluZyBJREJMZXZlbERCQ29kaW5n
OjpkZWNvZGVTdHJpbmcoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogZW5kKQoreworICAgIEFT
U0VSVChlbmQgPj0gcCk7CisgICAgQVNTRVJUKCEoKGVuZCAtIHApICUgMikpOworCisgICAgc2l6
ZV90IGxlbiA9IChlbmQgLSBwKSAvIDI7CisgICAgVmVjdG9yPFVDaGFyPiB2ZWN0b3IobGVuKTsK
KworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgdW5zaWdu
ZWQgY2hhciBoaSA9ICpwKys7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSAqcCsrOworCisg
ICAgICAgIHZlY3RvcltpXSA9IChoaSA8PCA4KSB8IGxvOworICAgIH0KKworICAgIHJldHVybiBT
dHJpbmc6OmFkb3B0KHZlY3Rvcik7Cit9CisKK1ZlY3RvcjxjaGFyPiBJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IFN0cmluZyYgcykKK3sKKyAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkpOworICAgIHJldC5hcHBlbmQoZW5j
b2RlU3RyaW5nKHMpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyKiBJREJMZXZl
bERCQ29kaW5nOjpkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNo
YXIqIGxpbWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQoreworICAgIEFTU0VSVChsaW1pdCA+PSBw
KTsKKyAgICBpbnQ2NF90IGxlbjsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBsZW4p
OworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHAgKyBsZW4gKiAyID4g
bGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJp
bmcocCwgcCArIGxlbiAqIDIpOworICAgIHAgKz0gbGVuICogMjsKKyAgICByZXR1cm4gcDsKK30K
KworVmVjdG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OmVuY29kZURvdWJsZShkb3VibGUgeCkK
K3sKKyAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBiZSBieXRlIG9y
ZGVyIGluZGVwZW5kZW50LgorICAgIGNvbnN0IGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNo
YXIqPigmeCk7CisgICAgVmVjdG9yPGNoYXI+IHY7CisgICAgdi5hcHBlbmQocCwgc2l6ZW9mKHgp
KTsKKyAgICBBU1NFUlQodi5zaXplKCkgPT0gc2l6ZW9mKHgpKTsKKyAgICByZXR1cm4gdjsKK30K
KworY29uc3QgY2hhciogSURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlRG91YmxlKGNvbnN0IGNoYXIq
IHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBkb3VibGUqIGQpCit7CisgICAgaWYgKHAgKyBzaXplb2Yo
KmQpID4gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2hhciogeCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y2hhcio+KGQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKCpk
KTsgKytpKQorICAgICAgICAqeCsrID0gKnArKzsKKyAgICByZXR1cm4gcDsKK30KKworVmVjdG9y
PGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OmVuY29kZUlEQktleShjb25zdCBJREJLZXkmIGtleSkK
K3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0OworCisgICAgc3dpdGNoIChrZXkudHlwZSgpKSB7Cisg
ICAgY2FzZSBJREJLZXk6Ok51bGxUeXBlOgorICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZShrSURC
S2V5TnVsbFR5cGVCeXRlKTsKKyAgICBjYXNlIElEQktleTo6U3RyaW5nVHlwZToKKyAgICAgICAg
cmV0ID0gZW5jb2RlQnl0ZShrSURCS2V5U3RyaW5nVHlwZUJ5dGUpOworICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoa2V5LnN0cmluZygpKSk7CisgICAgICAgIHJldHVy
biByZXQ7CisgICAgY2FzZSBJREJLZXk6OkRhdGVUeXBlOgorICAgICAgICByZXQgPSBlbmNvZGVC
eXRlKGtJREJLZXlEYXRlVHlwZUJ5dGUpOworICAgICAgICByZXQuYXBwZW5kKGVuY29kZURvdWJs
ZShrZXkuZGF0ZSgpKSk7CisgICAgICAgIEFTU0VSVChyZXQuc2l6ZSgpID09IDkpOworICAgICAg
ICByZXR1cm4gcmV0OworICAgIGNhc2UgSURCS2V5OjpOdW1iZXJUeXBlOgorICAgICAgICByZXQg
PSBlbmNvZGVCeXRlKGtJREJLZXlOdW1iZXJUeXBlQnl0ZSk7CisgICAgICAgIHJldC5hcHBlbmQo
ZW5jb2RlRG91YmxlKGtleS5udW1iZXIoKSkpOworICAgICAgICBBU1NFUlQocmV0LnNpemUoKSA9
PSA5KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gVmVjdG9yPGNoYXI+KCk7Cit9CisKK2NvbnN0IGNoYXIqIElEQkxl
dmVsREJDb2Rpbmc6OmRlY29kZUlEQktleShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1p
dCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsK
KyAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBj
aGFyIHR5cGUgPSAqcCsrOworICAgIFN0cmluZyBzOworICAgIGRvdWJsZSBkOworCisgICAgc3dp
dGNoICh0eXBlKSB7CisgICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgorICAgICAgICAvLyBO
dWxsLgorICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlTnVsbCgpOworICAgICAgICBy
ZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgLy8gU3Ry
aW5nLgorICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcyk7Cisg
ICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3VuZEtleSA9
IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOworICAgICAgICByZXR1cm4gcDsKKyAgICBjYXNlIGtJ
REJLZXlEYXRlVHlwZUJ5dGU6CisgICAgICAgIC8vIERhdGUuCisgICAgICAgIHAgPSBkZWNvZGVE
b3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKGQpOworICAgICAgICBy
ZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0ZToKKyAgICAgICAgLy8gTnVt
YmVyLgorICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7CisgICAgICAgIGlm
ICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3VuZEtleSA9IElEQktleTo6
Y3JlYXRlTnVtYmVyKGQpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciogSURCTGV2ZWxE
QkNvZGluZzo6ZXh0cmFjdEVuY29kZWRJREJLZXkoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNo
YXIqIGxpbWl0LCBWZWN0b3I8Y2hhcj4qIHJlc3VsdCkKK3sKKyAgICBjb25zdCBjaGFyKiBwID0g
c3RhcnQ7CisgICAgaWYgKHAgPj0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5z
aWduZWQgY2hhciB0eXBlID0gKnArKzsKKworICAgIGludDY0X3Qgc3RyaW5nTGVuOworCisgICAg
c3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgorICAgIGNhc2Ug
a0lEQktleU1pbktleVR5cGVCeXRlOgorICAgICAgICAqcmVzdWx0ID0gZW5jb2RlQnl0ZSh0eXBl
KTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6Cisg
ICAgICAgIC8vIFN0cmluZy4KKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgc3Ry
aW5nTGVuKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IGlmIChwICsgc3RyaW5nTGVuICogMiA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIHJlc3VsdC0+Y2xlYXIoKTsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQoc3RhcnQsIHAg
LSBzdGFydCArIHN0cmluZ0xlbiAqIDIpOworICAgICAgICByZXR1cm4gcCArIHN0cmluZ0xlbiAq
IDI7CisgICAgY2FzZSBrSURCS2V5RGF0ZVR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU51bWJl
clR5cGVCeXRlOgorICAgICAgICAvLyBEYXRlIG9yIG51bWJlci4KKyAgICAgICAgaWYgKHAgKyBz
aXplb2YoZG91YmxlKSA+IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
c3VsdC0+Y2xlYXIoKTsKKyAgICAgICAgcmVzdWx0LT5hcHBlbmQoc3RhcnQsIDEgKyBzaXplb2Yo
ZG91YmxlKSk7CisgICAgICAgIHJldHVybiBwICsgc2l6ZW9mKGRvdWJsZSk7CisgICAgfQorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitpbnQgSURCTGV2ZWxE
QkNvZGluZzo6Y29tcGFyZUVuY29kZWRJREJLZXlzKGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5QSwg
Y29uc3QgVmVjdG9yPGNoYXI+JiBrZXlCKQoreworICAgIEFTU0VSVChrZXlBLnNpemUoKSA+PSAx
KTsKKyAgICBBU1NFUlQoa2V5Qi5zaXplKCkgPj0gMSk7CisKKyAgICBjb25zdCBjaGFyKiBwID0g
a2V5QS5kYXRhKCk7CisgICAgY29uc3QgY2hhciogbGltaXRBID0gcCArIGtleUEuc2l6ZSgpOwor
ICAgIGNvbnN0IGNoYXIqIHEgPSBrZXlCLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBsaW1pdEIg
PSBxICsga2V5Qi5zaXplKCk7CisKKyAgICB1bnNpZ25lZCBjaGFyIHR5cGVBID0gKnArKzsKKyAg
ICB1bnNpZ25lZCBjaGFyIHR5cGVCID0gKnErKzsKKworICAgIFN0cmluZyBzLCB0OworICAgIGRv
dWJsZSBkLCBlOworCisgICAgaWYgKGludCB4ID0gdHlwZUIgLSB0eXBlQSkgLy8gRklYTUU6IE5v
dGUgdGhlIHN1YnRsZW5lc3MhCisgICAgICAgIHJldHVybiB4OworCisgICAgc3dpdGNoICh0eXBl
QSkgeworICAgIGNhc2Uga0lEQktleU51bGxUeXBlQnl0ZToKKyAgICBjYXNlIGtJREJLZXlNaW5L
ZXlUeXBlQnl0ZToKKyAgICAgICAgLy8gTnVsbCB0eXBlIG9yIG1heCB0eXBlOyBubyBwYXlsb2Fk
IHRvIGNvbXBhcmUuCisgICAgICAgIHJldHVybiAwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5
cGVCeXRlOgorICAgICAgICAvLyBTdHJpbmcgdHlwZS4KKyAgICAgICAgcCA9IGRlY29kZVN0cmlu
Z1dpdGhMZW5ndGgocCwgbGltaXRBLCBzKTsgLy8gRklYTUU6IENvbXBhcmUgd2l0aG91dCBhY3R1
YWxseSBkZWNvZGluZyB0aGUgU3RyaW5nIQorICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIHEg
PSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHEsIGxpbWl0QiwgdCk7CisgICAgICAgIEFTU0VSVChx
KTsKKyAgICAgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUocywgdCk7CisgICAgY2FzZSBrSURC
S2V5RGF0ZVR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAgICAg
ICAvLyBEYXRlIG9yIG51bWJlci4KKyAgICAgICAgcCA9IGRlY29kZURvdWJsZShwLCBsaW1pdEEs
ICZkKTsKKyAgICAgICAgQVNTRVJUKHApOworICAgICAgICBxID0gZGVjb2RlRG91YmxlKHEsIGxp
bWl0QiwgJmUpOworICAgICAgICBBU1NFUlQocSk7CisgICAgICAgIGlmIChkIDwgZSkKKyAgICAg
ICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGQgPiBlKQorICAgICAgICAgICAgcmV0dXJu
IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIHJldHVybiAwOworfQorCituYW1lc3BhY2UgewordGVtcGxhdGU8dHlwZW5hbWUgS2V5
VHlwZT4KK2ludCBkZWNvZGVBbmRDb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3Qg
TGV2ZWxEQlNsaWNlJiBiKQoreworICAgIEtleVR5cGUga2V5QTsKKyAgICBLZXlUeXBlIGtleUI7
CisKKyAgICBjb25zdCBjaGFyKiBwdHJBID0gS2V5VHlwZTo6ZGVjb2RlKGEuYmVnaW4oKSwgYS5l
bmQoKSwgJmtleUEpOworICAgIEFTU0VSVF9VTlVTRUQocHRyQSwgcHRyQSk7CisgICAgY29uc3Qg
Y2hhciogcHRyQiA9IEtleVR5cGU6OmRlY29kZShiLmJlZ2luKCksIGIuZW5kKCksICZrZXlCKTsK
KyAgICBBU1NFUlRfVU5VU0VEKHB0ckIsIHB0ckIpOworCisgICAgcmV0dXJuIGtleUEuY29tcGFy
ZShrZXlCKTsKK30KK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6OmNvbXBhcmUoY29uc3QgTGV2
ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzKQorewor
ICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBhLmJlZ2luKCk7CisgICAgY29uc3QgY2hhciogcHRyQiA9
IGIuYmVnaW4oKTsKKyAgICBjb25zdCBjaGFyKiBlbmRBID0gYS5lbmQoKTsKKyAgICBjb25zdCBj
aGFyKiBlbmRCID0gYi5lbmQoKTsKKworICAgIEtleVByZWZpeCBwcmVmaXhBOworICAgIEtleVBy
ZWZpeCBwcmVmaXhCOworCisgICAgcHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckEsIGVuZEEs
ICZwcmVmaXhBKTsKKyAgICBwdHJCID0gS2V5UHJlZml4OjpkZWNvZGUocHRyQiwgZW5kQiwgJnBy
ZWZpeEIpOworICAgIEFTU0VSVChwdHJBKTsKKyAgICBBU1NFUlQocHRyQik7CisKKyAgICBpZiAo
aW50IHggPSBwcmVmaXhBLmNvbXBhcmUocHJlZml4QikpCisgICAgICAgIHJldHVybiB4OworCisg
ICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a0dsb2JhbE1ldGFEYXRhKSB7Cisg
ICAgICAgIEFTU0VSVChwdHJBICE9IGVuZEEpOworICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRC
KTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7CisgICAgICAg
IHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVCID0gKnB0ckIrKzsKKworICAgICAgICBpZiAoaW50IHgg
PSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCisgICAgICAgICAgICByZXR1cm4geDsKKworICAgICAg
ICBpZiAodHlwZUJ5dGVBIDw9IDEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKQorICAgICAgICAgICAgcmV0
dXJuIGRlY29kZUFuZENvbXBhcmU8RGF0YWJhc2VGcmVlTGlzdEtleT4oYSwgYik7CisgICAgICAg
IGlmICh0eXBlQnl0ZUEgPT0ga0RhdGFiYXNlTmFtZVR5cGVCeXRlKQorICAgICAgICAgICAgcmV0
dXJuIGRlY29kZUFuZENvbXBhcmU8RGF0YWJhc2VOYW1lS2V5PihhLCBiKTsKKyAgICB9CisKKyAg
ICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprRGF0YWJhc2VNZXRhRGF0YSkgewor
ICAgICAgICBBU1NFUlQocHRyQSAhPSBlbmRBKTsKKyAgICAgICAgQVNTRVJUKHB0ckIgIT0gZW5k
Qik7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUEgPSAqcHRyQSsrOworICAgICAg
ICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQiA9ICpwdHJCKys7CisKKyAgICAgICAgaWYgKGludCB4
ID0gdHlwZUJ5dGVBIC0gdHlwZUJ5dGVCKQorICAgICAgICAgICAgcmV0dXJuIHg7CisKKyAgICAg
ICAgaWYgKHR5cGVCeXRlQSA8PSAzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAg
aWYgKHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlKQorICAgICAgICAg
ICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8T2JqZWN0U3RvcmVNZXRhRGF0YUtleT4oYSwgYik7
CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4TWV0YURhdGFUeXBlQnl0ZSkKKyAgICAg
ICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPEluZGV4TWV0YURhdGFLZXk+KGEsIGIpOwor
ICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUpCisg
ICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxPYmplY3RTdG9yZUZyZWVMaXN0S2V5
PihhLCBiKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrSW5kZXhGcmVlTGlzdFR5cGVCeXRl
KQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8SW5kZXhGcmVlTGlzdEtleT4o
YSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0
ZSkKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlTmFtZXNL
ZXk+KGEsIGIpOworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtJbmRleE5hbWVzS2V5VHlwZUJ5
dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRleE5hbWVzS2V5Pihh
LCBiKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgfQorCisgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6a09iamVjdFN0
b3JlRGF0YSkgeworICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0
dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91
bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKworICAgICAgICByZXR1cm4gZGVj
b2RlQW5kQ29tcGFyZTxPYmplY3RTdG9yZURhdGFLZXk+KGEsIGIpOworICAgIH0KKyAgICBpZiAo
cHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprRXhpc3RzRW50cnkpIHsKKyAgICAgICAgaWYg
KHB0ckEgPT0gZW5kQSAmJiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAg
aWYgKHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBj
YXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRs
ZWQgdGhpcyB3YXkuCisKKyAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8RXhpc3RzRW50
cnlLZXk+KGEsIGIpOworICAgIH0KKyAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4
OjprSW5kZXhEYXRhKSB7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRC
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAg
ICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAg
ICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlz
IHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgIEluZGV4
RGF0YUtleSBpbmRleERhdGFLZXlBOworICAgICAgICBJbmRleERhdGFLZXkgaW5kZXhEYXRhS2V5
QjsKKworICAgICAgICBwdHJBID0gSW5kZXhEYXRhS2V5OjpkZWNvZGUoYS5iZWdpbigpLCBlbmRB
LCAmaW5kZXhEYXRhS2V5QSk7CisgICAgICAgIHB0ckIgPSBJbmRleERhdGFLZXk6OmRlY29kZShi
LmJlZ2luKCksIGVuZEIsICZpbmRleERhdGFLZXlCKTsKKyAgICAgICAgQVNTRVJUKHB0ckEpOwor
ICAgICAgICBBU1NFUlQocHRyQik7CisKKyAgICAgICAgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJl
ciA9IGluZGV4S2V5czsKKyAgICAgICAgcmV0dXJuIGluZGV4RGF0YUtleUEuY29tcGFyZShpbmRl
eERhdGFLZXlCLCBpZ25vcmVTZXF1ZW5jZU51bWJlcik7CisgICAgfQorCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworSURCTGV2ZWxEQkNvZGluZzo6S2V5
UHJlZml4OjpLZXlQcmVmaXgoKQorICAgIDogbV9kYXRhYmFzZUlkKGtJbnZhbGlkVHlwZSkKKyAg
ICAsIG1fb2JqZWN0U3RvcmVJZChrSW52YWxpZFR5cGUpCisgICAgLCBtX2luZGV4SWQoa0ludmFs
aWRUeXBlKQoreworfQorCitJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OktleVByZWZpeChp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
KQorICAgIDogbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgLCBtX29iamVjdFN0b3JlSWQo
b2JqZWN0U3RvcmVJZCkKKyAgICAsIG1faW5kZXhJZChpbmRleElkKQoreworfQorCitjb25zdCBj
aGFyKiBJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmRlY29kZShjb25zdCBjaGFyKiBzdGFy
dCwgY29uc3QgY2hhciogbGltaXQsIEtleVByZWZpeCogcmVzdWx0KQoreworICAgIGlmIChzdGFy
dCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBjaGFyIGZpcnN0
Qnl0ZSA9ICpzdGFydCsrOworCisgICAgaW50IGRhdGFiYXNlSWRCeXRlcyA9ICgoZmlyc3RCeXRl
ID4+IDUpICYgMHg3KSArIDE7CisgICAgaW50IG9iamVjdFN0b3JlSWRCeXRlcyA9ICgoZmlyc3RC
eXRlID4+IDIpICYgMHg3KSArIDE7CisgICAgaW50IGluZGV4SWRCeXRlcyA9IChmaXJzdEJ5dGUg
JiAweDMpICsgMTsKKworICAgIGlmIChzdGFydCArIGRhdGFiYXNlSWRCeXRlcyArIG9iamVjdFN0
b3JlSWRCeXRlcyArIGluZGV4SWRCeXRlcyA+IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJlc3VsdC0+bV9kYXRhYmFzZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGRhdGFi
YXNlSWRCeXRlcyk7CisgICAgc3RhcnQgKz0gZGF0YWJhc2VJZEJ5dGVzOworICAgIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIG9iamVjdFN0b3JlSWRC
eXRlcyk7CisgICAgc3RhcnQgKz0gb2JqZWN0U3RvcmVJZEJ5dGVzOworICAgIHJlc3VsdC0+bV9p
bmRleElkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGluZGV4SWRCeXRlcyk7CisgICAgc3Rh
cnQgKz0gaW5kZXhJZEJ5dGVzOworCisgICAgcmV0dXJuIHN0YXJ0OworfQorCitWZWN0b3I8Y2hh
cj4gSURCTGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4OjplbmNvZGUoKSBjb25zdAoreworICAgIEFT
U0VSVChtX2RhdGFiYXNlSWQgIT0ga0ludmFsaWRJZCk7CisgICAgQVNTRVJUKG1fb2JqZWN0U3Rv
cmVJZCAhPSBrSW52YWxpZElkKTsKKyAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQp
OworCisgICAgVmVjdG9yPGNoYXI+IGRhdGFiYXNlSWRTdHJpbmcgPSBlbmNvZGVJbnQobV9kYXRh
YmFzZUlkKTsKKyAgICBWZWN0b3I8Y2hhcj4gb2JqZWN0U3RvcmVJZFN0cmluZyA9IGVuY29kZUlu
dChtX29iamVjdFN0b3JlSWQpOworICAgIFZlY3RvcjxjaGFyPiBpbmRleElkU3RyaW5nID0gZW5j
b2RlSW50KG1faW5kZXhJZCk7CisKKyAgICBBU1NFUlQoZGF0YWJhc2VJZFN0cmluZy5zaXplKCkg
PD0gOCk7CisgICAgQVNTRVJUKG9iamVjdFN0b3JlSWRTdHJpbmcuc2l6ZSgpIDw9IDgpOworICAg
IEFTU0VSVChpbmRleElkU3RyaW5nLnNpemUoKSA8PSA0KTsKKworCisgICAgdW5zaWduZWQgY2hh
ciBmaXJzdEJ5dGUgPSAoZGF0YWJhc2VJZFN0cmluZy5zaXplKCkgLSAxKSA8PCA1IHwgKG9iamVj
dFN0b3JlSWRTdHJpbmcuc2l6ZSgpIC0gMSkgPDwgMiB8IChpbmRleElkU3RyaW5nLnNpemUoKSAt
IDEpOworICAgIFZlY3RvcjxjaGFyPiByZXQ7CisgICAgcmV0LmFwcGVuZChmaXJzdEJ5dGUpOwor
ICAgIHJldC5hcHBlbmQoZGF0YWJhc2VJZFN0cmluZyk7CisgICAgcmV0LmFwcGVuZChvYmplY3RT
dG9yZUlkU3RyaW5nKTsKKyAgICByZXQuYXBwZW5kKGluZGV4SWRTdHJpbmcpOworCisgICAgcmV0
dXJuIHJldDsKK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6OktleVByZWZpeDo6Y29tcGFyZShj
b25zdCBLZXlQcmVmaXgmIG90aGVyKSBjb25zdAoreworICAgIEFTU0VSVChtX2RhdGFiYXNlSWQg
IT0ga0ludmFsaWRJZCk7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElk
KTsKKyAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOworCisgICAgaWYgKG1fZGF0
YWJhc2VJZCAhPSBvdGhlci5tX2RhdGFiYXNlSWQpCisgICAgICAgIHJldHVybiBtX2RhdGFiYXNl
SWQgLSBvdGhlci5tX2RhdGFiYXNlSWQ7CisgICAgaWYgKG1fb2JqZWN0U3RvcmVJZCAhPSBvdGhl
ci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQgLSBvdGhl
ci5tX29iamVjdFN0b3JlSWQ7CisgICAgaWYgKG1faW5kZXhJZCAhPSBvdGhlci5tX2luZGV4SWQp
CisgICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4SWQ7CisgICAgcmV0dXJu
IDA7Cit9CisKK0lEQkxldmVsREJDb2Rpbmc6OktleVByZWZpeDo6VHlwZSBJREJMZXZlbERCQ29k
aW5nOjpLZXlQcmVmaXg6OnR5cGUoKSBjb25zdAoreworICAgIEFTU0VSVChtX2RhdGFiYXNlSWQg
IT0ga0ludmFsaWRJZCk7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElk
KTsKKyAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOworCisgICAgaWYgKCFtX2Rh
dGFiYXNlSWQpCisgICAgICAgIHJldHVybiBrR2xvYmFsTWV0YURhdGE7CisgICAgaWYgKCFtX29i
amVjdFN0b3JlSWQpCisgICAgICAgIHJldHVybiBrRGF0YWJhc2VNZXRhRGF0YTsKKyAgICBpZiAo
bV9pbmRleElkID09IGtPYmplY3RTdG9yZURhdGFJbmRleElkKQorICAgICAgICByZXR1cm4ga09i
amVjdFN0b3JlRGF0YTsKKyAgICBpZiAobV9pbmRleElkID09IGtFeGlzdHNFbnRyeUluZGV4SWQp
CisgICAgICAgIHJldHVybiBrRXhpc3RzRW50cnk7CisgICAgaWYgKG1faW5kZXhJZCA+PSBrTWlu
aW11bUluZGV4SWQpCisgICAgICAgIHJldHVybiBrSW5kZXhEYXRhOworCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGtJbnZhbGlkVHlwZTsKK30KKworVmVjdG9yPGNoYXI+
IElEQkxldmVsREJDb2Rpbmc6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSgpCit7CisgICAgS2V5
UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVu
Y29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrU2NoZW1hVmVyc2lvblR5cGVCeXRl
KSk7CisgICAgcmV0dXJuIHJldDsKK30KKworVmVjdG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6
Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpCit7CisgICAgS2V5UHJlZml4IHByZWZpeCgwLCAw
LCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgIHJldC5h
cHBlbmQoZW5jb2RlQnl0ZShrTWF4RGF0YWJhc2VJZFR5cGVCeXRlKSk7CisgICAgcmV0dXJuIHJl
dDsKK30KKworSURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJhc2VG
cmVlTGlzdEtleSgpCisgICAgOiBtX2RhdGFiYXNlSWQoLTEpCit7Cit9CisKK2NvbnN0IGNoYXIq
IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRlY29kZShjb25zdCBjaGFy
KiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIERhdGFiYXNlRnJlZUxpc3RLZXkqIHJlc3VsdCkK
K3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIgKnAgPSBLZXlQcmVmaXg6
OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgQVNTRVJUKCFwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXBy
ZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Cisg
ICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIg
dHlwZUJ5dGUgPSAqcCsrOworICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09
IGtEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1f
ZGF0YWJhc2VJZCk7Cit9CisKK1ZlY3RvcjxjaGFyPiBJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZUZyZWVMaXN0S2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkKQoreworICAgIEtleVByZWZp
eCBwcmVmaXgoMCwgMCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUo
KTsKKyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSkp
OworICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KGRhdGFiYXNlSWQpKTsKKyAgICByZXR1cm4g
cmV0OworfQorCitpbnQ2NF90IElEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6
OmRhdGFiYXNlSWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7Cisg
ICAgcmV0dXJuIG1fZGF0YWJhc2VJZDsKK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6OkRhdGFi
YXNlRnJlZUxpc3RLZXk6OmNvbXBhcmUoY29uc3QgRGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIp
IGNvbnN0Cit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKKyAgICByZXR1cm4gbV9k
YXRhYmFzZUlkIC0gb3RoZXIubV9kYXRhYmFzZUlkOworfQorCitjb25zdCBjaGFyKiBJREJMZXZl
bERCQ29kaW5nOjpEYXRhYmFzZU5hbWVLZXk6OmRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29u
c3QgY2hhciogbGltaXQsIERhdGFiYXNlTmFtZUtleSogcmVzdWx0KQoreworICAgIEtleVByZWZp
eCBwcmVmaXg7CisgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBs
aW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gcDsKKyAgICBBU1NF
UlQoIXByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICBpZiAocCA9PSBsaW1p
dCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7
CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0RhdGFiYXNlTmFtZVR5
cGVCeXRlKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9
IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9vcmlnaW4pOworICAg
IGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhM
ZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZU5hbWUpOworfQorCitWZWN0b3I8Y2hh
cj4gSURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VOYW1lS2V5OjplbmNvZGUoY29uc3QgU3RyaW5n
JiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lKQoreworICAgIEtleVByZWZpeCBw
cmVmaXgoMCwgMCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsK
KyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0RhdGFiYXNlTmFtZVR5cGVCeXRlKSk7CisgICAg
cmV0LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKG9yaWdpbikpOworICAgIHJldC5hcHBl
bmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChkYXRhYmFzZU5hbWUpKTsKKyAgICByZXR1cm4gcmV0
OworfQorCitpbnQgSURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VOYW1lS2V5Ojpjb21wYXJlKGNv
bnN0IERhdGFiYXNlTmFtZUtleSYgb3RoZXIpCit7CisgICAgaWYgKGludCB4ID0gY29kZVBvaW50
Q29tcGFyZShtX29yaWdpbiwgb3RoZXIubV9vcmlnaW4pKQorICAgICAgICByZXR1cm4geDsKKyAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX2RhdGFiYXNlTmFtZSwgb3RoZXIubV9kYXRhYmFz
ZU5hbWUpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VNZXRh
RGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgTWV0YURhdGFUeXBlIG1ldGFEYXRh
VHlwZSkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgIFZl
Y3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVC
eXRlKG1ldGFEYXRhVHlwZSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK0lEQkxldmVsREJDb2Rp
bmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkoKQorICAg
IDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICwgbV9tZXRhRGF0YVR5cGUoLTEpCit7Cit9CisK
K2NvbnN0IGNoYXIqIElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRl
Y29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTWV0
YURhdGFLZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNo
YXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlm
ICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQp
OworICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVm
aXgubV9pbmRleElkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBl
Qnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSk7CisgICAgaWYg
KHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJl
dHVybiAwOworICAgIEFTU0VSVChyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKHAg
PT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2
ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSkKK3sKKyAg
ICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgIFZlY3RvcjxjaGFyPiBy
ZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtPYmplY3RT
dG9yZU1ldGFEYXRhVHlwZUJ5dGUpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChvYmpl
Y3RTdG9yZUlkKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQobWV0YURhdGFUeXBlKSk7
CisgICAgcmV0dXJuIHJldDsKK30KKworaW50NjRfdCBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RT
dG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9v
YmplY3RTdG9yZUlkID49IDApOworICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQ7Cit9CitpbnQ2
NF90IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Om1ldGFEYXRhVHlw
ZSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fbWV0YURhdGFUeXBlID49IDApOworICAgIHJldHVy
biBtX21ldGFEYXRhVHlwZTsKK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSYgb3RoZXIp
Cit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICBBU1NFUlQobV9tZXRh
RGF0YVR5cGUgPj0gMCk7CisgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0gb3RoZXIu
bV9vYmplY3RTdG9yZUlkKQorICAgICAgICByZXR1cm4geDsgLy8gRklYTUU6IElzIHRoaXMgY2Fz
dCBzYWZlPyBJLmUuLCB3aWxsIGl0IHByZXNlcnZlIHRoZSBzaWduPworICAgIHJldHVybiBtX21l
dGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFUeXBlOworfQorCitJREJMZXZlbERCQ29kaW5n
OjpJbmRleE1ldGFEYXRhS2V5OjpJbmRleE1ldGFEYXRhS2V5KCkKKyAgICA6IG1fb2JqZWN0U3Rv
cmVJZCgtMSkKKyAgICAsIG1faW5kZXhJZCgtMSkKKyAgICAsIG1fbWV0YURhdGFUeXBlKDApCit7
Cit9CisKK2NvbnN0IGNoYXIqIElEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmRl
Y29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TWV0YURhdGFL
ZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAg
PSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAg
IEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9p
bmRleElkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5z
aWduZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwg
dHlwZUJ5dGUgPT0ga0luZGV4TWV0YURhdGFUeXBlQnl0ZSk7CisgICAgaWYgKHAgPT0gbGltaXQp
CisgICAgICAgIHJldHVybiAwOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3Vs
dC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9pbmRleElkKTsKKyAgICBpZiAo
IXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXN1bHQtPm1fbWV0YURhdGFUeXBlID0gKnArKzsKKyAgICByZXR1cm4gcDsK
K30KKworVmVjdG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBp
bmRleElkLCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKK3sKKyAgICBLZXlQcmVmaXggcHJl
Zml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5j
b2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUp
KTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7CisgICAgcmV0
LmFwcGVuZChlbmNvZGVWYXJJbnQoaW5kZXhJZCkpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0
ZShtZXRhRGF0YVR5cGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgSURCTGV2ZWxEQkNv
ZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6Y29tcGFyZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBv
dGhlcikKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgIEFTU0VSVCht
X2luZGV4SWQgPj0gMCk7CisKKyAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhl
ci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgIHJldHVybiB4OworICAgIGlmIChpbnQgeCA9IG1f
aW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgcmV0dXJuIHg7CisgICAgcmV0dXJu
IG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7Cit9CisKK2ludDY0X3QgSURC
TGV2ZWxEQkNvZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6aW5kZXhJZCgpIGNvbnN0Cit7CisgICAg
QVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKyAgICByZXR1cm4gbV9pbmRleElkOworfQorCitJREJM
ZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpPYmplY3RTdG9yZUZyZWVMaXN0
S2V5KCkKKyAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKK3sKK30KKworY29uc3QgY2hhciogSURC
TGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZGVjb2RlKGNvbnN0IGNoYXIq
IHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0
KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciAqcCA9IEtleVByZWZp
eDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUKCFw
cmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwor
ICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBjaGFy
IHR5cGVCeXRlID0gKnArKzsKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9
PSBrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0
LT5tX29iamVjdFN0b3JlSWQpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6
T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkKQoreworICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwg
MCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICByZXQuYXBw
ZW5kKGVuY29kZUJ5dGUoa09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSkpOworICAgIHJldC5h
cHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICByZXR1cm4gcmV0OworfQor
CitpbnQ2NF90IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6Om9iamVj
dFN0b3JlSWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Cisg
ICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6Ok9i
amVjdFN0b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtl
eSYgb3RoZXIpCit7CisgICAgLy8gRklYTUU6IEl0IG1heSBzZWVtIHN0cmFuZ2UgdGhhdCB3ZSdy
ZSBub3QgY29tcGFyaW5nIGRhdGFiYXNlIGlkJ3MsCisgICAgLy8gYnV0IHRoYXQgY29tcGFyaXNv
biB3aWxsIGhhdmUgYmVlbiBtYWRlIGVhcmxpZXIuCisgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5
IG1ha2UgdGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KKyAgICBBU1NFUlQobV9vYmplY3RTdG9y
ZUlkID49IDApOworICAgIHJldHVybiBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0
b3JlSWQ7Cit9CisKK0lEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXk6OkluZGV4RnJl
ZUxpc3RLZXkoKQorICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICwgbV9pbmRleElkKC0x
KQoreworfQorCitjb25zdCBjaGFyKiBJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5
OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVM
aXN0S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFy
KiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAo
IXApCisgICAgICAgIHJldHVybiAwOworICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsK
KyAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4
Lm1faW5kZXhJZCk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAg
IHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5
dGUsIHR5cGVCeXRlID09IGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpOworICAgIGlmIChwID09IGxp
bWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBy
ZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsK
KyAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhJZCk7Cit9
CisKK1ZlY3RvcjxjaGFyPiBJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjplbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgIFZl
Y3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVC
eXRlKGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVZhcklu
dChvYmplY3RTdG9yZUlkKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQoaW5kZXhJZCkp
OworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVM
aXN0S2V5Ojpjb21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKQoreworICAgIEFT
U0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsK
KyAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQp
CisgICAgICAgIHJldHVybiB4OworICAgIHJldHVybiBtX2luZGV4SWQgLSBvdGhlci5tX2luZGV4
SWQ7Cit9CisKK2ludDY0X3QgSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhGcmVlTGlzdEtleTo6b2Jq
ZWN0U3RvcmVJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsK
KyAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOworfQorCitpbnQ2NF90IElEQkxldmVsREJDb2Rp
bmc6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2lu
ZGV4SWQgPj0gMCk7CisgICAgcmV0dXJuIG1faW5kZXhJZDsKK30KKworLy8gRklYTUU6IFdlIG5l
dmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgb2JqZWN0IHN0b3JlIGlkcywgYmVjYXVzZSBhIG1hcHBp
bmcKKy8vIGlzIGtlcHQgaW4gdGhlIElEQkRhdGFiYXNlQmFja2VuZEltcGwuIENhbiB0aGUgbWFw
cGluZyBiZWNvbWUgdW5yZWxpYWJsZT8KKy8vIENhbiB3ZSByZW1vdmUgdGhpcz8KK2NvbnN0IGNo
YXIqIElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmRlY29kZShjb25zdCBj
aGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTmFtZXNLZXkqIHJlc3Vs
dCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVm
aXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCgh
cHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsK
KyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hh
ciB0eXBlQnl0ZSA9ICpwKys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUg
PT0ga09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSk7CisgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dp
dGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZU5hbWUpOworfQorCitWZWN0
b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGlu
dDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCit7CisgICAg
S2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0
ID0gcHJlZml4LmVuY29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrU2NoZW1hVmVy
c2lvblR5cGVCeXRlKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtPYmplY3RTdG9yZU5h
bWVzVHlwZUJ5dGUpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob2Jq
ZWN0U3RvcmVOYW1lKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IElEQkxldmVsREJDb2Rp
bmc6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tl
eSYgb3RoZXIpCit7CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9vYmplY3RTdG9yZU5h
bWUsIG90aGVyLm1fb2JqZWN0U3RvcmVOYW1lKTsKK30KKworSURCTGV2ZWxEQkNvZGluZzo6SW5k
ZXhOYW1lc0tleTo6SW5kZXhOYW1lc0tleSgpCisgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCit7
Cit9CisKKy8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVwIGluZGV4IGlkcywg
YmVjYXVzZSBhIG1hcHBpbmcKKy8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCitjb25zdCBj
aGFyKiBJREJMZXZlbERCQ29kaW5nOjpJbmRleE5hbWVzS2V5OjpkZWNvZGUoY29uc3QgY2hhciog
c3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiByZXN1bHQpCit7CisgICAg
S2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUo
c3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOwor
ICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX29i
amVjdFN0b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYgKHAg
PT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUg
PSAqcCsrOworICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtJbmRleE5h
bWVzS2V5VHlwZUJ5dGUpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsK
KyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7
CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5n
V2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4TmFtZSk7Cit9CisKK1ZlY3Rvcjxj
aGFyPiBJREJMZXZlbERCQ29kaW5nOjpJbmRleE5hbWVzS2V5OjplbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgaW5kZXhOYW1lKQor
eworICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgVmVjdG9yPGNo
YXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0lu
ZGV4TmFtZXNLZXlUeXBlQnl0ZSkpOworICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVj
dFN0b3JlSWQpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoaW5kZXhO
YW1lKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IElEQkxldmVsREJDb2Rpbmc6OkluZGV4
TmFtZXNLZXk6OmNvbXBhcmUoY29uc3QgSW5kZXhOYW1lc0tleSYgb3RoZXIpCit7CisgICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICBpZiAoaW50IHggPSBtX29iamVjdFN0b3Jl
SWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisgICAgICAgIHJldHVybiB4OworICAgIHJldHVy
biBjb2RlUG9pbnRDb21wYXJlKG1faW5kZXhOYW1lLCBvdGhlci5tX2luZGV4TmFtZSk7Cit9CisK
K2NvbnN0IGNoYXIqIElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIE9iamVjdFN0b3JlRGF0YUtleSog
cmVzdWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciogcCA9IEtl
eVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VS
VChwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA9
PSBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIHJldHVy
biAwOworICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1f
ZW5jb2RlZFVzZXJLZXkpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNvZGluZzo6T2Jq
ZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiBlbmNvZGVkVXNlcktleSkKK3sKKyAgICBLZXlQ
cmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1i
ZXIpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFw
cGVuZChlbmNvZGVkVXNlcktleSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0b3I8Y2hh
cj4gSURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSkK
K3sKKyAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlE
QktleSh1c2VyS2V5KSk7Cit9CisKK2ludCBJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURh
dGFLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlcikKK3sKKyAgICBy
ZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1fZW5j
b2RlZFVzZXJLZXkpOworfQorCitQYXNzUmVmUHRyPElEQktleT4gSURCTGV2ZWxEQkNvZGluZzo6
T2JqZWN0U3RvcmVEYXRhS2V5Ojp1c2VyS2V5KCkgY29uc3QKK3sKKyAgICBSZWZQdHI8SURCS2V5
PiBrZXk7CisgICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNv
ZGVkVXNlcktleS5lbmQoKSwga2V5KTsKKyAgICByZXR1cm4ga2V5OworfQorCitjb25zdCBpbnQ2
NF90IElEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6a1NwZWNpYWxJbmRleE51
bWJlciA9IGtPYmplY3RTdG9yZURhdGFJbmRleElkOworCitjb25zdCBjaGFyKiBJREJMZXZlbERC
Q29kaW5nOjpFeGlzdHNFbnRyeUtleTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBj
aGFyKiBlbmQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZp
eDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnBy
ZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4
Lm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAg
IEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgIGlm
IChwID09IGVuZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVk
SURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNlcktleSk7Cit9CisKK1ZlY3Rvcjxj
aGFyPiBJREJMZXZlbERCQ29kaW5nOjpFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29k
ZWRLZXkpCit7CisgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBrU3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVu
Y29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlZEtleSk7CisgICAgcmV0dXJuIHJldDsKK30K
KworVmVjdG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5OjplbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYg
dXNlcktleSkKK3sKKyAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGVuY29kZUlEQktleSh1c2VyS2V5KSk7Cit9CisKK2ludCBJREJMZXZlbERCQ29kaW5nOjpFeGlz
dHNFbnRyeUtleTo6Y29tcGFyZShjb25zdCBFeGlzdHNFbnRyeUtleSYgb3RoZXIpCit7CisgICAg
cmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2Vu
Y29kZWRVc2VyS2V5KTsKK30KKworUGFzc1JlZlB0cjxJREJLZXk+IElEQkxldmVsREJDb2Rpbmc6
OkV4aXN0c0VudHJ5S2V5Ojp1c2VyS2V5KCkgY29uc3QKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBr
ZXk7CisgICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVk
VXNlcktleS5lbmQoKSwga2V5KTsKKyAgICByZXR1cm4ga2V5OworfQorCitjb25zdCBpbnQ2NF90
IElEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5OjprU3BlY2lhbEluZGV4TnVtYmVyID0g
a0V4aXN0c0VudHJ5SW5kZXhJZDsKKworSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5OjpJ
bmRleERhdGFLZXkoKQorICAgIDogbV9kYXRhYmFzZUlkKC0xKQorICAgICwgbV9vYmplY3RTdG9y
ZUlkKC0xKQorICAgICwgbV9pbmRleElkKC0xKQorICAgICwgbV9zZXF1ZW5jZU51bWJlcigtMSkK
K3sKK30KKworY29uc3QgY2hhciogSURCTGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5OjpkZWNv
ZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFLZXkqIHJl
c3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQ
cmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VS
VChwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA+
PSBrTWluaW11bUluZGV4SWQpOworICAgIHJlc3VsdC0+bV9kYXRhYmFzZUlkID0gcHJlZml4Lm1f
ZGF0YWJhc2VJZDsKKyAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IHByZWZpeC5tX29iamVj
dFN0b3JlSWQ7CisgICAgcmVzdWx0LT5tX2luZGV4SWQgPSBwcmVmaXgubV9pbmRleElkOworICAg
IHAgPSBleHRyYWN0RW5jb2RlZElEQktleShwLCBsaW1pdCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNl
cktleSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocCA9PSBsaW1p
dCkgeworICAgICAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIgPSAtMTsgLy8gRklYTUU6IFdl
IHNob3VsZCBjaGFuZ2UgaXQgc28gdGhhdCBhbGwga2V5cyBoYXZlIGEgc2VxdWVuY2UgbnVtYmVy
LiBTaG91bGRuJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLgorICAgICAgICByZXR1cm4gcDsK
KyAgICB9CisgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX3NlcXVl
bmNlTnVtYmVyKTsKK30KKworVmVjdG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0
YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2RlZFVzZXJLZXksIGludDY0
X3Qgc2VxdWVuY2VOdW1iZXIpCit7CisgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVu
Y29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlZFVzZXJLZXkpOworICAgIHJldC5hcHBlbmQo
ZW5jb2RlVmFySW50KHNlcXVlbmNlTnVtYmVyKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworVmVj
dG9yPGNoYXI+IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6ZW5jb2RlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0
IElEQktleSYgdXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikKK3sKKyAgICByZXR1cm4g
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGVuY29kZUlEQktleSh1
c2VyS2V5KSwgc2VxdWVuY2VOdW1iZXIpOworfQorCitWZWN0b3I8Y2hhcj4gSURCTGV2ZWxEQkNv
ZGluZzo6SW5kZXhEYXRhS2V5OjplbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBJTlQzMl9NQVgsIG1heElEQktleSgpLCBJTlQ2NF9NQVgpOworfQorCitpbnQg
SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5Ojpjb21wYXJlKGNvbnN0IEluZGV4RGF0YUtl
eSYgb3RoZXIsIGJvb2wgaWdub3JlU2VxdWVuY2VOdW1iZXIpCit7CisgICAgQVNTRVJUKG1fZGF0
YWJhc2VJZCA+PSAwKTsKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgIEFT
U0VSVChtX2luZGV4SWQgPj0gMCk7CisgICAgaWYgKGludCB4ID0gY29tcGFyZUVuY29kZWRJREJL
ZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1fZW5jb2RlZFVzZXJLZXkpKQorICAgICAgICBy
ZXR1cm4geDsKKyAgICBpZiAoaWdub3JlU2VxdWVuY2VOdW1iZXIpCisgICAgICAgIHJldHVybiAw
OworICAgIHJldHVybiBtX3NlcXVlbmNlTnVtYmVyIC0gb3RoZXIubV9zZXF1ZW5jZU51bWJlcjsK
K30KKworaW50NjRfdCBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmRhdGFiYXNlSWQo
KSBjb25zdAoreworICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAgcmV0dXJuIG1f
ZGF0YWJhc2VJZDsKK30KKworaW50NjRfdCBJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6
Om9iamVjdFN0b3JlSWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0g
MCk7CisgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKK30KKworaW50NjRfdCBJREJMZXZlbERC
Q29kaW5nOjpJbmRleERhdGFLZXk6OmluZGV4SWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2lu
ZGV4SWQgPj0gMCk7CisgICAgcmV0dXJuIG1faW5kZXhJZDsKK30KKworUGFzc1JlZlB0cjxJREJL
ZXk+IElEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6dXNlcktleSgpIGNvbnN0Cit7Cisg
ICAgUmVmUHRyPElEQktleT4ga2V5OworICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5
LmJlZ2luKCksIG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7CisgICAgcmV0dXJuIGtleTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIp
CisjZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2RpbmcuaCBiL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCTGV2ZWxEQkNvZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ3OTZiMDVhNGJjOGQxZjFhZTU2YTAz
MWY0NzVkMDgwMjJmOGU0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQkxldmVsREJDb2RpbmcuaApAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
SURCTGV2ZWxEQkNvZGluZ19oCisjZGVmaW5lIElEQkxldmVsREJDb2RpbmdfaAorCisjaWYgRU5B
QkxFKElOREVYRURfREFUQUJBU0UpCisjaWYgRU5BQkxFKExFVkVMREIpCisKKyNpbmNsdWRlIDx3
dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIElEQktleTsKK2Ns
YXNzIExldmVsREJTbGljZTsKKworY2xhc3MgSURCTGV2ZWxEQkNvZGluZyB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga01pbmltdW1JbmRleElkOworCisgICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGVCeXRlKHVuc2lnbmVkIGNoYXIpOworICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gbWF4SURCS2V5KCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBtaW5JREJL
ZXkoKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUludChpbnQ2NF90KTsKKyAgICBz
dGF0aWMgaW50NjRfdCBkZWNvZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVu
ZCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVWYXJJbnQoaW50NjRfdCk7CisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFy
KiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlU3RyaW5nKGNvbnN0IFN0cmluZyYpOworICAgIHN0YXRpYyBTdHJpbmcgZGVjb2RlU3RyaW5n
KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGVuZCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFy
PiBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IFN0cmluZyYpOworICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIq
IGxpbWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5nKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVu
Y29kZURvdWJsZShkb3VibGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGVEb3VibGUo
Y29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRvdWJsZSopOworICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlSURCS2V5KGNvbnN0IElEQktleSYpOworICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGVJREJLZXkoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIFJl
ZlB0cjxJREJLZXk+JiBmb3VuZEtleSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGV4dHJhY3RF
bmNvZGVkSURCS2V5KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgVmVjdG9y
PGNoYXI+KiByZXN1bHQpOworICAgIHN0YXRpYyBpbnQgY29tcGFyZUVuY29kZWRJREJLZXlzKGNv
bnN0IFZlY3RvcjxjaGFyPiYsIGNvbnN0IFZlY3RvcjxjaGFyPiYpOworCisgICAgc3RhdGljIGlu
dCBjb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYsIGNvbnN0IExldmVsREJTbGljZSYsIGJvb2wg
aW5kZXhLZXlzID0gZmFsc2UpOworCisgICAgY2xhc3MgS2V5UHJlZml4IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIEtleVByZWZpeCgpOworICAgICAgICBLZXlQcmVmaXgoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCk7CisKKyAgICAgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciog
bGltaXQsIEtleVByZWZpeCogcmVzdWx0KTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGVuY29kZSgp
IGNvbnN0OworICAgICAgICBpbnQgY29tcGFyZShjb25zdCBLZXlQcmVmaXgmIG90aGVyKSBjb25z
dDsKKworICAgICAgICBlbnVtIFR5cGUgeworICAgICAgICAgICAga0dsb2JhbE1ldGFEYXRhLAor
ICAgICAgICAgICAga0RhdGFiYXNlTWV0YURhdGEsCisgICAgICAgICAgICBrT2JqZWN0U3RvcmVE
YXRhLAorICAgICAgICAgICAga0V4aXN0c0VudHJ5LAorICAgICAgICAgICAga0luZGV4RGF0YSwK
KyAgICAgICAgICAgIGtJbnZhbGlkVHlwZQorICAgICAgICB9OworCisgICAgICAgIFR5cGUgdHlw
ZSgpIGNvbnN0OworCisgICAgICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgICAgICBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICAgICAgaW50NjRfdCBtX2luZGV4SWQ7CisKKyAgICAg
ICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0ludmFsaWRJZCA9IC0xOworICAgIH07CisKKyAgICBj
bGFzcyBTY2hlbWFWZXJzaW9uS2V5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBWZWN0
b3I8Y2hhcj4gZW5jb2RlKCk7CisgICAgfTsKKworICAgIGNsYXNzIE1heERhdGFiYXNlSWRLZXkg
eworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKTsKKyAg
ICB9OworCisgICAgY2xhc3MgRGF0YWJhc2VGcmVlTGlzdEtleSB7CisgICAgcHVibGljOgorICAg
ICAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCk7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZyZWVM
aXN0S2V5KiByZXN1bHQpOworICAgICAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2
NF90IGRhdGFiYXNlSWQpOworICAgICAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBjb25zdDsKKyAg
ICAgICAgaW50IGNvbXBhcmUoY29uc3QgRGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIpIGNvbnN0
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgfTsK
KworICAgIGNsYXNzIERhdGFiYXNlTmFtZUtleSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0
aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1p
dCwgRGF0YWJhc2VOYW1lS2V5KiByZXN1bHQpOworICAgICAgICBzdGF0aWMgVmVjdG9yPGNoYXI+
IGVuY29kZShjb25zdCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUp
OworICAgICAgICBTdHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAg
ICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VOYW1l
OyB9CisgICAgICAgIGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNlTmFtZUtleSYgb3RoZXIpOwor
CisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nIG1fb3JpZ2luOyAvLyBGSVhNRTogU3RvcmUg
ZW5jb2RlZCBzdHJpbmdzLCBvciBqdXN0IHBvaW50ZXJzLgorICAgICAgICBTdHJpbmcgbV9kYXRh
YmFzZU5hbWU7CisgICAgfTsKKworICAgIGNsYXNzIERhdGFiYXNlTWV0YURhdGFLZXkgeworICAg
IHB1YmxpYzoKKyAgICAgICAgZW51bSBNZXRhRGF0YVR5cGUgeworICAgICAgICAgICAga09yaWdp
bk5hbWUgPSAwLAorICAgICAgICAgICAga0RhdGFiYXNlTmFtZSA9IDEsCisgICAgICAgICAgICBr
VXNlclZlcnNpb24gPSAyLAorICAgICAgICAgICAga01heE9iamVjdFN0b3JlSWQgPSAzCisgICAg
ICAgIH07CisKKyAgICAgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBNZXRhRGF0YVR5cGUpOworICAgIH07CisKKyAgICBjbGFzcyBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXko
KTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXkqIHJlc3VsdCk7CisgICAg
ICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSk7CisgICAgICAgIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCgpIGNvbnN0OworICAgICAgICBpbnQ2NF90IG1ldGFEYXRhVHlwZSgpIGNv
bnN0OworICAgICAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5JiBv
dGhlcik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsK
KyAgICAgICAgaW50NjRfdCBtX21ldGFEYXRhVHlwZTsgLy8gRklYTUU6IE1ha2UgdGhpcyBhIGJ5
dGUuCisgICAgfTsKKworICAgIGNsYXNzIEluZGV4TWV0YURhdGFLZXkgeworICAgIHB1YmxpYzoK
KyAgICAgICAgSW5kZXhNZXRhRGF0YUtleSgpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciog
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhNZXRhRGF0
YUtleSogcmVzdWx0KTsKKyAgICAgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgdW5z
aWduZWQgY2hhciBtZXRhRGF0YVR5cGUpOworICAgICAgICBpbnQgY29tcGFyZShjb25zdCBJbmRl
eE1ldGFEYXRhS2V5JiBvdGhlcik7CisgICAgICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0Owor
ICAgICAgICB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWV0
YURhdGFUeXBlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQ2NF90IG1fb2JqZWN0U3Rv
cmVJZDsKKyAgICAgICAgaW50NjRfdCBtX2luZGV4SWQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
bV9tZXRhRGF0YVR5cGU7CisgICAgfTsKKworICAgIGNsYXNzIE9iamVjdFN0b3JlRnJlZUxpc3RL
ZXkgeworICAgIHB1YmxpYzoKKyAgICAgICAgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSgpOworICAg
ICAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBj
aGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0KTsKKyAgICAgICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQpOworICAgICAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdDsKKyAgICAg
ICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYgb3RoZXIpOworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgfTsKKwor
ICAgIGNsYXNzIEluZGV4RnJlZUxpc3RLZXkgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhG
cmVlTGlzdEtleSgpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNo
YXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhGcmVlTGlzdEtleSogcmVzdWx0KTsK
KyAgICAgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCk7CisgICAgICAgIGludCBjb21w
YXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKTsKKyAgICAgICAgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkKCkgY29uc3Q7CisgICAgICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0OworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgICAgIGlu
dDY0X3QgbV9pbmRleElkOworICAgIH07CisKKyAgICBjbGFzcyBPYmplY3RTdG9yZU5hbWVzS2V5
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBs
b29rIHVwIG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisgICAgICAgIC8vIGlz
IGtlcHQgaW4gdGhlIElEQkRhdGFiYXNlQmFja2VuZEltcGwuIENhbiB0aGUgbWFwcGluZyBiZWNv
bWUgdW5yZWxpYWJsZT8KKyAgICAgICAgLy8gQ2FuIHdlIHJlbW92ZSB0aGlzPworICAgICAgICBz
dGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBs
aW1pdCwgT2JqZWN0U3RvcmVOYW1lc0tleSogcmVzdWx0KTsKKyAgICAgICAgc3RhdGljIFZlY3Rv
cjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG9iamVjdFN0
b3JlTmFtZSk7CisgICAgICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlTmFtZXNLZXkm
IG90aGVyKTsKKyAgICAgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG1fb2JqZWN0U3RvcmVOYW1lOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTdHJpbmcgbV9v
YmplY3RTdG9yZU5hbWU7IC8vIEZJWE1FOiBTdG9yZSB0aGUgZW5jb2RlZCBzdHJpbmcsIG9yIGp1
c3QgcG9pbnRlcnMgdG8gaXQuCisgICAgfTsKKworICAgIGNsYXNzIEluZGV4TmFtZXNLZXkgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhOYW1lc0tleSgpOworICAgICAgICAvLyBGSVhNRTog
V2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBpbmRleCBpZHMsIGJlY2F1c2UgYSBtYXBwaW5n
CisgICAgICAgIC8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCisgICAgICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJ
bmRleE5hbWVzS2V5KiByZXN1bHQpOworICAgICAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5n
JiBpbmRleE5hbWUpOworICAgICAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE5hbWVzS2V5JiBv
dGhlcik7CisgICAgICAgIFN0cmluZyBpbmRleE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4
TmFtZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7
CisgICAgICAgIFN0cmluZyBtX2luZGV4TmFtZTsKKyAgICB9OworCisgICAgY2xhc3MgT2JqZWN0
U3RvcmVEYXRhS2V5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgT2JqZWN0U3RvcmVEYXRh
S2V5KiByZXN1bHQpOworICAgICAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNoYXI+IGVu
Y29kZWRVc2VyS2V5KTsKKyAgICAgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktl
eSk7CisgICAgICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlRGF0YUtleSYgb3RoZXIp
OworICAgICAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0OworICAgICAgICBz
dGF0aWMgY29uc3QgaW50NjRfdCBrU3BlY2lhbEluZGV4TnVtYmVyOworCisgICAgcHJpdmF0ZToK
KyAgICAgICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVzZXJLZXk7CisgICAgfTsKKworICAgIGNs
YXNzIEV4aXN0c0VudHJ5S2V5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgRXhpc3RzRW50
cnlLZXkqIHJlc3VsdCk7CisgICAgICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4m
IGVuY29kZWRLZXkpOworICAgICAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5
KTsKKyAgICAgICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkmIG90aGVyKTsKKyAg
ICAgICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdDsKKworICAgICAgICBzdGF0
aWMgY29uc3QgaW50NjRfdCBrU3BlY2lhbEluZGV4TnVtYmVyOworCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVzZXJLZXk7CisgICAgfTsKKworICAgIGNsYXNz
IEluZGV4RGF0YUtleSB7CisgICAgcHVibGljOgorICAgICAgICBJbmRleERhdGFLZXkoKTsKKyAg
ICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3Qg
Y2hhciogbGltaXQsIEluZGV4RGF0YUtleSogcmVzdWx0KTsKKyAgICAgICAgc3RhdGljIFZlY3Rv
cjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkVXNlcktleSwgaW50
NjRfdCBzZXF1ZW5jZU51bWJlcik7CisgICAgICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIGNvbnN0IElEQktleSYgdXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcik7CisgICAg
ICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICAgICAgaW50IGNvbXBhcmUoY29uc3QgSW5kZXhE
YXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIGludDY0
X3QgZGF0YWJhc2VJZCgpIGNvbnN0OworICAgICAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBj
b25zdDsKKyAgICAgICAgaW50NjRfdCBpbmRleElkKCkgY29uc3Q7CisgICAgICAgIFBhc3NSZWZQ
dHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQ2
NF90IG1fZGF0YWJhc2VJZDsKKyAgICAgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAg
ICAgIGludDY0X3QgbV9pbmRleElkOworICAgICAgICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNl
cktleTsKKyAgICAgICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVyOworICAgIH07Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKKyNlbmRp
ZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKworI2VuZGlmIC8vIElEQkxldmVsREJDb2Rp
bmdfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91258</attachid>
            <date>2011-04-27 02:31:39 -0700</date>
            <delta_ts>2011-04-27 02:35:16 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-59452-20110427103136.patch</filename>
            <type>text/plain</type>
            <size>103164</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODUwMzQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBlMjlkMWI5OWQ2YmE5NDE4
YThkMjJmZDMwNDMzZjY0NTNjYTliNWE0Li5mOWUyMDkzYzFiNzNmYzZkNjc1NTE5OTFkYTg3ODA3
ODcwMGJmMGMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQyIEBACisyMDExLTA0LTI2ICBIYW5z
IFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgSW5kZXhlZERCOiBNb3ZlIExldmVsREIga2V5IGNvZGlu
ZyByb3V0aW5lcyB0byBzZXBhcmF0ZSBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01OTQ1MgorCisgICAgICAgIE1vdmUgYWxsIHJvdXRpbmVzIGNv
bmNlcm5lZCB3aXRoIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgY29tcGFyaXNvbiBvZgorICAgICAg
ICBMZXZlbERCIGtleXMgZnJvbSBJREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCB0byBhIHNlcGFy
YXRlIGZpbGU6CisgICAgICAgIElEQkxldmVsREJDb2RpbmcuY3BwLgorCisgICAgICAgIFRoaXMg
bWFrZXMgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAgZWFzaWVyIHRvIHdvcmsgd2l0aCwgYW5k
IHdpbGwKKyAgICAgICAgYWxsb3cgZm9yIHVuaXQgdGVzdGluZyBvZiB0aGUgY29kaW5nIHJvdXRp
bmVzLgorCisgICAgICAgIE5vIG5ldyBmdW5jdGlvbmFsaXR5LCBubyBuZXcgdGVzdHMuCisKKyAg
ICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQmFja2lu
Z1N0b3JlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEludCk6CisgICAgICAgIChXZWJDb3Jl
OjpwdXRJbnQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNv
cmU6OnB1dFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlS2V5cyk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wYXJlSW5kZXhLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBhcmF0
b3I6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6c2V0VXBNZXRhZGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURCRGF0YWJhc2VNZXRh
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXROZXdEYXRhYmFzZUlkKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OnNldElEQkRhdGFiYXNlTWV0YURhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVz
KToKKyAgICAgICAgKFdlYkNvcmU6OmdldE5ld09iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlT2JqZWN0U3RvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVS
ZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0TmV3VmVyc2lvbk51bWJlcik6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpwdXRPYmplY3RTdG9yZVJlY29yZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0b3JlOjpjbGVhck9iamVjdFN0
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9i
amVjdFN0b3JlUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3Rv
cmU6Om5leHRBdXRvSW5jcmVtZW50TnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0U3RvcmUpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0TmV3SW5kZXhJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQpOgorICAgICAgICAoV2ViQ29y
ZTo6dmVyc2lvbkV4aXN0cyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkJhY2tpbmdTdG9yZTo6a2V5RXhpc3RzSW5JbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4S2V5Q3Vyc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW5JbmRleEN1cnNvcik6Cisg
ICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVCeXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6Om1heElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjptaW5JREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6ZW5jb2RlSW50KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29k
ZUludCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVWYXJJbnQp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZGVjb2RlVmFySW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmVuY29kZVN0cmluZyk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVTdHJpbmcpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlU3RyaW5nV2l0aExlbmd0aCk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmVuY29kZURvdWJsZSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVEb3VibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUlEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpleHRyYWN0RW5jb2RlZElEQktleSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjpjb21wYXJlRW5jb2RlZElEQktleXMpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkNvZGluZzo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjpLZXlQcmVmaXg6OktleVByZWZpeCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4Ojp0eXBlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJDb2Rpbmc6OlNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJMZXZlbERCQ29kaW5nOjpNYXhEYXRhYmFzZUlkS2V5OjplbmNvZGUpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6RGF0YWJhc2VG
cmVlTGlzdEtleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZUZyZWVMaXN0S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAo
V2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6Y29tcGFyZSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU5hbWVLZXk6OmRl
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZU5hbWVLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
RGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
Q29kaW5nOjpPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Om1ldGFE
YXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rp
bmc6OkluZGV4TWV0YURhdGFLZXk6OkluZGV4TWV0YURhdGFLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmVuY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleE1ldGFEYXRhS2V5Ojpjb21w
YXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFL
ZXk6OmluZGV4SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0
U3RvcmVGcmVlTGlzdEtleTo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpkZWNvZGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtl
eTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0
b3JlRnJlZUxpc3RLZXk6Om9iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpJbmRleEZyZWVMaXN0
S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RL
ZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZy
ZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
SW5kZXhGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
Q29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXk6OmluZGV4SWQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVOYW1lc0tleTo6ZGVjb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTmFtZXNL
ZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RT
dG9yZU5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rp
bmc6OkluZGV4TmFtZXNLZXk6OkluZGV4TmFtZXNLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkNvZGluZzo6SW5kZXhOYW1lc0tleTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TmFtZXNLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleE5hbWVzS2V5Ojpjb21wYXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3Jl
RGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpP
YmplY3RTdG9yZURhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6RXhpc3RzRW50cnlLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5Ojpjb21wYXJlKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkV4aXN0c0VudHJ5S2V5Ojp1c2VyS2V5KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6SW5kZXhEYXRhS2V5
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6ZGVj
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6
ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtl
eTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Oklu
ZGV4RGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjpJbmRleERhdGFLZXk6OmRhdGFiYXNlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhEYXRhS2V5OjpvYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6aW5kZXhJZCk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OnVzZXJLZXkpOgorICAgICAgICAq
IHN0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtleTo6b3JpZ2luKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtleTo6ZGF0YWJhc2VOYW1lKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6Om1ldGFE
YXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9y
ZU5hbWVzS2V5OjpvYmplY3RTdG9yZU5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhOYW1lc0tleTo6aW5kZXhOYW1lKToKKwogMjAxMS0wNC0yNyAgUGF2ZWwg
RmVsZG1hbiAgPHBmZWxkbWFuQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgWXVy
eSBTZW1pa2hhdHNreS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IDhkYWFkNmJm
ZWFkNWMzMmFkNzVkZWNiNzlmODZhZDE5ZWYzMTBiMmYuLjQ4ZmMxOTUyZDEwMWUxZWQzZDBkOWU1
ODYzZDgxNjdjZjJkNGI4ZTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxl
Lmxpc3QuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtMzEx
OSw2ICszMTE5LDggQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQktleVJhbmdlLmggXAogCVNvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZS5oIFwKKwlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2RpbmcuY3Bw
IFwKKwlTb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2RpbmcuaCBcCiAJU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcCBcCiAJU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmggXAogCVNvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW50ZXJmYWNlLmggXApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCmluZGV4IDhjYzhmZGM5OTgwYzc3OTA5ODUzOTI3YmI0YmRlNmIxY2U3Y2YxNGMuLjJh
YWEyNWUyN2ExYTIzZTU3NDlhNWZmZjE2NGYzODAwNDMzMTAxNjYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkK
QEAgLTU0OTIsNiArNTQ5Miw4IEBACiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlQYXRoQmFj
a2VuZEltcGwuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9JREJLZXlSYW5nZS5jcHAnLAogICAg
ICAgICAgICAgJ3N0b3JhZ2UvSURCS2V5UmFuZ2UuaCcsCisgICAgICAgICAgICAnc3RvcmFnZS9J
REJMZXZlbERCQ29kaW5nLmNwcCcsCisgICAgICAgICAgICAnc3RvcmFnZS9JREJMZXZlbERCQ29k
aW5nLmgnLAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAn
LAogICAgICAgICAgICAgJ3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oJywKICAgICAg
ICAgICAgICdzdG9yYWdlL0lEQk9iamVjdFN0b3JlLmNwcCcsCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcAppbmRleCAwOWQ2NjdmYmQ1ZjU5
ZTFjZTQ4NTQ2NjNhMTE3MmJhNDY3Y2NjZDVjLi40NGQyOTdhZjk2NTZjNjQ1ZDBiMGRiNjZkNGIz
NmU2ZDA0YmNiY2ViIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVs
REJCYWNraW5nU3RvcmUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZS5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJGaWxlU3lzdGVt
LmgiCiAjaW5jbHVkZSAiSURCRmFjdG9yeUJhY2tlbmRJbXBsLmgiCiAjaW5jbHVkZSAiSURCS2V5
UmFuZ2UuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQ29kaW5nLmgiCiAjaW5jbHVkZSAiTGV2ZWxE
QkNvbXBhcmF0b3IuaCIKICNpbmNsdWRlICJMZXZlbERCRGF0YWJhc2UuaCIKICNpbmNsdWRlICJM
ZXZlbERCSXRlcmF0b3IuaCIKQEAgLTQzLDQyNiArNDQsMTAgQEAKIC8vIEZJWE1FOiBXZSBzaG91
bGRuJ3QgbmVlZCB0byByZWx5IG9uIHRoZXNlIG1hY3Jvcy4KICNkZWZpbmUgSU5UNjRfTUFYIDB4
N2ZmZmZmZmZmZmZmZmZmZkxMCiAjZW5kaWYKLSNpZm5kZWYgSU5UMzJfTUFYCi0jZGVmaW5lIElO
VDMyX01BWCAweDdmZmZmZmZmTAotI2VuZGlmCi0KLS8vIExldmVsREIgc3RvcmVzIGtleS92YWx1
ZSBwYWlycy4gS2V5cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIG9mIGJ5dGVzLCBub3JtYWxseSBv
ZiB0eXBlIFZlY3RvcjxjaGFyPi4KLS8vCi0vLyBUaGUga2V5cyBpbiB0aGUgYmFja2luZyBzdG9y
ZSBhcmUgdmFyaWFibGUtbGVuZ3RoIHR1cGxlcyB3aXRoIGRpZmZlcmVudCB0eXBlcwotLy8gb2Yg
ZmllbGRzLiBFYWNoIGtleSBpbiB0aGUgYmFja2luZyBzdG9yZSBzdGFydHMgd2l0aCBhIHRlcm5h
cnkgcHJlZml4OiAoZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQpLiBGb3Ig
ZWFjaCwgMCBpcyByZXNlcnZlZCBmb3IgbWV0YS1kYXRhLgotLy8gVGhlIHByZWZpeCBtYWtlcyBz
dXJlIHRoYXQgZGF0YSBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSwgb2JqZWN0IHN0b3JlLCBhbmQg
aW5kZXggYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBsb2NhbGl0eSBpcyBpbXBvcnRhbnQgZm9y
IHBlcmZvcm1hbmNlOiBjb21tb24KLS8vIG9wZXJhdGlvbnMgc2hvdWxkIG9ubHkgbmVlZCBhIG1p
bmltYWwgbnVtYmVyIG9mIHNlZWsgb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGFsbCB0aGUgbWV0
YS1kYXRhIGZvciBhIGRhdGFiYXNlIGlzIGdyb3VwZWQgdG9nZXRoZXIgc28gdGhhdCByZWFkaW5n
IHRoYXQKLS8vIG1ldGEtZGF0YSBvbmx5IHJlcXVpcmVzIG9uZSBzZWVrLgotLy8KLS8vIEVhY2gg
a2V5IHR5cGUgaGFzIGEgY2xhc3MgKGluIHNxdWFyZSBicmFja2V0cyBiZWxvdykgd2hpY2gga25v
d3MgaG93IHRvIGVuY29kZSwgZGVjb2RlLCBhbmQgY29tcGFyZSB0aGF0IGtleSB0eXBlLgotLy8K
LS8vIEdsb2JhbCBtZXRhLWRhdGEgaGF2ZSBrZXlzIHdpdGggcHJlZml4ICgwLDAsMCksIGZvbGxv
d2VkIGJ5IGEgdHlwZSBieXRlOgotLy8KLS8vICAgICA8MCwgMCwgMCwgMD4gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gSW5kZXhlZERCL0xldmVsREIgc2NoZW1h
IHZlcnNpb24gKDAgZm9yIG5vdykgW1NjaGVtYVZlcnNpb25LZXldCi0vLyAgICAgPDAsIDAsIDAs
IDE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRoZSBtYXhp
bXVtIGRhdGFiYXNlIGlkIGV2ZXIgYWxsb2NhdGVkIFtNYXhEYXRhYmFzZUlkS2V5XQotLy8gICAg
IDwwLCAwLCAwLCAxMDAsIGRhdGFiYXNlIGlkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9
PiBFeGlzdGVuY2UgaW1wbGllcyB0aGUgZGF0YWJhc2UgaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBb
RGF0YWJhc2VGcmVlTGlzdEtleV0KLS8vICAgICA8MCwgMCwgMCwgMjAxLCB1dGYxNiBvcmlnaW4g
bmFtZSwgdXRmMTYgZGF0YWJhc2UgbmFtZT4gPT4gRGF0YWJhc2UgaWQgW0RhdGFiYXNlTmFtZUtl
eV0KLS8vCi0vLwotLy8gRGF0YWJhc2UgbWV0YS1kYXRhOgotLy8KLS8vICAgICBBZ2FpbiwgdGhl
IHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4KLS8vCi0vLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCAwPiA9PiB1dGYxNiBvcmlnaW4gbmFtZSBbRGF0YWJhc2VNZXRhRGF0YUtleV0K
LS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE+ID0+IHV0ZjE2IGRhdGFiYXNlIG5hbWUgW0Rh
dGFiYXNlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyPiA9PiB1dGYx
NiB1c2VyIHZlcnNpb24gZGF0YSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KLS8vICAgICA8ZGF0YWJh
c2UgaWQsIDAsIDAsIDM+ID0+IG1heGltdW0gb2JqZWN0IHN0b3JlIGlkIGV2ZXIgYWxsb2NhdGVk
IFtEYXRhYmFzZU1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBPYmplY3Qgc3RvcmUgbWV0YS1kYXRh
OgotLy8KLS8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVu
IGEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIsIGFuZCB0aGVuIGFub3RoZXIgdmFyaWFibGUtbGVu
Z3RoIGludGVnZXIgKEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIGJ5dGUpLgotLy8KLS8vICAgICA8
ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDA+ID0+IHV0ZjE2IG9iamVj
dCBzdG9yZSBuYW1lIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQotLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMT4gPT4gdXRmMTYga2V5IHBhdGggW09iamVj
dFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0
IHN0b3JlIGlkLCAyPiA9PiBoYXMgYXV0byBpbmNyZW1lbnQgW09iamVjdFN0b3JlTWV0YURhdGFL
ZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAzPiA9
PiBpcyBldmljdGFibGUgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCA0PiA9PiBsYXN0ICJ2ZXJzaW9uIiBudW1i
ZXIgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1
MCwgb2JqZWN0IHN0b3JlIGlkLCA1PiA9PiBtYXhpbXVtIGluZGV4IGlkIGV2ZXIgYWxsb2NhdGVk
IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBJbmRleCBtZXRhLWRhdGE6Ci0v
LwotLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4gdHdv
IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycywgYW5kIHRoZW4gYW5vdGhlciB0eXBlIGJ5dGUuCi0v
LwotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4
IGlkLCAwPiA9PiB1dGYxNiBpbmRleCBuYW1lIFtJbmRleE1ldGFEYXRhS2V5XQotLy8gICAgIDxk
YXRhYmFzZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAxPiA9PiBh
cmUgaW5kZXgga2V5cyB1bmlxdWUgW0luZGV4TWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDI+ID0+IHV0ZjE2IGtl
eSBwYXRoIFtJbmRleE1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBPdGhlciBvYmplY3Qgc3RvcmUg
YW5kIGluZGV4IG1ldGEtZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBi
eSBhIHR5cGUgYnl0ZS4gVGhlIG9iamVjdCBzdG9yZSBhbmQgaW5kZXggaWQgYXJlIHZhcmlhYmxl
IGxlbmd0aCBpbnRlZ2VycywgdGhlIHV0ZjE2IHN0cmluZ3MgYXJlIHZhcmlhYmxlIGxlbmd0aCBz
dHJpbmdzLgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1MCwgb2JqZWN0IHN0b3Jl
IGlkPiAgICAgICAgICAgICAgICAgICA9PiBleGlzdGVuY2UgaW1wbGllcyB0aGUgb2JqZWN0IHN0
b3JlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW09iamVjdFN0b3JlRnJlZUxpc3RLZXldCi0vLyAg
ICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTEsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQ+ICAg
ICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIGluZGV4IGlkIGlzIGluIHRoZSBmcmVlIGxp
c3QgW0luZGV4RnJlZUxpc3RLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyMDAsIHV0
ZjE2IG9iamVjdCBzdG9yZSBuYW1lPiAgICAgICAgICAgPT4gb2JqZWN0IHN0b3JlIGlkIFtPYmpl
Y3RTdG9yZU5hbWVzS2V5XQotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAxLCBvYmplY3Qg
c3RvcmUgaWQsIHV0ZjE2IGluZGV4IG5hbWU+ID0+IGluZGV4IGlkIFtJbmRleE5hbWVzS2V5XQot
Ly8KLS8vCi0vLyBPYmplY3Qgc3RvcmUgZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZpeCBpcyBm
b2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5
LgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMSwgdXNlciBrZXk+
ID0+ICJ2ZXJzaW9uIiwgc2VyaWFsaXplZCBzY3JpcHQgdmFsdWUgW09iamVjdFN0b3JlRGF0YUtl
eV0KLS8vCi0vLwotLy8gIkV4aXN0cyIgZW50cnk6Ci0vLwotLy8gICAgIFRoZSBwcmVmaXggaXMg
Zm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktl
eS4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDIsIHVzZXIga2V5
PiA9PiAidmVyc2lvbiIgW0V4aXN0c0VudHJ5S2V5XQotLy8KLS8vCi0vLyBJbmRleCBkYXRhOgot
Ly8KLS8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNl
ciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYSB2YXJp
YWJsZSBsZW5ndGggaW50ZWdlci4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3Rv
cmUgaWQsIGluZGV4IGlkLCB1c2VyIGtleSwgc2VxdWVuY2UgbnVtYmVyPiA9PiAidmVyc2lvbiIs
IHVzZXIga2V5IFtJbmRleERhdGFLZXldCi0vLwotLy8gICAgIChUaGUgc2VxdWVuY2UgbnVtYmVy
IGlzIHVzZWQgdG8gYWxsb3cgdHdvIGVudHJpZXMgd2l0aCB0aGUgc2FtZSB1c2VyIGtleQotLy8g
ICAgIGluIG5vbi11bmlxdWUgaW5kZXhlcy4gVGhlICJ2ZXJzaW9uIiBmaWVsZCBpcyB1c2VkIHRv
IHdlZWQgb3V0IHN0YWxlCi0vLyAgICAgaW5kZXggZGF0YS4gV2hlbmV2ZXIgbmV3IG9iamVjdCBz
dG9yZSBkYXRhIGlzIGluc2VydGVkLCBpdCBnZXRzIGEgbmV3Ci0vLyAgICAgInZlcnNpb24iIG51
bWJlciwgYW5kIG5ldyBpbmRleCBkYXRhIGlzIHdyaXR0ZW4gd2l0aCB0aGlzIG51bWJlci4gV2hl
bgotLy8gICAgIHRoZSBpbmRleCBpcyB1c2VkIGZvciBsb29rLXVwcywgZW50cmllcyBhcmUgdmFs
aWRhdGVkIGFnYWluc3QgdGhlCi0vLyAgICAgImV4aXN0cyIgZW50cmllcywgYW5kIHJlY29yZHMg
d2l0aCBvbGQgInZlcnNpb24iIG51bWJlcnMgYXJlIGRlbGV0ZWQKLS8vICAgICB3aGVuIHRoZXkg
YXJlIGVuY291bnRlcmVkIGluIGdldFByaW1hcnlLZXlWaWFJbmRleCwKLS8vICAgICBJbmRleEN1
cnNvckltcGw6OmxvYWRDdXJyZW50Um93LCBhbmQgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3Vy
cmVudFJvdykuCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdWxsVHlwZUJ5
dGUgPSAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleVN0cmluZ1R5cGVCeXRl
ID0gMTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlEYXRlVHlwZUJ5dGUgPSAy
Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bWJlclR5cGVCeXRlID0gMzsK
LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlNaW5LZXlUeXBlQnl0ZSA9IDQ7Ci0K
LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtNaW5pbXVtSW5kZXhJZCA9IDMwOwotc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlRGF0YUluZGV4SWQgPSAxOwotc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIga0V4aXN0c0VudHJ5SW5kZXhJZCA9IDI7Ci0KLXN0YXRpYyBj
b25zdCB1bnNpZ25lZCBjaGFyIGtTY2hlbWFWZXJzaW9uVHlwZUJ5dGUgPSAwOwotc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIga01heERhdGFiYXNlSWRUeXBlQnl0ZSA9IDE7Ci1zdGF0aWMgY29u
c3QgdW5zaWduZWQgY2hhciBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlID0gMTAwOwotc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIga0RhdGFiYXNlTmFtZVR5cGVCeXRlID0gMjAxOwotCi1zdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlID0gNTA7
Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlID0gMTAw
Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0
ZSA9IDE1MDsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleEZyZWVMaXN0VHlwZUJ5
dGUgPSAxNTE7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrT2JqZWN0U3RvcmVOYW1lc1R5
cGVCeXRlID0gMjAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4TmFtZXNLZXlU
eXBlQnl0ZSA9IDIwMTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgVmVjdG9yPGNo
YXI+IGVuY29kZUJ5dGUodW5zaWduZWQgY2hhciBjKQotewotICAgIFZlY3RvcjxjaGFyPiB2Owot
ICAgIHYuYXBwZW5kKGMpOwotICAgIHJldHVybiB2OwotfQotCi1zdGF0aWMgVmVjdG9yPGNoYXI+
IG1heElEQktleSgpCi17Ci0gICAgcmV0dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0
ZSk7Ci19Ci0KLXN0YXRpYyBWZWN0b3I8Y2hhcj4gbWluSURCS2V5KCkKLXsKLSAgICByZXR1cm4g
ZW5jb2RlQnl0ZShrSURCS2V5TWluS2V5VHlwZUJ5dGUpOwotfQotCi1zdGF0aWMgVmVjdG9yPGNo
YXI+IGVuY29kZUludChpbnQ2NF90IG4pCi17Ci0gICAgQVNTRVJUKG4gPj0gMCk7Ci0gICAgVmVj
dG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlvbi4KLQotICAgIGRv
IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbjsKLSAgICAgICAgcmV0LmFwcGVuZChjKTsK
LSAgICAgICAgbiA+Pj0gODsKLSAgICB9IHdoaWxlIChuKTsKLQotICAgIHJldHVybiByZXQ7Ci19
Ci0KLXN0YXRpYyBpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hh
ciogZW5kKQotewotICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOwotICAgIGludDY0X3QgcmV0ID0g
MDsKLQotICAgIHdoaWxlIChiZWdpbiA8IGVuZCkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMg
PSAqYmVnaW4rKzsKLSAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJldDsKLX0KLQotc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVWYXJJbnQoaW50NjRf
dCBuKQotewotICAgIFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQgY3Jl
YXRpb24uCi0KLSAgICBkbyB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAweDdmOwot
ICAgICAgICBuID4+PSA3OwotICAgICAgICBpZiAobikKLSAgICAgICAgICAgIGMgfD0gMTI4Owot
ICAgICAgICByZXQuYXBwZW5kKGMpOwotICAgIH0gd2hpbGUgKG4pOwotCi0gICAgcmV0dXJuIHJl
dDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBj
b25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQpCi17Ci0gICAgQVNTRVJUKGxpbWl0
ID49IHApOwotICAgIGZvdW5kSW50ID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKHAgPj0g
bGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBmb3VuZEludCA9IChmb3Vu
ZEludCA8PCA3KSB8ICgqcCAmIDB4N2YpOwotICAgIH0gd2hpbGUgKCpwKysgJiAxMjgpOwotICAg
IHJldHVybiBwOwotfQotCi1zdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhjb25zdCBT
dHJpbmcmIHMpCi17Ci0gICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBh
dCBjcmVhdGlvbi4KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyAr
K2kpIHsKLSAgICAgICAgVUNoYXIgdSA9IHNbaV07Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgaGkg
PSB1ID4+IDg7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSB1OwotICAgICAgICByZXQuYXBw
ZW5kKGhpKTsKLSAgICAgICAgcmV0LmFwcGVuZChsbyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJl
dDsKLX0KLQotc3RhdGljIFN0cmluZyBkZWNvZGVTdHJpbmcoY29uc3QgY2hhciogcCwgY29uc3Qg
Y2hhciogZW5kKQotewotICAgIEFTU0VSVChlbmQgPj0gcCk7Ci0gICAgQVNTRVJUKCEoKGVuZCAt
IHApICUgMikpOwotCi0gICAgc2l6ZV90IGxlbiA9IChlbmQgLSBwKSAvIDI7Ci0gICAgVmVjdG9y
PFVDaGFyPiB2ZWN0b3IobGVuKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyAr
K2kpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBoaSA9ICpwKys7Ci0gICAgICAgIHVuc2lnbmVk
IGNoYXIgbG8gPSAqcCsrOwotCi0gICAgICAgIHZlY3RvcltpXSA9IChoaSA8PCA4KSB8IGxvOwot
ICAgIH0KLQotICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlU3RyaW5nV2l0aExlbmd0aChjb25zdCBTdHJpbmcmIHMpCi17Ci0g
ICAgVmVjdG9yPGNoYXI+IHJldCA9IGVuY29kZVZhckludChzLmxlbmd0aCgpKTsKLSAgICByZXQu
YXBwZW5kKGVuY29kZVN0cmluZyhzKSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgoY29uc3QgY2hhciogcCwgY29uc3QgY2hh
ciogbGltaXQsIFN0cmluZyYgZm91bmRTdHJpbmcpCi17Ci0gICAgQVNTRVJUKGxpbWl0ID49IHAp
OwotICAgIGludDY0X3QgbGVuOwotICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbik7
Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocCArIGxlbiAqIDIgPiBs
aW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3VuZFN0cmluZyA9IGRlY29kZVN0cmlu
ZyhwLCBwICsgbGVuICogMik7Ci0gICAgcCArPSBsZW4gKiAyOwotICAgIHJldHVybiBwOwotfQot
Ci1zdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZURvdWJsZShkb3VibGUgeCkKLXsKLSAgICAvLyBG
SVhNRTogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBiZSBieXRlIG9yZGVyIGluZGVwZW5k
ZW50LgotICAgIGNvbnN0IGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmeCk7Ci0g
ICAgVmVjdG9yPGNoYXI+IHY7Ci0gICAgdi5hcHBlbmQocCwgc2l6ZW9mKHgpKTsKLSAgICBBU1NF
UlQodi5zaXplKCkgPT0gc2l6ZW9mKHgpKTsKLSAgICByZXR1cm4gdjsKLX0KLQotc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwg
ZG91YmxlKiBkKQotewotICAgIGlmIChwICsgc2l6ZW9mKCpkKSA+IGxpbWl0KQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIGNoYXIqIHggPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkKTsKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZigqZCk7ICsraSkKLSAgICAgICAgKngrKyA9
ICpwKys7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlSURC
S2V5KGNvbnN0IElEQktleSYga2V5KQotewotICAgIFZlY3RvcjxjaGFyPiByZXQ7Ci0KLSAgICBz
d2l0Y2ggKGtleS50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Ci0gICAgICAg
IHJldHVybiBlbmNvZGVCeXRlKGtJREJLZXlOdWxsVHlwZUJ5dGUpOwotICAgIGNhc2UgSURCS2V5
OjpTdHJpbmdUeXBlOgotICAgICAgICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlTdHJpbmdUeXBl
Qnl0ZSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChrZXkuc3Ry
aW5nKCkpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBjYXNlIElEQktleTo6RGF0ZVR5cGU6
Ci0gICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7Ci0gICAgICAg
IHJldC5hcHBlbmQoZW5jb2RlRG91YmxlKGtleS5kYXRlKCkpKTsKLSAgICAgICAgQVNTRVJUKHJl
dC5zaXplKCkgPT0gOSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgY2FzZSBJREJLZXk6Ok51
bWJlclR5cGU6Ci0gICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleU51bWJlclR5cGVCeXRl
KTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKSk7Ci0gICAg
ICAgIEFTU0VSVChyZXQuc2l6ZSgpID09IDkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0K
LQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBWZWN0b3I8Y2hhcj4oKTsK
LX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZUlEQktleShjb25zdCBjaGFyKiBwLCBjb25z
dCBjaGFyKiBsaW1pdCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KQotewotICAgIEFTU0VSVChs
aW1pdCA+PSBwKTsKLSAgICBpZiAocCA+PSBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOwotICAgIFN0cmluZyBzOwotICAgIGRvdWJsZSBk
OwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgot
ICAgICAgICAvLyBOdWxsLgotICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlTnVsbCgp
OwotICAgICAgICByZXR1cm4gcDsKLSAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKLSAg
ICAgICAgLy8gU3RyaW5nLgotICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBs
aW1pdCwgcyk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRlU3RyaW5nKHMpOwotICAgICAgICByZXR1cm4gcDsK
LSAgICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6Ci0gICAgICAgIC8vIERhdGUuCi0gICAgICAg
IHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKLSAgICAgICAgaWYgKCFwKQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKGQp
OwotICAgICAgICByZXR1cm4gcDsKLSAgICBjYXNlIGtJREJLZXlOdW1iZXJUeXBlQnl0ZToKLSAg
ICAgICAgLy8gTnVtYmVyLgotICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7
Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBmb3VuZEtl
eSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKGQpOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0K
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNv
bnN0IGNoYXIqIGV4dHJhY3RFbmNvZGVkSURCS2V5KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBj
aGFyKiBsaW1pdCwgVmVjdG9yPGNoYXI+KiByZXN1bHQpCi17Ci0gICAgY29uc3QgY2hhciogcCA9
IHN0YXJ0OwotICAgIGlmIChwID49IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHVu
c2lnbmVkIGNoYXIgdHlwZSA9ICpwKys7Ci0KLSAgICBpbnQ2NF90IHN0cmluZ0xlbjsKLQotICAg
IHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga0lEQktleU51bGxUeXBlQnl0ZToKLSAgICBjYXNl
IGtJREJLZXlNaW5LZXlUeXBlQnl0ZToKLSAgICAgICAgKnJlc3VsdCA9IGVuY29kZUJ5dGUodHlw
ZSk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgot
ICAgICAgICAvLyBTdHJpbmcuCi0gICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHN0
cmluZ0xlbik7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICBpZiAocCArIHN0cmluZ0xlbiAqIDIgPiBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICByZXN1bHQtPmNsZWFyKCk7Ci0gICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0YXJ0LCBw
IC0gc3RhcnQgKyBzdHJpbmdMZW4gKiAyKTsKLSAgICAgICAgcmV0dXJuIHAgKyBzdHJpbmdMZW4g
KiAyOwotICAgIGNhc2Uga0lEQktleURhdGVUeXBlQnl0ZToKLSAgICBjYXNlIGtJREJLZXlOdW1i
ZXJUeXBlQnl0ZToKLSAgICAgICAgLy8gRGF0ZSBvciBudW1iZXIuCi0gICAgICAgIGlmIChwICsg
c2l6ZW9mKGRvdWJsZSkgPiBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBy
ZXN1bHQtPmNsZWFyKCk7Ci0gICAgICAgIHJlc3VsdC0+YXBwZW5kKHN0YXJ0LCAxICsgc2l6ZW9m
KGRvdWJsZSkpOwotICAgICAgICByZXR1cm4gcCArIHNpemVvZihkb3VibGUpOwotICAgIH0KLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBj
b21wYXJlRW5jb2RlZElEQktleXMoY29uc3QgVmVjdG9yPGNoYXI+JiBrZXlBLCBjb25zdCBWZWN0
b3I8Y2hhcj4mIGtleUIpCi17Ci0gICAgQVNTRVJUKGtleUEuc2l6ZSgpID49IDEpOwotICAgIEFT
U0VSVChrZXlCLnNpemUoKSA+PSAxKTsKLQotICAgIGNvbnN0IGNoYXIqIHAgPSBrZXlBLmRhdGEo
KTsKLSAgICBjb25zdCBjaGFyKiBsaW1pdEEgPSBwICsga2V5QS5zaXplKCk7Ci0gICAgY29uc3Qg
Y2hhciogcSA9IGtleUIuZGF0YSgpOwotICAgIGNvbnN0IGNoYXIqIGxpbWl0QiA9IHEgKyBrZXlC
LnNpemUoKTsKLQotICAgIHVuc2lnbmVkIGNoYXIgdHlwZUEgPSAqcCsrOwotICAgIHVuc2lnbmVk
IGNoYXIgdHlwZUIgPSAqcSsrOwotCi0gICAgU3RyaW5nIHMsIHQ7Ci0gICAgZG91YmxlIGQsIGU7
Ci0KLSAgICBpZiAoaW50IHggPSB0eXBlQiAtIHR5cGVBKSAvLyBGSVhNRTogTm90ZSB0aGUgc3Vi
dGxlbmVzcyEKLSAgICAgICAgcmV0dXJuIHg7Ci0KLSAgICBzd2l0Y2ggKHR5cGVBKSB7Ci0gICAg
Y2FzZSBrSURCS2V5TnVsbFR5cGVCeXRlOgotICAgIGNhc2Uga0lEQktleU1pbktleVR5cGVCeXRl
OgotICAgICAgICAvLyBOdWxsIHR5cGUgb3IgbWF4IHR5cGU7IG5vIHBheWxvYWQgdG8gY29tcGFy
ZS4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6Ci0g
ICAgICAgIC8vIFN0cmluZyB0eXBlLgotICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0
aChwLCBsaW1pdEEsIHMpOyAvLyBGSVhNRTogQ29tcGFyZSB3aXRob3V0IGFjdHVhbGx5IGRlY29k
aW5nIHRoZSBTdHJpbmchCi0gICAgICAgIEFTU0VSVChwKTsKLSAgICAgICAgcSA9IGRlY29kZVN0
cmluZ1dpdGhMZW5ndGgocSwgbGltaXRCLCB0KTsKLSAgICAgICAgQVNTRVJUKHEpOwotICAgICAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShzLCB0KTsKLSAgICBjYXNlIGtJREJLZXlEYXRlVHlw
ZUJ5dGU6Ci0gICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6Ci0gICAgICAgIC8vIERhdGUg
b3IgbnVtYmVyLgotICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0QSwgJmQpOwotICAg
ICAgICBBU1NFUlQocCk7Ci0gICAgICAgIHEgPSBkZWNvZGVEb3VibGUocSwgbGltaXRCLCAmZSk7
Ci0gICAgICAgIEFTU0VSVChxKTsKLSAgICAgICAgaWYgKGQgPCBlKQotICAgICAgICAgICAgcmV0
dXJuIC0xOwotICAgICAgICBpZiAoZCA+IGUpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0
dXJuIDA7Ci19Cit1c2luZyBuYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZzsKIAogc3RhdGljIGJv
b2wgZ2V0SW50KExldmVsREJEYXRhYmFzZSogZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYga2V5LCBp
bnQ2NF90JiBmb3VuZEludCkKIHsKQEAgLTQ5Niw5NTAgKzgxLDIxIEBAIHN0YXRpYyBib29sIHB1
dFN0cmluZyhMZXZlbERCRGF0YWJhc2UqIGRiLCBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5LCBjb25z
dCBTdHJpbmcmCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLW5hbWVzcGFjZSB7Ci1jbGFzcyBLZXlQ
cmVmaXggewotcHVibGljOgotICAgIEtleVByZWZpeCgpCi0gICAgICAgIDogbV9kYXRhYmFzZUlk
KGtJbnZhbGlkVHlwZSkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQoa0ludmFsaWRUeXBlKQot
ICAgICAgICAsIG1faW5kZXhJZChrSW52YWxpZFR5cGUpCi0gICAgewotICAgIH0KLQotICAgIEtl
eVByZWZpeChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkKQotICAgICAgICA6IG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQotICAgICAgICAs
IG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQotICAgICAgICAsIG1faW5kZXhJZChpbmRl
eElkKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0
IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQpCi0gICAg
ewotICAgICAgICBpZiAoc3RhcnQgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQot
ICAgICAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9ICpzdGFydCsrOwotCi0gICAgICAgIGlu
dCBkYXRhYmFzZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOwotICAgICAg
ICBpbnQgb2JqZWN0U3RvcmVJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsK
LSAgICAgICAgaW50IGluZGV4SWRCeXRlcyA9IChmaXJzdEJ5dGUgJiAweDMpICsgMTsKLQotICAg
ICAgICBpZiAoc3RhcnQgKyBkYXRhYmFzZUlkQnl0ZXMgKyBvYmplY3RTdG9yZUlkQnl0ZXMgKyBp
bmRleElkQnl0ZXMgPiBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJl
c3VsdC0+bV9kYXRhYmFzZUlkID0gZGVjb2RlSW50KHN0YXJ0LCBzdGFydCArIGRhdGFiYXNlSWRC
eXRlcyk7Ci0gICAgICAgIHN0YXJ0ICs9IGRhdGFiYXNlSWRCeXRlczsKLSAgICAgICAgcmVzdWx0
LT5tX29iamVjdFN0b3JlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgb2JqZWN0U3RvcmVJ
ZEJ5dGVzKTsKLSAgICAgICAgc3RhcnQgKz0gb2JqZWN0U3RvcmVJZEJ5dGVzOwotICAgICAgICBy
ZXN1bHQtPm1faW5kZXhJZCA9IGRlY29kZUludChzdGFydCwgc3RhcnQgKyBpbmRleElkQnl0ZXMp
OwotICAgICAgICBzdGFydCArPSBpbmRleElkQnl0ZXM7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXJ0
OwotICAgIH0KLQotICAgIFZlY3RvcjxjaGFyPiBlbmNvZGUoKSBjb25zdAotICAgIHsKLSAgICAg
ICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52YWxpZElkKTsKLSAgICAgICAgQVNTRVJUKG1f
b2JqZWN0U3RvcmVJZCAhPSBrSW52YWxpZElkKTsKLSAgICAgICAgQVNTRVJUKG1faW5kZXhJZCAh
PSBrSW52YWxpZElkKTsKLQotICAgICAgICBWZWN0b3I8Y2hhcj4gZGF0YWJhc2VJZFN0cmluZyA9
IGVuY29kZUludChtX2RhdGFiYXNlSWQpOwotICAgICAgICBWZWN0b3I8Y2hhcj4gb2JqZWN0U3Rv
cmVJZFN0cmluZyA9IGVuY29kZUludChtX29iamVjdFN0b3JlSWQpOwotICAgICAgICBWZWN0b3I8
Y2hhcj4gaW5kZXhJZFN0cmluZyA9IGVuY29kZUludChtX2luZGV4SWQpOwotCi0gICAgICAgIEFT
U0VSVChkYXRhYmFzZUlkU3RyaW5nLnNpemUoKSA8PSA4KTsKLSAgICAgICAgQVNTRVJUKG9iamVj
dFN0b3JlSWRTdHJpbmcuc2l6ZSgpIDw9IDgpOwotICAgICAgICBBU1NFUlQoaW5kZXhJZFN0cmlu
Zy5zaXplKCkgPD0gNCk7Ci0KLQotICAgICAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9IChk
YXRhYmFzZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IDUgfCAob2JqZWN0U3RvcmVJZFN0cmluZy5z
aXplKCkgLSAxKSA8PCAyIHwgKGluZGV4SWRTdHJpbmcuc2l6ZSgpIC0gMSk7Ci0gICAgICAgIFZl
Y3RvcjxjaGFyPiByZXQ7Ci0gICAgICAgIHJldC5hcHBlbmQoZmlyc3RCeXRlKTsKLSAgICAgICAg
cmV0LmFwcGVuZChkYXRhYmFzZUlkU3RyaW5nKTsKLSAgICAgICAgcmV0LmFwcGVuZChvYmplY3RT
dG9yZUlkU3RyaW5nKTsKLSAgICAgICAgcmV0LmFwcGVuZChpbmRleElkU3RyaW5nKTsKLQotICAg
ICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IEtleVByZWZp
eCYgb3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IGtJ
bnZhbGlkSWQpOwotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQp
OwotICAgICAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOwotCi0gICAgICAgIGlm
IChtX2RhdGFiYXNlSWQgIT0gb3RoZXIubV9kYXRhYmFzZUlkKQotICAgICAgICAgICAgcmV0dXJu
IG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJhc2VJZDsKLSAgICAgICAgaWYgKG1fb2JqZWN0
U3RvcmVJZCAhPSBvdGhlci5tX29iamVjdFN0b3JlSWQpCi0gICAgICAgICAgICByZXR1cm4gbV9v
YmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkOwotICAgICAgICBpZiAobV9pbmRl
eElkICE9IG90aGVyLm1faW5kZXhJZCkKLSAgICAgICAgICAgIHJldHVybiBtX2luZGV4SWQgLSBv
dGhlci5tX2luZGV4SWQ7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGVudW0gVHlw
ZSB7Ci0gICAgICAgIGtHbG9iYWxNZXRhRGF0YSwKLSAgICAgICAga0RhdGFiYXNlTWV0YURhdGEs
Ci0gICAgICAgIGtPYmplY3RTdG9yZURhdGEsCi0gICAgICAgIGtFeGlzdHNFbnRyeSwKLSAgICAg
ICAga0luZGV4RGF0YSwKLSAgICAgICAga0ludmFsaWRUeXBlCi0gICAgfTsKLQotICAgIFR5cGUg
dHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IGtJbnZh
bGlkSWQpOwotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQpOwot
ICAgICAgICBBU1NFUlQobV9pbmRleElkICE9IGtJbnZhbGlkSWQpOwotCi0gICAgICAgIGlmICgh
bV9kYXRhYmFzZUlkKQotICAgICAgICAgICAgcmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKLSAgICAg
ICAgaWYgKCFtX29iamVjdFN0b3JlSWQpCi0gICAgICAgICAgICByZXR1cm4ga0RhdGFiYXNlTWV0
YURhdGE7Ci0gICAgICAgIGlmIChtX2luZGV4SWQgPT0ga09iamVjdFN0b3JlRGF0YUluZGV4SWQp
Ci0gICAgICAgICAgICByZXR1cm4ga09iamVjdFN0b3JlRGF0YTsKLSAgICAgICAgaWYgKG1faW5k
ZXhJZCA9PSBrRXhpc3RzRW50cnlJbmRleElkKQotICAgICAgICAgICAgcmV0dXJuIGtFeGlzdHNF
bnRyeTsKLSAgICAgICAgaWYgKG1faW5kZXhJZCA+PSBrTWluaW11bUluZGV4SWQpCi0gICAgICAg
ICAgICByZXR1cm4ga0luZGV4RGF0YTsKLQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgcmV0dXJuIGtJbnZhbGlkVHlwZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IG1fZGF0
YWJhc2VJZDsKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBpbnQ2NF90IG1faW5k
ZXhJZDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtJbnZhbGlkSWQgPSAtMTsKLX07Ci0K
LWNsYXNzIFNjaGVtYVZlcnNpb25LZXkgewotcHVibGljOgotICAgIHN0YXRpYyBWZWN0b3I8Y2hh
cj4gZW5jb2RlKCkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7Ci0g
ICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5h
cHBlbmQoZW5jb2RlQnl0ZShrU2NoZW1hVmVyc2lvblR5cGVCeXRlKSk7Ci0gICAgICAgIHJldHVy
biByZXQ7Ci0gICAgfQotfTsKLQotY2xhc3MgTWF4RGF0YWJhc2VJZEtleSB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4
IHByZWZpeCgwLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNv
ZGUoKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtNYXhEYXRhYmFzZUlkVHlwZUJ5
dGUpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19OwotCi1jbGFzcyBEYXRhYmFzZUZy
ZWVMaXN0S2V5IHsKLXB1YmxpYzoKLSAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCkKLSAgICAgICAg
OiBtX2RhdGFiYXNlSWQoLTEpCi0gICAgewotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZy
ZWVMaXN0S2V5KiByZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAg
ICAgICBjb25zdCBjaGFyICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFT
U0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1fb2Jq
ZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Ci0gICAgICAg
IGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHVuc2lnbmVk
IGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0
eXBlQnl0ZSA9PSBrRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKTsKLSAgICAgICAgaWYgKHAgPT0g
bGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGRlY29kZVZhcklu
dChwLCBsaW1pdCwgcmVzdWx0LT5tX2RhdGFiYXNlSWQpOwotICAgIH0KLQotICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCkKLSAgICB7Ci0gICAgICAgIEtl
eVByZWZpeCBwcmVmaXgoMCwgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVm
aXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrRGF0YWJhc2VGcmVl
TGlzdFR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KGRhdGFiYXNl
SWQpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRhdGFiYXNl
SWQoKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKLSAg
ICAgICAgcmV0dXJuIG1fZGF0YWJhc2VJZDsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZShjb25z
dCBEYXRhYmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VS
VChtX2RhdGFiYXNlSWQgPj0gMCk7Ci0gICAgICAgIHJldHVybiBtX2RhdGFiYXNlSWQgLSBvdGhl
ci5tX2RhdGFiYXNlSWQ7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGludDY0X3QgbV9kYXRhYmFz
ZUlkOwotfTsKLQotY2xhc3MgRGF0YWJhc2VOYW1lS2V5IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMg
Y29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwg
RGF0YWJhc2VOYW1lS2V5KiByZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4
OwotICAgICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0
LCAmcHJlZml4KTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAg
ICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4
Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Ci0g
ICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVC
eXRlLCB0eXBlQnl0ZSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpOwotICAgICAgICBpZiAocCA9
PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwID0gZGVjb2RlU3RyaW5n
V2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX29yaWdpbik7Ci0gICAgICAgIGlmICghcCkK
LSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExl
bmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX2RhdGFiYXNlTmFtZSk7Ci0gICAgfQotCi0gICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0IFN0cmlu
ZyYgZGF0YWJhc2VOYW1lKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAw
KTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICAgICAg
cmV0LmFwcGVuZChlbmNvZGVCeXRlKGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSkpOwotICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob3JpZ2luKSk7Ci0gICAgICAgIHJldC5h
cHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChkYXRhYmFzZU5hbWUpKTsKLSAgICAgICAgcmV0
dXJuIHJldDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9v
cmlnaW47IH0KLSAgICBTdHJpbmcgZGF0YWJhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
YmFzZU5hbWU7IH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IERhdGFiYXNlTmFtZUtleSYgb3Ro
ZXIpCi0gICAgewotICAgICAgICBpZiAoaW50IHggPSBjb2RlUG9pbnRDb21wYXJlKG1fb3JpZ2lu
LCBvdGhlci5tX29yaWdpbikpCi0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgcmV0dXJu
IGNvZGVQb2ludENvbXBhcmUobV9kYXRhYmFzZU5hbWUsIG90aGVyLm1fZGF0YWJhc2VOYW1lKTsK
LSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fb3JpZ2luOyAvLyBGSVhNRTogU3RvcmUg
ZW5jb2RlZCBzdHJpbmdzLCBvciBqdXN0IHBvaW50ZXJzLgotICAgIFN0cmluZyBtX2RhdGFiYXNl
TmFtZTsKLX07Ci0KLWNsYXNzIERhdGFiYXNlTWV0YURhdGFLZXkgewotcHVibGljOgotICAgIGVu
dW0gTWV0YURhdGFUeXBlIHsKLSAgICAgICAga09yaWdpbk5hbWUgPSAwLAotICAgICAgICBrRGF0
YWJhc2VOYW1lID0gMSwKLSAgICAgICAga1VzZXJWZXJzaW9uID0gMiwKLSAgICAgICAga01heE9i
amVjdFN0b3JlSWQgPSAzCi0gICAgfTsKLQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgTWV0YURhdGFUeXBlIG1ldGFEYXRhVHlwZSkKLSAgICB7Ci0g
ICAgICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3Rv
cjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2Rl
Qnl0ZShtZXRhRGF0YVR5cGUpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19OwotCi1j
bGFzcyBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IHsKLXB1YmxpYzoKLSAgICBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KCkKLSAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCi0gICAgICAgICwgbV9t
ZXRhRGF0YVR5cGUoLTEpCi0gICAgewotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5KiByZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAg
ICAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJl
Zml4KTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFT
U0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9vYmpl
Y3RTdG9yZUlkKTsKLSAgICAgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICAgICAg
aWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdW5zaWduZWQg
Y2hhciB0eXBlQnl0ZSA9ICpwKys7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5
cGVCeXRlID09IGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpOwotICAgICAgICBpZiAocCA9
PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwID0gZGVjb2RlVmFySW50
KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIGlmICghcCkKLSAg
ICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBBU1NFUlQocmVzdWx0LT5tX29iamVjdFN0b3Jl
SWQpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
ICAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBl
KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBtZXRhRGF0YVR5cGUpCi0gICAg
ewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOwotICAgICAgICBW
ZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkpOwotICAgICAgICByZXQuYXBw
ZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5j
b2RlVmFySW50KG1ldGFEYXRhVHlwZSkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQot
ICAgIGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQo
bV9vYmplY3RTdG9yZUlkID49IDApOwotICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwot
ICAgIH0KLSAgICBpbnQ2NF90IG1ldGFEYXRhVHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBB
U1NFUlQobV9tZXRhRGF0YVR5cGUgPj0gMCk7Ci0gICAgICAgIHJldHVybiBtX21ldGFEYXRhVHlw
ZTsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5
JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0g
ICAgICAgIEFTU0VSVChtX21ldGFEYXRhVHlwZSA+PSAwKTsKLSAgICAgICAgaWYgKGludCB4ID0g
bV9vYmplY3RTdG9yZUlkIC0gb3RoZXIubV9vYmplY3RTdG9yZUlkKQotICAgICAgICAgICAgcmV0
dXJuIHg7IC8vIEZJWE1FOiBJcyB0aGlzIGNhc3Qgc2FmZT8gSS5lLiwgd2lsbCBpdCBwcmVzZXJ2
ZSB0aGUgc2lnbj8KLSAgICAgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRh
RGF0YVR5cGU7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlk
OwotICAgIGludDY0X3QgbV9tZXRhRGF0YVR5cGU7IC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBieXRl
LgotfTsKLQotY2xhc3MgSW5kZXhNZXRhRGF0YUtleSB7Ci1wdWJsaWM6Ci0gICAgSW5kZXhNZXRh
RGF0YUtleSgpCi0gICAgICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQotICAgICAgICAsIG1faW5k
ZXhJZCgtMSkKLSAgICAgICAgLCBtX21ldGFEYXRhVHlwZSgwKQotICAgIHsKLSAgICB9Ci0KLSAg
ICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFy
KiBsaW1pdCwgSW5kZXhNZXRhRGF0YUtleSogcmVzdWx0KQotICAgIHsKLSAgICAgICAgS2V5UHJl
Zml4IHByZWZpeDsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0
YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VS
VCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5k
ZXhJZCk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5V
U0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKTsKLSAgICAg
ICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcCA9IGRl
Y29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgICAgICBp
ZiAoIXApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4SWQpOwotICAgICAgICBpZiAoIXApCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgcmVzdWx0LT5tX21ldGFEYXRhVHlwZSA9ICpwKys7Ci0gICAgICAgIHJldHVy
biBwOwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVk
IGNoYXIgbWV0YURhdGFUeXBlKQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRh
YmFzZUlkLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUo
KTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtJbmRleE1ldGFEYXRhVHlwZUJ5dGUp
KTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOwotICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChpbmRleElkKSk7Ci0gICAgICAgIHJldC5hcHBl
bmQoZW5jb2RlQnl0ZShtZXRhRGF0YVR5cGUpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9
Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcikKLSAgICB7
Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgICAgIEFTU0VSVCht
X2luZGV4SWQgPj0gMCk7Ci0KLSAgICAgICAgaWYgKGludCB4ID0gbV9vYmplY3RTdG9yZUlkIC0g
b3RoZXIubV9vYmplY3RTdG9yZUlkKQotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIGlm
IChpbnQgeCA9IG1faW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZCkKLSAgICAgICAgICAgIHJldHVy
biB4OwotICAgICAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRhVHlw
ZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdAotICAgIHsKLSAgICAgICAg
QVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKLSAgICAgICAgcmV0dXJuIG1faW5kZXhJZDsKLSAgICB9
Ci0KLSAgICB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWV0
YURhdGFUeXBlOyB9Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0g
ICAgaW50NjRfdCBtX2luZGV4SWQ7Ci0gICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlwZTsK
LX07Ci0KLWNsYXNzIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgewotcHVibGljOgotICAgIE9iamVj
dFN0b3JlRnJlZUxpc3RLZXkoKQotICAgICAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKLSAgICB7
Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFy
dCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkqIHJlc3VsdCkKLSAg
ICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnAgPSBL
ZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXAp
Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNl
SWQpOwotICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgICAgICBB
U1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsK
LSAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga09iamVjdFN0b3Jl
RnJlZUxpc3RUeXBlQnl0ZSk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLSAgICB7Ci0gICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7Ci0gICAgICAgIFZlY3Rvcjxj
aGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0
ZShrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKSk7Ci0gICAgICAgIHJldC5hcHBlbmQoZW5j
b2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0K
LSAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJU
KG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsK
LSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5JiBv
dGhlcikKLSAgICB7Ci0gICAgICAgIC8vIEZJWE1FOiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRoYXQg
d2UncmUgbm90IGNvbXBhcmluZyBkYXRhYmFzZSBpZCdzLAotICAgICAgICAvLyBidXQgdGhhdCBj
b21wYXJpc29uIHdpbGwgaGF2ZSBiZWVuIG1hZGUgZWFybGllci4KLSAgICAgICAgLy8gV2Ugc2hv
dWxkIHByb2JhYmx5IG1ha2UgdGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KLSAgICAgICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJ
ZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRf
dCBtX29iamVjdFN0b3JlSWQ7Ci19OwotCi1jbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKLXB1Ymxp
YzoKLSAgICBJbmRleEZyZWVMaXN0S2V5KCkKLSAgICAgICAgOiBtX29iamVjdFN0b3JlSWQoLTEp
Ci0gICAgICAgICwgbV9pbmRleElkKC0xKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29u
c3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5k
ZXhGcmVlTGlzdEtleSogcmVzdWx0KQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeDsK
LSAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwg
JnByZWZpeCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1f
b2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Ci0gICAg
ICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHVuc2ln
bmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRl
LCB0eXBlQnl0ZSA9PSBrSW5kZXhGcmVlTGlzdFR5cGVCeXRlKTsKLSAgICAgICAgaWYgKHAgPT0g
bGltaXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcCA9IGRlY29kZVZhckludChw
LCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgICAgICBpZiAoIXApCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwg
cmVzdWx0LT5tX2luZGV4SWQpOwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDAp
OwotICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4RnJlZUxpc3RUeXBlQnl0ZSkpOwotICAgICAgICBy
ZXQuYXBwZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7Ci0gICAgICAgIHJldC5hcHBl
bmQoZW5jb2RlVmFySW50KGluZGV4SWQpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0K
LSAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleEZyZWVMaXN0S2V5JiBvdGhlcikKLSAgICB7Ci0g
ICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgICAgIEFTU0VSVChtX2lu
ZGV4SWQgPj0gMCk7Ci0gICAgICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVy
Lm1fb2JqZWN0U3RvcmVJZCkKLSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICByZXR1cm4g
bV9pbmRleElkIC0gb3RoZXIubV9pbmRleElkOwotICAgIH0KLQotICAgIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOwotICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwotICAgIH0KLQotICAgIGludDY0
X3QgaW5kZXhJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9pbmRleElkID49IDAp
OwotICAgICAgICByZXR1cm4gbV9pbmRleElkOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBpbnQ2NF90IG1faW5kZXhJZDsKLX07Ci0KLWNsYXNz
IE9iamVjdFN0b3JlTmFtZXNLZXkgewotcHVibGljOgotICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1
c2UgdGhpcyB0byBsb29rIHVwIG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCi0g
ICAgLy8gaXMga2VwdCBpbiB0aGUgSURCRGF0YWJhc2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBw
aW5nIGJlY29tZSB1bnJlbGlhYmxlPwotICAgIC8vIENhbiB3ZSByZW1vdmUgdGhpcz8KLSAgICBz
dGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBs
aW1pdCwgT2JqZWN0U3RvcmVOYW1lc0tleSogcmVzdWx0KQotICAgIHsKLSAgICAgICAgS2V5UHJl
Zml4IHByZWZpeDsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0
YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VS
VCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVCghcHJlZml4Lm1faW5k
ZXhJZCk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOwotICAgICAgICBBU1NFUlRfVU5V
U0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKTsKLSAg
ICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9v
YmplY3RTdG9yZU5hbWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgU3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCi0gICAg
ewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOwotICAgICAgICBW
ZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa1NjaGVtYVZlcnNpb25UeXBlQnl0ZSkpOwotICAgICAgICByZXQuYXBwZW5kKGVu
Y29kZUJ5dGUoa09iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSkpOwotICAgICAgICByZXQuYXBwZW5k
KGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob2JqZWN0U3RvcmVOYW1lKSk7Ci0gICAgICAgIHJldHVy
biByZXQ7Ci0gICAgfQotCi0gICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tl
eSYgb3RoZXIpCi0gICAgewotICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVj
dFN0b3JlTmFtZSwgb3RoZXIubV9vYmplY3RTdG9yZU5hbWUpOwotICAgIH0KLQotICAgIFN0cmlu
ZyBvYmplY3RTdG9yZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX29iamVjdFN0b3JlTmFtZTsgfQot
Ci1wcml2YXRlOgotICAgIFN0cmluZyBtX29iamVjdFN0b3JlTmFtZTsgLy8gRklYTUU6IFN0b3Jl
IHRoZSBlbmNvZGVkIHN0cmluZywgb3IganVzdCBwb2ludGVycyB0byBpdC4KLX07Ci0KLWNsYXNz
IEluZGV4TmFtZXNLZXkgewotcHVibGljOgotICAgIEluZGV4TmFtZXNLZXkoKQotICAgICAgICA6
IG1fb2JqZWN0U3RvcmVJZCgtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFdlIG5l
dmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgaW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGluZwotICAg
IC8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRl
Y29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TmFtZXNLZXkq
IHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAgIGNvbnN0
IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOwotICAg
ICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQVNTRVJUKHByZWZp
eC5tX2RhdGFiYXNlSWQpOwotICAgICAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQp
OwotICAgICAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwotICAgICAgICBpZiAocCA9PSBs
aW1pdCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVC
eXRlID0gKnArKzsKLSAgICAgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0g
a0luZGV4TmFtZXNLZXlUeXBlQnl0ZSk7Ci0gICAgICAgIGlmIChwID09IGxpbWl0KQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3Vs
dC0+bV9vYmplY3RTdG9yZUlkKTsKLSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1
bHQtPm1faW5kZXhOYW1lKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5n
JiBpbmRleE5hbWUpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQs
IDAsIDApOwotICAgICAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4TmFtZXNLZXlUeXBlQnl0ZSkpOwotICAg
ICAgICByZXQuYXBwZW5kKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7Ci0gICAgICAgIHJl
dC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChpbmRleE5hbWUpKTsKLSAgICAgICAgcmV0
dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpbnQgY29tcGFyZShjb25zdCBJbmRleE5hbWVzS2V5JiBv
dGhlcikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAg
ICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkK
LSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZSht
X2luZGV4TmFtZSwgb3RoZXIubV9pbmRleE5hbWUpOwotICAgIH0KLQotICAgIFN0cmluZyBpbmRl
eE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4TmFtZTsgfQotCi1wcml2YXRlOgotICAgIGlu
dDY0X3QgbV9vYmplY3RTdG9yZUlkOwotICAgIFN0cmluZyBtX2luZGV4TmFtZTsKLX07Ci0KLWNs
YXNzIE9iamVjdFN0b3JlRGF0YUtleSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIq
IGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURh
dGFLZXkqIHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgICAg
IGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsK
LSAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFTU0VSVChw
cmVmaXgubV9kYXRhYmFzZUlkKTsKLSAgICAgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3Jl
SWQpOwotICAgICAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA9PSBrU3BlY2lhbEluZGV4TnVt
YmVyKTsKLSAgICAgICAgaWYgKHAgPT0gZW5kKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAg
ICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1fZW5jb2Rl
ZFVzZXJLZXkpOwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4g
ZW5jb2RlZFVzZXJLZXkpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGtTcGVjaWFsSW5kZXhOdW1iZXIpOwotICAgICAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgICAgICByZXQuYXBwZW5kKGVuY29kZWRV
c2VyS2V5KTsKLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHN0YXRpYyBWZWN0
b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBjb25zdCBJREJLZXkmIHVzZXJLZXkpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSk7Ci0gICAgfQot
Ci0gICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlcikKLSAgICB7
Ci0gICAgICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwg
b3RoZXIubV9lbmNvZGVkVXNlcktleSk7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxJREJLZXk+
IHVzZXJLZXkoKSBjb25zdAotICAgIHsKLSAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OwotICAg
ICAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2Vy
S2V5LmVuZCgpLCBrZXkpOwotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHN0YXRp
YyBjb25zdCBpbnQ2NF90IGtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrT2JqZWN0U3RvcmVEYXRhSW5k
ZXhJZDsKLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsKLX07
Ci0KLWNsYXNzIEV4aXN0c0VudHJ5S2V5IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hh
ciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIEV4aXN0c0VudHJ5
S2V5KiByZXN1bHQpCi0gICAgewotICAgICAgICBLZXlQcmVmaXggcHJlZml4OwotICAgICAgICBj
b25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7Ci0g
ICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBBU1NFUlQocHJl
Zml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlk
KTsKLSAgICAgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPT0ga1NwZWNpYWxJbmRleE51bWJl
cik7Ci0gICAgICAgIGlmIChwID09IGVuZCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRV
c2VyS2V5KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBl
bmNvZGVkS2V5KQotICAgIHsKLSAgICAgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBrU3BlY2lhbEluZGV4TnVtYmVyKTsKLSAgICAgICAgVmVjdG9yPGNoYXI+
IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVkS2V5KTsK
LSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
S2V5JiB1c2VyS2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBlbmNvZGVJREJLZXkodXNlcktleSkpOwotICAgIH0KLQotICAgIGludCBj
b21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIHJldHVy
biBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVk
VXNlcktleSk7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25z
dAotICAgIHsKLSAgICAgICAgUmVmUHRyPElEQktleT4ga2V5OwotICAgICAgICBkZWNvZGVJREJL
ZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkp
OwotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90
IGtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrRXhpc3RzRW50cnlJbmRleElkOwotCi1wcml2YXRlOgot
ICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5OwotfTsKLQotY2xhc3MgSW5kZXhEYXRh
S2V5IHsKLXB1YmxpYzoKLSAgICBJbmRleERhdGFLZXkoKQotICAgICAgICA6IG1fZGF0YWJhc2VJ
ZCgtMSkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQoLTEpCi0gICAgICAgICwgbV9pbmRleElk
KC0xKQotICAgICAgICAsIG1fc2VxdWVuY2VOdW1iZXIoLTEpCi0gICAgewotICAgIH0KLQotICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIq
IGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCkKLSAgICB7Ci0gICAgICAgIEtleVByZWZpeCBw
cmVmaXg7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwg
bGltaXQsICZwcmVmaXgpOwotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm4gMDsK
LSAgICAgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOwotICAgICAgICBBU1NFUlQocHJl
Zml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID49
IGtNaW5pbXVtSW5kZXhJZCk7Ci0gICAgICAgIHJlc3VsdC0+bV9kYXRhYmFzZUlkID0gcHJlZml4
Lm1fZGF0YWJhc2VJZDsKLSAgICAgICAgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQgPSBwcmVmaXgu
bV9vYmplY3RTdG9yZUlkOwotICAgICAgICByZXN1bHQtPm1faW5kZXhJZCA9IHByZWZpeC5tX2lu
ZGV4SWQ7Ci0gICAgICAgIHAgPSBleHRyYWN0RW5jb2RlZElEQktleShwLCBsaW1pdCwgJnJlc3Vs
dC0+bV9lbmNvZGVkVXNlcktleSk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICBpZiAocCA9PSBsaW1pdCkgewotICAgICAgICAgICAgcmVzdWx0LT5tX3Nl
cXVlbmNlTnVtYmVyID0gLTE7IC8vIEZJWE1FOiBXZSBzaG91bGQgY2hhbmdlIGl0IHNvIHRoYXQg
YWxsIGtleXMgaGF2ZSBhIHNlcXVlbmNlIG51bWJlci4gU2hvdWxkbid0IG5lZWQgdG8gaGFuZGxl
IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9zZXF1ZW5jZU51bWJlcik7Ci0g
ICAgfQotCi0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNo
YXI+JiBlbmNvZGVkVXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikKLSAgICB7Ci0gICAg
ICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7
Ci0gICAgICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgICAgIHJl
dC5hcHBlbmQoZW5jb2RlZFVzZXJLZXkpOwotICAgICAgICByZXQuYXBwZW5kKGVuY29kZVZhcklu
dChzZXF1ZW5jZU51bWJlcikpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHN0
YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYgdXNlcktleSwgaW50NjRf
dCBzZXF1ZW5jZU51bWJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpLCBzZXF1ZW5j
ZU51bWJlcik7Ci0gICAgfQotCi0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhLZXko
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi0gICAgewotICAgICAg
ICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIElOVDMyX01BWCwgbWF4
SURCS2V5KCksIElOVDY0X01BWCk7Ci0gICAgfQotCi0gICAgaW50IGNvbXBhcmUoY29uc3QgSW5k
ZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVTZXF1ZW5jZU51bWJlcikKLSAgICB7Ci0gICAg
ICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7Ci0gICAgICAgIEFTU0VSVChtX29iamVjdFN0
b3JlSWQgPj0gMCk7Ci0gICAgICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7Ci0gICAgICAgIGlm
IChpbnQgeCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5t
X2VuY29kZWRVc2VyS2V5KSkKLSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICBpZiAoaWdu
b3JlU2VxdWVuY2VOdW1iZXIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJu
IG1fc2VxdWVuY2VOdW1iZXIgLSBvdGhlci5tX3NlcXVlbmNlTnVtYmVyOwotICAgIH0KLQotICAg
IGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9kYXRh
YmFzZUlkID49IDApOwotICAgICAgICByZXR1cm4gbV9kYXRhYmFzZUlkOwotICAgIH0KLQotICAg
IGludDY0X3Qgb2JqZWN0U3RvcmVJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQobV9v
YmplY3RTdG9yZUlkID49IDApOwotICAgICAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwotICAg
IH0KLQotICAgIGludDY0X3QgaW5kZXhJZCgpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQo
bV9pbmRleElkID49IDApOwotICAgICAgICByZXR1cm4gbV9pbmRleElkOwotICAgIH0KLQotICAg
IFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFJlZlB0
cjxJREJLZXk+IGtleTsKLSAgICAgICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVn
aW4oKSwgbV9lbmNvZGVkVXNlcktleS5lbmQoKSwga2V5KTsKLSAgICAgICAgcmV0dXJuIGtleTsK
LSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Ci0gICAgaW50NjRf
dCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgaW50NjRfdCBtX2luZGV4SWQ7Ci0gICAgVmVjdG9yPGNo
YXI+IG1fZW5jb2RlZFVzZXJLZXk7Ci0gICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVyOwotfTsK
LQotbmFtZXNwYWNlIHsKLXRlbXBsYXRlPHR5cGVuYW1lIEtleVR5cGU+Ci1pbnQgZGVjb2RlQW5k
Q29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKLXsK
LSAgICBLZXlUeXBlIGtleUE7Ci0gICAgS2V5VHlwZSBrZXlCOwotCi0gICAgY29uc3QgY2hhciog
cHRyQSA9IEtleVR5cGU6OmRlY29kZShhLmJlZ2luKCksIGEuZW5kKCksICZrZXlBKTsKLSAgICBB
U1NFUlRfVU5VU0VEKHB0ckEsIHB0ckEpOwotICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBLZXlUeXBl
OjpkZWNvZGUoYi5iZWdpbigpLCBiLmVuZCgpLCAma2V5Qik7Ci0gICAgQVNTRVJUX1VOVVNFRChw
dHJCLCBwdHJCKTsKLQotICAgIHJldHVybiBrZXlBLmNvbXBhcmUoa2V5Qik7Ci19Ci19Ci0KLXN0
YXRpYyBpbnQgcmVhbENvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERC
U2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzID0gZmFsc2UpCi17Ci0gICAgY29uc3QgY2hhciogcHRy
QSA9IGEuYmVnaW4oKTsKLSAgICBjb25zdCBjaGFyKiBwdHJCID0gYi5iZWdpbigpOwotICAgIGNv
bnN0IGNoYXIqIGVuZEEgPSBhLmVuZCgpOwotICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBiLmVuZCgp
OwotCi0gICAgS2V5UHJlZml4IHByZWZpeEE7Ci0gICAgS2V5UHJlZml4IHByZWZpeEI7Ci0KLSAg
ICBwdHJBID0gS2V5UHJlZml4OjpkZWNvZGUocHRyQSwgZW5kQSwgJnByZWZpeEEpOwotICAgIHB0
ckIgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJCLCBlbmRCLCAmcHJlZml4Qik7Ci0gICAgQVNTRVJU
KHB0ckEpOwotICAgIEFTU0VSVChwdHJCKTsKLQotICAgIGlmIChpbnQgeCA9IHByZWZpeEEuY29t
cGFyZShwcmVmaXhCKSkKLSAgICAgICAgcmV0dXJuIHg7Ci0KLSAgICBpZiAocHJlZml4QS50eXBl
KCkgPT0gS2V5UHJlZml4OjprR2xvYmFsTWV0YURhdGEpIHsKLSAgICAgICAgQVNTRVJUKHB0ckEg
IT0gZW5kQSk7Ci0gICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOwotCi0gICAgICAgIHVuc2ln
bmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckErKzsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0eXBl
Qnl0ZUIgPSAqcHRyQisrOwotCi0gICAgICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVC
eXRlQikKLSAgICAgICAgICAgIHJldHVybiB4OwotCi0gICAgICAgIGlmICh0eXBlQnl0ZUEgPD0g
MSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtEYXRh
YmFzZUZyZWVMaXN0VHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFy
ZTxEYXRhYmFzZUZyZWVMaXN0S2V5PihhLCBiKTsKLSAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBr
RGF0YWJhc2VOYW1lVHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFy
ZTxEYXRhYmFzZU5hbWVLZXk+KGEsIGIpOwotICAgIH0KLQotICAgIGlmIChwcmVmaXhBLnR5cGUo
KSA9PSBLZXlQcmVmaXg6OmtEYXRhYmFzZU1ldGFEYXRhKSB7Ci0gICAgICAgIEFTU0VSVChwdHJB
ICE9IGVuZEEpOwotICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKLQotICAgICAgICB1bnNp
Z25lZCBjaGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlw
ZUJ5dGVCID0gKnB0ckIrKzsKLQotICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBl
Qnl0ZUIpCi0gICAgICAgICAgICByZXR1cm4geDsKLQotICAgICAgICBpZiAodHlwZUJ5dGVBIDw9
IDMpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtP
YmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5k
Q29tcGFyZTxPYmplY3RTdG9yZU1ldGFEYXRhS2V5PihhLCBiKTsKLSAgICAgICAgaWYgKHR5cGVC
eXRlQSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKQotICAgICAgICAgICAgcmV0dXJuIGRlY29k
ZUFuZENvbXBhcmU8SW5kZXhNZXRhRGF0YUtleT4oYSwgYik7Ci0gICAgICAgIGlmICh0eXBlQnl0
ZUEgPT0ga09iamVjdFN0b3JlRnJlZUxpc3RUeXBlQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiBk
ZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlRnJlZUxpc3RLZXk+KGEsIGIpOwotICAgICAgICBp
ZiAodHlwZUJ5dGVBID09IGtJbmRleEZyZWVMaXN0VHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1
cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRleEZyZWVMaXN0S2V5PihhLCBiKTsKLSAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKQotICAgICAgICAgICAgcmV0
dXJuIGRlY29kZUFuZENvbXBhcmU8T2JqZWN0U3RvcmVOYW1lc0tleT4oYSwgYik7Ci0gICAgICAg
IGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4TmFtZXNLZXlUeXBlQnl0ZSkKLSAgICAgICAgICAgIHJl
dHVybiBkZWNvZGVBbmRDb21wYXJlPEluZGV4TmFtZXNLZXk+KGEsIGIpOwotCi0gICAgICAgIHJl
dHVybiAwOwotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0KLSAgICBpZiAo
cHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprT2JqZWN0U3RvcmVEYXRhKSB7Ci0gICAgICAg
IGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQotICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgICAgIGlmIChwdHJBID09IGVuZEEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAg
ICAgIGlmIChwdHJCID09IGVuZEIpCi0gICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRo
aXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBo
YW5kbGVkIHRoaXMgd2F5LgotCi0gICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVj
dFN0b3JlRGF0YUtleT4oYSwgYik7Ci0gICAgfQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBL
ZXlQcmVmaXg6OmtFeGlzdHNFbnRyeSkgewotICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0
ckIgPT0gZW5kQikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocHRyQSA9PSBl
bmRBKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQot
ICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5n
IHVzZXIga2V5cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KLQotICAg
ICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxFeGlzdHNFbnRyeUtleT4oYSwgYik7Ci0gICAg
fQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtJbmRleERhdGEpIHsKLSAg
ICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJCID09IGVuZEIpCi0gICAgICAgICAgICByZXR1
cm4gMDsKLSAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSkKLSAgICAgICAgICAgIHJldHVybiAtMTsK
LSAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKLSAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhN
RTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRv
IGJlIGhhbmRsZWQgdGhpcyB3YXkuCi0KLSAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtl
eUE7Ci0gICAgICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXlCOwotCi0gICAgICAgIHB0ckEg
PSBJbmRleERhdGFLZXk6OmRlY29kZShhLmJlZ2luKCksIGVuZEEsICZpbmRleERhdGFLZXlBKTsK
LSAgICAgICAgcHRyQiA9IEluZGV4RGF0YUtleTo6ZGVjb2RlKGIuYmVnaW4oKSwgZW5kQiwgJmlu
ZGV4RGF0YUtleUIpOwotICAgICAgICBBU1NFUlQocHRyQSk7Ci0gICAgICAgIEFTU0VSVChwdHJC
KTsKLQotICAgICAgICBib29sIGlnbm9yZVNlcXVlbmNlTnVtYmVyID0gaW5kZXhLZXlzOwotICAg
ICAgICByZXR1cm4gaW5kZXhEYXRhS2V5QS5jb21wYXJlKGluZGV4RGF0YUtleUIsIGlnbm9yZVNl
cXVlbmNlTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICBy
ZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjb21wYXJlS2V5cyhjb25zdCBMZXZlbERCU2xpY2Um
IGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKIHsKLSAgICByZXR1cm4gcmVhbENvbXBhcmUoYSwg
Yik7CisgICAgcmV0dXJuIGNvbXBhcmUoYSwgYik7CiB9CiAKIHN0YXRpYyBpbnQgY29tcGFyZUlu
ZGV4S2V5cyhjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKIHsK
LSAgICByZXR1cm4gcmVhbENvbXBhcmUoYSwgYiwgdHJ1ZSk7CisgICAgcmV0dXJuIGNvbXBhcmUo
YSwgYiwgdHJ1ZSk7CiB9CiAKIGNsYXNzIENvbXBhcmF0b3IgOiBwdWJsaWMgTGV2ZWxEQkNvbXBh
cmF0b3IgewogcHVibGljOgotICAgIHZpcnR1YWwgaW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNs
aWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpIGNvbnN0IHsgcmV0dXJuIHJlYWxDb21wYXJl
KGEsIGIpOyB9CisgICAgdmlydHVhbCBpbnQgY29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEs
IGNvbnN0IExldmVsREJTbGljZSYgYikgY29uc3QgeyByZXR1cm4gSURCTGV2ZWxEQkNvZGluZzo6
Y29tcGFyZShhLCBiKTsgfQogICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJpZGJfY21wMSI7IH0KIH07Ci19CiAKIHN0YXRpYyBib29sIHNldFVwTWV0YWRhdGEo
TGV2ZWxEQkRhdGFiYXNlKiBkYikKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3Jh
Z2UvSURCTGV2ZWxEQkNvZGluZy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVs
REJDb2RpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgyMmFjMTc4ZTFkNzJhNDYxNzhkN2NmZjMyMjA1ODBi
MTBmOWFlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxl
dmVsREJDb2RpbmcuY3BwCkBAIC0wLDAgKzEsMTI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJJREJMZXZlbERCQ29kaW5nLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhF
RF9EQVRBQkFTRSkKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworI2luY2x1ZGUgIklEQktleS5oIgor
I2luY2x1ZGUgIkxldmVsREJTbGljZS5oIgorCisvLyBMZXZlbERCIHN0b3JlcyBrZXkvdmFsdWUg
cGFpcnMuIEtleXMgYW5kIHZhbHVlcyBhcmUgc3RyaW5ncyBvZiBieXRlcywgbm9ybWFsbHkgb2Yg
dHlwZSBWZWN0b3I8Y2hhcj4uCisvLworLy8gVGhlIGtleXMgaW4gdGhlIGJhY2tpbmcgc3RvcmUg
YXJlIHZhcmlhYmxlLWxlbmd0aCB0dXBsZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMKKy8vIG9mIGZp
ZWxkcy4gRWFjaCBrZXkgaW4gdGhlIGJhY2tpbmcgc3RvcmUgc3RhcnRzIHdpdGggYSB0ZXJuYXJ5
IHByZWZpeDogKGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkKS4gRm9yIGVh
Y2gsIDAgaXMgcmVzZXJ2ZWQgZm9yIG1ldGEtZGF0YS4KKy8vIFRoZSBwcmVmaXggbWFrZXMgc3Vy
ZSB0aGF0IGRhdGEgZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2UsIG9iamVjdCBzdG9yZSwgYW5kIGlu
ZGV4IGFyZSBncm91cGVkIHRvZ2V0aGVyLiBUaGUgbG9jYWxpdHkgaXMgaW1wb3J0YW50IGZvciBw
ZXJmb3JtYW5jZTogY29tbW9uCisvLyBvcGVyYXRpb25zIHNob3VsZCBvbmx5IG5lZWQgYSBtaW5p
bWFsIG51bWJlciBvZiBzZWVrIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhbGwgdGhlIG1ldGEt
ZGF0YSBmb3IgYSBkYXRhYmFzZSBpcyBncm91cGVkIHRvZ2V0aGVyIHNvIHRoYXQgcmVhZGluZyB0
aGF0CisvLyBtZXRhLWRhdGEgb25seSByZXF1aXJlcyBvbmUgc2Vlay4KKy8vCisvLyBFYWNoIGtl
eSB0eXBlIGhhcyBhIGNsYXNzIChpbiBzcXVhcmUgYnJhY2tldHMgYmVsb3cpIHdoaWNoIGtub3dz
IGhvdyB0byBlbmNvZGUsIGRlY29kZSwgYW5kIGNvbXBhcmUgdGhhdCBrZXkgdHlwZS4KKy8vCisv
LyBHbG9iYWwgbWV0YS1kYXRhIGhhdmUga2V5cyB3aXRoIHByZWZpeCAoMCwwLDApLCBmb2xsb3dl
ZCBieSBhIHR5cGUgYnl0ZToKKy8vCisvLyAgICAgPDAsIDAsIDAsIDA+ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IEluZGV4ZWREQi9MZXZlbERCIHNjaGVtYSB2
ZXJzaW9uICgwIGZvciBub3cpIFtTY2hlbWFWZXJzaW9uS2V5XQorLy8gICAgIDwwLCAwLCAwLCAx
PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBUaGUgbWF4aW11
bSBkYXRhYmFzZSBpZCBldmVyIGFsbG9jYXRlZCBbTWF4RGF0YWJhc2VJZEtleV0KKy8vICAgICA8
MCwgMCwgMCwgMTAwLCBkYXRhYmFzZSBpZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4g
RXhpc3RlbmNlIGltcGxpZXMgdGhlIGRhdGFiYXNlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0Rh
dGFiYXNlRnJlZUxpc3RLZXldCisvLyAgICAgPDAsIDAsIDAsIDIwMSwgdXRmMTYgb3JpZ2luIG5h
bWUsIHV0ZjE2IGRhdGFiYXNlIG5hbWU+ID0+IERhdGFiYXNlIGlkIFtEYXRhYmFzZU5hbWVLZXld
CisvLworLy8KKy8vIERhdGFiYXNlIG1ldGEtZGF0YToKKy8vCisvLyAgICAgQWdhaW4sIHRoZSBw
cmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuCisvLworLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgMD4gPT4gdXRmMTYgb3JpZ2luIG5hbWUgW0RhdGFiYXNlTWV0YURhdGFLZXldCisv
LyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxPiA9PiB1dGYxNiBkYXRhYmFzZSBuYW1lIFtEYXRh
YmFzZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMj4gPT4gdXRmMTYg
dXNlciB2ZXJzaW9uIGRhdGEgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNl
IGlkLCAwLCAwLCAzPiA9PiBtYXhpbXVtIG9iamVjdCBzdG9yZSBpZCBldmVyIGFsbG9jYXRlZCBb
RGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEtZGF0YToK
Ky8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwgdGhlbiBh
IHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLCBhbmQgdGhlbiBhbm90aGVyIHZhcmlhYmxlLWxlbmd0
aCBpbnRlZ2VyIChGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBieXRlKS4KKy8vCisvLyAgICAgPGRh
dGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAwPiA9PiB1dGYxNiBvYmplY3Qg
c3RvcmUgbmFtZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQs
IDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0ZjE2IGtleSBwYXRoIFtPYmplY3RT
dG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBz
dG9yZSBpZCwgMj4gPT4gaGFzIGF1dG8gaW5jcmVtZW50IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5
XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMz4gPT4g
aXMgZXZpY3RhYmxlIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgND4gPT4gbGFzdCAidmVyc2lvbiIgbnVtYmVy
IFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAs
IG9iamVjdCBzdG9yZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRleCBpZCBldmVyIGFsbG9jYXRlZCBb
T2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vCisvLworLy8gSW5kZXggbWV0YS1kYXRhOgorLy8K
Ky8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVuIHR3byB2
YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMsIGFuZCB0aGVuIGFub3RoZXIgdHlwZSBieXRlLgorLy8K
Ky8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBp
ZCwgMD4gPT4gdXRmMTYgaW5kZXggbmFtZSBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMT4gPT4gYXJl
IGluZGV4IGtleXMgdW5pcXVlIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAyPiA9PiB1dGYxNiBrZXkg
cGF0aCBbSW5kZXhNZXRhRGF0YUtleV0KKy8vCisvLworLy8gT3RoZXIgb2JqZWN0IHN0b3JlIGFu
ZCBpbmRleCBtZXRhLWRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkg
YSB0eXBlIGJ5dGUuIFRoZSBvYmplY3Qgc3RvcmUgYW5kIGluZGV4IGlkIGFyZSB2YXJpYWJsZSBs
ZW5ndGggaW50ZWdlcnMsIHRoZSB1dGYxNiBzdHJpbmdzIGFyZSB2YXJpYWJsZSBsZW5ndGggc3Ry
aW5ncy4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTAsIG9iamVjdCBzdG9yZSBp
ZD4gICAgICAgICAgICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIG9iamVjdCBzdG9y
ZSBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtPYmplY3RTdG9yZUZyZWVMaXN0S2V5XQorLy8gICAg
IDxkYXRhYmFzZSBpZCwgMCwgMCwgMTUxLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkPiAgICAg
ICAgID0+IGV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBpbmRleCBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0
IFtJbmRleEZyZWVMaXN0S2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMjAwLCB1dGYx
NiBvYmplY3Qgc3RvcmUgbmFtZT4gICAgICAgICAgID0+IG9iamVjdCBzdG9yZSBpZCBbT2JqZWN0
U3RvcmVOYW1lc0tleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMSwgb2JqZWN0IHN0
b3JlIGlkLCB1dGYxNiBpbmRleCBuYW1lPiA9PiBpbmRleCBpZCBbSW5kZXhOYW1lc0tleV0KKy8v
CisvLworLy8gT2JqZWN0IHN0b3JlIGRhdGE6CisvLworLy8gICAgIFRoZSBwcmVmaXggaXMgZm9s
bG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBhbiBlbmNvZGVkIElEQktleS4K
Ky8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUgaWQsIDEsIHVzZXIga2V5PiA9
PiAidmVyc2lvbiIsIHNlcmlhbGl6ZWQgc2NyaXB0IHZhbHVlIFtPYmplY3RTdG9yZURhdGFLZXld
CisvLworLy8KKy8vICJFeGlzdHMiIGVudHJ5OgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZv
bGxvd2VkIGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXku
CisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCAyLCB1c2VyIGtleT4g
PT4gInZlcnNpb24iIFtFeGlzdHNFbnRyeUtleV0KKy8vCisvLworLy8gSW5kZXggZGF0YToKKy8v
CisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIg
a2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LiBUaGUgc2VxdWVuY2UgbnVtYmVyIGlzIGEgdmFyaWFi
bGUgbGVuZ3RoIGludGVnZXIuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3Jl
IGlkLCBpbmRleCBpZCwgdXNlciBrZXksIHNlcXVlbmNlIG51bWJlcj4gPT4gInZlcnNpb24iLCB1
c2VyIGtleSBbSW5kZXhEYXRhS2V5XQorLy8KKy8vICAgICAoVGhlIHNlcXVlbmNlIG51bWJlciBp
cyB1c2VkIHRvIGFsbG93IHR3byBlbnRyaWVzIHdpdGggdGhlIHNhbWUgdXNlciBrZXkKKy8vICAg
ICBpbiBub24tdW5pcXVlIGluZGV4ZXMuIFRoZSAidmVyc2lvbiIgZmllbGQgaXMgdXNlZCB0byB3
ZWVkIG91dCBzdGFsZQorLy8gICAgIGluZGV4IGRhdGEuIFdoZW5ldmVyIG5ldyBvYmplY3Qgc3Rv
cmUgZGF0YSBpcyBpbnNlcnRlZCwgaXQgZ2V0cyBhIG5ldworLy8gICAgICJ2ZXJzaW9uIiBudW1i
ZXIsIGFuZCBuZXcgaW5kZXggZGF0YSBpcyB3cml0dGVuIHdpdGggdGhpcyBudW1iZXIuIFdoZW4K
Ky8vICAgICB0aGUgaW5kZXggaXMgdXNlZCBmb3IgbG9vay11cHMsIGVudHJpZXMgYXJlIHZhbGlk
YXRlZCBhZ2FpbnN0IHRoZQorLy8gICAgICJleGlzdHMiIGVudHJpZXMsIGFuZCByZWNvcmRzIHdp
dGggb2xkICJ2ZXJzaW9uIiBudW1iZXJzIGFyZSBkZWxldGVkCisvLyAgICAgd2hlbiB0aGV5IGFy
ZSBlbmNvdW50ZXJlZCBpbiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgsCisvLyAgICAgSW5kZXhDdXJz
b3JJbXBsOjpsb2FkQ3VycmVudFJvdywgYW5kIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJl
bnRSb3cpLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGlu
ZyB7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlOdWxsVHlwZUJ5dGUgPSAw
Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleVN0cmluZ1R5cGVCeXRlID0gMTsK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlEYXRlVHlwZUJ5dGUgPSAyOworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0lEQktleU51bWJlclR5cGVCeXRlID0gMzsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJREJLZXlNaW5LZXlUeXBlQnl0ZSA9IDQ7CisKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZURhdGFJbmRleElkID0gMTsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtFeGlzdHNFbnRyeUluZGV4SWQgPSAyOworCitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgY2hhciBrU2NoZW1hVmVyc2lvblR5cGVCeXRlID0gMDsKK3N0YXRpYyBj
b25zdCB1bnNpZ25lZCBjaGFyIGtNYXhEYXRhYmFzZUlkVHlwZUJ5dGUgPSAxOworc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIga0RhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSA9IDEwMDsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIGtEYXRhYmFzZU5hbWVUeXBlQnl0ZSA9IDIwMTsKKworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSA9IDUw
Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0luZGV4TWV0YURhdGFUeXBlQnl0ZSA9IDEw
MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5
dGUgPSAxNTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrSW5kZXhGcmVlTGlzdFR5cGVC
eXRlID0gMTUxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga09iamVjdFN0b3JlTmFtZXNU
eXBlQnl0ZSA9IDIwMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtJbmRleE5hbWVzS2V5
VHlwZUJ5dGUgPSAyMDE7CisKKyNpZm5kZWYgSU5UNjRfTUFYCisvLyBGSVhNRTogV2Ugc2hvdWxk
bid0IG5lZWQgdG8gcmVseSBvbiB0aGVzZSBtYWNyb3MuCisjZGVmaW5lIElOVDY0X01BWCAweDdm
ZmZmZmZmZmZmZmZmZmZMTAorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQz
Ml9NQVggMHg3ZmZmZmZmZkwKKyNlbmRpZgorCisKK1ZlY3RvcjxjaGFyPiBlbmNvZGVCeXRlKHVu
c2lnbmVkIGNoYXIgYykKK3sKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICB2LmFwcGVuZChjKTsK
KyAgICByZXR1cm4gdjsKK30KKworVmVjdG9yPGNoYXI+IG1heElEQktleSgpCit7CisgICAgcmV0
dXJuIGVuY29kZUJ5dGUoa0lEQktleU51bGxUeXBlQnl0ZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBt
aW5JREJLZXkoKQoreworICAgIHJldHVybiBlbmNvZGVCeXRlKGtJREJLZXlNaW5LZXlUeXBlQnl0
ZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBlbmNvZGVJbnQoaW50NjRfdCBuKQoreworICAgIEFTU0VS
VChuID49IDApOworICAgIFZlY3RvcjxjaGFyPiByZXQ7IC8vIEZJWE1FOiBTaXplIHRoaXMgYXQg
Y3JlYXRpb24uCisKKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG47CisgICAg
ICAgIHJldC5hcHBlbmQoYyk7CisgICAgICAgIG4gPj49IDg7CisgICAgfSB3aGlsZSAobik7CisK
KyAgICByZXR1cm4gcmV0OworfQorCitpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdp
biwgY29uc3QgY2hhciogZW5kKQoreworICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOworICAgIGlu
dDY0X3QgcmV0ID0gMDsKKworICAgIHdoaWxlIChiZWdpbiA8IGVuZCkgeworICAgICAgICB1bnNp
Z25lZCBjaGFyIGMgPSAqYmVnaW4rKzsKKyAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7Cisg
ICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworVmVjdG9yPGNoYXI+IGVuY29kZVZhckludChp
bnQ2NF90IG4pCit7CisgICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBh
dCBjcmVhdGlvbi4KKworICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbiAmIDB4
N2Y7CisgICAgICAgIG4gPj49IDc7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgYyB8PSAx
Mjg7CisgICAgICAgIHJldC5hcHBlbmQoYyk7CisgICAgfSB3aGlsZSAobik7CisKKyAgICByZXR1
cm4gcmV0OworfQorCitjb25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciAqcCwgY29u
c3QgY2hhciogbGltaXQsIGludDY0X3QmIGZvdW5kSW50KQoreworICAgIEFTU0VSVChsaW1pdCA+
PSBwKTsKKyAgICBmb3VuZEludCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGlmIChwID49IGxp
bWl0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZm91bmRJbnQgPSAoZm91bmRJ
bnQgPDwgNykgfCAoKnAgJiAweDdmKTsKKyAgICB9IHdoaWxlICgqcCsrICYgMTI4KTsKKyAgICBy
ZXR1cm4gcDsKK30KKworVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmIHMp
Cit7CisgICAgVmVjdG9yPGNoYXI+IHJldDsgLy8gRklYTUU6IFNpemUgdGhpcyBhdCBjcmVhdGlv
bi4KKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgVUNoYXIgdSA9IHNbaV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGkgPSB1ID4+IDg7
CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbG8gPSB1OworICAgICAgICByZXQuYXBwZW5kKGhpKTsK
KyAgICAgICAgcmV0LmFwcGVuZChsbyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwor
U3RyaW5nIGRlY29kZVN0cmluZyhjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpCit7Cisg
ICAgQVNTRVJUKGVuZCA+PSBwKTsKKyAgICBBU1NFUlQoISgoZW5kIC0gcCkgJSAyKSk7CisKKyAg
ICBzaXplX3QgbGVuID0gKGVuZCAtIHApIC8gMjsKKyAgICBWZWN0b3I8VUNoYXI+IHZlY3Rvcihs
ZW4pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICB1
bnNpZ25lZCBjaGFyIGhpID0gKnArKzsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsbyA9ICpwKys7
CisKKyAgICAgICAgdmVjdG9yW2ldID0gKGhpIDw8IDgpIHwgbG87CisgICAgfQorCisgICAgcmV0
dXJuIFN0cmluZzo6YWRvcHQodmVjdG9yKTsKK30KKworVmVjdG9yPGNoYXI+IGVuY29kZVN0cmlu
Z1dpdGhMZW5ndGgoY29uc3QgU3RyaW5nJiBzKQoreworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBl
bmNvZGVWYXJJbnQocy5sZW5ndGgoKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVTdHJpbmcocykp
OworICAgIHJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIqIGRlY29kZVN0cmluZ1dpdGhMZW5n
dGgoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIFN0cmluZyYgZm91bmRTdHJpbmcp
Cit7CisgICAgQVNTRVJUKGxpbWl0ID49IHApOworICAgIGludDY0X3QgbGVuOworICAgIHAgPSBk
ZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBpZiAocCArIGxlbiAqIDIgPiBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBmb3VuZFN0cmluZyA9IGRlY29kZVN0cmluZyhwLCBwICsgbGVuICogMik7CisgICAgcCArPSBs
ZW4gKiAyOworICAgIHJldHVybiBwOworfQorCitWZWN0b3I8Y2hhcj4gZW5jb2RlRG91YmxlKGRv
dWJsZSB4KQoreworICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGJl
IGJ5dGUgb3JkZXIgaW5kZXBlbmRlbnQuCisgICAgY29uc3QgY2hhciogcCA9IHJlaW50ZXJwcmV0
X2Nhc3Q8Y2hhcio+KCZ4KTsKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICB2LmFwcGVuZChwLCBz
aXplb2YoeCkpOworICAgIEFTU0VSVCh2LnNpemUoKSA9PSBzaXplb2YoeCkpOworICAgIHJldHVy
biB2OworfQorCitjb25zdCBjaGFyKiBkZWNvZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29uc3Qg
Y2hhciogbGltaXQsIGRvdWJsZSogZCkKK3sKKyAgICBpZiAocCArIHNpemVvZigqZCkgPiBsaW1p
dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjaGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxj
aGFyKj4oZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoKmQpOyArK2kpCisg
ICAgICAgICp4KysgPSAqcCsrOworICAgIHJldHVybiBwOworfQorCitWZWN0b3I8Y2hhcj4gZW5j
b2RlSURCS2V5KGNvbnN0IElEQktleSYga2V5KQoreworICAgIFZlY3RvcjxjaGFyPiByZXQ7CisK
KyAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsKKyAgICBjYXNlIElEQktleTo6TnVsbFR5cGU6Cisg
ICAgICAgIHJldHVybiBlbmNvZGVCeXRlKGtJREJLZXlOdWxsVHlwZUJ5dGUpOworICAgIGNhc2Ug
SURCS2V5OjpTdHJpbmdUeXBlOgorICAgICAgICByZXQgPSBlbmNvZGVCeXRlKGtJREJLZXlTdHJp
bmdUeXBlQnl0ZSk7CisgICAgICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChr
ZXkuc3RyaW5nKCkpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIElEQktleTo6RGF0
ZVR5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleURhdGVUeXBlQnl0ZSk7Cisg
ICAgICAgIHJldC5hcHBlbmQoZW5jb2RlRG91YmxlKGtleS5kYXRlKCkpKTsKKyAgICAgICAgQVNT
RVJUKHJldC5zaXplKCkgPT0gOSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBJREJL
ZXk6Ok51bWJlclR5cGU6CisgICAgICAgIHJldCA9IGVuY29kZUJ5dGUoa0lEQktleU51bWJlclR5
cGVCeXRlKTsKKyAgICAgICAgcmV0LmFwcGVuZChlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKSk7
CisgICAgICAgIEFTU0VSVChyZXQuc2l6ZSgpID09IDkpOworICAgICAgICByZXR1cm4gcmV0Owor
ICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBWZWN0b3I8Y2hh
cj4oKTsKK30KKworY29uc3QgY2hhciogZGVjb2RlSURCS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0
IGNoYXIqIGxpbWl0LCBSZWZQdHI8SURCS2V5PiYgZm91bmRLZXkpCit7CisgICAgQVNTRVJUKGxp
bWl0ID49IHApOworICAgIGlmIChwID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAg
IHVuc2lnbmVkIGNoYXIgdHlwZSA9ICpwKys7CisgICAgU3RyaW5nIHM7CisgICAgZG91YmxlIGQ7
CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6Cisg
ICAgICAgIC8vIE51bGwuCisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdWxsKCk7
CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Uga0lEQktleVN0cmluZ1R5cGVCeXRlOgorICAg
ICAgICAvLyBTdHJpbmcuCisgICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxp
bWl0LCBzKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVTdHJpbmcocyk7CisgICAgICAgIHJldHVybiBwOwor
ICAgIGNhc2Uga0lEQktleURhdGVUeXBlQnl0ZToKKyAgICAgICAgLy8gRGF0ZS4KKyAgICAgICAg
cCA9IGRlY29kZURvdWJsZShwLCBsaW1pdCwgJmQpOworICAgICAgICBpZiAoIXApCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7
CisgICAgICAgIHJldHVybiBwOworICAgIGNhc2Uga0lEQktleU51bWJlclR5cGVCeXRlOgorICAg
ICAgICAvLyBOdW1iZXIuCisgICAgICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsK
KyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5
ID0gSURCS2V5OjpjcmVhdGVOdW1iZXIoZCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKwor
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitjb25zdCBjaGFy
KiBleHRyYWN0RW5jb2RlZElEQktleShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGlt
aXQsIFZlY3RvcjxjaGFyPiogcmVzdWx0KQoreworICAgIGNvbnN0IGNoYXIqIHAgPSBzdGFydDsK
KyAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBj
aGFyIHR5cGUgPSAqcCsrOworCisgICAgaW50NjRfdCBzdHJpbmdMZW47CisKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyAgICBjYXNlIGtJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5
TWluS2V5VHlwZUJ5dGU6CisgICAgICAgICpyZXN1bHQgPSBlbmNvZGVCeXRlKHR5cGUpOworICAg
ICAgICByZXR1cm4gcDsKKyAgICBjYXNlIGtJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAg
Ly8gU3RyaW5nLgorICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBzdHJpbmdMZW4p
OworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHAg
KyBzdHJpbmdMZW4gKiAyID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
cmVzdWx0LT5jbGVhcigpOworICAgICAgICByZXN1bHQtPmFwcGVuZChzdGFydCwgcCAtIHN0YXJ0
ICsgc3RyaW5nTGVuICogMik7CisgICAgICAgIHJldHVybiBwICsgc3RyaW5nTGVuICogMjsKKyAg
ICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAgY2FzZSBrSURCS2V5TnVtYmVyVHlwZUJ5
dGU6CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAgICAgICBpZiAocCArIHNpemVvZihk
b3VibGUpID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmVzdWx0LT5j
bGVhcigpOworICAgICAgICByZXN1bHQtPmFwcGVuZChzdGFydCwgMSArIHNpemVvZihkb3VibGUp
KTsKKyAgICAgICAgcmV0dXJuIHAgKyBzaXplb2YoZG91YmxlKTsKKyAgICB9CisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjb21wYXJlRW5jb2RlZElE
QktleXMoY29uc3QgVmVjdG9yPGNoYXI+JiBrZXlBLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGtleUIp
Cit7CisgICAgQVNTRVJUKGtleUEuc2l6ZSgpID49IDEpOworICAgIEFTU0VSVChrZXlCLnNpemUo
KSA+PSAxKTsKKworICAgIGNvbnN0IGNoYXIqIHAgPSBrZXlBLmRhdGEoKTsKKyAgICBjb25zdCBj
aGFyKiBsaW1pdEEgPSBwICsga2V5QS5zaXplKCk7CisgICAgY29uc3QgY2hhciogcSA9IGtleUIu
ZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGxpbWl0QiA9IHEgKyBrZXlCLnNpemUoKTsKKworICAg
IHVuc2lnbmVkIGNoYXIgdHlwZUEgPSAqcCsrOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUIgPSAq
cSsrOworCisgICAgU3RyaW5nIHMsIHQ7CisgICAgZG91YmxlIGQsIGU7CisKKyAgICBpZiAoaW50
IHggPSB0eXBlQiAtIHR5cGVBKSAvLyBGSVhNRTogTm90ZSB0aGUgc3VidGxlbmVzcyEKKyAgICAg
ICAgcmV0dXJuIHg7CisKKyAgICBzd2l0Y2ggKHR5cGVBKSB7CisgICAgY2FzZSBrSURCS2V5TnVs
bFR5cGVCeXRlOgorICAgIGNhc2Uga0lEQktleU1pbktleVR5cGVCeXRlOgorICAgICAgICAvLyBO
dWxsIHR5cGUgb3IgbWF4IHR5cGU7IG5vIHBheWxvYWQgdG8gY29tcGFyZS4KKyAgICAgICAgcmV0
dXJuIDA7CisgICAgY2FzZSBrSURCS2V5U3RyaW5nVHlwZUJ5dGU6CisgICAgICAgIC8vIFN0cmlu
ZyB0eXBlLgorICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdEEsIHMp
OyAvLyBGSVhNRTogQ29tcGFyZSB3aXRob3V0IGFjdHVhbGx5IGRlY29kaW5nIHRoZSBTdHJpbmch
CisgICAgICAgIEFTU0VSVChwKTsKKyAgICAgICAgcSA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgo
cSwgbGltaXRCLCB0KTsKKyAgICAgICAgQVNTRVJUKHEpOworICAgICAgICByZXR1cm4gY29kZVBv
aW50Q29tcGFyZShzLCB0KTsKKyAgICBjYXNlIGtJREJLZXlEYXRlVHlwZUJ5dGU6CisgICAgY2Fz
ZSBrSURCS2V5TnVtYmVyVHlwZUJ5dGU6CisgICAgICAgIC8vIERhdGUgb3IgbnVtYmVyLgorICAg
ICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0QSwgJmQpOworICAgICAgICBBU1NFUlQocCk7
CisgICAgICAgIHEgPSBkZWNvZGVEb3VibGUocSwgbGltaXRCLCAmZSk7CisgICAgICAgIEFTU0VS
VChxKTsKKyAgICAgICAgaWYgKGQgPCBlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAg
ICBpZiAoZCA+IGUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK25h
bWVzcGFjZSB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlUeXBlPgoraW50IGRlY29kZUFuZENvbXBh
cmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7CisgICAg
S2V5VHlwZSBrZXlBOworICAgIEtleVR5cGUga2V5QjsKKworICAgIGNvbnN0IGNoYXIqIHB0ckEg
PSBLZXlUeXBlOjpkZWNvZGUoYS5iZWdpbigpLCBhLmVuZCgpLCAma2V5QSk7CisgICAgQVNTRVJU
X1VOVVNFRChwdHJBLCBwdHJBKTsKKyAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5VHlwZTo6ZGVj
b2RlKGIuYmVnaW4oKSwgYi5lbmQoKSwgJmtleUIpOworICAgIEFTU0VSVF9VTlVTRUQocHRyQiwg
cHRyQik7CisKKyAgICByZXR1cm4ga2V5QS5jb21wYXJlKGtleUIpOworfQorfQorCitpbnQgY29t
cGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYiwgYm9vbCBp
bmRleEtleXMpCit7CisgICAgY29uc3QgY2hhciogcHRyQSA9IGEuYmVnaW4oKTsKKyAgICBjb25z
dCBjaGFyKiBwdHJCID0gYi5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGVuZEEgPSBhLmVuZCgp
OworICAgIGNvbnN0IGNoYXIqIGVuZEIgPSBiLmVuZCgpOworCisgICAgS2V5UHJlZml4IHByZWZp
eEE7CisgICAgS2V5UHJlZml4IHByZWZpeEI7CisKKyAgICBwdHJBID0gS2V5UHJlZml4OjpkZWNv
ZGUocHRyQSwgZW5kQSwgJnByZWZpeEEpOworICAgIHB0ckIgPSBLZXlQcmVmaXg6OmRlY29kZShw
dHJCLCBlbmRCLCAmcHJlZml4Qik7CisgICAgQVNTRVJUKHB0ckEpOworICAgIEFTU0VSVChwdHJC
KTsKKworICAgIGlmIChpbnQgeCA9IHByZWZpeEEuY29tcGFyZShwcmVmaXhCKSkKKyAgICAgICAg
cmV0dXJuIHg7CisKKyAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjprR2xvYmFs
TWV0YURhdGEpIHsKKyAgICAgICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgIEFTU0VS
VChwdHJCICE9IGVuZEIpOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0
ckErKzsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOworCisgICAg
ICAgIGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikKKyAgICAgICAgICAgIHJldHVy
biB4OworCisgICAgICAgIGlmICh0eXBlQnl0ZUEgPD0gMSkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUpCisg
ICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxEYXRhYmFzZUZyZWVMaXN0S2V5Pihh
LCBiKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpCisg
ICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxEYXRhYmFzZU5hbWVLZXk+KGEsIGIp
OworICAgIH0KKworICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtEYXRhYmFz
ZU1ldGFEYXRhKSB7CisgICAgICAgIEFTU0VSVChwdHJBICE9IGVuZEEpOworICAgICAgICBBU1NF
UlQocHRyQiAhPSBlbmRCKTsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQSA9ICpw
dHJBKys7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVCID0gKnB0ckIrKzsKKworICAg
ICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCisgICAgICAgICAgICByZXR1
cm4geDsKKworICAgICAgICBpZiAodHlwZUJ5dGVBIDw9IDMpCisgICAgICAgICAgICByZXR1cm4g
MDsKKworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtPYmplY3RTdG9yZU1ldGFEYXRhVHlwZUJ5
dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxPYmplY3RTdG9yZU1ldGFE
YXRhS2V5PihhLCBiKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrSW5kZXhNZXRhRGF0YVR5
cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8SW5kZXhNZXRhRGF0
YUtleT4oYSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga09iamVjdFN0b3JlRnJlZUxp
c3RUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0
b3JlRnJlZUxpc3RLZXk+KGEsIGIpOworICAgICAgICBpZiAodHlwZUJ5dGVBID09IGtJbmRleEZy
ZWVMaXN0VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29tcGFyZTxJbmRl
eEZyZWVMaXN0S2V5PihhLCBiKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBrT2JqZWN0U3Rv
cmVOYW1lc1R5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZUFuZENvbXBhcmU8T2Jq
ZWN0U3RvcmVOYW1lc0tleT4oYSwgYik7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0ga0luZGV4
TmFtZXNLZXlUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPElu
ZGV4TmFtZXNLZXk+KGEsIGIpOworCisgICAgICAgIHJldHVybiAwOworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJl
Zml4OjprT2JqZWN0U3RvcmVEYXRhKSB7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRy
QiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwdHJBID09IGVu
ZEEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChwdHJCID09IGVuZEIpCisg
ICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6IFRoaXMgY2FzZSBvZiBub24tZXhpc3Rpbmcg
dXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAg
ICAgIHJldHVybiBkZWNvZGVBbmRDb21wYXJlPE9iamVjdFN0b3JlRGF0YUtleT4oYSwgYik7Cisg
ICAgfQorICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OmtFeGlzdHNFbnRyeSkg
eworICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBpZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAgICAgcmV0dXJu
IC0xOworICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8v
IEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhh
dmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKworICAgICAgICByZXR1cm4gZGVjb2RlQW5kQ29t
cGFyZTxFeGlzdHNFbnRyeUtleT4oYSwgYik7CisgICAgfQorICAgIGlmIChwcmVmaXhBLnR5cGUo
KSA9PSBLZXlQcmVmaXg6OmtJbmRleERhdGEpIHsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAm
JiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHB0ckEg
PT0gZW5kQSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHB0ckIgPT0gZW5k
QikKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlz
dGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisK
KyAgICAgICAgSW5kZXhEYXRhS2V5IGluZGV4RGF0YUtleUE7CisgICAgICAgIEluZGV4RGF0YUtl
eSBpbmRleERhdGFLZXlCOworCisgICAgICAgIHB0ckEgPSBJbmRleERhdGFLZXk6OmRlY29kZShh
LmJlZ2luKCksIGVuZEEsICZpbmRleERhdGFLZXlBKTsKKyAgICAgICAgcHRyQiA9IEluZGV4RGF0
YUtleTo6ZGVjb2RlKGIuYmVnaW4oKSwgZW5kQiwgJmluZGV4RGF0YUtleUIpOworICAgICAgICBB
U1NFUlQocHRyQSk7CisgICAgICAgIEFTU0VSVChwdHJCKTsKKworICAgICAgICBib29sIGlnbm9y
ZVNlcXVlbmNlTnVtYmVyID0gaW5kZXhLZXlzOworICAgICAgICByZXR1cm4gaW5kZXhEYXRhS2V5
QS5jb21wYXJlKGluZGV4RGF0YUtleUIsIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsKKyAgICB9CisK
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworCitLZXlQcmVm
aXg6OktleVByZWZpeCgpCisgICAgOiBtX2RhdGFiYXNlSWQoa0ludmFsaWRUeXBlKQorICAgICwg
bV9vYmplY3RTdG9yZUlkKGtJbnZhbGlkVHlwZSkKKyAgICAsIG1faW5kZXhJZChrSW52YWxpZFR5
cGUpCit7Cit9CisKK0tleVByZWZpeDo6S2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgOiBtX2RhdGFiYXNlSWQo
ZGF0YWJhc2VJZCkKKyAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQorICAgICwg
bV9pbmRleElkKGluZGV4SWQpCit7Cit9CisKK2NvbnN0IGNoYXIqIEtleVByZWZpeDo6ZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQp
Cit7CisgICAgaWYgKHN0YXJ0ID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVu
c2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKnN0YXJ0Kys7CisKKyAgICBpbnQgZGF0YWJhc2VJZEJ5
dGVzID0gKChmaXJzdEJ5dGUgPj4gNSkgJiAweDcpICsgMTsKKyAgICBpbnQgb2JqZWN0U3RvcmVJ
ZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gMikgJiAweDcpICsgMTsKKyAgICBpbnQgaW5kZXhJZEJ5
dGVzID0gKGZpcnN0Qnl0ZSAmIDB4MykgKyAxOworCisgICAgaWYgKHN0YXJ0ICsgZGF0YWJhc2VJ
ZEJ5dGVzICsgb2JqZWN0U3RvcmVJZEJ5dGVzICsgaW5kZXhJZEJ5dGVzID4gbGltaXQpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3Rh
cnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzKTsKKyAgICBzdGFydCArPSBkYXRhYmFzZUlkQnl0
ZXM7CisgICAgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0
ICsgb2JqZWN0U3RvcmVJZEJ5dGVzKTsKKyAgICBzdGFydCArPSBvYmplY3RTdG9yZUlkQnl0ZXM7
CisgICAgcmVzdWx0LT5tX2luZGV4SWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgaW5kZXhJ
ZEJ5dGVzKTsKKyAgICBzdGFydCArPSBpbmRleElkQnl0ZXM7CisKKyAgICByZXR1cm4gc3RhcnQ7
Cit9CisKK1ZlY3RvcjxjaGFyPiBLZXlQcmVmaXg6OmVuY29kZSgpIGNvbnN0Cit7CisgICAgQVNT
RVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52YWxpZElkKTsKKyAgICBBU1NFUlQobV9vYmplY3RTdG9y
ZUlkICE9IGtJbnZhbGlkSWQpOworICAgIEFTU0VSVChtX2luZGV4SWQgIT0ga0ludmFsaWRJZCk7
CisKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YWJhc2VJZFN0cmluZyA9IGVuY29kZUludChtX2RhdGFi
YXNlSWQpOworICAgIFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZUlkU3RyaW5nID0gZW5jb2RlSW50
KG1fb2JqZWN0U3RvcmVJZCk7CisgICAgVmVjdG9yPGNoYXI+IGluZGV4SWRTdHJpbmcgPSBlbmNv
ZGVJbnQobV9pbmRleElkKTsKKworICAgIEFTU0VSVChkYXRhYmFzZUlkU3RyaW5nLnNpemUoKSA8
PSA4KTsKKyAgICBBU1NFUlQob2JqZWN0U3RvcmVJZFN0cmluZy5zaXplKCkgPD0gOCk7CisgICAg
QVNTRVJUKGluZGV4SWRTdHJpbmcuc2l6ZSgpIDw9IDQpOworCisKKyAgICB1bnNpZ25lZCBjaGFy
IGZpcnN0Qnl0ZSA9IChkYXRhYmFzZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IDUgfCAob2JqZWN0
U3RvcmVJZFN0cmluZy5zaXplKCkgLSAxKSA8PCAyIHwgKGluZGV4SWRTdHJpbmcuc2l6ZSgpIC0g
MSk7CisgICAgVmVjdG9yPGNoYXI+IHJldDsKKyAgICByZXQuYXBwZW5kKGZpcnN0Qnl0ZSk7Cisg
ICAgcmV0LmFwcGVuZChkYXRhYmFzZUlkU3RyaW5nKTsKKyAgICByZXQuYXBwZW5kKG9iamVjdFN0
b3JlSWRTdHJpbmcpOworICAgIHJldC5hcHBlbmQoaW5kZXhJZFN0cmluZyk7CisKKyAgICByZXR1
cm4gcmV0OworfQorCitpbnQgS2V5UHJlZml4Ojpjb21wYXJlKGNvbnN0IEtleVByZWZpeCYgb3Ro
ZXIpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBrSW52YWxpZElkKTsKKyAg
ICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlkSWQpOworICAgIEFTU0VSVChtX2lu
ZGV4SWQgIT0ga0ludmFsaWRJZCk7CisKKyAgICBpZiAobV9kYXRhYmFzZUlkICE9IG90aGVyLm1f
ZGF0YWJhc2VJZCkKKyAgICAgICAgcmV0dXJuIG1fZGF0YWJhc2VJZCAtIG90aGVyLm1fZGF0YWJh
c2VJZDsKKyAgICBpZiAobV9vYmplY3RTdG9yZUlkICE9IG90aGVyLm1fb2JqZWN0U3RvcmVJZCkK
KyAgICAgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsK
KyAgICBpZiAobV9pbmRleElkICE9IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgcmV0dXJuIG1f
aW5kZXhJZCAtIG90aGVyLm1faW5kZXhJZDsKKyAgICByZXR1cm4gMDsKK30KKworS2V5UHJlZml4
OjpUeXBlIEtleVByZWZpeDo6dHlwZSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VJ
ZCAhPSBrSW52YWxpZElkKTsKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkICE9IGtJbnZhbGlk
SWQpOworICAgIEFTU0VSVChtX2luZGV4SWQgIT0ga0ludmFsaWRJZCk7CisKKyAgICBpZiAoIW1f
ZGF0YWJhc2VJZCkKKyAgICAgICAgcmV0dXJuIGtHbG9iYWxNZXRhRGF0YTsKKyAgICBpZiAoIW1f
b2JqZWN0U3RvcmVJZCkKKyAgICAgICAgcmV0dXJuIGtEYXRhYmFzZU1ldGFEYXRhOworICAgIGlm
IChtX2luZGV4SWQgPT0ga09iamVjdFN0b3JlRGF0YUluZGV4SWQpCisgICAgICAgIHJldHVybiBr
T2JqZWN0U3RvcmVEYXRhOworICAgIGlmIChtX2luZGV4SWQgPT0ga0V4aXN0c0VudHJ5SW5kZXhJ
ZCkKKyAgICAgICAgcmV0dXJuIGtFeGlzdHNFbnRyeTsKKyAgICBpZiAobV9pbmRleElkID49IGtN
aW5pbXVtSW5kZXhJZCkKKyAgICAgICAgcmV0dXJuIGtJbmRleERhdGE7CisKKyAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4ga0ludmFsaWRUeXBlOworfQorCitWZWN0b3I8Y2hh
cj4gU2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KDAs
IDAsIDApOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0
LmFwcGVuZChlbmNvZGVCeXRlKGtTY2hlbWFWZXJzaW9uVHlwZUJ5dGUpKTsKKyAgICByZXR1cm4g
cmV0OworfQorCitWZWN0b3I8Y2hhcj4gTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCkKK3sKKyAg
ICBLZXlQcmVmaXggcHJlZml4KDAsIDAsIDApOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVm
aXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtNYXhEYXRhYmFzZUlkVHlw
ZUJ5dGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitEYXRhYmFzZUZyZWVMaXN0S2V5OjpEYXRh
YmFzZUZyZWVMaXN0S2V5KCkKKyAgICA6IG1fZGF0YWJhc2VJZCgtMSkKK3sKK30KKworY29uc3Qg
Y2hhciogRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25z
dCBjaGFyKiBsaW1pdCwgRGF0YWJhc2VGcmVlTGlzdEtleSogcmVzdWx0KQoreworICAgIEtleVBy
ZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciAqcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0
LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBB
U1NFUlQoIXByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0
U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICBpZiAocCA9PSBs
aW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9ICpw
Kys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0RhdGFiYXNlRnJl
ZUxpc3RUeXBlQnl0ZSk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOwor
ICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZUlkKTsK
K30KKworVmVjdG9yPGNoYXI+IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29kZShpbnQ2NF90IGRh
dGFiYXNlSWQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICBWZWN0b3I8
Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShr
RGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQo
ZGF0YWJhc2VJZCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludDY0X3QgRGF0YWJhc2VGcmVl
TGlzdEtleTo6ZGF0YWJhc2VJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+
PSAwKTsKKyAgICByZXR1cm4gbV9kYXRhYmFzZUlkOworfQorCitpbnQgRGF0YWJhc2VGcmVlTGlz
dEtleTo6Y29tcGFyZShjb25zdCBEYXRhYmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKK3sK
KyAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgIHJldHVybiBtX2RhdGFiYXNlSWQg
LSBvdGhlci5tX2RhdGFiYXNlSWQ7Cit9CisKK2NvbnN0IGNoYXIqIERhdGFiYXNlTmFtZUtleTo6
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0YWJhc2VOYW1l
S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBw
ID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAoIXAp
CisgICAgICAgIHJldHVybiBwOworICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7Cisg
ICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5t
X2luZGV4SWQpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB1
bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRl
LCB0eXBlQnl0ZSA9PSBrRGF0YWJhc2VOYW1lVHlwZUJ5dGUpOworICAgIGlmIChwID09IGxpbWl0
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBs
aW1pdCwgcmVzdWx0LT5tX29yaWdpbik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsK
KyAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX2Rh
dGFiYXNlTmFtZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZShj
b25zdCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUpCit7CisgICAg
S2V5UHJlZml4IHByZWZpeCgwLCAwLCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4
LmVuY29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrRGF0YWJhc2VOYW1lVHlwZUJ5
dGUpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob3JpZ2luKSk7Cisg
ICAgcmV0LmFwcGVuZChlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGRhdGFiYXNlTmFtZSkpOworICAg
IHJldHVybiByZXQ7Cit9CisKK2ludCBEYXRhYmFzZU5hbWVLZXk6OmNvbXBhcmUoY29uc3QgRGF0
YWJhc2VOYW1lS2V5JiBvdGhlcikKK3sKKyAgICBpZiAoaW50IHggPSBjb2RlUG9pbnRDb21wYXJl
KG1fb3JpZ2luLCBvdGhlci5tX29yaWdpbikpCisgICAgICAgIHJldHVybiB4OworICAgIHJldHVy
biBjb2RlUG9pbnRDb21wYXJlKG1fZGF0YWJhc2VOYW1lLCBvdGhlci5tX2RhdGFiYXNlTmFtZSk7
Cit9CisKK1ZlY3RvcjxjaGFyPiBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkLCBNZXRhRGF0YVR5cGUgbWV0YURhdGFUeXBlKQoreworICAgIEtleVByZWZpeCBw
cmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5l
bmNvZGUoKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKSk7CisgICAg
cmV0dXJuIHJldDsKK30KKworT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6T2JqZWN0U3RvcmVNZXRh
RGF0YUtleSgpCisgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgLCBtX21ldGFEYXRhVHlw
ZSgtMSkKK3sKK30KKworY29uc3QgY2hhciogT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVNZXRhRGF0
YUtleSogcmVzdWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciog
cCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFw
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Cisg
ICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5t
X2luZGV4SWQpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB1
bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRl
LCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICBpZiAocCA9
PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1p
dCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgQVNTRVJUKHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICBpZiAocCA9PSBs
aW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1p
dCwgcmVzdWx0LT5tX21ldGFEYXRhVHlwZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgbWV0YURhdGFUeXBlKQoreworICAgIEtleVByZWZpeCBwcmVmaXgoZGF0
YWJhc2VJZCwgMCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsK
KyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa09iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkp
OworICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICByZXQu
YXBwZW5kKGVuY29kZVZhckludChtZXRhRGF0YVR5cGUpKTsKKyAgICByZXR1cm4gcmV0OworfQor
CitpbnQ2NF90IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Om9iamVjdFN0b3JlSWQoKSBjb25zdAor
eworICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgcmV0dXJuIG1fb2JqZWN0
U3RvcmVJZDsKK30KK2ludDY0X3QgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6bWV0YURhdGFUeXBl
KCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9tZXRhRGF0YVR5cGUgPj0gMCk7CisgICAgcmV0dXJu
IG1fbWV0YURhdGFUeXBlOworfQorCitpbnQgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29tcGFy
ZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5JiBvdGhlcikKK3sKKyAgICBBU1NFUlQobV9v
YmplY3RTdG9yZUlkID49IDApOworICAgIEFTU0VSVChtX21ldGFEYXRhVHlwZSA+PSAwKTsKKyAg
ICBpZiAoaW50IHggPSBtX29iamVjdFN0b3JlSWQgLSBvdGhlci5tX29iamVjdFN0b3JlSWQpCisg
ICAgICAgIHJldHVybiB4OyAvLyBGSVhNRTogSXMgdGhpcyBjYXN0IHNhZmU/IEkuZS4sIHdpbGwg
aXQgcHJlc2VydmUgdGhlIHNpZ24/CisgICAgcmV0dXJuIG1fbWV0YURhdGFUeXBlIC0gb3RoZXIu
bV9tZXRhRGF0YVR5cGU7Cit9CisKK0luZGV4TWV0YURhdGFLZXk6OkluZGV4TWV0YURhdGFLZXko
KQorICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICwgbV9pbmRleElkKC0xKQorICAgICwg
bV9tZXRhRGF0YVR5cGUoMCkKK3sKK30KKworY29uc3QgY2hhciogSW5kZXhNZXRhRGF0YUtleTo6
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhNZXRhRGF0
YUtleSogcmVzdWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciog
cCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFw
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Cisg
ICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5t
X2luZGV4SWQpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB1
bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRl
LCB0eXBlQnl0ZSA9PSBrSW5kZXhNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICBpZiAocCA9PSBsaW1p
dCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVz
dWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4SWQpOworICAgIGlm
ICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJl
dHVybiAwOworICAgIHJlc3VsdC0+bV9tZXRhRGF0YVR5cGUgPSAqcCsrOworICAgIHJldHVybiBw
OworfQorCitWZWN0b3I8Y2hhcj4gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVk
IGNoYXIgbWV0YURhdGFUeXBlKQoreworICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCwg
MCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICByZXQu
YXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4TWV0YURhdGFUeXBlQnl0ZSkpOworICAgIHJldC5hcHBl
bmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZVZh
ckludChpbmRleElkKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKG1ldGFEYXRhVHlwZSkp
OworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBJbmRleE1ldGFEYXRhS2V5Ojpjb21wYXJlKGNv
bnN0IEluZGV4TWV0YURhdGFLZXkmIG90aGVyKQoreworICAgIEFTU0VSVChtX29iamVjdFN0b3Jl
SWQgPj0gMCk7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKworICAgIGlmIChpbnQgeCA9
IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgcmV0dXJu
IHg7CisgICAgaWYgKGludCB4ID0gbV9pbmRleElkIC0gb3RoZXIubV9pbmRleElkKQorICAgICAg
ICByZXR1cm4geDsKKyAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRh
VHlwZTsKK30KKworaW50NjRfdCBJbmRleE1ldGFEYXRhS2V5OjppbmRleElkKCkgY29uc3QKK3sK
KyAgICBBU1NFUlQobV9pbmRleElkID49IDApOworICAgIHJldHVybiBtX2luZGV4SWQ7Cit9CisK
K09iamVjdFN0b3JlRnJlZUxpc3RLZXk6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXkoKQorICAgIDog
bV9vYmplY3RTdG9yZUlkKC0xKQoreworfQorCitjb25zdCBjaGFyKiBPYmplY3RTdG9yZUZyZWVM
aXN0S2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAg
ICBjb25zdCBjaGFyICpwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4
KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIEFTU0VSVChwcmVmaXgubV9k
YXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFT
U0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJl
dHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAqcCsrOworICAgIEFTU0VSVF9V
TlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IGtPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUp
OworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGVj
b2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7Cit9CisKK1ZlY3Rv
cjxjaGFyPiBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFz
ZUlkLCAwLCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOworICAg
IHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKSk7Cisg
ICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgIHJldHVybiBy
ZXQ7Cit9CisKK2ludDY0X3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCgp
IGNvbnN0Cit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICByZXR1cm4g
bV9vYmplY3RTdG9yZUlkOworfQorCitpbnQgT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFy
ZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5JiBvdGhlcikKK3sKKyAgICAvLyBGSVhNRTog
SXQgbWF5IHNlZW0gc3RyYW5nZSB0aGF0IHdlJ3JlIG5vdCBjb21wYXJpbmcgZGF0YWJhc2UgaWQn
cywKKyAgICAvLyBidXQgdGhhdCBjb21wYXJpc29uIHdpbGwgaGF2ZSBiZWVuIG1hZGUgZWFybGll
ci4KKyAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgbWFrZSB0aGlzIG1vcmUgY2xlYXIsIHRob3Vn
aC4uLgorICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgcmV0dXJuIG1fb2Jq
ZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZDsKK30KKworSW5kZXhGcmVlTGlzdEtl
eTo6SW5kZXhGcmVlTGlzdEtleSgpCisgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgLCBt
X2luZGV4SWQoLTEpCit7Cit9CisKK2NvbnN0IGNoYXIqIEluZGV4RnJlZUxpc3RLZXk6OmRlY29k
ZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4RnJlZUxpc3RLZXkq
IHJlc3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBL
ZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFT
U0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRl
eElkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWdu
ZWQgY2hhciB0eXBlQnl0ZSA9ICpwKys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlw
ZUJ5dGUgPT0ga0luZGV4RnJlZUxpc3RUeXBlQnl0ZSk7CisgICAgaWYgKHAgPT0gbGltaXQpCisg
ICAgICAgIHJldHVybiAwOworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIHJl
dHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9pbmRleElkKTsKK30KKworVmVj
dG9yPGNoYXI+IEluZGV4RnJlZUxpc3RLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQoreworICAgIEtleVByZWZpeCBw
cmVmaXgoZGF0YWJhc2VJZCwgMCwgMCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5l
bmNvZGUoKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa0luZGV4RnJlZUxpc3RUeXBlQnl0
ZSkpOworICAgIHJldC5hcHBlbmQoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICBy
ZXQuYXBwZW5kKGVuY29kZVZhckludChpbmRleElkKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwor
aW50IEluZGV4RnJlZUxpc3RLZXk6OmNvbXBhcmUoY29uc3QgSW5kZXhGcmVlTGlzdEtleSYgb3Ro
ZXIpCit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICBBU1NFUlQobV9p
bmRleElkID49IDApOworICAgIGlmIChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1f
b2JqZWN0U3RvcmVJZCkKKyAgICAgICAgcmV0dXJuIHg7CisgICAgcmV0dXJuIG1faW5kZXhJZCAt
IG90aGVyLm1faW5kZXhJZDsKK30KKworaW50NjRfdCBJbmRleEZyZWVMaXN0S2V5OjpvYmplY3RT
dG9yZUlkKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAg
IHJldHVybiBtX29iamVjdFN0b3JlSWQ7Cit9CisKK2ludDY0X3QgSW5kZXhGcmVlTGlzdEtleTo6
aW5kZXhJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKyAgICByZXR1
cm4gbV9pbmRleElkOworfQorCisvLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1
cCBvYmplY3Qgc3RvcmUgaWRzLCBiZWNhdXNlIGEgbWFwcGluZworLy8gaXMga2VwdCBpbiB0aGUg
SURCRGF0YWJhc2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBwaW5nIGJlY29tZSB1bnJlbGlhYmxl
PworLy8gQ2FuIHdlIHJlbW92ZSB0aGlzPworY29uc3QgY2hhciogT2JqZWN0U3RvcmVOYW1lc0tl
eTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3Rv
cmVOYW1lc0tleSogcmVzdWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3Qg
Y2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAg
aWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJ
ZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXBy
ZWZpeC5tX2luZGV4SWQpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsK
KyAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gKnArKzsKKyAgICBBU1NFUlRfVU5VU0VEKHR5
cGVCeXRlLCB0eXBlQnl0ZSA9PSBrT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlKTsKKyAgICByZXR1
cm4gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3Jl
TmFtZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZU5hbWVzS2V5OjplbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG9iamVjdFN0b3JlTmFtZSkKK3sKKyAgICBL
ZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIDAsIDApOworICAgIFZlY3RvcjxjaGFyPiByZXQg
PSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVCeXRlKGtTY2hlbWFWZXJz
aW9uVHlwZUJ5dGUpKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZUJ5dGUoa09iamVjdFN0b3JlTmFt
ZXNUeXBlQnl0ZSkpOworICAgIHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChvYmpl
Y3RTdG9yZU5hbWUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgT2JqZWN0U3RvcmVOYW1l
c0tleTo6Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZU5hbWVzS2V5JiBvdGhlcikKK3sKKyAgICBy
ZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVjdFN0b3JlTmFtZSwgb3RoZXIubV9vYmplY3RT
dG9yZU5hbWUpOworfQorCitJbmRleE5hbWVzS2V5OjpJbmRleE5hbWVzS2V5KCkKKyAgICA6IG1f
b2JqZWN0U3RvcmVJZCgtMSkKK3sKK30KKworLy8gRklYTUU6IFdlIG5ldmVyIHVzZSB0aGlzIHRv
IGxvb2sgdXAgaW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGluZworLy8gaXMga2VwdCBhdCBhIGhp
Z2hlciBsZXZlbC4KK2NvbnN0IGNoYXIqIEluZGV4TmFtZXNLZXk6OmRlY29kZShjb25zdCBjaGFy
KiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TmFtZXNLZXkqIHJlc3VsdCkKK3sKKyAg
ICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29k
ZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1f
b2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICBpZiAo
cCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0
ZSA9ICpwKys7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0ga0luZGV4
TmFtZXNLZXlUeXBlQnl0ZSk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAw
OworICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlk
KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBkZWNvZGVTdHJp
bmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhOYW1lKTsKK30KKworVmVjdG9y
PGNoYXI+IEluZGV4TmFtZXNLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgU3RyaW5nJiBpbmRleE5hbWUpCit7CisgICAgS2V5UHJlZml4
IHByZWZpeChkYXRhYmFzZUlkLCAwLCAwKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4
LmVuY29kZSgpOworICAgIHJldC5hcHBlbmQoZW5jb2RlQnl0ZShrSW5kZXhOYW1lc0tleVR5cGVC
eXRlKSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAg
IHJldC5hcHBlbmQoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChpbmRleE5hbWUpKTsKKyAgICByZXR1
cm4gcmV0OworfQorCitpbnQgSW5kZXhOYW1lc0tleTo6Y29tcGFyZShjb25zdCBJbmRleE5hbWVz
S2V5JiBvdGhlcikKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgIGlm
IChpbnQgeCA9IG1fb2JqZWN0U3RvcmVJZCAtIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAg
ICAgcmV0dXJuIHg7CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9pbmRleE5hbWUsIG90
aGVyLm1faW5kZXhOYW1lKTsKK30KKworY29uc3QgY2hhciogT2JqZWN0U3RvcmVEYXRhS2V5Ojpk
ZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgT2JqZWN0U3RvcmVEYXRh
S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBw
ID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7CisgICAgaWYgKCFwKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAg
QVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVChwcmVmaXgubV9pbmRl
eElkID09IGtTcGVjaWFsSW5kZXhOdW1iZXIpOworICAgIGlmIChwID09IGVuZCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3Vs
dC0+bV9lbmNvZGVkVXNlcktleSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29u
c3QgVmVjdG9yPGNoYXI+IGVuY29kZWRVc2VyS2V5KQoreworICAgIEtleVByZWZpeCBwcmVmaXgo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga1NwZWNpYWxJbmRleE51bWJlcik7CisgICAgVmVj
dG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICByZXQuYXBwZW5kKGVuY29kZWRV
c2VyS2V5KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQoreworICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsKK30KKworaW50IE9iamVj
dFN0b3JlRGF0YUtleTo6Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZURhdGFLZXkmIG90aGVyKQor
eworICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3Ro
ZXIubV9lbmNvZGVkVXNlcktleSk7Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5PiBPYmplY3RTdG9y
ZURhdGFLZXk6OnVzZXJLZXkoKSBjb25zdAoreworICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAg
ICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5
LmVuZCgpLCBrZXkpOworICAgIHJldHVybiBrZXk7Cit9CisKK2NvbnN0IGludDY0X3QgT2JqZWN0
U3RvcmVEYXRhS2V5OjprU3BlY2lhbEluZGV4TnVtYmVyID0ga09iamVjdFN0b3JlRGF0YUluZGV4
SWQ7CisKK2NvbnN0IGNoYXIqIEV4aXN0c0VudHJ5S2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3Rh
cnQsIGNvbnN0IGNoYXIqIGVuZCwgRXhpc3RzRW50cnlLZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQ
cmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFy
dCwgZW5kLCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIEFT
U0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQocHJlZml4Lm1fb2JqZWN0U3Rv
cmVJZCk7CisgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPT0ga1NwZWNpYWxJbmRleE51bWJl
cik7CisgICAgaWYgKHAgPT0gZW5kKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZXh0
cmFjdEVuY29kZWRJREJLZXkocCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKK30K
KworVmVjdG9yPGNoYXI+IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2RlZEtleSkK
K3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtTcGVj
aWFsSW5kZXhOdW1iZXIpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7
CisgICAgcmV0LmFwcGVuZChlbmNvZGVkS2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0
b3I8Y2hhcj4gRXhpc3RzRW50cnlLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQoreworICAgIHJldHVybiBl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsK
K30KKworaW50IEV4aXN0c0VudHJ5S2V5Ojpjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBv
dGhlcikKK3sKKyAgICByZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJL
ZXksIG90aGVyLm1fZW5jb2RlZFVzZXJLZXkpOworfQorCitQYXNzUmVmUHRyPElEQktleT4gRXhp
c3RzRW50cnlLZXk6OnVzZXJLZXkoKSBjb25zdAoreworICAgIFJlZlB0cjxJREJLZXk+IGtleTsK
KyAgICBkZWNvZGVJREJLZXkobV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2Vy
S2V5LmVuZCgpLCBrZXkpOworICAgIHJldHVybiBrZXk7Cit9CisKK2NvbnN0IGludDY0X3QgRXhp
c3RzRW50cnlLZXk6OmtTcGVjaWFsSW5kZXhOdW1iZXIgPSBrRXhpc3RzRW50cnlJbmRleElkOwor
CitJbmRleERhdGFLZXk6OkluZGV4RGF0YUtleSgpCisgICAgOiBtX2RhdGFiYXNlSWQoLTEpCisg
ICAgLCBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgLCBtX2luZGV4SWQoLTEpCisgICAgLCBtX3Nl
cXVlbmNlTnVtYmVyKC0xKQoreworfQorCitjb25zdCBjaGFyKiBJbmRleERhdGFLZXk6OmRlY29k
ZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4RGF0YUtleSogcmVz
dWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hhciogcCA9IEtleVBy
ZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJU
KHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID49
IGtNaW5pbXVtSW5kZXhJZCk7CisgICAgcmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBwcmVmaXgubV9k
YXRhYmFzZUlkOworICAgIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkID0gcHJlZml4Lm1fb2JqZWN0
U3RvcmVJZDsKKyAgICByZXN1bHQtPm1faW5kZXhJZCA9IHByZWZpeC5tX2luZGV4SWQ7CisgICAg
cCA9IGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGxpbWl0LCAmcmVzdWx0LT5tX2VuY29kZWRVc2Vy
S2V5KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwID09IGxpbWl0
KSB7CisgICAgICAgIHJlc3VsdC0+bV9zZXF1ZW5jZU51bWJlciA9IC0xOyAvLyBGSVhNRTogV2Ug
c2hvdWxkIGNoYW5nZSBpdCBzbyB0aGF0IGFsbCBrZXlzIGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIu
IFNob3VsZG4ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgIHJldHVybiBwOwor
ICAgIH0KKyAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fc2VxdWVu
Y2VOdW1iZXIpOworfQorCitWZWN0b3I8Y2hhcj4gSW5kZXhEYXRhS2V5OjplbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkVXNlcktleSwgaW50NjRfdCBzZXF1ZW5jZU51bWJlcikK
K3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFw
cGVuZChlbmNvZGVkVXNlcktleSk7CisgICAgcmV0LmFwcGVuZChlbmNvZGVWYXJJbnQoc2VxdWVu
Y2VOdW1iZXIpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0b3I8Y2hhcj4gSW5kZXhEYXRh
S2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5LCBpbnQ2NF90IHNlcXVlbmNlTnVt
YmVyKQoreworICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpLCBzZXF1ZW5jZU51bWJlcik7Cit9CisKK1ZlY3Rv
cjxjaGFyPiBJbmRleERhdGFLZXk6OmVuY29kZU1heEtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIElOVDMyX01BWCwgbWF4SURCS2V5KCksIElOVDY0X01BWCk7Cit9CisKK2lu
dCBJbmRleERhdGFLZXk6OmNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBp
Z25vcmVTZXF1ZW5jZU51bWJlcikKK3sKKyAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOwor
ICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+
PSAwKTsKKyAgICBpZiAoaW50IHggPSBjb21wYXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNl
cktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktleSkpCisgICAgICAgIHJldHVybiB4OworICAgIGlm
IChpZ25vcmVTZXF1ZW5jZU51bWJlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1f
c2VxdWVuY2VOdW1iZXIgLSBvdGhlci5tX3NlcXVlbmNlTnVtYmVyOworfQorCitpbnQ2NF90IElu
ZGV4RGF0YUtleTo6ZGF0YWJhc2VJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VJ
ZCA+PSAwKTsKKyAgICByZXR1cm4gbV9kYXRhYmFzZUlkOworfQorCitpbnQ2NF90IEluZGV4RGF0
YUtleTo6b2JqZWN0U3RvcmVJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJ
ZCA+PSAwKTsKKyAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOworfQorCitpbnQ2NF90IEluZGV4
RGF0YUtleTo6aW5kZXhJZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsK
KyAgICByZXR1cm4gbV9pbmRleElkOworfQorCitQYXNzUmVmUHRyPElEQktleT4gSW5kZXhEYXRh
S2V5Ojp1c2VyS2V5KCkgY29uc3QKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBrZXk7CisgICAgZGVj
b2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVkVXNlcktleS5lbmQo
KSwga2V5KTsKKyAgICByZXR1cm4ga2V5OworfQorCit9IC8vIG5hbWVzcGFjZSBJREJMZXZlbERC
Q29kaW5nCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTEVWRUxE
QikKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5oIGIvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJMZXZlbERCQ29kaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmZjZjY3NjEzOTA3ZmUyN2I0MWNi
MTFkOThmNzBhM2E4MWI3NmNmYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5oCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBJREJMZXZlbERCQ29kaW5nX2gKKyNkZWZpbmUgSURCTGV2ZWxEQkNvZGluZ19oCisKKyNpZiBF
TkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSURCS2V5Owor
Y2xhc3MgTGV2ZWxEQlNsaWNlOworCituYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZyB7CisKK2Nv
bnN0IHVuc2lnbmVkIGNoYXIga01pbmltdW1JbmRleElkID0gMzA7CisKK1ZlY3RvcjxjaGFyPiBl
bmNvZGVCeXRlKHVuc2lnbmVkIGNoYXIpOworVmVjdG9yPGNoYXI+IG1heElEQktleSgpOworVmVj
dG9yPGNoYXI+IG1pbklEQktleSgpOworVmVjdG9yPGNoYXI+IGVuY29kZUludChpbnQ2NF90KTsK
K2ludDY0X3QgZGVjb2RlSW50KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpOwor
VmVjdG9yPGNoYXI+IGVuY29kZVZhckludChpbnQ2NF90KTsKK2NvbnN0IGNoYXIqIGRlY29kZVZh
ckludChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQp
OworVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmKTsKK1N0cmluZyBkZWNv
ZGVTdHJpbmcoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogZW5kKTsKK1ZlY3RvcjxjaGFyPiBl
bmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IFN0cmluZyYpOworY29uc3QgY2hhciogZGVjb2Rl
U3RyaW5nV2l0aExlbmd0aChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgU3RyaW5n
JiBmb3VuZFN0cmluZyk7CitWZWN0b3I8Y2hhcj4gZW5jb2RlRG91YmxlKGRvdWJsZSk7Citjb25z
dCBjaGFyKiBkZWNvZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRv
dWJsZSopOworVmVjdG9yPGNoYXI+IGVuY29kZUlEQktleShjb25zdCBJREJLZXkmKTsKK2NvbnN0
IGNoYXIqIGRlY29kZUlEQktleShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgUmVm
UHRyPElEQktleT4mIGZvdW5kS2V5KTsKK2NvbnN0IGNoYXIqIGV4dHJhY3RFbmNvZGVkSURCS2V5
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgVmVjdG9yPGNoYXI+KiByZXN1
bHQpOworaW50IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhjb25zdCBWZWN0b3I8Y2hhcj4mLCBjb25z
dCBWZWN0b3I8Y2hhcj4mKTsKKworaW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNlJiwgY29u
c3QgTGV2ZWxEQlNsaWNlJiwgYm9vbCBpbmRleEtleXMgPSBmYWxzZSk7CisKK2NsYXNzIEtleVBy
ZWZpeCB7CitwdWJsaWM6CisgICAgS2V5UHJlZml4KCk7CisgICAgS2V5UHJlZml4KGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOworCisg
ICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hh
ciogbGltaXQsIEtleVByZWZpeCogcmVzdWx0KTsKKyAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlKCkg
Y29uc3Q7CisgICAgaW50IGNvbXBhcmUoY29uc3QgS2V5UHJlZml4JiBvdGhlcikgY29uc3Q7CisK
KyAgICBlbnVtIFR5cGUgeworICAgICAgICBrR2xvYmFsTWV0YURhdGEsCisgICAgICAgIGtEYXRh
YmFzZU1ldGFEYXRhLAorICAgICAgICBrT2JqZWN0U3RvcmVEYXRhLAorICAgICAgICBrRXhpc3Rz
RW50cnksCisgICAgICAgIGtJbmRleERhdGEsCisgICAgICAgIGtJbnZhbGlkVHlwZQorICAgIH07
CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdDsKKworICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOwor
ICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworCisg
ICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0ludmFsaWRJZCA9IC0xOworfTsKKworY2xhc3MgU2No
ZW1hVmVyc2lvbktleSB7CitwdWJsaWM6CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUo
KTsKK307CisKK2NsYXNzIE1heERhdGFiYXNlSWRLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlKCk7Cit9OworCitjbGFzcyBEYXRhYmFzZUZyZWVMaXN0S2V5IHsK
K3B1YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCk7CisgICAgc3RhdGljIGNvbnN0IGNo
YXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIERhdGFiYXNl
RnJlZUxpc3RLZXkqIHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkKTsKKyAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBjb25zdDsKKyAgICBp
bnQgY29tcGFyZShjb25zdCBEYXRhYmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3Q7CisKK3By
aXZhdGU6CisgICAgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Cit9OworCitjbGFzcyBEYXRhYmFzZU5h
bWVLZXkgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hh
ciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCk7Cisg
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0
IFN0cmluZyYgZGF0YWJhc2VOYW1lKTsKKyAgICBTdHJpbmcgb3JpZ2luKCkgY29uc3QgeyByZXR1
cm4gbV9vcmlnaW47IH0KKyAgICBTdHJpbmcgZGF0YWJhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhYmFzZU5hbWU7IH0KKyAgICBpbnQgY29tcGFyZShjb25zdCBEYXRhYmFzZU5hbWVLZXkm
IG90aGVyKTsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9vcmlnaW47IC8vIEZJWE1FOiBTdG9y
ZSBlbmNvZGVkIHN0cmluZ3MsIG9yIGp1c3QgcG9pbnRlcnMuCisgICAgU3RyaW5nIG1fZGF0YWJh
c2VOYW1lOworfTsKKworY2xhc3MgRGF0YWJhc2VNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAg
ZW51bSBNZXRhRGF0YVR5cGUgeworICAgICAgICBrT3JpZ2luTmFtZSA9IDAsCisgICAgICAgIGtE
YXRhYmFzZU5hbWUgPSAxLAorICAgICAgICBrVXNlclZlcnNpb24gPSAyLAorICAgICAgICBrTWF4
T2JqZWN0U3RvcmVJZCA9IDMKKyAgICB9OworCisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBNZXRhRGF0YVR5cGUpOworfTsKKworY2xhc3MgT2JqZWN0
U3RvcmVNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSgp
OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0
IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1bHQpOworICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IG1ldGFEYXRhVHlwZSk7CisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlk
KCkgY29uc3Q7CisgICAgaW50NjRfdCBtZXRhRGF0YVR5cGUoKSBjb25zdDsKKyAgICBpbnQgY29t
cGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5JiBvdGhlcik7CisKK3ByaXZhdGU6Cisg
ICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX21ldGFEYXRhVHlwZTsg
Ly8gRklYTUU6IE1ha2UgdGhpcyBhIGJ5dGUuCit9OworCitjbGFzcyBJbmRleE1ldGFEYXRhS2V5
IHsKK3B1YmxpYzoKKyAgICBJbmRleE1ldGFEYXRhS2V5KCk7CisgICAgc3RhdGljIGNvbnN0IGNo
YXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TWV0
YURhdGFLZXkqIHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgdW5z
aWduZWQgY2hhciBtZXRhRGF0YVR5cGUpOworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4TWV0
YURhdGFLZXkmIG90aGVyKTsKKyAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdDsKKyAgICB1bnNp
Z25lZCBjaGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWV0YURhdGFUeXBlOyB9
CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBt
X2luZGV4SWQ7CisgICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlwZTsKK307CisKK2NsYXNz
IE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgeworcHVibGljOgorICAgIE9iamVjdFN0b3JlRnJlZUxp
c3RLZXkoKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0
LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSogcmVzdWx0KTsKKyAg
ICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCk7CisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3Q7CisgICAg
aW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYgb3RoZXIpOworCitwcml2
YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworfTsKKworY2xhc3MgSW5kZXhGcmVl
TGlzdEtleSB7CitwdWJsaWM6CisgICAgSW5kZXhGcmVlTGlzdEtleSgpOworICAgIHN0YXRpYyBj
b25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJ
bmRleEZyZWVMaXN0S2V5KiByZXN1bHQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQpOworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKTsKKyAg
ICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdDsKKyAgICBpbnQ2NF90IGluZGV4SWQoKSBj
b25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBpbnQ2
NF90IG1faW5kZXhJZDsKK307CisKK2NsYXNzIE9iamVjdFN0b3JlTmFtZXNLZXkgeworcHVibGlj
OgorICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVwIG9iamVjdCBzdG9y
ZSBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisgICAgLy8gaXMga2VwdCBpbiB0aGUgSURCRGF0YWJh
c2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBwaW5nIGJlY29tZSB1bnJlbGlhYmxlPworICAgIC8v
IENhbiB3ZSByZW1vdmUgdGhpcz8KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0
IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVOYW1lc0tleSogcmVz
dWx0KTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQs
IGNvbnN0IFN0cmluZyYgb2JqZWN0U3RvcmVOYW1lKTsKKyAgICBpbnQgY29tcGFyZShjb25zdCBP
YmplY3RTdG9yZU5hbWVzS2V5JiBvdGhlcik7CisgICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0U3RvcmVOYW1lOyB9CisKK3ByaXZhdGU6CisgICAgU3Ry
aW5nIG1fb2JqZWN0U3RvcmVOYW1lOyAvLyBGSVhNRTogU3RvcmUgdGhlIGVuY29kZWQgc3RyaW5n
LCBvciBqdXN0IHBvaW50ZXJzIHRvIGl0LgorfTsKKworY2xhc3MgSW5kZXhOYW1lc0tleSB7Citw
dWJsaWM6CisgICAgSW5kZXhOYW1lc0tleSgpOworICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1c2Ug
dGhpcyB0byBsb29rIHVwIGluZGV4IGlkcywgYmVjYXVzZSBhIG1hcHBpbmcKKyAgICAvLyBpcyBr
ZXB0IGF0IGEgaGlnaGVyIGxldmVsLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiByZXN1bHQp
OworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIGluZGV4TmFtZSk7CisgICAgaW50IGNv
bXBhcmUoY29uc3QgSW5kZXhOYW1lc0tleSYgb3RoZXIpOworICAgIFN0cmluZyBpbmRleE5hbWUo
KSBjb25zdCB7IHJldHVybiBtX2luZGV4TmFtZTsgfQorCitwcml2YXRlOgorICAgIGludDY0X3Qg
bV9vYmplY3RTdG9yZUlkOworICAgIFN0cmluZyBtX2luZGV4TmFtZTsKK307CisKK2NsYXNzIE9i
amVjdFN0b3JlRGF0YUtleSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29k
ZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURhdGFLZXkq
IHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiBlbmNvZGVkVXNl
cktleSk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSk7CisgICAgaW50
IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlcik7CisgICAgUGFzc1JlZlB0
cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU3Bl
Y2lhbEluZGV4TnVtYmVyOworCitwcml2YXRlOgorICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRV
c2VyS2V5OworfTsKKworY2xhc3MgRXhpc3RzRW50cnlLZXkgeworcHVibGljOgorICAgIHN0YXRp
YyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwg
RXhpc3RzRW50cnlLZXkqIHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFZlY3Rvcjxj
aGFyPiYgZW5jb2RlZEtleSk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktl
eSk7CisgICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkmIG90aGVyKTsKKyAgICBQ
YXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGlu
dDY0X3Qga1NwZWNpYWxJbmRleE51bWJlcjsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y2hhcj4g
bV9lbmNvZGVkVXNlcktleTsKK307CisKK2NsYXNzIEluZGV4RGF0YUtleSB7CitwdWJsaWM6Cisg
ICAgSW5kZXhEYXRhS2V5KCk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBj
aGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4RGF0YUtleSogcmVzdWx0KTsKKyAg
ICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29k
ZWRVc2VyS2V5LCBpbnQ2NF90IHNlcXVlbmNlTnVtYmVyKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNo
YXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXkmIHVzZXJLZXksIGludDY0X3Qgc2VxdWVuY2VOdW1i
ZXIpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICBpbnQgY29tcGFyZShjb25zdCBJbmRl
eERhdGFLZXkmIG90aGVyLCBib29sIGlnbm9yZVNlcXVlbmNlTnVtYmVyKTsKKyAgICBpbnQ2NF90
IGRhdGFiYXNlSWQoKSBjb25zdDsKKyAgICBpbnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdDsK
KyAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdDsKKyAgICBQYXNzUmVmUHRyPElEQktleT4gdXNl
cktleSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOworICAg
IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9pbmRleElkOworICAgIFZl
Y3RvcjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5OworICAgIGludDY0X3QgbV9zZXF1ZW5jZU51bWJl
cjsKK307CisKK30gLy8gbmFtZXNwYWNlIElEQkxldmVsREJDb2RpbmcKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxF
KElOREVYRURfREFUQUJBU0UpCisKKyNlbmRpZiAvLyBJREJMZXZlbERCQ29kaW5nX2gK
</data>
<flag name="review"
          id="84069"
          type_id="1"
          status="+"
          setter="tonyg"
    />
          </attachment>
      

    </bug>

</bugzilla>