<?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>174871</bug_id>
          
          <creation_ts>2017-07-26 13:33:15 -0700</creation_ts>
          <short_desc>Rename {Web/UI}Process/Storage to {Web/UI}Process/WebStorage</short_desc>
          <delta_ts>2017-07-26 15:52:45 -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>WebKit2</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Brady Eidson">beidson</reporter>
          <assigned_to name="Brady Eidson">beidson</assigned_to>
          <cc>buildbot</cc>
    
    <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1332424</commentid>
    <comment_count>0</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-07-26 13:33:15 -0700</bug_when>
    <thetext>Rename {Web/UI}Process/Storage to {Web/UI}Process/WebStorage

The standard this directories help implement is the &quot;WebStorage&quot; standard, and &quot;Storage&quot; is too general of a concept that we&apos;ll want to start using in other contexts soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332428</commentid>
    <comment_count>1</comment_count>
      <attachid>316472</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-07-26 13:45:15 -0700</bug_when>
    <thetext>Created attachment 316472
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332430</commentid>
    <comment_count>2</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-07-26 13:48:23 -0700</bug_when>
    <thetext>Attachment 316472 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.cpp:252:  &apos;localStorageDatabase&apos; is incorrectly named. It should be named &apos;protectedThis&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/UIProcess/WebStorage/StorageManager.cpp:597:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 5 in 23 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332435</commentid>
    <comment_count>3</comment_count>
      <attachid>316474</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-07-26 13:56:40 -0700</bug_when>
    <thetext>Created attachment 316474
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332439</commentid>
    <comment_count>4</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-07-26 14:00:35 -0700</bug_when>
    <thetext>Attachment 316474 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.cpp:252:  &apos;localStorageDatabase&apos; is incorrectly named. It should be named &apos;protectedThis&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/UIProcess/WebStorage/StorageManager.cpp:597:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 5 in 23 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332441</commentid>
    <comment_count>5</comment_count>
      <attachid>316478</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-07-26 14:12:20 -0700</bug_when>
    <thetext>Created attachment 316478
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332442</commentid>
    <comment_count>6</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-07-26 14:15:15 -0700</bug_when>
    <thetext>Attachment 316478 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/WebStorageNamespaceProvider.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.cpp:252:  &apos;localStorageDatabase&apos; is incorrectly named. It should be named &apos;protectedThis&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/UIProcess/WebStorage/StorageManager.cpp:597:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 5 in 26 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332452</commentid>
    <comment_count>7</comment_count>
      <attachid>316482</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-07-26 14:36:35 -0700</bug_when>
    <thetext>Created attachment 316482
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332457</commentid>
    <comment_count>8</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-07-26 14:40:29 -0700</bug_when>
    <thetext>Attachment 316482 did not pass style-queue:


ERROR: Source/WebKit/UIProcess/WebStorage/StorageManager.cpp:597:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 1 in 27 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332484</commentid>
    <comment_count>9</comment_count>
      <attachid>316482</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-07-26 15:52:44 -0700</bug_when>
    <thetext>Comment on attachment 316482
Patch

Clearing flags on attachment: 316482

Committed r219966: &lt;http://trac.webkit.org/changeset/219966&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332485</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-07-26 15:52:45 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316472</attachid>
            <date>2017-07-26 13:45:15 -0700</date>
            <delta_ts>2017-07-26 13:56:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174871-20170726134514.patch</filename>
            <type>text/plain</type>
            <size>317138</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5OTYwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZkMDA4NjNkMWFmZjRkZDFm
YmZhMzAxNzNiYjEwODFkOWVhYzVlYjQuLjcyNWM2ZTc0NjY4YzMyMTYzNWU3ZmI1Y2MyNjYyZTEz
NTI4ZmU3NWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDAgQEAKIDIwMTctMDctMjYgIEJyYWR5IEVp
ZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCisgICAgICAgIFJlbmFtZSB7V2ViL1VJfVByb2Nl
c3MvU3RvcmFnZSB0byB7V2ViL1VJfVByb2Nlc3MvV2ViU3RvcmFnZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDg3MQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBzdGFuZGFyZCB0aGVzZSBkaXJl
Y3RvcmllcyBoZWxwIGltcGxlbWVudCBpcyB0aGUgIldlYiBTdG9yYWdlIiBzdGFuZGFyZC4KKyAg
ICAgICAgIlN0b3JhZ2UiIGlzIHRvbyBnZW5lcmFsIG9mIGEgd29yZCB0aGF0IHdlIGhhdmUgcGxh
bnMgdG8gc3RhcnQgdXNpbmcgaW4gb3RoZXIgY29udGV4dHMgc29vbi4KKworICAgICAgICAqIENN
YWtlTGlzdHMudHh0OgorICAgICAgICAqIFdlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
OgorCisgICAgICAgICogVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZS5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAuCisgICAgICAgICog
VUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oOiBSZW5h
bWVkIGZyb20gU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViU3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcC4KKyAgICAgICAgKiBVSVBy
b2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oOiBSZW5hbWVkIGZyb20gU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oLgorICAg
ICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5j
cHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlci5jcHAuCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2Uv
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oLgorICAgICAg
ICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcDogUmVuYW1lZCBmcm9t
IFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwLgorICAg
ICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmg6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmguCisgICAg
ICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW46IFJl
bmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2Vy
Lm1lc3NhZ2VzLmluLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW06IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0uCisg
ICAgICAgICogVUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2VJT1MubW06IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0uCisKKyAg
ICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcDogUmVuYW1l
ZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5j
cHAuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oOiBS
ZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJ
bXBsLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNw
cDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VB
cmVhTWFwLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFN
YXAuaDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VBcmVhTWFwLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVh
TWFwLm1lc3NhZ2VzLmluOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4uCisgICAgICAgICogV2ViUHJvY2Vzcy9X
ZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcC4KKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaDogUmVuYW1l
ZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJ
bXBsLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlci5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3Rv
cmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwLgorICAgICAgICAqIFdlYlByb2Nl
c3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaDogUmVuYW1lZCBmcm9t
IFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlci5oLgorCisyMDE3LTA3LTI2ICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4K
KwogICAgICAgICBSZW1vdmUgREFUQUJBU0VfUFJPQ0VTUyBidWlsZCBmbGFnLgogICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODY4CiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViS2l0L0NNYWtlTGlz
dHMudHh0CmluZGV4IDEyM2Y0YmZhODEzZjAzZDFkNzMwNTUxZDcwNGVlYTVmMjFkNmI2YjYuLmYz
YzBmYzA0YTE2MjQ4Y2FiMWFiZDRlNzg3OGMzOGNmNTkzMDJhZDMgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYktpdC9DTWFrZUxpc3RzLnR4
dApAQCAtNDQsOCArNDQsOCBAQCBzZXQoV2ViS2l0Ml9JTkNMVURFX0RJUkVDVE9SSUVTCiAgICAg
IiR7V0VCS0lUMl9ESVJ9L1VJUHJvY2Vzcy9OZXR3b3JrL0N1c3RvbVByb3RvY29scyIKICAgICAi
JHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL05vdGlmaWNhdGlvbnMiCiAgICAgIiR7V0VCS0lUMl9E
SVJ9L1VJUHJvY2Vzcy9QbHVnaW5zIgotICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3MvU3Rv
cmFnZSIKICAgICAiJHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL1VzZXJDb250ZW50IgorICAgICIk
e1dFQktJVDJfRElSfS9VSVByb2Nlc3MvV2ViU3RvcmFnZSIKICAgICAiJHtXRUJLSVQyX0RJUn0v
VUlQcm9jZXNzL1dlYnNpdGVEYXRhIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzIgog
ICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL0FwcGxlUGF5IgpAQCAtNzMsMTAgKzczLDEw
IEBAIHNldChXZWJLaXQyX0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtXRUJLSVQyX0RJUn0v
V2ViUHJvY2Vzcy9QbHVnaW5zIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1BsdWdp
bnMvTmV0c2NhcGUiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvUmVzb3VyY2VDYWNo
ZSIKLSAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9TdG9yYWdlIgogICAgICIke1dFQktJ
VDJfRElSfS9XZWJQcm9jZXNzL1VzZXJDb250ZW50IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQ
cm9jZXNzL1dlYkNvcmVTdXBwb3J0IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dl
YlBhZ2UiCisgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvV2ViU3RvcmFnZSIKICAgICAi
JHtERVJJVkVEX1NPVVJDRVNfV0VCS0lUMl9ESVJ9IgogICAgICIke0RFUklWRURfU09VUkNFU19X
RUJLSVQyX0RJUn0vaW5jbHVkZSIKICAgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9XZWJLaXRMaWJy
YXJpZXMiCkBAIC00MjksMTMgKzQyOSwxMyBAQCBzZXQoV2ViS2l0Ml9TT1VSQ0VTCiAgICAgVUlQ
cm9jZXNzL1BsdWdpbnMvUGx1Z2luUHJvY2Vzc01hbmFnZXIuY3BwCiAgICAgVUlQcm9jZXNzL1Bs
dWdpbnMvUGx1Z2luUHJvY2Vzc1Byb3h5LmNwcAogCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2UvTG9j
YWxTdG9yYWdlRGF0YWJhc2UuY3BwCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyLmNwcAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKLQogICAgIFVJUHJvY2Vzcy9Vc2VyQ29udGVu
dC9XZWJTY3JpcHRNZXNzYWdlSGFuZGxlci5jcHAKICAgICBVSVByb2Nlc3MvVXNlckNvbnRlbnQv
V2ViVXNlckNvbnRlbnRDb250cm9sbGVyUHJveHkuY3BwCiAKKyAgICBVSVByb2Nlc3MvV2ViU3Rv
cmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKKyAgICBVSVByb2Nlc3MvV2ViU3RvcmFnZS9M
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwCisgICAgVUlQcm9jZXNzL1dlYlN0b3JhZ2Uv
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcAorCiAgICAgVUlQcm9j
ZXNzL1dlYnNpdGVEYXRhL1dlYnNpdGVEYXRhUmVjb3JkLmNwcAogICAgIFVJUHJvY2Vzcy9XZWJz
aXRlRGF0YS9XZWJzaXRlRGF0YVN0b3JlLmNwcAogCkBAIC01MjcsMTEgKzUyNyw2IEBAIHNldChX
ZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1BsdWdpbnMvTmV0c2NhcGUvTmV0c2NhcGVQ
bHVnaW5Ob25lLmNwcAogICAgIFdlYlByb2Nlc3MvUGx1Z2lucy9OZXRzY2FwZS9OZXRzY2FwZVBs
dWdpblN0cmVhbS5jcHAKIAotICAgIFdlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwu
Y3BwCi0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcAotICAgIFdlYlBy
b2Nlc3MvU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5jcHAKLSAgICBXZWJQcm9jZXNzL1N0
b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcAotCiAgICAgV2ViUHJvY2Vzcy9V
c2VyQ29udGVudC9XZWJVc2VyQ29udGVudENvbnRyb2xsZXIuY3BwCiAKICAgICBXZWJQcm9jZXNz
L1dlYkNvcmVTdXBwb3J0L1Nlc3Npb25TdGF0ZUNvbnZlcnNpb24uY3BwCkBAIC01NzYsNiArNTcx
LDExIEBAIHNldChXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViVVJM
U2NoZW1lSGFuZGxlclByb3h5LmNwcAogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJVUkxTY2hl
bWVUYXNrUHJveHkuY3BwCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlVuZG9TdGVwLmNwcAor
CisgICAgV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKKyAgICBXZWJQ
cm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCisgICAgV2ViUHJvY2Vzcy9XZWJT
dG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcAorICAgIFdlYlByb2Nlc3MvV2ViU3RvcmFn
ZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCiApCiAKIHNldChXZWJLaXQyX01FU1NB
R0VTX0lOX0ZJTEVTCkBAIC02MzEsMTAgKzYzMSwxMCBAQCBzZXQoV2ViS2l0Ml9NRVNTQUdFU19J
Tl9GSUxFUwogCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvUGx1Z2luUHJvY2Vzc1Byb3h5Lm1lc3Nh
Z2VzLmluCiAKLSAgICBVSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5p
bgotCiAgICAgVUlQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250ZW50Q29udHJvbGxlclBy
b3h5Lm1lc3NhZ2VzLmluCiAKKyAgICBVSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdl
ci5tZXNzYWdlcy5pbgorCiAgICAgV2ViUHJvY2Vzcy9XZWJQcm9jZXNzLm1lc3NhZ2VzLmluCiAK
ICAgICBXZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5tZXNz
YWdlcy5pbgpAQCAtNjYxLDggKzY2MSw2IEBAIHNldChXZWJLaXQyX01FU1NBR0VTX0lOX0ZJTEVT
CiAgICAgV2ViUHJvY2Vzcy9QbHVnaW5zL1BsdWdpblByb2Nlc3NDb25uZWN0aW9uTWFuYWdlci5t
ZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvUGx1Z2lucy9QbHVnaW5Qcm94eS5tZXNzYWdlcy5p
bgogCi0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCi0K
ICAgICBXZWJQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250ZW50Q29udHJvbGxlci5tZXNz
YWdlcy5pbgogCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL0RyYXdpbmdBcmVhLm1lc3NhZ2VzLmlu
CkBAIC02NzMsNiArNjcxLDggQEAgc2V0KFdlYktpdDJfTUVTU0FHRVNfSU5fRklMRVMKICAgICBX
ZWJQcm9jZXNzL1dlYlBhZ2UvV2ViSW5zcGVjdG9ySW50ZXJydXB0RGlzcGF0Y2hlci5tZXNzYWdl
cy5pbgogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJJbnNwZWN0b3JVSS5tZXNzYWdlcy5pbgog
ICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCisKKyAgICBXZWJQcm9j
ZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4KICkKIAogc2V0KFdlYlBy
b2Nlc3NfTElCUkFSSUVTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9SZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5kMzA0NTI1Nzc3ODhlOWIwMzgzMTEwZmYwZTU0MjdhOGQ5OTZlNTBiCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlLmNwcApAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJXZWJSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVNb25pdG9y
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9L
ZXllZENvZGluZy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2hhcmVkQnVmZmVyLmg+CisjaW5jbHVk
ZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8
d3RmL3RocmVhZHMvQmluYXJ5U2VtYXBob3JlLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitj
b25zdGV4cHIgU2Vjb25kcyBtaW5pbXVtV3JpdGVJbnRlcnZhbCB7IDVfbWluIH07CisKK3VzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOworCitzdGF0aWMgYm9vbCBoYXNGaWxlQ2hhbmdlZFNpbmNlKGNv
bnN0IFN0cmluZyYgcGF0aCwgV2FsbFRpbWUgc2luY2UpCit7CisgICAgQVNTRVJUKCFSdW5Mb29w
Ojppc01haW4oKSk7CisgICAgdGltZV90IG1vZGlmaWNhdGlvblRpbWU7CisgICAgaWYgKCFnZXRG
aWxlTW9kaWZpY2F0aW9uVGltZShwYXRoLCBtb2RpZmljYXRpb25UaW1lKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICByZXR1cm4gV2FsbFRpbWU6OmZyb21SYXdTZWNvbmRzKG1vZGlmaWNh
dGlvblRpbWUpID4gc2luY2U7Cit9CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8S2V5ZWREZWNv
ZGVyPiBjcmVhdGVEZWNvZGVyRm9yRmlsZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgQVNT
RVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgYXV0byBoYW5kbGUgPSBvcGVuQW5kTG9ja0Zp
bGUocGF0aCwgT3BlbkZvclJlYWQpOworICAgIGlmIChoYW5kbGUgPT0gaW52YWxpZFBsYXRmb3Jt
RmlsZUhhbmRsZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBsb25nIGxvbmcgZmls
ZVNpemUgPSAwOworICAgIGlmICghZ2V0RmlsZVNpemUoaGFuZGxlLCBmaWxlU2l6ZSkpIHsKKyAg
ICAgICAgdW5sb2NrQW5kQ2xvc2VGaWxlKGhhbmRsZSk7CisgICAgICAgIHJldHVybiBudWxscHRy
OworICAgIH0KKworICAgIHNpemVfdCBieXRlc1RvUmVhZDsKKyAgICBpZiAoIVdURjo6Y29udmVy
dFNhZmVseShmaWxlU2l6ZSwgYnl0ZXNUb1JlYWQpKSB7CisgICAgICAgIHVubG9ja0FuZENsb3Nl
RmlsZShoYW5kbGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBWZWN0
b3I8Y2hhcj4gYnVmZmVyKGJ5dGVzVG9SZWFkKTsKKyAgICBzaXplX3QgdG90YWxCeXRlc1JlYWQg
PSByZWFkRnJvbUZpbGUoaGFuZGxlLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKwor
ICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOworCisgICAgaWYgKHRvdGFsQnl0ZXNSZWFk
ICE9IGJ5dGVzVG9SZWFkKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBL
ZXllZERlY29kZXI6OmRlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVm
ZmVyLmRhdGEoKSksIGJ1ZmZlci5zaXplKCkpOworfQorCitSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6OlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZShXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUmIHN0b3JlLCBjb25zdCBTdHJpbmcmIHN0
b3JhZ2VEaXJlY3RvcnlQYXRoKQorICAgIDogbV9tZW1vcnlTdG9yZShzdG9yZSkKKyAgICAsIG1f
c3RvcmFnZURpcmVjdG9yeVBhdGgoc3RvcmFnZURpcmVjdG9yeVBhdGgpCisgICAgLCBtX2FzeW5j
V3JpdGVUaW1lcihSdW5Mb29wOjptYWluKCksIHRoaXMsICZSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6OmFzeW5jV3JpdGVUaW1lckZpcmVkKQoreworfQorCit2b2lkIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6aW5pdGlhbGl6ZSgpCit7Cisg
ICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgcG9wdWxhdGVNZW1vcnlTdG9yZUZy
b21EaXNrKCk7CisgICAgc3RhcnRNb25pdG9yaW5nRGlzaygpOworfQorCitSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6On5SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UoKQoreworICAgIGZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgp
OworICAgIEFTU0VSVCghbV9oYXNQZW5kaW5nV3JpdGUpOworfQorCitTdHJpbmcgUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpzdG9yYWdlRGlyZWN0b3J5UGF0aCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fc3RvcmFnZURpcmVjdG9yeVBhdGguaXNvbGF0ZWRDb3B5KCk7
Cit9CisKK1N0cmluZyBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJl
c291cmNlTG9nRmlsZVBhdGgoKSBjb25zdAoreworICAgIFN0cmluZyBzdG9yYWdlUGF0aCA9IHN0
b3JhZ2VEaXJlY3RvcnlQYXRoKCk7CisgICAgaWYgKHN0b3JhZ2VQYXRoLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIGVtcHR5U3RyaW5nKCk7CisKKyAgICByZXR1cm4gcGF0aEJ5QXBwZW5kaW5n
Q29tcG9uZW50KHN0b3JhZ2VQYXRoLCAiZnVsbF9icm93c2luZ19zZXNzaW9uX3Jlc291cmNlTG9n
LnBsaXN0Iik7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlOjpzdGFydE1vbml0b3JpbmdEaXNrKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFp
bigpKTsKKyAgICBpZiAobV9maWxlTW9uaXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgU3Ry
aW5nIHJlc291cmNlTG9nUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKKyAgICBpZiAocmVz
b3VyY2VMb2dQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9maWxlTW9u
aXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8RmlsZU1vbml0b3I+KHJlc291cmNlTG9nUGF0aCwgbV9t
ZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKSwgW3RoaXNdIChGaWxlTW9uaXRvcjo6RmlsZUNo
YW5nZVR5cGUgdHlwZSkgeworICAgICAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAg
ICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZpbGVDaGFu
Z2VUeXBlOjpNb2RpZmljYXRpb246CisgICAgICAgICAgICByZWZyZXNoTWVtb3J5U3RvcmVGcm9t
RGlzaygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZp
bGVDaGFuZ2VUeXBlOjpSZW1vdmFsOgorICAgICAgICAgICAgbV9tZW1vcnlTdG9yZS5jbGVhcklu
TWVtb3J5KCk7CisgICAgICAgICAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKKyAgICAgICAg
ICAgIG1vbml0b3JEaXJlY3RvcnlGb3JOZXdTdGF0aXN0aWNzKCk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZTo6bW9uaXRvckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKQorewor
ICAgIFN0cmluZyBzdG9yYWdlUGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7CisgICAgQVNT
RVJUKCFzdG9yYWdlUGF0aC5pc0VtcHR5KCkpOworCisgICAgaWYgKCFmaWxlRXhpc3RzKHN0b3Jh
Z2VQYXRoKSkgeworICAgICAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhzdG9yYWdlUGF0aCkp
IHsKKyAgICAgICAgICAgIFJFTEVBU0VfTE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3Ms
ICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6IEZhaWxlZCB0byBjcmVh
dGUgZGlyZWN0b3J5IHBhdGggJXMiLCBzdG9yYWdlUGF0aC51dGY4KCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZmlsZU1vbml0b3IgPSBz
dGQ6Om1ha2VfdW5pcXVlPEZpbGVNb25pdG9yPihzdG9yYWdlUGF0aCwgbV9tZW1vcnlTdG9yZS5z
dGF0aXN0aWNzUXVldWUoKSwgW3RoaXNdIChGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGUgdHlw
ZSkgeworICAgICAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICAgICAgaWYgKHR5
cGUgPT0gRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlOjpSZW1vdmFsKSB7CisgICAgICAgICAg
ICAvLyBEaXJlY3Rvcnkgd2FzIHJlbW92ZWQhCisgICAgICAgICAgICBtX2ZpbGVNb25pdG9yID0g
bnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmlu
ZyByZXNvdXJjZUxvZ1BhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7CisgICAgICAgIEFTU0VS
VCghcmVzb3VyY2VMb2dQYXRoLmlzRW1wdHkoKSk7CisKKyAgICAgICAgaWYgKCFmaWxlRXhpc3Rz
KHJlc291cmNlTG9nUGF0aCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9maWxl
TW9uaXRvciA9IG51bGxwdHI7CisKKyAgICAgICAgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2so
KTsKKyAgICAgICAgc3RhcnRNb25pdG9yaW5nRGlzaygpOworICAgIH0pOworfQorCit2b2lkIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RvcE1vbml0b3JpbmdEaXNr
KCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBtX2ZpbGVNb25pdG9y
ID0gbnVsbHB0cjsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2Vz
IG9uIGRpc2suCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6
cmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNN
YWluKCkpOworCisgICAgU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOwor
ICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdl
IHNvbWV0aW1lcyBzZWUgZmlsZSBjaGFuZ2VkIGV2ZW50cyBmcm9tIGJlZm9yZSBvdXIgbG9hZCBj
b21wbGV0ZWQgKHdlIHN0YXJ0CisgICAgLy8gcmVhZGluZyBhdCB0aGUgZmlyc3QgY2hhbmdlIGV2
ZW50LCBidXQgd2UgbWlnaHQgcmVjZWl2ZSBhIHNlcmllcyBvZiBldmVudHMgcmVsYXRlZAorICAg
IC8vIHRvIHRoZSBzYW1lIGZpbGUgb3BlcmF0aW9uKS4gQ2F0Y2ggdGhpcyBjYXNlIHRvIGF2b2lk
IHJlYWRpbmcgb3Zlcmx5IG9mdGVuLgorICAgIGlmICghaGFzRmlsZUNoYW5nZWRTaW5jZShmaWxl
UGF0aCwgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFdhbGxUaW1lIHJlYWRUaW1lID0gV2FsbFRpbWU6Om5vdygpOworCisgICAgYXV0byBkZWNv
ZGVyID0gY3JlYXRlRGVjb2RlckZvckZpbGUoZmlsZVBhdGgpOworICAgIGlmICghZGVjb2RlcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV9tZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURl
Y29kZXIoKmRlY29kZXIpOworICAgIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSByZWFk
VGltZTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OnBvcHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlzaygpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjpp
c01haW4oKSk7CisKKyAgICBTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7
CisgICAgaWYgKGZpbGVQYXRoLmlzRW1wdHkoKSB8fCAhZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHsK
KyAgICAgICAgbV9tZW1vcnlTdG9yZS5ncmFuZGZhdGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsK
KyAgICAgICAgbW9uaXRvckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmICghaGFzRmlsZUNoYW5nZWRTaW5jZShmaWxlUGF0aCwgbV9s
YXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSkpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byBncmFu
ZGZhdGhlciBpbiB0aGlzIGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXYWxs
VGltZSByZWFkVGltZSA9IFdhbGxUaW1lOjpub3coKTsKKworICAgIGF1dG8gZGVjb2RlciA9IGNy
ZWF0ZURlY29kZXJGb3JGaWxlKGZpbGVQYXRoKTsKKyAgICBpZiAoIWRlY29kZXIpIHsKKyAgICAg
ICAgbV9tZW1vcnlTdG9yZS5ncmFuZGZhdGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9tZW1vcnlTdG9y
ZS5pc0VtcHR5KCksICJUaGlzIGlzIHRoZSBpbml0aWFsIGltcG9ydCBzbyB0aGUgc3RvcmUgc2hv
dWxkIGJlIGVtcHR5Iik7CisgICAgbV9tZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURlY29k
ZXIoKmRlY29kZXIpOworCisgICAgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSA9IHJlYWRU
aW1lOworCisgICAgbV9tZW1vcnlTdG9yZS5sb2dUZXN0aW5nRXZlbnQoQVNDSUlMaXRlcmFsKCJQ
b3B1bGF0ZWRXaXRob3V0R3JhbmRmYXRoZXJpbmciKSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjphc3luY1dyaXRlVGltZXJGaXJlZCgpCit7Cisg
ICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBtX21lbW9yeVN0b3JlLnN0YXRpc3Rp
Y3NRdWV1ZSgpLmRpc3BhdGNoKFt0aGlzXSAoKSBtdXRhYmxlIHsKKyAgICAgICAgd3JpdGVNZW1v
cnlTdG9yZVRvRGlzaygpOworICAgIH0pOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZTo6d3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpCit7CisgICAgQVNT
RVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBtX2hhc1BlbmRpbmdXcml0ZSA9IGZhbHNl
OworICAgIHN0b3BNb25pdG9yaW5nRGlzaygpOworCisgICAgYXV0byBlbmNvZGVyID0gbV9tZW1v
cnlTdG9yZS5jcmVhdGVFbmNvZGVyRnJvbURhdGEoKTsKKyAgICBhdXRvIHJhd0RhdGEgPSBlbmNv
ZGVyLT5maW5pc2hFbmNvZGluZygpOworICAgIGlmICghcmF3RGF0YSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYXV0byBzdG9yYWdlUGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7CisgICAg
aWYgKCFzdG9yYWdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgbWFrZUFsbERpcmVjdG9yaWVz
KHN0b3JhZ2VQYXRoKTsKKyAgICAgICAgZXhjbHVkZUZyb21CYWNrdXAoKTsKKyAgICB9CisKKyAg
ICBhdXRvIGhhbmRsZSA9IG9wZW5BbmRMb2NrRmlsZShyZXNvdXJjZUxvZ0ZpbGVQYXRoKCksIE9w
ZW5Gb3JXcml0ZSk7CisgICAgaWYgKGhhbmRsZSA9PSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxl
KQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQ2NF90IHdyaXR0ZW5CeXRlcyA9IHdyaXRlVG9G
aWxlKGhhbmRsZSwgcmF3RGF0YS0+ZGF0YSgpLCByYXdEYXRhLT5zaXplKCkpOworICAgIHVubG9j
a0FuZENsb3NlRmlsZShoYW5kbGUpOworCisgICAgaWYgKHdyaXR0ZW5CeXRlcyAhPSBzdGF0aWNf
Y2FzdDxpbnQ2NF90PihyYXdEYXRhLT5zaXplKCkpKQorICAgICAgICBSRUxFQVNFX0xPR19FUlJP
UihSZXNvdXJjZUxvYWRTdGF0aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlOiBXZSBvbmx5IHdyb3RlICVkIG91dCBvZiAlenUgYnl0ZXMgdG8gZGlzayIsIHN0
YXRpY19jYXN0PHVuc2lnbmVkPih3cml0dGVuQnl0ZXMpLCByYXdEYXRhLT5zaXplKCkpOworCisg
ICAgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSA9IFdhbGxUaW1lOjpub3coKTsKKyAgICBt
X2xhc3RTdGF0aXN0aWNzV3JpdGVUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisKKyAgICBz
dGFydE1vbml0b3JpbmdEaXNrKCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlOjpzY2hlZHVsZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVkaWF0
ZVdyaXRlIGZvcmNlSW1tZWRpYXRlV3JpdGUpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01h
aW4oKSk7CisKKyAgICBhdXRvIHRpbWVTaW5jZUxhc3RXcml0ZSA9IE1vbm90b25pY1RpbWU6Om5v
dygpIC0gbV9sYXN0U3RhdGlzdGljc1dyaXRlVGltZTsKKyAgICBpZiAoZm9yY2VJbW1lZGlhdGVX
cml0ZSAhPSBGb3JjZUltbWVkaWF0ZVdyaXRlOjpZZXMgJiYgdGltZVNpbmNlTGFzdFdyaXRlIDwg
bWluaW11bVdyaXRlSW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKCFtX2hhc1BlbmRpbmdXcml0ZSkg
eworICAgICAgICAgICAgbV9oYXNQZW5kaW5nV3JpdGUgPSB0cnVlOworICAgICAgICAgICAgU2Vj
b25kcyBkZWxheSA9IG1pbmltdW1Xcml0ZUludGVydmFsIC0gdGltZVNpbmNlTGFzdFdyaXRlICsg
MV9zOworICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0
ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGRlbGF5XSB7CisgICAgICAgICAgICAgICAgbV9hc3lu
Y1dyaXRlVGltZXIuc3RhcnRPbmVTaG90KGRlbGF5KTsKKyAgICAgICAgICAgIH0pOworICAgICAg
ICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNr
KCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpj
bGVhcigpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgU3RyaW5nIGZp
bGVQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOworICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0b3BNb25pdG9yaW5nRGlzaygpOworCisgICAg
aWYgKCFkZWxldGVGaWxlKGZpbGVQYXRoKSkKKyAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVz
b3VyY2VMb2FkU3RhdGlzdGljcywgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZTogVW5hYmxlIHRvIGRlbGV0ZSBzdGF0aXN0aWNzIGZpbGU6ICVzIiwgZmlsZVBhdGgudXRm
OCgpLmRhdGEoKSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlOjpmaW5pc2hBbGxQZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKQoreworICAgIG1fYXN5
bmNXcml0ZVRpbWVyLnN0b3AoKTsKKworICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7Cisg
ICAgLy8gTWFrZSBzdXJlIGFueSBwZW5kaW5nIHdvcmsgaW4gb3VyIHF1ZXVlIGlzIGZpbmlzaGVk
IGJlZm9yZSB3ZSB0ZXJtaW5hdGUuCisgICAgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUo
KS5kaXNwYXRjaChbJnNlbWFwaG9yZSwgdGhpc10geworICAgICAgICAvLyBXcml0ZSBmaW5hbCBm
aWxlIHN0YXRlIHRvIGRpc2suCisgICAgICAgIGlmIChtX2hhc1BlbmRpbmdXcml0ZSkKKyAgICAg
ICAgICAgIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKKyAgICAgICAgc2VtYXBob3JlLnNpZ25h
bCgpOworICAgIH0pOworICAgIHNlbWFwaG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsK
K30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlZigp
Cit7CisgICAgbV9tZW1vcnlTdG9yZS5yZWYoKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmRlcmVmKCkKK3sKKyAgICBtX21lbW9yeVN0b3JlLmRl
cmVmKCk7Cit9CisKKyNpZiAhUExBVEZPUk0oSU9TKQordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKK3sKK30KKyNl
bmRpZgorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uYzVkMmVkNGJjNjkzYmExZWEyMTk0MmU0MDNjZDEzNmQ0ZTc2NzI1
YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8
d3RmL01vbm90b25pY1RpbWUuaD4KKyNpbmNsdWRlIDx3dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUg
PHd0Zi9XYWxsVGltZS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CitjbGFzcyBGaWxlTW9uaXRvcjsKK30KKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK2NsYXNzIFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9yZTsKKworY2xhc3MgUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlIHsKK3B1YmxpYzoKKyAgICBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoV2ViUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1N0b3JlJiwgY29uc3QgU3RyaW5nJiBzdG9yYWdlRGlyZWN0b3J5UGF0aCk7CisgICAgflJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZSgpOworCisgICAgdm9pZCBpbml0
aWFsaXplKCk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBmaW5pc2hBbGxQZW5kaW5n
V29ya1N5bmNocm9ub3VzbHkoKTsKKworICAgIHZvaWQgcmVmKCk7CisgICAgdm9pZCBkZXJlZigp
OworCisgICAgZW51bSBjbGFzcyBGb3JjZUltbWVkaWF0ZVdyaXRlIHsKKyAgICAgICAgTm8sCisg
ICAgICAgIFllcywKKyAgICB9OworICAgIHZvaWQgc2NoZWR1bGVPcldyaXRlTWVtb3J5U3RvcmUo
Rm9yY2VJbW1lZGlhdGVXcml0ZSk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIHN0b3JhZ2VEaXJl
Y3RvcnlQYXRoKCkgY29uc3Q7CisgICAgU3RyaW5nIHJlc291cmNlTG9nRmlsZVBhdGgoKSBjb25z
dDsKKworICAgIHZvaWQgc3RhcnRNb25pdG9yaW5nRGlzaygpOworICAgIHZvaWQgc3RvcE1vbml0
b3JpbmdEaXNrKCk7CisgICAgdm9pZCBtb25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygp
OworCisgICAgdm9pZCB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7CisgICAgdm9pZCBwb3B1bGF0
ZU1lbW9yeVN0b3JlRnJvbURpc2soKTsKKyAgICB2b2lkIGV4Y2x1ZGVGcm9tQmFja3VwKCkgY29u
c3Q7CisgICAgdm9pZCByZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlzaygpOworICAgIHZvaWQgYXN5
bmNXcml0ZVRpbWVyRmlyZWQoKTsKKworICAgIFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9y
ZSYgbV9tZW1vcnlTdG9yZTsKKyAgICBjb25zdCBTdHJpbmcgbV9zdG9yYWdlRGlyZWN0b3J5UGF0
aDsKKyAgICBSdW5Mb29wOjpUaW1lcjxSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2U+IG1fYXN5bmNXcml0ZVRpbWVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpG
aWxlTW9uaXRvcj4gbV9maWxlTW9uaXRvcjsKKyAgICBXYWxsVGltZSBtX2xhc3RTdGF0aXN0aWNz
RmlsZVN5bmNUaW1lOworICAgIE1vbm90b25pY1RpbWUgbV9sYXN0U3RhdGlzdGljc1dyaXRlVGlt
ZTsKKyAgICBib29sIG1faGFzUGVuZGluZ1dyaXRlIHsgZmFsc2UgfTsKK307CisKK30KZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJh
c2UuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRh
YmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OGEzYmQ2ODkwZTUzZDkx
YzM5MDRjOTk3OWU5MWRhZTQ1NTA1MTEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3Jh
Z2VEYXRhYmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJMb2Nh
bFN0b3JhZ2VEYXRhYmFzZS5oIgotCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9TUUxpdGVTdGF0ZW1lbnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVRyYW5zYWN0aW9u
Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbi5oPgotI2luY2x1ZGUgPFdlYkNv
cmUvU3RvcmFnZU1hcC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3VkZGVuVGVybWluYXRpb24uaD4K
LSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJp
bmcuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLXN0YXRpYyBjb25zdCBhdXRvIGRh
dGFiYXNlVXBkYXRlSW50ZXJ2YWwgPSAxX3M7Ci0KLXN0YXRpYyBjb25zdCBpbnQgbWF4aW11bUl0
ZW1zVG9VcGRhdGUgPSAxMDA7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZWY8TG9jYWxTdG9y
YWdlRGF0YWJhc2U+IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjcmVhdGUoUmVmPFdvcmtRdWV1ZT4m
JiBxdWV1ZSwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiB0cmFja2VyLCBjb25z
dCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKFdURk1vdmUocXVldWUpLCBXVEZNb3ZlKHRy
YWNrZXIpLCBzZWN1cml0eU9yaWdpbikpOwotfQotCi1Mb2NhbFN0b3JhZ2VEYXRhYmFzZTo6TG9j
YWxTdG9yYWdlRGF0YWJhc2UoUmVmPFdvcmtRdWV1ZT4mJiBxdWV1ZSwgUmVmPExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcj4mJiB0cmFja2VyLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNl
Y3VyaXR5T3JpZ2luKQotICAgIDogbV9xdWV1ZShXVEZNb3ZlKHF1ZXVlKSkKLSAgICAsIG1fdHJh
Y2tlcihXVEZNb3ZlKHRyYWNrZXIpKQotICAgICwgbV9zZWN1cml0eU9yaWdpbihzZWN1cml0eU9y
aWdpbikKLSAgICAsIG1fZGF0YWJhc2VQYXRoKG1fdHJhY2tlci0+ZGF0YWJhc2VQYXRoKG1fc2Vj
dXJpdHlPcmlnaW4pKQotICAgICwgbV9mYWlsZWRUb09wZW5EYXRhYmFzZShmYWxzZSkKLSAgICAs
IG1fZGlkSW1wb3J0SXRlbXMoZmFsc2UpCi0gICAgLCBtX2lzQ2xvc2VkKGZhbHNlKQotICAgICwg
bV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKGZhbHNlKQotICAgICwgbV9zaG91bGRDbGVhckl0
ZW1zKGZhbHNlKQotewotfQotCi1Mb2NhbFN0b3JhZ2VEYXRhYmFzZTo6fkxvY2FsU3RvcmFnZURh
dGFiYXNlKCkKLXsKLSAgICBBU1NFUlQobV9pc0Nsb3NlZCk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9y
YWdlRGF0YWJhc2U6Om9wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5n
U3RyYXRlZ3kpCi17Ci0gICAgQVNTRVJUKCFtX2RhdGFiYXNlLmlzT3BlbigpKTsKLSAgICBBU1NF
UlQoIW1fZmFpbGVkVG9PcGVuRGF0YWJhc2UpOwotCi0gICAgaWYgKCF0cnlUb09wZW5EYXRhYmFz
ZShvcGVuaW5nU3RyYXRlZ3kpKSB7Ci0gICAgICAgIG1fZmFpbGVkVG9PcGVuRGF0YWJhc2UgPSB0
cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVu
KCkpCi0gICAgICAgIG1fdHJhY2tlci0+ZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdpbihtX3NlY3Vy
aXR5T3JpZ2luKTsKLX0KLQotYm9vbCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dHJ5VG9PcGVuRGF0
YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQotewotICAgIGlm
ICghZmlsZUV4aXN0cyhtX2RhdGFiYXNlUGF0aCkgJiYgb3BlbmluZ1N0cmF0ZWd5ID09IFNraXBJ
Zk5vbkV4aXN0ZW50KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2RhdGFiYXNl
UGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGaWxlbmFtZSBmb3IgbG9jYWwg
c3RvcmFnZSBkYXRhYmFzZSBpcyBlbXB0eSAtIGNhbm5vdCBvcGVuIGZvciBwZXJzaXN0ZW50IHN0
b3JhZ2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbV9kYXRh
YmFzZS5vcGVuKG1fZGF0YWJhc2VQYXRoKSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBvcGVuIGRhdGFiYXNlIGZpbGUgJXMgZm9yIGxvY2FsIHN0b3JhZ2UiLCBtX2RhdGFiYXNlUGF0
aC51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8v
IFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0IGJvdW5kIHRvIGEgc3BlY2lmaWMgdGhyZWFkLCB3ZSBo
YXZlIHRvIGRpc2FibGUgdGhyZWFkaW5nIGNoZWNrcwotICAgIC8vIGV2ZW4gdGhvdWdoIHdlIG5l
dmVyIGFjY2VzcyB0aGUgZGF0YWJhc2UgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRhbmVv
dXNseS4KLSAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJlYWRpbmdDaGVja3MoKTsKLQotICAgIGlm
ICghbWlncmF0ZUl0ZW1UYWJsZUlmTmVlZGVkKCkpIHsKLSAgICAgICAgLy8gV2UgZmFpbGVkIHRv
IG1pZ3JhdGUgdGhlIGl0ZW0gdGFibGUuIEluIG9yZGVyIHRvIGF2b2lkIHRyeWluZyB0byBtaWdy
YXRlIHRoZSB0YWJsZSBvdmVyIGFuZCBvdmVyLAotICAgICAgICAvLyBqdXN0IGRlbGV0ZSBpdCBh
bmQgc3RhcnQgZnJvbSBzY3JhdGNoLgotICAgICAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNv
bW1hbmQoIkRST1AgVEFCTEUgSXRlbVRhYmxlIikpCi0gICAgICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBkZWxldGUgdGFibGUgSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAg
fQotCi0gICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSUYg
Tk9UIEVYSVNUUyBJdGVtVGFibGUgKGtleSBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNF
LCB2YWx1ZSBCTE9CIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpIikpIHsKLSAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRhYmxlIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFn
ZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLWJvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Om1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgp
Ci17Ci0gICAgaWYgKCFtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJJdGVtVGFibGUiKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwg
IlNFTEVDVCB2YWx1ZSBGUk9NIEl0ZW1UYWJsZSBMSU1JVCAxIik7Ci0KLSAgICAvLyBUaGlzIHF1
ZXJ5IGlzbid0IGV2ZXIgZXhlY3V0ZWQsIGl0J3MganVzdCB1c2VkIHRvIGNoZWNrIHRoZSBjb2x1
bW4gdHlwZS4KLSAgICBpZiAocXVlcnkuaXNDb2x1bW5EZWNsYXJlZEFzQmxvYigwKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgdGFibGUgd2l0aCB0aGUgcmln
aHQgdHlwZSwgY29weSBhbGwgdGhlIGRhdGEgb3ZlciB0byBpdCBhbmQgdGhlbiByZXBsYWNlIHRo
ZSBuZXcgdGFibGUgd2l0aCB0aGUgb2xkIHRhYmxlLgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBj
b21tYW5kc1tdID0gewotICAgICAgICAiRFJPUCBUQUJMRSBJRiBFWElTVFMgSXRlbVRhYmxlMiIs
Ci0gICAgICAgICJDUkVBVEUgVEFCTEUgSXRlbVRhYmxlMiAoa2V5IFRFWFQgVU5JUVVFIE9OIENP
TkZMSUNUIFJFUExBQ0UsIHZhbHVlIEJMT0IgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCkiLAot
ICAgICAgICAiSU5TRVJUIElOVE8gSXRlbVRhYmxlMiBTRUxFQ1QgKiBmcm9tIEl0ZW1UYWJsZSIs
Ci0gICAgICAgICJEUk9QIFRBQkxFIEl0ZW1UYWJsZSIsCi0gICAgICAgICJBTFRFUiBUQUJMRSBJ
dGVtVGFibGUyIFJFTkFNRSBUTyBJdGVtVGFibGUiLAotICAgICAgICAwLAotICAgIH07Ci0KLSAg
ICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RhdGFiYXNlLCBmYWxzZSk7Ci0gICAg
dHJhbnNhY3Rpb24uYmVnaW4oKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBjb21tYW5kc1tp
XTsgKytpKSB7Ci0gICAgICAgIGlmIChtX2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRz
W2ldKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIG1pZ3JhdGUgdGFibGUgSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIHdoZW4gZXhlY3V0
aW5nOiAlcyIsIGNvbW1hbmRzW2ldKTsKLSAgICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soKTsK
LQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdHJhbnNhY3Rpb24uY29tbWl0
KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Omlt
cG9ydEl0ZW1zKFN0b3JhZ2VNYXAmIHN0b3JhZ2VNYXApCi17Ci0gICAgaWYgKG1fZGlkSW1wb3J0
SXRlbXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJWE1FOiBJZiBpdCBjYW4ndCBpbXBv
cnQsIHRoZW4gdGhlIGRlZmF1bHQgV2ViS2l0IGJlaGF2aW9yIHNob3VsZCBiZSB0aGF0IG9mIHBy
aXZhdGUgYnJvd3NpbmcsCi0gICAgLy8gbm90IHNpbGVudGx5IGlnbm9yaW5nIGl0LiBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU4OTQKLQotICAgIC8vIFdlIHNldCB0
aGlzIHRvIHRydWUgZXZlbiBpZiB3ZSBkb24ndCBlbmQgdXAgaW1wb3J0aW5nIGFueSBpdGVtcyBk
dWUgdG8gZmFpbHVyZSBiZWNhdXNlCi0gICAgLy8gdGhlcmUncyByZWFsbHkgbm8gZ29vZCB3YXkg
dG8gcmVjb3ZlciBvdGhlciB0aGFuIG5vdCBpbXBvcnRpbmcgYW55dGhpbmcuCi0gICAgbV9kaWRJ
bXBvcnRJdGVtcyA9IHRydWU7Ci0KLSAgICBvcGVuRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQp
OwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
U1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGF0YWJhc2UsICJTRUxFQ1Qga2V5LCB2YWx1ZSBGUk9N
IEl0ZW1UYWJsZSIpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0g
ICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHNlbGVjdCBpdGVtcyBmcm9tIEl0ZW1UYWJsZSBm
b3IgbG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSGFzaE1h
cDxTdHJpbmcsIFN0cmluZz4gaXRlbXM7Ci0KLSAgICBpbnQgcmVzdWx0ID0gcXVlcnkuc3RlcCgp
OwotICAgIHdoaWxlIChyZXN1bHQgPT0gU1FMSVRFX1JPVykgewotICAgICAgICBTdHJpbmcga2V5
ID0gcXVlcnkuZ2V0Q29sdW1uVGV4dCgwKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnku
Z2V0Q29sdW1uQmxvYkFzU3RyaW5nKDEpOwotICAgICAgICBpZiAoIWtleS5pc051bGwoKSAmJiAh
dmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBpdGVtcy5zZXQoa2V5LCB2YWx1ZSk7Ci0gICAg
ICAgIHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IFNR
TElURV9ET05FKSB7Ci0gICAgICAgIExPR19FUlJPUigiRXJyb3IgcmVhZGluZyBpdGVtcyBmcm9t
IEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgc3RvcmFnZU1hcC5pbXBvcnRJdGVtcyhpdGVtcyk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9y
YWdlRGF0YWJhc2U6OnNldEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUpCi17Ci0gICAgaXRlbURpZENoYW5nZShrZXksIHZhbHVlKTsKLX0KLQotdm9pZCBMb2NhbFN0
b3JhZ2VEYXRhYmFzZTo6cmVtb3ZlSXRlbShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBpdGVt
RGlkQ2hhbmdlKGtleSwgU3RyaW5nKCkpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNl
OjpjbGVhcigpCi17Ci0gICAgbV9jaGFuZ2VkSXRlbXMuY2xlYXIoKTsKLSAgICBtX3Nob3VsZENs
ZWFySXRlbXMgPSB0cnVlOwotCi0gICAgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOwotfQotCi12
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpjbG9zZSgpCi17Ci0gICAgQVNTRVJUKCFtX2lzQ2xv
c2VkKTsKLSAgICBtX2lzQ2xvc2VkID0gdHJ1ZTsKLQotICAgIGlmIChtX2RpZFNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUpIHsKLSAgICAgICAgdXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKG1f
Y2hhbmdlZEl0ZW1zKTsKLSAgICAgICAgbV9jaGFuZ2VkSXRlbXMuY2xlYXIoKTsKLSAgICB9Ci0K
LSAgICBib29sIGlzRW1wdHkgPSBkYXRhYmFzZUlzRW1wdHkoKTsKLQotICAgIGlmIChtX2RhdGFi
YXNlLmlzT3BlbigpKQotICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7Ci0KLSAgICBpZiAoaXNF
bXB0eSkKLSAgICAgICAgbV90cmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4obV9zZWN1
cml0eU9yaWdpbik7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Oml0ZW1EaWRDaGFu
Z2UoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgbV9jaGFu
Z2VkSXRlbXMuc2V0KGtleSwgdmFsdWUpOwotICAgIHNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoKTsK
LX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6c2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgp
Ci17Ci0gICAgaWYgKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKCFtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9j
YWxTdG9yYWdlKQotICAgICAgICBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGlu
Z1RvTG9jYWxTdG9yYWdlID0gc3RkOjptYWtlX3VuaXF1ZTxTdWRkZW5UZXJtaW5hdGlvbkRpc2Fi
bGVyPigpOwotCi0gICAgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlID0gdHJ1ZTsKLQotICAg
IFJlZlB0cjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gbG9jYWxTdG9yYWdlRGF0YWJhc2UodGhpcyk7
Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2hBZnRlcihkYXRhYmFzZVVwZGF0ZUludGVydmFsLCBbbG9j
YWxTdG9yYWdlRGF0YWJhc2VdIHsKLSAgICAgICAgbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnVwZGF0
ZURhdGFiYXNlKCk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnVw
ZGF0ZURhdGFiYXNlKCkKLXsKLSAgICBpZiAobV9pc0Nsb3NlZCkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgQVNTRVJUKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSk7Ci0gICAgbV9kaWRTY2hl
ZHVsZURhdGFiYXNlVXBkYXRlID0gZmFsc2U7Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiBjaGFuZ2VkSXRlbXM7Ci0gICAgaWYgKG1fY2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBtYXhpbXVt
SXRlbXNUb1VwZGF0ZSkgewotICAgICAgICAvLyBUaGVyZSBhcmUgZmV3IGVub3VnaCBjaGFuZ2Vk
IGl0ZW1zIHRoYXQgd2UgY2FuIGp1c3QgYWx3YXlzIHdyaXRlIGFsbCBvZiB0aGVtLgotICAgICAg
ICBtX2NoYW5nZWRJdGVtcy5zd2FwKGNoYW5nZWRJdGVtcyk7Ci0gICAgICAgIHVwZGF0ZURhdGFi
YXNlV2l0aENoYW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMpOwotICAgICAgICBtX2Rpc2FibGVTdWRk
ZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlID0gbnVsbHB0cjsKLSAgICB9
IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heGltdW1JdGVtc1RvVXBkYXRl
OyArK2kpIHsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBtX2NoYW5nZWRJdGVtcy5iZWdpbigpOwot
ICAgICAgICAgICAgY2hhbmdlZEl0ZW1zLmFkZChpdC0+a2V5LCBpdC0+dmFsdWUpOwotCi0gICAg
ICAgICAgICBtX2NoYW5nZWRJdGVtcy5yZW1vdmUoaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAg
QVNTRVJUKGNoYW5nZWRJdGVtcy5zaXplKCkgPD0gbWF4aW11bUl0ZW1zVG9VcGRhdGUpOwotCi0g
ICAgICAgIC8vIFJlc2NoZWR1bGUgdGhlIHVwZGF0ZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcy4K
LSAgICAgICAgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOwotICAgICAgICB1cGRhdGVEYXRhYmFz
ZVdpdGhDaGFuZ2VkSXRlbXMoY2hhbmdlZEl0ZW1zKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9jYWxT
dG9yYWdlRGF0YWJhc2U6OnVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjb25zdCBIYXNo
TWFwPFN0cmluZywgU3RyaW5nPiYgY2hhbmdlZEl0ZW1zKQotewotICAgIGlmICghbV9kYXRhYmFz
ZS5pc09wZW4oKSkKLSAgICAgICAgb3BlbkRhdGFiYXNlKENyZWF0ZUlmTm9uRXhpc3RlbnQpOwot
ICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYg
KG1fc2hvdWxkQ2xlYXJJdGVtcykgewotICAgICAgICBtX3Nob3VsZENsZWFySXRlbXMgPSBmYWxz
ZTsKLQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgY2xlYXJTdGF0ZW1lbnQobV9kYXRhYmFzZSwg
IkRFTEVURSBGUk9NIEl0ZW1UYWJsZSIpOwotICAgICAgICBpZiAoY2xlYXJTdGF0ZW1lbnQucHJl
cGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8g
cHJlcGFyZSBjbGVhciBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBk
YXRhYmFzZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50
IHJlc3VsdCA9IGNsZWFyU3RhdGVtZW50LnN0ZXAoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBT
UUxJVEVfRE9ORSkgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY2xlYXIgYWxs
IGl0ZW1zIGluIHRoZSBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIC0gJWkiLCByZXN1bHQpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU1FMaXRlU3RhdGVtZW50
IGluc2VydFN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gSXRlbVRhYmxlIFZBTFVF
UyAoPywgPykiKTsKLSAgICBpZiAoaW5zZXJ0U3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVf
T0spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBpbnNlcnQgc3RhdGVt
ZW50IC0gY2Fubm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UiKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIFNRTGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9k
YXRhYmFzZSwgIkRFTEVURSBGUk9NIEl0ZW1UYWJsZSBXSEVSRSBrZXk9PyIpOwotICAgIGlmIChk
ZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBwcmVwYXJlIGRlbGV0ZSBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8g
bG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
U1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYXRhYmFzZSk7Ci0gICAgdHJhbnNhY3Rp
b24uYmVnaW4oKTsKLQotICAgIGZvciAoYXV0byBpdCA9IGNoYW5nZWRJdGVtcy5iZWdpbigpLCBl
bmQgPSBjaGFuZ2VkSXRlbXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAvLyBB
IG51bGwgdmFsdWUgbWVhbnMgdGhhdCB0aGUga2V5L3ZhbHVlIHBhaXIgc2hvdWxkIGJlIGRlbGV0
ZWQuCi0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCYgc3RhdGVtZW50ID0gaXQtPnZhbHVlLmlzTnVs
bCgpID8gZGVsZXRlU3RhdGVtZW50IDogaW5zZXJ0U3RhdGVtZW50OwotCi0gICAgICAgIHN0YXRl
bWVudC5iaW5kVGV4dCgxLCBpdC0+a2V5KTsKLQotICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRp
bmcgYSBrZXkvdmFsdWUgcGFpciwgYmluZCB0aGUgdmFsdWUgYXMgd2VsbC4KLSAgICAgICAgaWYg
KCFpdC0+dmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEJsb2IoMiwg
aXQtPnZhbHVlKTsKLQotICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKTsKLSAg
ICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gdXBkYXRlIGl0ZW0gaW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgLSAl
aSIsIHJlc3VsdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHN0
YXRlbWVudC5yZXNldCgpOwotICAgIH0KLQotICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOwotfQot
Ci1ib29sIExvY2FsU3RvcmFnZURhdGFiYXNlOjpkYXRhYmFzZUlzRW1wdHkoKQotewotICAgIGlm
ICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGF0YWJhc2UsICJTRUxFQ1QgQ09VTlQoKikgRlJPTSBJdGVt
VGFibGUiKTsKLSAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBjb3VudCBudW1iZXIgb2Ygcm93cyBpbiBJdGVtVGFibGUg
Zm9yIGxvY2FsIHN0b3JhZ2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IGludCByZXN1bHQgPSBxdWVyeS5zdGVwKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfUk9X
KSB7Ci0gICAgICAgIExPR19FUlJPUigiTm8gcmVzdWx0cyB3aGVuIGNvdW50aW5nIG51bWJlciBv
ZiByb3dzIGluIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuICFxdWVyeS5nZXRDb2x1bW5JbnQoMCk7Ci19Ci0K
LX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nl
c3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nl
c3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCA5OTkyMDMxZjQ0OGZiM2Q5MTU4MDE4NmQ4ODYwYTEyZDg0ODU5NTYyLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0x
LDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UK
LQotI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlRGF0YWJhc2UuaD4KLSNpbmNsdWRlIDxXZWJDb3Jl
L1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+Ci0jaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3Rm
L1RocmVhZFNhZmVSZWZDb3VudGVkLmg+Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBTZWN1cml0eU9yaWdpbjsKLWNsYXNzIFN0b3JhZ2VN
YXA7Ci1jbGFzcyBTdWRkZW5UZXJtaW5hdGlvbkRpc2FibGVyOwotfQotCi1uYW1lc3BhY2UgV2Vi
S2l0IHsKLQotY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOwotCi1jbGFzcyBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3Jh
Z2VEYXRhYmFzZT4gewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8TG9jYWxTdG9yYWdlRGF0YWJh
c2U+IGNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyPiYmLCBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKLSAgICB+TG9jYWxT
dG9yYWdlRGF0YWJhc2UoKTsKLQotICAgIC8vIFdpbGwgYmxvY2sgdW50aWwgdGhlIGltcG9ydCBp
cyBjb21wbGV0ZS4KLSAgICB2b2lkIGltcG9ydEl0ZW1zKFdlYkNvcmU6OlN0b3JhZ2VNYXAmKTsK
LQotICAgIHZvaWQgc2V0SXRlbShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSk7Ci0gICAgdm9pZCByZW1vdmVJdGVtKGNvbnN0IFN0cmluZyYga2V5KTsKLSAgICB2b2lkIGNs
ZWFyKCk7Ci0KLSAgICAvLyBXaWxsIGJsb2NrIHVudGlsIGFsbCBwZW5kaW5nIGNoYW5nZXMgaGF2
ZSBiZWVuIHdyaXR0ZW4gdG8gZGlzay4KLSAgICB2b2lkIGNsb3NlKCk7Ci0KLXByaXZhdGU6Ci0g
ICAgTG9jYWxTdG9yYWdlRGF0YWJhc2UoUmVmPFdvcmtRdWV1ZT4mJiwgUmVmPExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcj4mJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7
Ci0KLSAgICBlbnVtIERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5IHsKLSAgICAgICAgQ3JlYXRlSWZO
b25FeGlzdGVudCwKLSAgICAgICAgU2tpcElmTm9uRXhpc3RlbnQKLSAgICB9OwotICAgIGJvb2wg
dHJ5VG9PcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOwotICAgIHZvaWQgb3Bl
bkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5KTsKLQotICAgIGJvb2wgbWlncmF0ZUl0
ZW1UYWJsZUlmTmVlZGVkKCk7Ci0KLSAgICB2b2lkIGl0ZW1EaWRDaGFuZ2UoY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpOwotCi0gICAgdm9pZCBzY2hlZHVsZURhdGFiYXNl
VXBkYXRlKCk7Ci0gICAgdm9pZCB1cGRhdGVEYXRhYmFzZSgpOwotICAgIHZvaWQgdXBkYXRlRGF0
YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+Jik7Ci0K
LSAgICBib29sIGRhdGFiYXNlSXNFbXB0eSgpOwotCi0gICAgUmVmPFdvcmtRdWV1ZT4gbV9xdWV1
ZTsKLSAgICBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiBtX3RyYWNrZXI7Ci0gICAg
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIG1fc2VjdXJpdHlPcmlnaW47Ci0KLSAgICBTdHJp
bmcgbV9kYXRhYmFzZVBhdGg7Ci0gICAgV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFz
ZTsKLSAgICBib29sIG1fZmFpbGVkVG9PcGVuRGF0YWJhc2U7Ci0gICAgYm9vbCBtX2RpZEltcG9y
dEl0ZW1zOwotICAgIGJvb2wgbV9pc0Nsb3NlZDsKLQotICAgIGJvb2wgbV9kaWRTY2hlZHVsZURh
dGFiYXNlVXBkYXRlOwotICAgIGJvb2wgbV9zaG91bGRDbGVhckl0ZW1zOwotICAgIEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+IG1fY2hhbmdlZEl0ZW1zOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlN1ZGRlblRlcm1pbmF0aW9uRGlzYWJsZXI+IG1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0
aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2U7Ci19OwotCi0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAxOWIyMjlmNmI1Mzc0YTc3NDYzYWFmOWI0NjRjZTkzNmEwNGFjYzJiLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcAorKysgL2Rldi9u
dWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgotCi0jaW5jbHVk
ZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVGaWxlU3lz
dGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdp
bkRhdGEuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1RleHRFbmNvZGluZy5oPgotI2luY2x1ZGUgPHd0
Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KLSNpbmNsdWRlIDx3dGYv
V29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotCi11c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVJlZjxMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKFJlZjxX
b3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQot
ewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcihX
VEZNb3ZlKHF1ZXVlKSwgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSk7Ci19Ci0KLUxvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcjo6TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVl
dWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQotICAgIDog
bV9xdWV1ZShXVEZNb3ZlKHF1ZXVlKSkKLSAgICAsIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KGxv
Y2FsU3RvcmFnZURpcmVjdG9yeS5pc29sYXRlZENvcHkoKSkKLXsKLSAgICBBU1NFUlQoIW1fbG9j
YWxTdG9yYWdlRGlyZWN0b3J5LmlzRW1wdHkoKSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGVu
Y29kaW5nIGlzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0aGluZ3Mg
dG8gdGhlIHF1ZXVlLgotICAgIFVURjhFbmNvZGluZygpOwotCi0gICAgbV9xdWV1ZS0+ZGlzcGF0
Y2goW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0oKSBtdXRhYmxlIHsKLSAgICAgICAg
cHJvdGVjdGVkVGhpcy0+aW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKLSAgICB9KTsKLX0KLQot
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
KCkKLXsKLX0KLQotU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VQ
YXRoKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGRhdGFiYXNlUGF0aChzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIo
KSArICIubG9jYWxzdG9yYWdlIik7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyOjpkaWRPcGVuRGF0YWJhc2VXaXRoT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYg
c2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihz
ZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSwgZGF0YWJhc2VQYXRoKHNlY3VyaXR5
T3JpZ2luKSk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVE
YXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdp
bikKLXsKLSAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKHNlY3VyaXR5T3Jp
Z2luLmRhdGFiYXNlSWRlbnRpZmllcigpKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcygpCi17Ci0gICAgbV9vcmlnaW5zLmNsZWFyKCk7
Ci0KLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAo
IW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNRTGl0ZVN0YXRl
bWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4sIHBhdGggRlJPTSBPcmln
aW5zIik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHJlc3VsdDsKLSAgICB3aGlsZSAoKHJlc3VsdCA9IHN0
YXRlbWVudC5zdGVwKCkpID09IFNRTElURV9ST1cpIHsKLSAgICAgICAgZGVsZXRlRmlsZShzdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IENhbGwgb3V0IHRv
IHRoZSBjbGllbnQuCi0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkKLSAg
ICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBk
YXRhYmFzZS4iKTsKLQotICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICBtX2Rh
dGFiYXNlLmNsb3NlKCk7Ci0KLSAgICBpZiAoIWRlbGV0ZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0
aCgpKSkgewotICAgICAgICAvLyBJbiB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUg
dG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlIChlLmcgc29tZSBvdGhlciBwcm9ncmFtCi0gICAg
ICAgIC8vIGxpa2UgYSB2aXJ1cyBzY2FubmVyIGlzIGFjY2Vzc2luZyBpdCksIG1ha2Ugc3VyZSB0
byByZW1vdmUgYWxsIGVudHJpZXMuCi0gICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tpcElm
Tm9uRXhpc3RlbnQpOwotICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAg
ICAgICByZXR1cm47Ci0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudCht
X2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyIpOwotICAgICAgICBpZiAoZGVsZXRlU3Rh
dGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2YgYWxsIG9yaWdpbnMiKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVjdXRl
Q29tbWFuZCgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRl
bGV0aW9uIG9mIGFsbCBvcmlnaW5zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBkZWxldGVFbXB0eURpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9y
eSk7Ci19Ci0KLXN0YXRpYyBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gZmlsZUNyZWF0aW9uVGltZShj
b25zdCBTdHJpbmcmIGZpbGVQYXRoKQotewotICAgIHRpbWVfdCB0aW1lOwotICAgIHJldHVybiBn
ZXRGaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoLCB0aW1lKSA/IHRpbWUgOiBzdGQ6Om9wdGlvbmFs
PHRpbWVfdD4oc3RkOjpudWxsb3B0KTsKLX0KLQotc3RhdGljIHN0ZDo6b3B0aW9uYWw8dGltZV90
PiBmaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQotewotICAgIHRp
bWVfdCB0aW1lOwotICAgIGlmICghZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgsIHRp
bWUpKQotICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotCi0gICAgcmV0dXJuIHRpbWU7Ci19
Ci0KLVZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2Nr
Ojp0aW1lX3BvaW50IHRpbWUpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0g
ICAgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKLSAgICBWZWN0b3I8U3RyaW5nPiBvcmlnaW5J
ZGVudGlmaWVyc1RvRGVsZXRlOwotCi0gICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbiA6IG1f
b3JpZ2lucykgewotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBwYXRoRm9yRGF0YWJhc2VXaXRo
T3JpZ2luSWRlbnRpZmllcihvcmlnaW4pOwotCi0gICAgICAgIGF1dG8gbW9kaWZpY2F0aW9uVGlt
ZSA9IGZpbGVNb2RpZmljYXRpb25UaW1lKGZpbGVQYXRoKTsKLSAgICAgICAgaWYgKCFtb2RpZmlj
YXRpb25UaW1lKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKG1vZGlmaWNh
dGlvblRpbWUudmFsdWUoKSA+PSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3Qo
dGltZSkpCi0gICAgICAgICAgICBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlLmFwcGVuZChvcmln
aW4pOwotICAgIH0KLQotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZWREYXRh
YmFzZU9yaWdpbnM7Ci0gICAgZGVsZXRlZERhdGFiYXNlT3JpZ2lucy5yZXNlcnZlSW5pdGlhbENh
cGFjaXR5KG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUuc2l6ZSgpKTsKLQotICAgIGZvciAoY29u
c3QgYXV0byYgb3JpZ2luSWRlbnRpZmllciA6IG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUpIHsK
LSAgICAgICAgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlm
aWVyKTsKLQotICAgICAgICBpZiAoYXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZy
b21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcikpCi0gICAgICAgICAgICBkZWxl
dGVkRGF0YWJhc2VPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7Ci19Ci0KLVZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+
IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2lucygpIGNvbnN0Ci17Ci0gICAgVmVj
dG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKLSAgICBvcmlnaW5zLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkobV9vcmlnaW5zLnNpemUoKSk7Ci0KLSAgICBmb3IgKGNvbnN0IFN0cmluZyYg
b3JpZ2luSWRlbnRpZmllciA6IG1fb3JpZ2lucykgewotICAgICAgICBpZiAoYXV0byBvcmlnaW4g
PSBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRp
ZmllcikpCi0gICAgICAgICAgICBvcmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIG9yaWdpbnM7Ci19Ci0KLVZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXI6Ok9yaWdpbkRldGFpbHM+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2luRGV0
YWlscygpCi17Ci0gICAgVmVjdG9yPE9yaWdpbkRldGFpbHM+IHJlc3VsdDsKLSAgICByZXN1bHQu
cmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX29yaWdpbnMuc2l6ZSgpKTsKLQotICAgIGZvciAoY29u
c3QgU3RyaW5nJiBvcmlnaW4gOiBtX29yaWdpbnMpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRo
ID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luKTsKLQotICAgICAg
ICBPcmlnaW5EZXRhaWxzIGRldGFpbHM7Ci0gICAgICAgIGRldGFpbHMub3JpZ2luSWRlbnRpZmll
ciA9IG9yaWdpbi5pc29sYXRlZENvcHkoKTsKLSAgICAgICAgZGV0YWlscy5jcmVhdGlvblRpbWUg
PSBmaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoKTsKLSAgICAgICAgZGV0YWlscy5tb2RpZmljYXRp
b25UaW1lID0gZmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgpOwotICAgICAgICByZXN1bHQu
dW5jaGVja2VkQXBwZW5kKGRldGFpbHMpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19
Ci0KLVN0cmluZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChjb25z
dCBTdHJpbmcmIGZpbGVuYW1lKSBjb25zdAotewotICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVz
KG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFiYXNlIHBhdGggJXMiLCBtX2xvY2FsU3RvcmFnZURp
cmVjdG9yeS51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgIH0K
LQotI2lmIFBMQVRGT1JNKElPUykKLSAgICBwbGF0Zm9ybU1heWJlRXhjbHVkZUZyb21CYWNrdXAo
KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtX2xvY2Fs
U3RvcmFnZURpcmVjdG9yeSwgZmlsZW5hbWUpOwotfQotCi1TdHJpbmcgTG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ZGF0YWJhc2VQYXRoKCJTdG9yYWdlVHJhY2tlci5kYiIpOwotfQotCi12b2lkIExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJh
dGVneSBvcGVuaW5nU3RyYXRlZ3kpCi17Ci0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIFN0cmluZyBkYXRhYmFzZVBhdGggPSB0cmFja2VyRGF0YWJh
c2VQYXRoKCk7Ci0KLSAgICBpZiAoIWZpbGVFeGlzdHMoZGF0YWJhc2VQYXRoKSAmJiBvcGVuaW5n
U3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhpc3RlbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlm
ICghbV9kYXRhYmFzZS5vcGVuKGRhdGFiYXNlUGF0aCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJG
YWlsZWQgdG8gb3BlbiBkYXRhYmFzZVBhdGggJXMuIiwgZGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0
YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFNpbmNlIGEgV29ya1F1ZXVl
IGlzbid0IGJvdW5kIHRvIGEgc3BlY2lmaWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhy
ZWFkaW5nIGNoZWNrcwotICAgIC8vIGV2ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUgZGF0
YWJhc2UgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KLSAgICBtX2RhdGFi
YXNlLmRpc2FibGVUaHJlYWRpbmdDaGVja3MoKTsKLQotICAgIGlmIChtX2RhdGFiYXNlLnRhYmxl
RXhpc3RzKCJPcmlnaW5zIikpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9kYXRhYmFz
ZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIE9yaWdpbnMgKG9yaWdpbiBURVhUIFVOSVFV
RSBPTiBDT05GTElDVCBSRVBMQUNFLCBwYXRoIFRFWFQpOyIpKQotICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byBjcmVhdGUgT3JpZ2lucyB0YWJsZS4iKTsKLX0KLQotdm9pZCBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6OmltcG9ydE9yaWdpbklkZW50aWZpZXJzKCkKLXsKLSAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLQotICAgIGlmIChtX2RhdGFiYXNl
LmlzT3BlbigpKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIlNFTEVDVCBvcmlnaW4gRlJPTSBPcmlnaW5zIik7Ci0gICAgICAgIGlmIChzdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQg
dG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LQotICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgIHdoaWxlICgocmVzdWx0ID0gc3RhdGVt
ZW50LnN0ZXAoKSkgPT0gU1FMSVRFX1JPVykKLSAgICAgICAgICAgIG1fb3JpZ2lucy5hZGQoc3Rh
dGVtZW50LmdldENvbHVtblRleHQoMCkpOwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FMSVRF
X0RPTkUpIHsKLSAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9y
aWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICB1cGRhdGVUcmFja2VyRGF0YWJhc2VGcm9tTG9jYWxTdG9yYWdlRGF0
YWJhc2VGaWxlcygpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6dXBk
YXRlVHJhY2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKQotewotICAg
IFZlY3RvcjxTdHJpbmc+IHBhdGhzID0gbGlzdERpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVj
dG9yeSwgIioubG9jYWxzdG9yYWdlIik7Ci0KLSAgICBIYXNoU2V0PFN0cmluZz4gb3JpZ2lucyht
X29yaWdpbnMpOwotICAgIEhhc2hTZXQ8U3RyaW5nPiBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURh
dGFiYXNlRmlsZXM7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGhzLnNpemUoKTsg
KytpKSB7Ci0gICAgICAgIGNvbnN0IFN0cmluZyYgcGF0aCA9IHBhdGhzW2ldOwotCi0gICAgICAg
IGlmICghcGF0aC5lbmRzV2l0aCgiLmxvY2Fsc3RvcmFnZSIpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aEdldEZpbGVOYW1lKHBhdGgpOwot
Ci0gICAgICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAs
IGZpbGVuYW1lLmxlbmd0aCgpIC0gc3RybGVuKCIubG9jYWxzdG9yYWdlIikpOwotCi0gICAgICAg
IGlmICghbV9vcmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKQotICAgICAgICAgICAg
YWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyLCBwYXRoKTsK
LQotICAgICAgICBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMuYWRkKG9yaWdp
bklkZW50aWZpZXIpOwotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IG9yaWdpbnMuYmVnaW4o
KSwgZW5kID0gb3JpZ2lucy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0
IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA9ICppdDsKLSAgICAgICAgaWYgKG9yaWdpbnMuY29u
dGFpbnMob3JpZ2luSWRlbnRpZmllcikpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAg
ICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOwot
ICAgIH0KLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNl
V2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25z
dCBTdHJpbmcmIGRhdGFiYXNlUGF0aCkKLXsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKENyZWF0
ZUlmTm9uRXhpc3RlbnQpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5T
RVJUIElOVE8gT3JpZ2lucyBWQUxVRVMgKD8sID8pIik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVw
YXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFi
bGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgp
LmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGF0ZW1lbnQuYmluZFRl
eHQoMSwgb3JpZ2luSWRlbnRpZmllcik7Ci0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIGRhdGFi
YXNlUGF0aCk7Ci0KLSAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKLSAg
ICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAnJXMnIGluIHRoZSB0
cmFja2VyIiwgb3JpZ2luSWRlbnRpZmllci51dGY4KCkuZGF0YSgpKTsKLQotICAgIG1fb3JpZ2lu
cy5hZGQob3JpZ2luSWRlbnRpZmllcik7Ci0KLSAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRzIHRo
YXQgdGhlIG9yaWdpbiB3YXMgYWRkZWQuCi19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyOjpyZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYg
b3JpZ2luSWRlbnRpZmllcikKLXsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4
aXN0ZW50KTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFN0cmluZyBwYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIo
b3JpZ2luSWRlbnRpZmllcik7Ci0gICAgaWYgKHBhdGguaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2UsICJE
RUxFVEUgRlJPTSBPcmlnaW5zIHdoZXJlIG9yaWdpbj0/Iik7Ci0gICAgaWYgKGRlbGV0ZVN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICclcyciLCBvcmlnaW5JZGVudGlmaWVyLmFz
Y2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWxldGVTdGF0ZW1l
bnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7Ci0gICAgaWYgKCFkZWxldGVTdGF0ZW1l
bnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVj
dXRlIGRlbGV0aW9uIG9mIG9yaWdpbiAnJXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRh
dGEoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTUUxpdGVGaWxlU3lzdGVtOjpk
ZWxldGVEYXRhYmFzZUZpbGUocGF0aCk7Ci0KLSAgICBtX29yaWdpbnMucmVtb3ZlKG9yaWdpbklk
ZW50aWZpZXIpOwotICAgIGlmIChtX29yaWdpbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIFRo
ZXJlIGFyZSBubyBvcmlnaW5zIGxlZnQ7IGRlbGV0ZSB0aGUgdHJhY2tlciBkYXRhYmFzZS4KLSAg
ICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOwotICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxl
dGVEYXRhYmFzZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKTsKLSAgICAgICAgZGVsZXRlRW1w
dHlEaXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotICAgIH0KLQotICAgIC8vIEZJ
WE1FOiBUZWxsIGNsaWVudHMgdGhhdCB0aGUgb3JpZ2luIHdhcyByZW1vdmVkLgotfQotCi1TdHJp
bmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2lu
SWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIpCi17Ci0gICAgaWYgKCFt
X2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBTUUxp
dGVTdGF0ZW1lbnQgcGF0aFN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJPTSBP
cmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgaWYgKHBhdGhTdGF0ZW1lbnQucHJlcGFyZSgp
ICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIHNl
bGVjdGlvbiBvZiBwYXRoIGZvciBvcmlnaW4gJyVzJyIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgp
LmRhdGEoKSk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwYXRoU3Rh
dGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOwotCi0gICAgaW50IHJlc3VsdCA9
IHBhdGhTdGF0ZW1lbnQuc3RlcCgpOwotICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX1JPVykKLSAg
ICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgcmV0dXJuIHBhdGhTdGF0ZW1lbnQuZ2V0Q29s
dW1uVGV4dCgwKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5o
IGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYjE5MTZkOTM0ZTU2ZjFm
NGEyNDE1NTdkNzMxODM0YmU3N2ZkMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlRGF0
YWJhc2UuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9PcHRpb25h
bC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJl
ZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3Rl
eHQvU3RyaW5nSGFzaC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBTZWN1cml0eU9yaWdpbjsKLXN0cnVjdCBTZWN1cml0eU9y
aWdpbkRhdGE7Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdHJ1Y3QgTG9jYWxTdG9yYWdl
RGV0YWlsczsKLQotY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gewotcHVibGlj
OgotICAgIHN0YXRpYyBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiBjcmVhdGUoUmVm
PFdvcmtRdWV1ZT4mJiwgY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotICAg
IH5Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIoKTsKLQotICAgIFN0cmluZyBkYXRhYmFzZVBh
dGgoY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJikgY29uc3Q7Ci0KLSAgICB2b2lk
IGRpZE9wZW5EYXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5E
YXRhJik7Ci0gICAgdm9pZCBkZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgV2ViQ29yZTo6
U2VjdXJpdHlPcmlnaW5EYXRhJik7Ci0gICAgdm9pZCBkZWxldGVBbGxEYXRhYmFzZXMoKTsKLQot
ICAgIC8vIFJldHVybnMgYSB2ZWN0b3Igb2YgdGhlIG9yaWdpbnMgd2hvc2UgZGF0YWJhc2VzIGhh
dmUgYmVlbiBkZWxldGVkLgotICAgIFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+
IGRlbGV0ZURhdGFiYXNlc01vZGlmaWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6
dGltZV9wb2ludCk7Ci0KLSAgICBWZWN0b3I8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiBv
cmlnaW5zKCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgT3JpZ2luRGV0YWlscyB7Ci0gICAgICAgIFN0
cmluZyBvcmlnaW5JZGVudGlmaWVyOwotICAgICAgICBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gY3Jl
YXRpb25UaW1lOwotICAgICAgICBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gbW9kaWZpY2F0aW9uVGlt
ZTsKLSAgICB9OwotICAgIFZlY3RvcjxPcmlnaW5EZXRhaWxzPiBvcmlnaW5EZXRhaWxzKCk7Ci0K
LXByaXZhdGU6Ci0gICAgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVldWU+
JiYsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KTsKLQotICAgIFN0cmluZyBk
YXRhYmFzZVBhdGgoY29uc3QgU3RyaW5nJiBmaWxlbmFtZSkgY29uc3Q7Ci0gICAgU3RyaW5nIHRy
YWNrZXJEYXRhYmFzZVBhdGgoKSBjb25zdDsKLQotICAgIGVudW0gRGF0YWJhc2VPcGVuaW5nU3Ry
YXRlZ3kgewotICAgICAgICBDcmVhdGVJZk5vbkV4aXN0ZW50LAotICAgICAgICBTa2lwSWZOb25F
eGlzdGVudAotICAgIH07Ci0gICAgdm9pZCBvcGVuVHJhY2tlckRhdGFiYXNlKERhdGFiYXNlT3Bl
bmluZ1N0cmF0ZWd5KTsKLQotICAgIHZvaWQgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKLSAg
ICB2b2lkIHVwZGF0ZVRyYWNrZXJEYXRhYmFzZUZyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVz
KCk7Ci0KLSAgICB2b2lkIGFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3Ry
aW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCk7Ci0gICAg
dm9pZCByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3Jp
Z2luSWRlbnRpZmllcik7Ci0gICAgU3RyaW5nIHBhdGhGb3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVu
dGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcik7Ci0KLSAgICBSZWZQdHI8V29y
a1F1ZXVlPiBtX3F1ZXVlOwotICAgIFN0cmluZyBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeTsKLQot
ICAgIFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlIG1fZGF0YWJhc2U7Ci0gICAgSGFzaFNldDxTdHJp
bmc+IG1fb3JpZ2luczsKLQotI2lmIFBMQVRGT1JNKElPUykKLSAgICB2b2lkIHBsYXRmb3JtTWF5
YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0OwotCi0gICAgbXV0YWJsZSBib29sIG1faGFzRXhj
bHVkZWRGcm9tQmFja3VwIHsgZmFsc2UgfTsKLSNlbmRpZgotfTsKLQotfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291
cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5j
cHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMDQ1MjU3Nzc4OGU5YjAzODMxMTBm
ZjBlNTQyN2E4ZDk5NmU1MGIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgiCi0KLSNpbmNsdWRlICJMb2dnaW5nLmgi
Ci0jaW5jbHVkZSAiV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlLmgiCi0jaW5jbHVkZSA8
V2ViQ29yZS9GaWxlTW9uaXRvci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvS2V5ZWRDb2RpbmcuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NoYXJl
ZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL1dvcmtR
dWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgotCi1uYW1l
c3BhY2UgV2ViS2l0IHsKLQotY29uc3RleHByIFNlY29uZHMgbWluaW11bVdyaXRlSW50ZXJ2YWwg
eyA1X21pbiB9OwotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotc3RhdGljIGJvb2wgaGFz
RmlsZUNoYW5nZWRTaW5jZShjb25zdCBTdHJpbmcmIHBhdGgsIFdhbGxUaW1lIHNpbmNlKQotewot
ICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIHRpbWVfdCBtb2RpZmljYXRpb25U
aW1lOwotICAgIGlmICghZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUocGF0aCwgbW9kaWZpY2F0aW9u
VGltZSkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIFdhbGxUaW1lOjpmcm9t
UmF3U2Vjb25kcyhtb2RpZmljYXRpb25UaW1lKSA+IHNpbmNlOwotfQotCi1zdGF0aWMgc3RkOjp1
bmlxdWVfcHRyPEtleWVkRGVjb2Rlcj4gY3JlYXRlRGVjb2RlckZvckZpbGUoY29uc3QgU3RyaW5n
JiBwYXRoKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIGF1dG8gaGFu
ZGxlID0gb3BlbkFuZExvY2tGaWxlKHBhdGgsIE9wZW5Gb3JSZWFkKTsKLSAgICBpZiAoaGFuZGxl
ID09IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwot
Ci0gICAgbG9uZyBsb25nIGZpbGVTaXplID0gMDsKLSAgICBpZiAoIWdldEZpbGVTaXplKGhhbmRs
ZSwgZmlsZVNpemUpKSB7Ci0gICAgICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOwotICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBzaXplX3QgYnl0ZXNUb1JlYWQ7Ci0g
ICAgaWYgKCFXVEY6OmNvbnZlcnRTYWZlbHkoZmlsZVNpemUsIGJ5dGVzVG9SZWFkKSkgewotICAg
ICAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7
Ci0gICAgfQotCi0gICAgVmVjdG9yPGNoYXI+IGJ1ZmZlcihieXRlc1RvUmVhZCk7Ci0gICAgc2l6
ZV90IHRvdGFsQnl0ZXNSZWFkID0gcmVhZEZyb21GaWxlKGhhbmRsZSwgYnVmZmVyLmRhdGEoKSwg
YnVmZmVyLnNpemUoKSk7Ci0KLSAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKLQotICAg
IGlmICh0b3RhbEJ5dGVzUmVhZCAhPSBieXRlc1RvUmVhZCkKLSAgICAgICAgcmV0dXJuIG51bGxw
dHI7Ci0KLSAgICByZXR1cm4gS2V5ZWREZWNvZGVyOjpkZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KGJ1ZmZlci5kYXRhKCkpLCBidWZmZXIuc2l6ZSgpKTsKLX0KLQotUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2UoV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiBzdG9y
ZSwgY29uc3QgU3RyaW5nJiBzdG9yYWdlRGlyZWN0b3J5UGF0aCkKLSAgICA6IG1fbWVtb3J5U3Rv
cmUoc3RvcmUpCi0gICAgLCBtX3N0b3JhZ2VEaXJlY3RvcnlQYXRoKHN0b3JhZ2VEaXJlY3RvcnlQ
YXRoKQotICAgICwgbV9hc3luY1dyaXRlVGltZXIoUnVuTG9vcDo6bWFpbigpLCB0aGlzLCAmUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjphc3luY1dyaXRlVGltZXJGaXJl
ZCkKLXsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OmluaXRpYWxpemUoKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIHBv
cHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlzaygpOwotICAgIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsK
LX0KLQotUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjp+UmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlKCkKLXsKLSAgICBmaW5pc2hBbGxQZW5kaW5n
V29ya1N5bmNocm9ub3VzbHkoKTsKLSAgICBBU1NFUlQoIW1faGFzUGVuZGluZ1dyaXRlKTsKLX0K
LQotU3RyaW5nIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RvcmFn
ZURpcmVjdG9yeVBhdGgoKSBjb25zdAotewotICAgIHJldHVybiBtX3N0b3JhZ2VEaXJlY3RvcnlQ
YXRoLmlzb2xhdGVkQ29weSgpOwotfQotCi1TdHJpbmcgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlOjpyZXNvdXJjZUxvZ0ZpbGVQYXRoKCkgY29uc3QKLXsKLSAgICBTdHJp
bmcgc3RvcmFnZVBhdGggPSBzdG9yYWdlRGlyZWN0b3J5UGF0aCgpOwotICAgIGlmIChzdG9yYWdl
UGF0aC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOwotCi0gICAgcmV0
dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChzdG9yYWdlUGF0aCwgImZ1bGxfYnJvd3Npbmdf
c2Vzc2lvbl9yZXNvdXJjZUxvZy5wbGlzdCIpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RhcnRNb25pdG9yaW5nRGlzaygpCi17Ci0gICAgQVNT
RVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgaWYgKG1fZmlsZU1vbml0b3IpCi0gICAgICAg
IHJldHVybjsKLQotICAgIFN0cmluZyByZXNvdXJjZUxvZ1BhdGggPSByZXNvdXJjZUxvZ0ZpbGVQ
YXRoKCk7Ci0gICAgaWYgKHJlc291cmNlTG9nUGF0aC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIG1fZmlsZU1vbml0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpbGVNb25pdG9yPihy
ZXNvdXJjZUxvZ1BhdGgsIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCksIFt0aGlzXSAo
RmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlIHR5cGUpIHsKLSAgICAgICAgQVNTRVJUKCFSdW5M
b29wOjppc01haW4oKSk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZp
bGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6TW9kaWZpY2F0aW9uOgotICAgICAgICAgICAgcmVm
cmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6UmVtb3ZhbDoKLSAgICAgICAgICAgIG1f
bWVtb3J5U3RvcmUuY2xlYXJJbk1lbW9yeSgpOwotICAgICAgICAgICAgbV9maWxlTW9uaXRvciA9
IG51bGxwdHI7Ci0gICAgICAgICAgICBtb25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9KTsKLX0KLQotdm9pZCBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6Om1vbml0b3JEaXJlY3RvcnlGb3JO
ZXdTdGF0aXN0aWNzKCkKLXsKLSAgICBTdHJpbmcgc3RvcmFnZVBhdGggPSBzdG9yYWdlRGlyZWN0
b3J5UGF0aCgpOwotICAgIEFTU0VSVCghc3RvcmFnZVBhdGguaXNFbXB0eSgpKTsKLQotICAgIGlm
ICghZmlsZUV4aXN0cyhzdG9yYWdlUGF0aCkpIHsKLSAgICAgICAgaWYgKCFtYWtlQWxsRGlyZWN0
b3JpZXMoc3RvcmFnZVBhdGgpKSB7Ci0gICAgICAgICAgICBSRUxFQVNFX0xPR19FUlJPUihSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlOiBGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSBwYXRoICVzIiwgc3RvcmFnZVBhdGgudXRm
OCgpLmRhdGEoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBtX2ZpbGVNb25pdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxGaWxlTW9uaXRvcj4oc3RvcmFnZVBh
dGgsIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCksIFt0aGlzXSAoRmlsZU1vbml0b3I6
OkZpbGVDaGFuZ2VUeXBlIHR5cGUpIHsKLSAgICAgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4o
KSk7Ci0gICAgICAgIGlmICh0eXBlID09IEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6UmVt
b3ZhbCkgewotICAgICAgICAgICAgLy8gRGlyZWN0b3J5IHdhcyByZW1vdmVkIQotICAgICAgICAg
ICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBTdHJpbmcgcmVzb3VyY2VMb2dQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0
aCgpOwotICAgICAgICBBU1NFUlQoIXJlc291cmNlTG9nUGF0aC5pc0VtcHR5KCkpOwotCi0gICAg
ICAgIGlmICghZmlsZUV4aXN0cyhyZXNvdXJjZUxvZ1BhdGgpKQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOwotCi0gICAgICAgIHJlZnJlc2hN
ZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0gICAgICAgIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsKLSAg
ICB9KTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OnN0b3BNb25pdG9yaW5nRGlzaygpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7
Ci0gICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7Ci19Ci0KLS8vIFRoaXMgaXMgY2FsbGVkIHdo
ZW4gdGhlIGZpbGUgY2hhbmdlcyBvbiBkaXNrLgotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6OnJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCkKLXsKLSAgICBB
U1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLQotICAgIFN0cmluZyBmaWxlUGF0aCA9IHJlc291
cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBpZiAoZmlsZVBhdGguaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICAvLyBXZSBzb21ldGltZXMgc2VlIGZpbGUgY2hhbmdlZCBldmVudHMgZnJv
bSBiZWZvcmUgb3VyIGxvYWQgY29tcGxldGVkICh3ZSBzdGFydAotICAgIC8vIHJlYWRpbmcgYXQg
dGhlIGZpcnN0IGNoYW5nZSBldmVudCwgYnV0IHdlIG1pZ2h0IHJlY2VpdmUgYSBzZXJpZXMgb2Yg
ZXZlbnRzIHJlbGF0ZWQKLSAgICAvLyB0byB0aGUgc2FtZSBmaWxlIG9wZXJhdGlvbikuIENhdGNo
IHRoaXMgY2FzZSB0byBhdm9pZCByZWFkaW5nIG92ZXJseSBvZnRlbi4KLSAgICBpZiAoIWhhc0Zp
bGVDaGFuZ2VkU2luY2UoZmlsZVBhdGgsIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBXYWxsVGltZSByZWFkVGltZSA9IFdhbGxUaW1lOjpub3co
KTsKLQotICAgIGF1dG8gZGVjb2RlciA9IGNyZWF0ZURlY29kZXJGb3JGaWxlKGZpbGVQYXRoKTsK
LSAgICBpZiAoIWRlY29kZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fbWVtb3J5U3RvcmUu
bWVyZ2VXaXRoRGF0YUZyb21EZWNvZGVyKCpkZWNvZGVyKTsKLSAgICBtX2xhc3RTdGF0aXN0aWNz
RmlsZVN5bmNUaW1lID0gcmVhZFRpbWU7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlOjpwb3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKQotewotICAg
IEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVz
b3VyY2VMb2dGaWxlUGF0aCgpOwotICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5KCkgfHwgIWZpbGVF
eGlzdHMoZmlsZVBhdGgpKSB7Ci0gICAgICAgIG1fbWVtb3J5U3RvcmUuZ3JhbmRmYXRoZXJFeGlz
dGluZ1dlYnNpdGVEYXRhKCk7Ci0gICAgICAgIG1vbml0b3JEaXJlY3RvcnlGb3JOZXdTdGF0aXN0
aWNzKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWhhc0ZpbGVDaGFuZ2Vk
U2luY2UoZmlsZVBhdGgsIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUpKSB7Ci0gICAgICAg
IC8vIE5vIG5lZWQgdG8gZ3JhbmRmYXRoZXIgaW4gdGhpcyBjYXNlLgotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgV2FsbFRpbWUgcmVhZFRpbWUgPSBXYWxsVGltZTo6bm93KCk7Ci0KLSAg
ICBhdXRvIGRlY29kZXIgPSBjcmVhdGVEZWNvZGVyRm9yRmlsZShmaWxlUGF0aCk7Ci0gICAgaWYg
KCFkZWNvZGVyKSB7Ci0gICAgICAgIG1fbWVtb3J5U3RvcmUuZ3JhbmRmYXRoZXJFeGlzdGluZ1dl
YnNpdGVEYXRhKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBU1NFUlRfV0lUSF9N
RVNTQUdFKG1fbWVtb3J5U3RvcmUuaXNFbXB0eSgpLCAiVGhpcyBpcyB0aGUgaW5pdGlhbCBpbXBv
cnQgc28gdGhlIHN0b3JlIHNob3VsZCBiZSBlbXB0eSIpOwotICAgIG1fbWVtb3J5U3RvcmUubWVy
Z2VXaXRoRGF0YUZyb21EZWNvZGVyKCpkZWNvZGVyKTsKLQotICAgIG1fbGFzdFN0YXRpc3RpY3NG
aWxlU3luY1RpbWUgPSByZWFkVGltZTsKLQotICAgIG1fbWVtb3J5U3RvcmUubG9nVGVzdGluZ0V2
ZW50KEFTQ0lJTGl0ZXJhbCgiUG9wdWxhdGVkV2l0aG91dEdyYW5kZmF0aGVyaW5nIikpOwotfQot
Ci12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6YXN5bmNXcml0
ZVRpbWVyRmlyZWQoKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgbV9t
ZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKS5kaXNwYXRjaChbdGhpc10gKCkgbXV0YWJsZSB7
Ci0gICAgICAgIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKLSAgICB9KTsKLX0KLQotdm9pZCBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OndyaXRlTWVtb3J5U3RvcmVU
b0Rpc2soKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgbV9oYXNQ
ZW5kaW5nV3JpdGUgPSBmYWxzZTsKLSAgICBzdG9wTW9uaXRvcmluZ0Rpc2soKTsKLQotICAgIGF1
dG8gZW5jb2RlciA9IG1fbWVtb3J5U3RvcmUuY3JlYXRlRW5jb2RlckZyb21EYXRhKCk7Ci0gICAg
YXV0byByYXdEYXRhID0gZW5jb2Rlci0+ZmluaXNoRW5jb2RpbmcoKTsKLSAgICBpZiAoIXJhd0Rh
dGEpCi0gICAgICAgIHJldHVybjsKLQotICAgIGF1dG8gc3RvcmFnZVBhdGggPSBzdG9yYWdlRGly
ZWN0b3J5UGF0aCgpOwotICAgIGlmICghc3RvcmFnZVBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAg
IG1ha2VBbGxEaXJlY3RvcmllcyhzdG9yYWdlUGF0aCk7Ci0gICAgICAgIGV4Y2x1ZGVGcm9tQmFj
a3VwKCk7Ci0gICAgfQotCi0gICAgYXV0byBoYW5kbGUgPSBvcGVuQW5kTG9ja0ZpbGUocmVzb3Vy
Y2VMb2dGaWxlUGF0aCgpLCBPcGVuRm9yV3JpdGUpOwotICAgIGlmIChoYW5kbGUgPT0gaW52YWxp
ZFBsYXRmb3JtRmlsZUhhbmRsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50NjRfdCB3cml0
dGVuQnl0ZXMgPSB3cml0ZVRvRmlsZShoYW5kbGUsIHJhd0RhdGEtPmRhdGEoKSwgcmF3RGF0YS0+
c2l6ZSgpKTsKLSAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKLQotICAgIGlmICh3cml0
dGVuQnl0ZXMgIT0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmF3RGF0YS0+c2l6ZSgpKSkKLSAgICAg
ICAgUkVMRUFTRV9MT0dfRVJST1IoUmVzb3VyY2VMb2FkU3RhdGlzdGljcywgIlJlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTogV2Ugb25seSB3cm90ZSAlZCBvdXQgb2YgJXp1
IGJ5dGVzIHRvIGRpc2siLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4od3JpdHRlbkJ5dGVzKSwgcmF3
RGF0YS0+c2l6ZSgpKTsKLQotICAgIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSBXYWxs
VGltZTo6bm93KCk7Ci0gICAgbV9sYXN0U3RhdGlzdGljc1dyaXRlVGltZSA9IE1vbm90b25pY1Rp
bWU6Om5vdygpOwotCi0gICAgc3RhcnRNb25pdG9yaW5nRGlzaygpOwotfQotCi12b2lkIFJlc291
cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c2NoZWR1bGVPcldyaXRlTWVtb3J5
U3RvcmUoRm9yY2VJbW1lZGlhdGVXcml0ZSBmb3JjZUltbWVkaWF0ZVdyaXRlKQotewotICAgIEFT
U0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgYXV0byB0aW1lU2luY2VMYXN0V3JpdGUg
PSBNb25vdG9uaWNUaW1lOjpub3coKSAtIG1fbGFzdFN0YXRpc3RpY3NXcml0ZVRpbWU7Ci0gICAg
aWYgKGZvcmNlSW1tZWRpYXRlV3JpdGUgIT0gRm9yY2VJbW1lZGlhdGVXcml0ZTo6WWVzICYmIHRp
bWVTaW5jZUxhc3RXcml0ZSA8IG1pbmltdW1Xcml0ZUludGVydmFsKSB7Ci0gICAgICAgIGlmICgh
bV9oYXNQZW5kaW5nV3JpdGUpIHsKLSAgICAgICAgICAgIG1faGFzUGVuZGluZ1dyaXRlID0gdHJ1
ZTsKLSAgICAgICAgICAgIFNlY29uZHMgZGVsYXkgPSBtaW5pbXVtV3JpdGVJbnRlcnZhbCAtIHRp
bWVTaW5jZUxhc3RXcml0ZSArIDFfczsKLSAgICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNw
YXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBkZWxheV0gewotICAg
ICAgICAgICAgICAgIG1fYXN5bmNXcml0ZVRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Ci0gICAg
ICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3Jp
dGVNZW1vcnlTdG9yZVRvRGlzaygpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZTo6Y2xlYXIoKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWlu
KCkpOwotICAgIFN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBp
ZiAoZmlsZVBhdGguaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzdG9wTW9uaXRv
cmluZ0Rpc2soKTsKLQotICAgIGlmICghZGVsZXRlRmlsZShmaWxlUGF0aCkpCi0gICAgICAgIFJF
TEVBU0VfTE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6IFVuYWJsZSB0byBkZWxldGUgc3RhdGlzdGljcyBmaWxl
OiAlcyIsIGZpbGVQYXRoLnV0ZjgoKS5kYXRhKCkpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZmluaXNoQWxsUGVuZGluZ1dvcmtTeW5jaHJvbm91
c2x5KCkKLXsKLSAgICBtX2FzeW5jV3JpdGVUaW1lci5zdG9wKCk7Ci0KLSAgICBCaW5hcnlTZW1h
cGhvcmUgc2VtYXBob3JlOwotICAgIC8vIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyB3b3JrIGluIG91
ciBxdWV1ZSBpcyBmaW5pc2hlZCBiZWZvcmUgd2UgdGVybWluYXRlLgotICAgIG1fbWVtb3J5U3Rv
cmUuc3RhdGlzdGljc1F1ZXVlKCkuZGlzcGF0Y2goWyZzZW1hcGhvcmUsIHRoaXNdIHsKLSAgICAg
ICAgLy8gV3JpdGUgZmluYWwgZmlsZSBzdGF0ZSB0byBkaXNrLgotICAgICAgICBpZiAobV9oYXNQ
ZW5kaW5nV3JpdGUpCi0gICAgICAgICAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7Ci0gICAg
ICAgIHNlbWFwaG9yZS5zaWduYWwoKTsKLSAgICB9KTsKLSAgICBzZW1hcGhvcmUud2FpdChXYWxs
VGltZTo6aW5maW5pdHkoKSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlOjpyZWYoKQotewotICAgIG1fbWVtb3J5U3RvcmUucmVmKCk7Ci19Ci0KLXZv
aWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpkZXJlZigpCi17Ci0g
ICAgbV9tZW1vcnlTdG9yZS5kZXJlZigpOwotfQotCi0jaWYgIVBMQVRGT1JNKElPUykKLXZvaWQg
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpleGNsdWRlRnJvbUJhY2t1
cCgpIGNvbnN0Ci17Ci19Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZS5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9S
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggYzVkMmVkNGJjNjkzYmExZWEyMTk0MmU0MDNjZDEzNmQ0ZTc2NzI1Yy4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYvTW9ub3Rv
bmljVGltZS5oPgotI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL1dhbGxU
aW1lLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLWNsYXNzIEZpbGVNb25pdG9yOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xh
c3MgV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlOwotCi1jbGFzcyBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UgewotcHVibGljOgotICAgIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZShXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUm
LCBjb25zdCBTdHJpbmcmIHN0b3JhZ2VEaXJlY3RvcnlQYXRoKTsKLSAgICB+UmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlKCk7Ci0KLSAgICB2b2lkIGluaXRpYWxpemUoKTsK
LSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICB2b2lkIGZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hy
b25vdXNseSgpOwotCi0gICAgdm9pZCByZWYoKTsKLSAgICB2b2lkIGRlcmVmKCk7Ci0KLSAgICBl
bnVtIGNsYXNzIEZvcmNlSW1tZWRpYXRlV3JpdGUgewotICAgICAgICBObywKLSAgICAgICAgWWVz
LAotICAgIH07Ci0gICAgdm9pZCBzY2hlZHVsZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVk
aWF0ZVdyaXRlKTsKLQotcHJpdmF0ZToKLSAgICBTdHJpbmcgc3RvcmFnZURpcmVjdG9yeVBhdGgo
KSBjb25zdDsKLSAgICBTdHJpbmcgcmVzb3VyY2VMb2dGaWxlUGF0aCgpIGNvbnN0OwotCi0gICAg
dm9pZCBzdGFydE1vbml0b3JpbmdEaXNrKCk7Ci0gICAgdm9pZCBzdG9wTW9uaXRvcmluZ0Rpc2so
KTsKLSAgICB2b2lkIG1vbml0b3JEaXJlY3RvcnlGb3JOZXdTdGF0aXN0aWNzKCk7Ci0KLSAgICB2
b2lkIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKLSAgICB2b2lkIHBvcHVsYXRlTWVtb3J5U3Rv
cmVGcm9tRGlzaygpOwotICAgIHZvaWQgZXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdDsKLSAgICB2
b2lkIHJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0gICAgdm9pZCBhc3luY1dyaXRlVGlt
ZXJGaXJlZCgpOwotCi0gICAgV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiBtX21lbW9y
eVN0b3JlOwotICAgIGNvbnN0IFN0cmluZyBtX3N0b3JhZ2VEaXJlY3RvcnlQYXRoOwotICAgIFJ1
bkxvb3A6OlRpbWVyPFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZT4gbV9h
c3luY1dyaXRlVGltZXI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkZpbGVNb25pdG9y
PiBtX2ZpbGVNb25pdG9yOwotICAgIFdhbGxUaW1lIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1Rp
bWU7Ci0gICAgTW9ub3RvbmljVGltZSBtX2xhc3RTdGF0aXN0aWNzV3JpdGVUaW1lOwotICAgIGJv
b2wgbV9oYXNQZW5kaW5nV3JpdGUgeyBmYWxzZSB9OwotfTsKLQotfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggNjM4Y2E2Y2I1MjYyMWY3MjNiYTgwNDQxMDFlMGNkMDU5NGM5NGI5
OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDg3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiU3RvcmFnZU1hbmFnZXIuaCIKLQotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURh
dGFiYXNlLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCi0jaW5j
bHVkZSAiU3RvcmFnZUFyZWFNYXBNZXNzYWdlcy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2Vy
TWVzc2FnZXMuaCIKLSNpbmNsdWRlICJXZWJQcm9jZXNzUHJveHkuaCIKLSNpbmNsdWRlIDxXZWJD
b3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmln
aW5IYXNoLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+Ci0jaW5jbHVkZSA8V2Vi
Q29yZS9UZXh0RW5jb2RpbmcuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8d3RmL1dv
cmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgotCi11
c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0
b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxT
dG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFN0
b3JhZ2VBcmVhPiBjcmVhdGUoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlP
cmlnaW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICB+U3RvcmFnZUFyZWEoKTsK
LQotICAgIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4o
KSBjb25zdCB7IHJldHVybiBtX3NlY3VyaXR5T3JpZ2luOyB9Ci0KLSAgICB2b2lkIGFkZExpc3Rl
bmVyKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCk7Ci0gICAgdm9pZCBy
ZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOwot
Ci0gICAgUmVmPFN0b3JhZ2VBcmVhPiBjbG9uZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRJdGVt
KElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFn
ZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0
cmluZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2VwdGlvbik7Ci0gICAgdm9pZCByZW1vdmVJ
dGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3Rv
cmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsK
LSAgICB2b2lkIGNsZWFyKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0
X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotCi0gICAg
Y29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIGl0ZW1zKCkgY29uc3Q7Ci0gICAgdm9pZCBj
bGVhcigpOwotCi0gICAgYm9vbCBpc1Nlc3Npb25TdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gIW1f
bG9jYWxTdG9yYWdlTmFtZXNwYWNlOyB9Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgU3RvcmFn
ZUFyZWEoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwg
dW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLQotICAgIHZvaWQgb3BlbkRhdGFiYXNlQW5kSW1wb3J0
SXRlbXNJZk5lZWRlZCgpIGNvbnN0OwotCi0gICAgdm9pZCBkaXNwYXRjaEV2ZW50cyhJUEM6OkNv
bm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQs
IGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcm
IG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykgY29uc3Q7Ci0KLSAgICAvLyBXaWxs
IGJlIG51bGwgaWYgdGhlIHN0b3JhZ2UgYXJlYSBiZWxvbmdzIHRvIGEgc2Vzc2lvbiBzdG9yYWdl
IG5hbWVzcGFjZS4KLSAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIG1fbG9jYWxTdG9yYWdlTmFt
ZXNwYWNlOwotICAgIG11dGFibGUgUmVmUHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBtX2xvY2Fs
U3RvcmFnZURhdGFiYXNlOwotICAgIG11dGFibGUgYm9vbCBtX2RpZEltcG9ydEl0ZW1zRnJvbURh
dGFiYXNlIHsgZmFsc2UgfTsKLQotICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3Jp
Z2luOwotICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOwotCi0gICAgUmVmUHRyPFN0b3JhZ2VN
YXA+IG1fc3RvcmFnZU1hcDsKLSAgICBIYXNoU2V0PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25u
ZWN0aW9uPiwgdWludDY0X3Q+PiBtX2V2ZW50TGlzdGVuZXJzOwotfTsKLQotY2xhc3MgU3RvcmFn
ZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291
bnRlZDxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPExv
Y2FsU3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlKFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3Rv
cmFnZU1hbmFnZXJJRCk7Ci0gICAgfkxvY2FsU3RvcmFnZU5hbWVzcGFjZSgpOwotCi0gICAgU3Rv
cmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlTWFu
YWdlcjsgfQotCi0gICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNl
Y3VyaXR5T3JpZ2luRGF0YSYmKTsKLSAgICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYShTdG9y
YWdlQXJlYSopOwotCi0gICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNv
bnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYpOwotICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMo
KTsKLQotcHJpdmF0ZToKLSAgICBleHBsaWNpdCBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoU3RvcmFn
ZU1hbmFnZXIqLCB1aW50NjRfdCBzdG9yYWdlTWFuYWdlcklEKTsKLQotICAgIFN0b3JhZ2VNYW5h
Z2VyKiBtX3N0b3JhZ2VNYW5hZ2VyOwotICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlE
OwotICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOwotCi0gICAgLy8gV2UgZG9uJ3QgaG9sZCBh
biBleHBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIFN0b3JhZ2VBcmVhczsgdGhleSBhcmUga2VwdCBh
bGl2ZSBieSB0aGUgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24gbWFwIGluIFN0b3JhZ2VNYW5h
Z2VyLgotICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYSo+IG1fc3Rv
cmFnZUFyZWFNYXA7Ci19OwotCi1jbGFzcyBTdG9yYWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxT
dG9yYWdlTmFtZXNwYWNlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFRyYW5zaWVudExv
Y2FsU3RvcmFnZU5hbWVzcGFjZT4gewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8VHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkpOwotICAgIH0KLQot
ICAgIH5UcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQotICAgIHsKLSAgICB9Ci0KLSAg
ICBSZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5E
YXRhJiYgc2VjdXJpdHlPcmlnaW4pCi0gICAgewotICAgICAgICByZXR1cm4gKm1fc3RvcmFnZUFy
ZWFNYXAuZW5zdXJlKHNlY3VyaXR5T3JpZ2luLCBbdGhpcywgc2VjdXJpdHlPcmlnaW5dKCkgbXV0
YWJsZSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBX
VEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOwotICAgICAgICB9KS5pdGVy
YXRvci0+dmFsdWUuY29weVJlZigpOwotICAgIH0KLQotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdp
bkRhdGE+IG9yaWdpbnMoKSBjb25zdAotICAgIHsKLSAgICAgICAgVmVjdG9yPFNlY3VyaXR5T3Jp
Z2luRGF0YT4gb3JpZ2luczsKLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0b3JhZ2VBcmVh
IDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFzdG9yYWdl
QXJlYS0+aXRlbXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQo
c3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIG9yaWdpbnM7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5n
T3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi0gICAgewot
ICAgICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMo
KSkgewotICAgICAgICAgICAgaWYgKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpID09IHNl
Y3VyaXR5T3JpZ2luKQotICAgICAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhckFsbFN0b3JhZ2VBcmVhcygpCi0gICAgewot
ICAgICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMo
KSkKLSAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwotICAgIH0KLQotcHJpdmF0ZToK
LSAgICBleHBsaWNpdCBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQotICAgIHsKLSAg
ICB9Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAy
NDsKLQotICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8U3RvcmFnZUFyZWE+
PiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsKLQotYXV0byBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFy
ZWE6OmNyZWF0ZShMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwg
Y29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbiwgdW5zaWduZWQgcXVvdGFJ
bkJ5dGVzKSAtPiBSZWY8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPgotewotICAgIHJldHVy
biBhZG9wdFJlZigqbmV3IFN0b3JhZ2VBcmVhKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgc2VjdXJp
dHlPcmlnaW4sIHF1b3RhSW5CeXRlcykpOwotfQotCi1TdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFy
ZWE6OlN0b3JhZ2VBcmVhKExvY2FsU3RvcmFnZU5hbWVzcGFjZSogbG9jYWxTdG9yYWdlTmFtZXNw
YWNlLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luLCB1bnNpZ25lZCBx
dW90YUluQnl0ZXMpCi0gICAgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZShsb2NhbFN0b3JhZ2VO
YW1lc3BhY2UpCi0gICAgLCBtX3NlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQotICAgICwg
bV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQotICAgICwgbV9zdG9yYWdlTWFwKFN0b3JhZ2VN
YXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcykpCi17Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTdG9y
YWdlQXJlYTo6flN0b3JhZ2VBcmVhKCkKLXsKLSAgICBBU1NFUlQobV9ldmVudExpc3RlbmVycy5p
c0VtcHR5KCkpOwotCi0gICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNsb3NlKCk7Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VO
YW1lc3BhY2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3Rv
cmFnZUFyZWEodGhpcyk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjph
ZGRMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VN
YXBJRCkKLXsKLSAgICBBU1NFUlQoIW1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtl
X3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKLSAgICBtX2V2ZW50TGlzdGVuZXJz
LmFkZChzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Ci19Ci0KLXZv
aWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpyZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5l
Y3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKLXsKLSAgICBBU1NFUlQo
aXNTZXNzaW9uU3RvcmFnZSgpIHx8IG1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtl
X3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKLSAgICBtX2V2ZW50TGlzdGVuZXJz
LnJlbW92ZShzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Ci19Ci0K
LVJlZjxTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdl
QXJlYTo6Y2xvbmUoKSBjb25zdAotewotICAgIEFTU0VSVCghbV9sb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UpOwotCi0gICAgYXV0byBzdG9yYWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0
ciwgbV9zZWN1cml0eU9yaWdpbiwgbV9xdW90YUluQnl0ZXMpOwotICAgIHN0b3JhZ2VBcmVhLT5t
X3N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXA7Ci0KLSAgICByZXR1cm4gc3RvcmFnZUFyZWE7Ci19
Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpzZXRJdGVtKElQQzo6Q29ubmVj
dGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3Ry
aW5nLCBib29sJiBxdW90YUV4Y2VwdGlvbikKLXsKLSAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJ
dGVtc0lmTmVlZGVkKCk7Ci0KLSAgICBTdHJpbmcgb2xkVmFsdWU7Ci0KLSAgICBhdXRvIG5ld1N0
b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1
b3RhRXhjZXB0aW9uKTsKLSAgICBpZiAobmV3U3RvcmFnZU1hcCkKLSAgICAgICAgbV9zdG9yYWdl
TWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKLQotICAgIGlmIChxdW90YUV4Y2VwdGlvbikK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCi0gICAg
ICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnNldEl0ZW0oa2V5LCB2YWx1ZSk7Ci0KLSAgICBk
aXNwYXRjaEV2ZW50cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXks
IG9sZFZhbHVlLCB2YWx1ZSwgdXJsU3RyaW5nKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6
U3RvcmFnZUFyZWE6OnJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9u
LCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3Qg
U3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5l
ZWRlZCgpOwotCi0gICAgU3RyaW5nIG9sZFZhbHVlOwotICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9
IG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKLSAgICBpZiAobmV3U3Rv
cmFnZU1hcCkKLSAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsK
LQotICAgIGlmIChvbGRWYWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYg
KG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2Ut
PnJlbW92ZUl0ZW0oa2V5KTsKLQotICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24s
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIFN0cmluZygpLCB1cmxTdHJpbmcp
OwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoSVBDOjpDb25u
ZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBj
b25zdCBTdHJpbmcmIHVybFN0cmluZykKLXsKLSAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVt
c0lmTmVlZGVkKCk7Ci0KLSAgICBpZiAoIW1fc3RvcmFnZU1hcC0+bGVuZ3RoKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3Rh
SW5CeXRlcyk7Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAgbV9s
b2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xlYXIoKTsKLQotICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJj
ZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmluZygpLCBTdHJpbmcoKSwgU3Ry
aW5nKCksIHVybFN0cmluZyk7Ci19Ci0KLWNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBT
dG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6Oml0ZW1zKCkgY29uc3QKLXsKLSAgICBvcGVuRGF0
YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlTWFw
LT5pdGVtcygpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIo
KQotewotICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRl
cyk7Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkgewotICAgICAgICBtX2xvY2Fs
U3RvcmFnZURhdGFiYXNlLT5jbG9zZSgpOwotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNl
ID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBtX2V2ZW50TGlzdGVuZXJz
LmJlZ2luKCksIGVuZCA9IG1fZXZlbnRMaXN0ZW5lcnMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkK
LSAgICAgICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6Q2xlYXJD
YWNoZSgpLCBpdC0+c2Vjb25kKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFy
ZWE6Om9wZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25zdAotewotICAgIGlm
ICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdl
IG9wZW4gdGhlIGRhdGFiYXNlIGhlcmUgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGltcG9ydGVkIG91
ciBpdGVtcyB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YWJhc2UgaXMgb3BlbiBpZiB3ZSBuZWVkIHRv
IHdyaXRlIHRvIGl0LgotICAgIGlmICghbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAg
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSA9IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjcmVhdGUobV9s
b2NhbFN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VNYW5hZ2VyKCktPm1fcXVldWUuY29weVJlZigp
LCBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU1hbmFnZXIoKS0+bV9sb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXIuY29weVJlZigpLCBtX3NlY3VyaXR5T3JpZ2luKTsKLQotICAgIGlm
IChtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBt
X2xvY2FsU3RvcmFnZURhdGFiYXNlLT5pbXBvcnRJdGVtcygqbV9zdG9yYWdlTWFwKTsKLSAgICBt
X2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlID0gdHJ1ZTsKLX0KLQotdm9pZCBTdG9yYWdlTWFu
YWdlcjo6U3RvcmFnZUFyZWE6OmRpc3BhdGNoRXZlbnRzKElQQzo6Q29ubmVjdGlvbiogc291cmNl
Q29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0
IFN0cmluZyYgdXJsU3RyaW5nKSBjb25zdAotewotICAgIGZvciAoSGFzaFNldDxzdGQ6OnBhaXI8
UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9ldmVudExpc3RlbmVycy5iZWdpbigpLCBlbmQgPSBtX2V2ZW50TGlzdGVuZXJzLmVuZCgpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCA9IGl0LT5m
aXJzdCA9PSBzb3VyY2VDb25uZWN0aW9uID8gc291cmNlU3RvcmFnZUFyZWFJRCA6IDA7Ci0KLSAg
ICAgICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlzcGF0Y2hT
dG9yYWdlRXZlbnQoc3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0
cmluZyksIGl0LT5zZWNvbmQpOwotICAgIH0KLX0KLQotUmVmPFN0b3JhZ2VNYW5hZ2VyOjpMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6
OmNyZWF0ZShTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VO
YW1lc3BhY2VJRCkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VOYW1l
c3BhY2Uoc3RvcmFnZU1hbmFnZXIsIHN0b3JhZ2VOYW1lc3BhY2VJRCkpOwotfQotCi0vLyBGSVhN
RTogVGhlIHF1b3RhIHZhbHVlIGlzIGNvcGllZCBmcm9tIEdyb3VwU2V0dGluZ3MuY3BwLgotLy8g
V2Ugc2hvdWxkIGludmVzdGlnYXRlIGEgd2F5IHRvIHNoYXJlIGl0IHdpdGggV2ViQ29yZS4KLVN0
b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OkxvY2FsU3RvcmFnZU5hbWVzcGFj
ZShTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3Bh
Y2VJRCkKLSAgICA6IG1fc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU1hbmFnZXIpCi0gICAgLCBtX3N0
b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCi0gICAgLCBtX3F1b3RhSW5CeXRl
cyg1ICogMTAyNCAqIDEwMjQpCi17Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VO
YW1lc3BhY2U6On5Mb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQotewotICAgIEFTU0VSVChtX3N0b3Jh
Z2VBcmVhTWFwLmlzRW1wdHkoKSk7Ci19Ci0KLWF1dG8gU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3Rv
cmFnZU5hbWVzcGFjZTo6Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEm
JiBzZWN1cml0eU9yaWdpbikgLT4gUmVmPFN0b3JhZ2VBcmVhPgotewotICAgIGF1dG8mIHNsb3Qg
PSBtX3N0b3JhZ2VBcmVhTWFwLmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3It
PnZhbHVlOwotICAgIGlmIChzbG90KQotICAgICAgICByZXR1cm4gKnNsb3Q7Ci0KLSAgICBhdXRv
IHN0b3JhZ2VBcmVhID0gU3RvcmFnZUFyZWE6OmNyZWF0ZSh0aGlzLCBXVEZNb3ZlKHNlY3VyaXR5
T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOwotICAgIHNsb3QgPSAmc3RvcmFnZUFyZWEuZ2V0KCk7
Ci0KLSAgICByZXR1cm4gc3RvcmFnZUFyZWE7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6Okxv
Y2FsU3RvcmFnZU5hbWVzcGFjZTo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhKFN0b3JhZ2VBcmVhKiBz
dG9yYWdlQXJlYSkKLXsKLSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYU1hcC5jb250YWlucyhzdG9y
YWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSkpOwotCi0gICAgbV9zdG9yYWdlQXJlYU1hcC5yZW1v
dmUoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOwotICAgIGlmICghbV9zdG9yYWdlQXJl
YU1hcC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX3N0b3JhZ2VN
YW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMobV9zdG9yYWdlTmFtZXNw
YWNlSUQpKTsKLSAgICBtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMu
cmVtb3ZlKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6
TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNv
bnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgZm9yIChjb25z
dCBhdXRvJiBvcmlnaW5BbmRTdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXApIHsKLSAgICAg
ICAgaWYgKG9yaWdpbkFuZFN0b3JhZ2VBcmVhLmtleSA9PSBzZWN1cml0eU9yaWdpbikKLSAgICAg
ICAgICAgIG9yaWdpbkFuZFN0b3JhZ2VBcmVhLnZhbHVlLT5jbGVhcigpOwotICAgIH0KLX0KLQot
dm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhckFsbFN0b3Jh
Z2VBcmVhcygpCi17Ci0gICAgZm9yIChhdXRvKiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFN
YXAudmFsdWVzKCkpCi0gICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwotfQotCi1jbGFzcyBT
dG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2Fm
ZVJlZkNvdW50ZWQ8U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0
aWMgUmVmPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUodW5zaWduZWQgcXVvdGFJbkJ5
dGVzKTsKLSAgICB+U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoKTsKLQotICAgIGJvb2wgaXNFbXB0
eSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgpOyB9Ci0KLSAgICBJ
UEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hbGxv
d2VkQ29ubmVjdGlvbi5nZXQoKTsgfQotICAgIHZvaWQgc2V0QWxsb3dlZENvbm5lY3Rpb24oSVBD
OjpDb25uZWN0aW9uKik7Ci0KLSAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFn
ZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYpOwotCi0gICAgdm9pZCBjbG9uZVRvKFNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7Ci0KLSAgICBWZWN0
b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFZl
Y3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7Ci0KLSAgICAgICAgZm9yIChjb25zdCBh
dXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKLSAgICAgICAg
ICAgIGlmICghc3RvcmFnZUFyZWEtPml0ZW1zKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
IG9yaWdpbnMuYXBwZW5kKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHJldHVybiBvcmlnaW5zOwotICAgIH0KLQotICAgIHZvaWQgY2xlYXJTdG9y
YWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5
T3JpZ2luKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFn
ZUFyZWFNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS0+c2VjdXJp
dHlPcmlnaW4oKSA9PSBzZWN1cml0eU9yaWdpbikKLSAgICAgICAgICAgICAgICBzdG9yYWdlQXJl
YS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdl
QXJlYXMoKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFn
ZUFyZWFNYXAudmFsdWVzKCkpCi0gICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKLSAg
ICB9Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodW5z
aWduZWQgcXVvdGFJbkJ5dGVzKTsKLQotICAgIFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+IG1fYWxs
b3dlZENvbm5lY3Rpb247Ci0gICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7Ci0KLSAgICBIYXNo
TWFwPFNlY3VyaXR5T3JpZ2luRGF0YSwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJl
YU1hcDsKLX07Ci0KLVJlZjxTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+
IFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHVuc2lnbmVk
IHF1b3RhSW5CeXRlcykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZShxdW90YUluQnl0ZXMpKTsKLX0KLQotU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YUlu
Qnl0ZXMpCi0gICAgOiBtX3F1b3RhSW5CeXRlcyhxdW90YUluQnl0ZXMpCi17Ci19Ci0KLVN0b3Jh
Z2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6flNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKCkKLXsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2U6OnNldEFsbG93ZWRDb25uZWN0aW9uKElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rp
b24pCi17Ci0gICAgQVNTRVJUKCFhbGxvd2VkQ29ubmVjdGlvbiB8fCAhbV9hbGxvd2VkQ29ubmVj
dGlvbik7Ci0KLSAgICBtX2FsbG93ZWRDb25uZWN0aW9uID0gYWxsb3dlZENvbm5lY3Rpb247Ci19
Ci0KLWF1dG8gU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpnZXRPckNy
ZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKSAtPiBS
ZWY8U3RvcmFnZUFyZWE+Ci17Ci0gICAgcmV0dXJuICptX3N0b3JhZ2VBcmVhTWFwLmVuc3VyZShz
ZWN1cml0eU9yaWdpbiwgW3RoaXMsIHNlY3VyaXR5T3JpZ2luXSgpIG11dGFibGUgewotICAgICAg
ICByZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3Jp
Z2luKSwgbV9xdW90YUluQnl0ZXMpOwotICAgIH0pLml0ZXJhdG9yLT52YWx1ZS5jb3B5UmVmKCk7
Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpjbG9u
ZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSkK
LXsKLSAgICBBU1NFUlRfVU5VU0VEKG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLCBuZXdTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZS5pc0VtcHR5KCkpOwotCi0gICAgZm9yIChhdXRvJiBwYWlyIDog
bV9zdG9yYWdlQXJlYU1hcCkKLSAgICAgICAgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UubV9z
dG9yYWdlQXJlYU1hcC5hZGQocGFpci5rZXksIHBhaXIudmFsdWUtPmNsb25lKCkpOwotfQotCi1S
ZWY8U3RvcmFnZU1hbmFnZXI+IFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBs
b2NhbFN0b3JhZ2VEaXJlY3RvcnkpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFn
ZU1hbmFnZXIobG9jYWxTdG9yYWdlRGlyZWN0b3J5KSk7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpT
dG9yYWdlTWFuYWdlcihjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKLSAgICA6
IG1fcXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuU3RvcmFnZU1hbmFn
ZXIiKSkKLSAgICAsIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcjo6Y3JlYXRlKG1fcXVldWUuY29weVJlZigpLCBsb2NhbFN0b3JhZ2VEaXJl
Y3RvcnkpKQotewotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgaXMgaW5pdGlhbGl6ZWQg
YmVmb3JlIHdlIHN0YXJ0IGRpc3BhdGNoaW5nIHRoaW5ncyB0byB0aGUgcXVldWUuCi0gICAgVVRG
OEVuY29kaW5nKCk7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjp+U3RvcmFnZU1hbmFnZXIoKQotewot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1
aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAg
ICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMp
LCBzdG9yYWdlTmFtZXNwYWNlSUQsIHF1b3RhSW5CeXRlc10oKSBtdXRhYmxlIHsKLSAgICAgICAg
QVNTRVJUKCFtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNw
YWNlSUQpKTsKLQotICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5zZXQoc3RvcmFn
ZU5hbWVzcGFjZUlELCBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHF1b3RhSW5CeXRl
cykpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQotewotICAgIG1fcXVl
dWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3Jh
Z2VOYW1lc3BhY2VJRF0gewotICAgICAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZXMuY29udGFpbnMoc3RvcmFnZU5hbWVzcGFjZUlEKSk7Ci0gICAgICAgIG1fc2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2VzLnJlbW92ZShzdG9yYWdlTmFtZXNwYWNlSUQpOwotICAgIH0pOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpzZXRBbGxvd2VkU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VDb25u
ZWN0aW9uKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgSVBDOjpDb25uZWN0aW9uKiBhbGxv
d2VkQ29ubmVjdGlvbikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVk
VGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb25uZWN0aW9uID0gUmVmUHRyPElQQzo6Q29ubmVjdGlv
bj4oYWxsb3dlZENvbm5lY3Rpb24pLCBzdG9yYWdlTmFtZXNwYWNlSURdKCkgbXV0YWJsZSB7Ci0g
ICAgICAgIEFTU0VSVChtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdl
TmFtZXNwYWNlSUQpKTsKLQotICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQo
c3RvcmFnZU5hbWVzcGFjZUlEKS0+c2V0QWxsb3dlZENvbm5lY3Rpb24oY29ubmVjdGlvbi5nZXQo
KSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmNsb25lU2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9y
YWdlTmFtZXNwYWNlSUQpCi17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3Rl
ZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlELCBuZXdTdG9yYWdlTmFt
ZXNwYWNlSURdIHsKLSAgICAgICAgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UqIHNlc3Npb25TdG9y
YWdlTmFtZXNwYWNlID0gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1l
c3BhY2VJRCk7Ci0gICAgICAgIGlmICghc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpIHsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gZ2V0IGludG8gdGhpcyBzaXR1YXRpb24gaWYgc29tZW9u
ZSBjbG9zZXMgdGhlIG9yaWdpbmF0aW5nIHBhZ2UgZnJvbSB3aXRoaW4gYQotICAgICAgICAgICAg
Ly8gY3JlYXRlTmV3UGFnZSBjYWxsYmFjay4gV2UgYmFpbCBmb3Igbm93LCBidXQgd2Ugc2hvdWxk
IHJlYWxseSBmaW5kIGEgd2F5IHRvIGtlZXAgdGhlIHNlc3Npb24gc3RvcmFnZSBhbGl2ZQotICAg
ICAgICAgICAgLy8gc28gd2Ugd2UnbGwgY2xvbmUgdGhlIHNlc3Npb24gc3RvcmFnZSBjb3JyZWN0
bHkuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZSogbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9y
YWdlTmFtZXNwYWNlcy5nZXQobmV3U3RvcmFnZU5hbWVzcGFjZUlEKTsKLSAgICAgICAgQVNTRVJU
KG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlKTsKLQotICAgICAgICBzZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZS0+Y2xvbmVUbygqbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpOwotICAgIH0pOwot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlBy
b2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbikKLXsKLSAgICBjb25uZWN0
aW9uLmFkZFdvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6
Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9xdWV1ZS5nZXQoKSwgdGhpcyk7Ci19Ci0KLXZvaWQg
U3RvcmFnZU1hbmFnZXI6OnByb2Nlc3NEaWRDbG9zZUNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5
JiwgSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uKQotewotICAgIGNvbm5lY3Rpb24ucmVtb3Zl
V29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6bWVzc2Fn
ZVJlY2VpdmVyTmFtZSgpKTsKLQotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0
ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbm5lY3Rpb24gPSBSZWY8SVBDOjpDb25uZWN0aW9u
Pihjb25uZWN0aW9uKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxSZWZQ
dHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElE
UGFpcnNUb1JlbW92ZTsKLSAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEua2V5LmZp
cnN0ICE9IGNvbm5lY3Rpb24ucHRyKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgICAgIHN0b3JhZ2VBcmVhLnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqc3RvcmFnZUFyZWEu
a2V5LmZpcnN0LCBzdG9yYWdlQXJlYS5rZXkuc2Vjb25kKTsKLSAgICAgICAgICAgIGNvbm5lY3Rp
b25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlLmFwcGVuZChzdG9yYWdlQXJlYS5rZXkpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY29ubmVjdGlvbkFuZFN0b3Jh
Z2VNYXBJRFBhaXJzVG9SZW1vdmUpCi0gICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVj
dGlvbi5yZW1vdmUocGFpcik7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6Omdl
dFNlc3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBtX3F1ZXVl
LT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0
aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAg
ICAgICBIYXNoU2V0PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKLQotICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogc2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UtPm9yaWdpbnMoKSkKLSAgICAgICAgICAgICAgICBvcmlnaW5z
LmFkZChvcmlnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3Bh
dGNoKFtvcmlnaW5zID0gV1RGTW92ZShvcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZN
b3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgICAgIGNvbXBsZXRp
b25IYW5kbGVyKFdURk1vdmUob3JpZ2lucykpOwotICAgICAgICB9KTsKLSAgICB9KTsKLX0KLQot
dm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9u
PHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChb
dGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9
IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICBmb3IgKGF1
dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMu
dmFsdWVzKCkpCi0gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJBbGxT
dG9yYWdlQXJlYXMoKTsKLQotICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcikpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2Vy
OjpkZWxldGVTZXNzaW9uU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29t
cGxldGlvbkhhbmRsZXIpCi17Ci0gICAgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0
YT4gY29waWVkT3JpZ2luczsKLSAgICBjb3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNp
dHkob3JpZ2lucy5zaXplKCkpOwotCi0gICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQot
ICAgICAgICBjb3BpZWRPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5
KCkpOwotCi0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtl
UmVmKCp0aGlzKSwgY29waWVkT3JpZ2lucyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBs
ZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0g
ICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogY29waWVkT3JpZ2lucykgewotICAgICAgICAgICAg
Zm9yIChhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
LT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7Ci0gICAgICAgIH0KLQot
ICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxl
cikpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VP
cmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+
JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlz
LCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RG
TW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgIEhhc2hTZXQ8U2Vj
dXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zOwotCi0gICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDog
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPm9yaWdpbnMoKSkKLSAgICAgICAgICAgIG9y
aWdpbnMuYWRkKG9yaWdpbik7Ci0KLSAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVz
KCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogdHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlLT5vcmlnaW5zKCkpCi0gICAgICAgICAgICAgICAgb3JpZ2lucy5hZGQob3Jp
Z2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3Jp
Z2lucyA9IFdURk1vdmUob3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21w
bGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxl
cihXVEZNb3ZlKG9yaWdpbnMpKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3Rv
cmFnZU1hbmFnZXI6OmdldExvY2FsU3RvcmFnZU9yaWdpbkRldGFpbHMoRnVuY3Rpb248dm9pZCAo
VmVjdG9yPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNv
bXBsZXRpb25IYW5kbGVyKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0
ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21w
bGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgIGF1dG8gb3JpZ2luRGV0YWlscyA9
IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5vcmlnaW5EZXRhaWxzKCk7Ci0KLSAgICAg
ICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5EZXRhaWxzID0gV1RGTW92ZShvcmln
aW5EZXRhaWxzKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVy
KV0oKSBtdXRhYmxlIHsKLSAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3Jp
Z2luRGV0YWlscykpOwotICAgICAgICB9KTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFu
YWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbkRh
dGEmJiBzZWN1cml0eU9yaWdpbikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJv
dGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW4gPSBzZWN1cml0eU9yaWdp
bi5pc29sYXRlZENvcHkoKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0
b3JhZ2VOYW1lc3BhY2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAg
ICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdP
cmlnaW4oY29waWVkT3JpZ2luKTsKLQotICAgICAgICBmb3IgKGF1dG8mIHRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1
ZXMoKSkKLSAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJT
dG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb3BpZWRPcmlnaW4pOwotCi0gICAgICAgIG1fbG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29waWVk
T3JpZ2luKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxT
dG9yYWdlT3JpZ2luc01vZGlmaWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGlt
ZV9wb2ludCB0aW1lLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0g
ICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KSwgdGltZSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
KSBtdXRhYmxlIHsKLSAgICAgICAgYXV0byBkZWxldGVkT3JpZ2lucyA9IG1fbG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZXNNb2RpZmllZFNpbmNlKHRpbWUpOwotCi0g
ICAgICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luIDogZGVsZXRlZE9yaWdpbnMpIHsKLSAgICAg
ICAgICAgIGZvciAoYXV0byYgbG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VO
YW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFj
ZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOwotICAgICAgICB9Ci0K
LSAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3Ry
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICB0cmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7Ci0KLSAg
ICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIp
KTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdl
RW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0
YT4mIG9yaWdpbnMsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAg
ICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBjb3BpZWRPcmlnaW5zOwotICAgIGNvcGllZE9y
aWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5zLnNpemUoKSk7Ci0KLSAgICBmb3Ig
KGF1dG8mIG9yaWdpbiA6IG9yaWdpbnMpCi0gICAgICAgIGNvcGllZE9yaWdpbnMudW5jaGVja2Vk
QXBwZW5kKG9yaWdpbi5pc29sYXRlZENvcHkoKSk7Ci0KLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChb
dGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW5zID0gV1RG
TW92ZShjb3BpZWRPcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRp
b25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBjb3Bp
ZWRPcmlnaW5zKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFj
ZSA6IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBs
b2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3Jp
Z2luKTsKLQotICAgICAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAg
ICAgICAgICAgICAgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VB
cmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7Ci0KLSAgICAgICAgICAgIG1fbG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4ob3JpZ2luKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRp
b25IYW5kbGVyKSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZUxv
Y2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdpbkRhdGEm
JiBzZWN1cml0eU9yaWdpbkRhdGEpCi17Ci0gICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5l
Y3Rpb24+LCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rp
b24sIHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNz
YWdlIGNoZWNrLgotICAgIEFTU0VSVCgoSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29u
bmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj46OmlzVmFsaWRLZXkoY29u
bmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKSk7Ci0KLSAgICBIYXNoTWFwPHN0ZDo6cGFpcjxS
ZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+Pjo6
QWRkUmVzdWx0IHJlc3VsdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZChjb25uZWN0
aW9uQW5kU3RvcmFnZU1hcElEUGFpciwgbnVsbHB0cik7Ci0KLSAgICAvLyBGSVhNRTogVGhlc2Ug
c2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVja3MuCi0gICAgQVNTRVJUKHJlc3VsdC5pc05ld0VudHJ5
KTsKLSAgICBBU1NFUlQoKEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1l
c3BhY2U+Pjo6aXNWYWxpZEtleShzdG9yYWdlTmFtZXNwYWNlSUQpKSk7Ci0KLSAgICBMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlTG9jYWxT
dG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0KLSAgICAvLyBGSVhNRTogVGhp
cyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVChsb2NhbFN0b3JhZ2VOYW1l
c3BhY2UpOwotCi0gICAgYXV0byBzdG9yYWdlQXJlYSA9IGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+
Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOwotICAg
IHN0b3JhZ2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0g
ICAgcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZSA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAoSVBDOjpD
b25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0
b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW5EYXRh
LCBTZWN1cml0eU9yaWdpbkRhdGEmJiBvcmlnaW4pCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hv
dWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5l
Y3Rpb24uaXNWYWxpZEtleSh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSkpOwotCi0gICAg
Ly8gU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXMgY29ubmVj
dGlvbi9vcmlnaW4gY29tYm8uCi0gICAgLy8gSWYgc28sIHVwZGF0ZSB0aGUgbWFwIHdpdGggdGhl
IG5ldyBJRCwgb3RoZXJ3aXNlIGtlZXAgb24gdHJ1Y2tpbmcuCi0gICAgZm9yIChhdXRvIGl0ID0g
bV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYmVnaW4oKSwgZW5kID0gbV9zdG9yYWdlQXJlYXNC
eUNvbm5lY3Rpb24uZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBpZiAoaXQtPmtl
eS5maXJzdCAhPSAmY29ubmVjdGlvbikKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBS
ZWY8U3RvcmFnZUFyZWE+IGFyZWEgPSAqaXQtPnZhbHVlOwotICAgICAgICBpZiAoIWFyZWEtPmlz
U2Vzc2lvblN0b3JhZ2UoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoIW9y
aWdpbi5zZWN1cml0eU9yaWdpbigpLT5pc1NhbWVTY2hlbWVIb3N0UG9ydChhcmVhLT5zZWN1cml0
eU9yaWdpbigpLnNlY3VyaXR5T3JpZ2luKCkuZ2V0KCkpKQotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIGFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0g
ICAgICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLnJlbW92ZShpdCk7Ci0gICAgICAgIG1f
c3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZCh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQg
fSwgV1RGTW92ZShhcmVhKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvJiBz
bG90ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0KLSAgICAvLyBGSVhNRTogVGhp
cyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVCghc2xvdCk7Ci0KLSAgICBU
cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZSA9IGdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VO
YW1lc3BhY2VJRCwgV1RGTW92ZSh0b3BMZXZlbE9yaWdpbkRhdGEpKTsKLQotICAgIGF1dG8gc3Rv
cmFnZUFyZWEgPSB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRlU3Rv
cmFnZUFyZWEoV1RGTW92ZShvcmlnaW4pKTsKLSAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIo
Y29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAgIHNsb3QgPSBXVEZNb3ZlKHN0b3JhZ2VB
cmVhKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAo
SVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2
NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmln
aW5EYXRhKQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2su
Ci0gICAgQVNTRVJUKG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFn
ZU5hbWVzcGFjZUlEKSk7Ci0KLSAgICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5h
bWVzcGFjZUlEKTsKLSAgICBpZiAoIXNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKSB7Ci0gICAgICAg
IC8vIFdlJ3JlIGdldHRpbmcgYW4gaW5jb21pbmcgbWVzc2FnZSBmcm9tIHRoZSB3ZWIgcHJvY2Vz
cyB0aGF0J3MgZm9yIHNlc3Npb24gc3RvcmFnZSBmb3IgYSB3ZWIgcGFnZQotICAgICAgICAvLyB0
aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLCBqdXN0IGlnbm9yZSBpdC4KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hl
Y2suCi0gICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAm
Y29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0pKTsKLQotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3Jh
Z2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIG51
bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBh
IG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKCFzbG90KTsKLQotICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKCZjb25uZWN0aW9uID09IHNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlLT5hbGxvd2VkQ29ubmVjdGlvbigpKTsKLQotICAgIGF1dG8g
c3RvcmFnZUFyZWEgPSBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdl
QXJlYShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOwotICAgIHN0b3JhZ2VBcmVhLT5hZGRM
aXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgc2xvdCA9IFdURk1vdmUo
c3RvcmFnZUFyZWEpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U3RvcmFnZU1h
cChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKLXsK
LSAgICBzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiBjb25uZWN0
aW9uQW5kU3RvcmFnZU1hcElEUGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKG1f
c3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VN
YXBJRFBhaXIpKTsKLQotICAgIGF1dG8gaXQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5m
aW5kKGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKTsKLSAgICBpZiAoaXQgPT0gbV9zdG9y
YWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5kKCkpIHsKLSAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24g
aGFzIGJlZW4gcmVtb3ZlZCBiZWNhdXNlIHRoZSBsYXN0IHBhZ2Ugd2FzIGNsb3NlZC4KLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIGl0LT52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoY29ubmVj
dGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAgIC8vIERvbid0IHJlbW92ZSBzZXNzaW9uIHN0b3Jh
Z2UgbWFwcy4gVGhlIHdlYiBwcm9jZXNzIG1heSByZWNvbm5lY3QgYW5kIGV4cGVjdCB0aGUgZGF0
YSB0byBzdGlsbCBiZSBhcm91bmQuCi0gICAgaWYgKGl0LT52YWx1ZS0+aXNTZXNzaW9uU3RvcmFn
ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5y
ZW1vdmUoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOwotfQotCi12b2lkIFN0b3JhZ2VN
YW5hZ2VyOjpnZXRWYWx1ZXMoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBz
dG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiYgdmFsdWVzKQotewotICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9y
YWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEp
IHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2Ug
dGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgdmFsdWVzID0gc3RvcmFnZUFyZWEtPml0ZW1zKCk7Ci0gICAgY29ubmVj
dGlvbi5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkR2V0VmFsdWVzKHN0b3JhZ2VN
YXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0SXRl
bShJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWlu
dDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmlu
ZykKLXsKLSAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29u
bmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLSAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7Ci0gICAgICAg
IC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFs
cmVhZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGJvb2wgcXVvdGFFcnJvcjsKLSAgICBzdG9yYWdlQXJlYS0+c2V0SXRlbSgmY29ubmVjdGlv
biwgc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCB2YWx1ZSwgdXJsU3RyaW5nLCBxdW90YUVycm9y
KTsKLSAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRTZXRJ
dGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXksIHF1b3RhRXJyb3IpLCBzdG9yYWdlTWFwSUQpOwotfQot
Ci12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpyZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiYgY29ubmVj
dGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlE
LCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgdXJsU3RyaW5nKQotewotICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9y
YWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEp
IHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2Ug
dGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgc3RvcmFnZUFyZWEtPnJlbW92ZUl0ZW0oJmNvbm5lY3Rpb24sIHNvdXJj
ZVN0b3JhZ2VBcmVhSUQsIGtleSwgdXJsU3RyaW5nKTsKLSAgICBjb25uZWN0aW9uLnNlbmQoTWVz
c2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRSZW1vdmVJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXkp
LCBzdG9yYWdlTWFwSUQpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjbGVhcihJUEM6OkNv
bm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYg
dXJsU3RyaW5nKQotewotICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdl
QXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEpIHsK
LSAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhh
dCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgc3RvcmFnZUFyZWEtPmNsZWFyKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdl
QXJlYUlELCB1cmxTdHJpbmcpOwotICAgIGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFn
ZUFyZWFNYXA6OkRpZENsZWFyKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKLX0KLQot
dm9pZCBTdG9yYWdlTWFuYWdlcjo6YXBwbGljYXRpb25XaWxsVGVybWluYXRlKCkKLXsKLSAgICBC
aW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOwotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCAm
c2VtYXBob3JlXSB7Ci0gICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVj
dGlvbj4sIHVpbnQ2NF90Pj4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmU7
Ci0gICAgICAgIGZvciAoYXV0byYgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBjb25uZWN0aW9uU3RvcmFnZUFyZWFQ
YWlyLnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXku
Zmlyc3QsIGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5LnNlY29uZCk7Ci0gICAgICAgICAg
ICBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZS5hcHBlbmQoY29ubmVjdGlv
blN0b3JhZ2VBcmVhUGFpci5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiBj
b25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJz
VG9SZW1vdmUpCi0gICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUo
Y29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpcik7Ci0KLSAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgp
OwotICAgIH0pOwotICAgIHNlbWFwaG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKLX0K
LQotU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhKiBTdG9yYWdlTWFuYWdlcjo6ZmluZFN0b3Jh
Z2VBcmVhKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElE
KSBjb25zdAotewotICAgIHN0ZDo6cGFpcjxJUEM6OkNvbm5lY3Rpb24qLCB1aW50NjRfdD4gY29u
bmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0K
LSAgICBpZiAoIW1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlv
bkFuZFN0b3JhZ2VNYXBJRFBhaXIpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJl
dHVybiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5nZXQoY29ubmVjdGlvbkFuZFN0b3JhZ2VN
YXBJRFBhaXIpOwotfQotCi1TdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBT
dG9yYWdlTWFuYWdlcjo6Z2V0T3JDcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlEKQotewotICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2Vz
LmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7
Ci0KLSAgICBhdXRvJiBzbG90ID0gbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmFkZChzdG9yYWdl
TmFtZXNwYWNlSUQsIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAoIXNsb3QpCi0g
ICAgICAgIHNsb3QgPSBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZSh0aGlzLCBzdG9yYWdl
TmFtZXNwYWNlSUQpOwotCi0gICAgcmV0dXJuIHNsb3QuZ2V0KCk7Ci19Ci0KLVN0b3JhZ2VNYW5h
Z2VyOjpUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIFN0b3JhZ2VNYW5hZ2VyOjpnZXRP
ckNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFt
ZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luKQot
ewotICAgIGlmICghbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXko
eyBzdG9yYWdlTmFtZXNwYWNlSUQsIHRvcExldmVsT3JpZ2luIH0pKQotICAgICAgICByZXR1cm4g
bnVsbHB0cjsKLQotICAgIGF1dG8mIHNsb3QgPSBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZXMuYWRkKHsgc3RvcmFnZU5hbWVzcGFjZUlELCBXVEZNb3ZlKHRvcExldmVsT3JpZ2luKSB9
LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgaWYgKCFzbG90KQotICAgICAgICBzbG90
ID0gVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjcmVhdGUoKTsKLQotICAgIHJldHVy
biBzbG90LmdldCgpOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaCBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggYTFmNjllYjcwNzNhM2NhNWYzYjhlMjdkOTMzZDFiOGFlMjgxYTA5Yi4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAt
MSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQ29u
bmVjdGlvbi5oIgotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgotI2lu
Y2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9T
ZWN1cml0eU9yaWdpbkhhc2guaD4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8d3RmL0Zv
cndhcmQuaD4KLSNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNl
dC5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgotI2luY2x1ZGUgPHd0
Zi90ZXh0L1N0cmluZ0hhc2guaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJp
dHlPcmlnaW47Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI7Ci1jbGFzcyBXZWJQcm9jZXNzUHJveHk7Ci0KLWNsYXNzIFN0b3JhZ2VN
YW5hZ2VyIDogcHVibGljIElQQzo6Q29ubmVjdGlvbjo6V29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVy
IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFN0b3JhZ2VNYW5hZ2VyPiBjcmVhdGUoY29uc3Qg
U3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotICAgIH5TdG9yYWdlTWFuYWdlcigpOwot
Ci0gICAgdm9pZCBjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdl
TmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0gICAgdm9pZCBkZXN0cm95U2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKTsKLSAgICB2
b2lkIHNldEFsbG93ZWRTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZUNvbm5lY3Rpb24odWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlELCBJUEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKTsK
LSAgICB2b2lkIGNsb25lU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5h
bWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9yYWdlTmFtZXNwYWNlSUQpOwotCi0gICAgdm9pZCBw
cm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlv
biYpOwotICAgIHZvaWQgcHJvY2Vzc0RpZENsb3NlQ29ubmVjdGlvbihXZWJQcm9jZXNzUHJveHkm
LCBJUEM6OkNvbm5lY3Rpb24mKTsKLSAgICB2b2lkIGFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZSgp
OwotCi0gICAgdm9pZCBnZXRTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZChIYXNo
U2V0PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxldGlvbkhhbmRsZXIp
OwotICAgIHZvaWQgZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoKT4m
JiBjb21wbGV0aW9uSGFuZGxlcik7Ci0gICAgdm9pZCBkZWxldGVTZXNzaW9uU3RvcmFnZUVudHJp
ZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+Jiwg
RnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKLQotICAgIHZvaWQgZ2V0TG9j
YWxTdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7Ci0gICAgdm9pZCBkZWxldGVMb2Nh
bFN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2luKFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsK
LQotICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9yYWdlT3JpZ2luc01vZGlmaWVkU2luY2Uoc3RkOjpj
aHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBs
ZXRpb25IYW5kbGVyKTsKLSAgICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmln
aW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgRnVuY3Rpb248
dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKLQotICAgIHZvaWQgZ2V0TG9jYWxTdG9yYWdl
T3JpZ2luRGV0YWlscyhGdW5jdGlvbjx2b2lkKFZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI6Ok9yaWdpbkRldGFpbHM+KT4mJiBjb21wbGV0aW9uSGFuZGxlcik7Ci0KLXByaXZhdGU6
Ci0gICAgZXhwbGljaXQgU3RvcmFnZU1hbmFnZXIoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VE
aXJlY3RvcnkpOwotCi0gICAgLy8gSVBDOjpDb25uZWN0aW9uOjpXb3JrUXVldWVNZXNzYWdlUmVj
ZWl2ZXIuCi0gICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6
OkRlY29kZXImKSBvdmVycmlkZTsKLSAgICB2b2lkIGRpZFJlY2VpdmVTeW5jTWVzc2FnZShJUEM6
OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImLCBzdGQ6OnVuaXF1ZV9wdHI8SVBDOjpFbmNvZGVy
PiYgcmVwbHlFbmNvZGVyKSBvdmVycmlkZTsKLQotICAgIC8vIE1lc3NhZ2UgaGFuZGxlcnMuCi0g
ICAgdm9pZCBjcmVhdGVMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qg
c3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YSYmKTsKLSAgICB2b2lkIGNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU1h
cChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmln
aW5EYXRhLCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0gICAgdm9pZCBjcmVhdGVT
ZXNzaW9uU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQs
IHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRh
JiYpOwotICAgIHZvaWQgZGVzdHJveVN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0
X3Qgc3RvcmFnZU1hcElEKTsKLQotICAgIHZvaWQgZ2V0VmFsdWVzKElQQzo6Q29ubmVjdGlvbiYs
IHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+JiB2YWx1ZXMpOwotICAgIHZvaWQgc2V0SXRlbShJUEM6OkNvbm5lY3Rp
b24mLCB1aW50NjRfdCBzdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlE
LCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0o
SVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VT
dG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLSAgICB2b2lkIGNsZWFyKElQQzo6Q29ubmVjdGlv
biYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwg
dWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLQotICAg
IGNsYXNzIFN0b3JhZ2VBcmVhOwotICAgIFN0b3JhZ2VBcmVhKiBmaW5kU3RvcmFnZUFyZWEoSVBD
OjpDb25uZWN0aW9uJiwgdWludDY0X3QpIGNvbnN0OwotCi0gICAgY2xhc3MgTG9jYWxTdG9yYWdl
TmFtZXNwYWNlOwotICAgIExvY2FsU3RvcmFnZU5hbWVzcGFjZSogZ2V0T3JDcmVhdGVMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKTsKLQotICAgIGNsYXNz
IFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZTsKLSAgICBUcmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UqIGdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYg
dG9wTGV2ZWxPcmlnaW4pOwotCi0gICAgUmVmPFdvcmtRdWV1ZT4gbV9xdWV1ZTsKLQotICAgIFJl
ZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyOwotICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+
PiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXM7Ci0KLSAgICBIYXNoTWFwPHN0ZDo6cGFpcjx1aW50
NjRfdCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiwgUmVmUHRyPFRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZT4+IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlczsKLQot
ICAgIGNsYXNzIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOwotICAgIEhhc2hNYXA8dWludDY0X3Qs
IFJlZlB0cjxTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4+IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2VzOwotCi0gICAgSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVp
bnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb247
Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTc4OWY3NGNjMDgxYjA3NGI1ODg1MGQyYjdkN2JjNDE4
MDQ5YzhhLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4K
KysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSMgYXJlIG1ldDoKLSMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQK
LSMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKLSMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUgotIyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMCi0jIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0jIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSCi0jIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0j
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0KLW1lc3NhZ2VzIC0+IFN0b3JhZ2VNYW5hZ2VyIHsKLSAgICBDcmVhdGVM
b2NhbFN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFt
ZXNwYWNlSUQsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmln
aW5EYXRhKSBXYW50c0Nvbm5lY3Rpb24KLSAgICBDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VN
YXAodWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHN0
cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgdG9wTGV2ZWxTZWN1cml0eU9yaWdpbkRh
dGEsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5EYXRh
KSBXYW50c0Nvbm5lY3Rpb24KLSAgICBDcmVhdGVTZXNzaW9uU3RvcmFnZU1hcCh1aW50NjRfdCBz
dG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSBzZWN1cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgot
ICAgIERlc3Ryb3lTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkgV2FudHNDb25uZWN0
aW9uCi0KLSAgICBHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9y
YWdlTWFwU2VlZCkgLT4gKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcykgV2FudHNDb25u
ZWN0aW9uCi0KLSAgICBTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXksIFN0
cmluZyB2YWx1ZSwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCi0gICAgUmVtb3Zl
SXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQs
IHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBTdHJpbmcgdXJsU3RyaW5nKSBX
YW50c0Nvbm5lY3Rpb24KLSAgICBDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcgdXJs
U3RyaW5nKSBXYW50c0Nvbm5lY3Rpb24KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1N0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbSBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlcklPUy5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5MDllYTZiMjUwMzE5
YjAxMzA2YzQzNmJkMGYxMzJjMGY4Mjg1Ni4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkxvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlci5oIgotCi0jaWYgUExBVEZPUk0oSU9TKQotCi0jaW5jbHVkZSAi
VmVyc2lvbkNoZWNrcy5oIgotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotdm9pZCBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6OnBsYXRmb3JtTWF5YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0
Ci17Ci0gICAgaWYgKG1faGFzRXhjbHVkZWRGcm9tQmFja3VwKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtX2hhc0V4Y2x1ZGVkRnJvbUJhY2t1cCA9IHRydWU7Ci0KLSAgICBpZiAobGlua2VkT25P
ckFmdGVyKFNES1ZlcnNpb246OkZpcnN0VG9FeGNsdWRlTG9jYWxTdG9yYWdlRnJvbUJhY2t1cCkp
Ci0gICAgICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0cmluZyAqKW1fbG9jYWxTdG9y
YWdlRGlyZWN0b3J5XSBzZXRSZXNvdXJjZVZhbHVlOkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRl
ZEZyb21CYWNrdXBLZXkgZXJyb3I6bmlsXTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9pb3Mv
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tIGIvU291cmNlL1dl
YktpdC9VSVByb2Nlc3MvU3RvcmFnZS9pb3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlSU9TLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVjYmQyOGUy
NDkyOTEzYTQzMjc2NGM5YmE5MzY1Mjc3Yzk3NzIxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9z
L1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbQorKysgL2Rldi9u
dWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNp
bXBvcnQgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIgotCi0jaWYg
UExBVEZPUk0oSU9TKQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotdm9pZCBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKLXsK
LSAgICBbW05TVVJMIGZpbGVVUkxXaXRoUGF0aDooTlNTdHJpbmcgKiltX3N0b3JhZ2VEaXJlY3Rv
cnlQYXRoXSBzZXRSZXNvdXJjZVZhbHVlOkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21C
YWNrdXBLZXkgZXJyb3I6bmlsXTsKLX0KLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwIGIv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uNTk4YTNiZDY4OTBlNTNkOTFjMzkwNGM5OTc5ZTkxZGFlNDU1MDUxMQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9j
YWxTdG9yYWdlRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFn
ZURhdGFiYXNlLmgiCisKKyNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIK
KyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0
ZVN0YXRlbWVudC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlVHJhbnNhY3Rpb24uaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9y
YWdlTWFwLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdWRkZW5UZXJtaW5hdGlvbi5oPgorI2luY2x1
ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8
d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgor
Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGljIGNvbnN0IGF1dG8gZGF0YWJhc2VV
cGRhdGVJbnRlcnZhbCA9IDFfczsKKworc3RhdGljIGNvbnN0IGludCBtYXhpbXVtSXRlbXNUb1Vw
ZGF0ZSA9IDEwMDsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1JlZjxMb2NhbFN0b3JhZ2VEYXRh
YmFzZT4gTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVl
LCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmIHRyYWNrZXIsIGNvbnN0IFNlY3Vy
aXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpu
ZXcgTG9jYWxTdG9yYWdlRGF0YWJhc2UoV1RGTW92ZShxdWV1ZSksIFdURk1vdmUodHJhY2tlciks
IHNlY3VyaXR5T3JpZ2luKSk7Cit9CisKK0xvY2FsU3RvcmFnZURhdGFiYXNlOjpMb2NhbFN0b3Jh
Z2VEYXRhYmFzZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyPiYmIHRyYWNrZXIsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlP
cmlnaW4pCisgICAgOiBtX3F1ZXVlKFdURk1vdmUocXVldWUpKQorICAgICwgbV90cmFja2VyKFdU
Rk1vdmUodHJhY2tlcikpCisgICAgLCBtX3NlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQor
ICAgICwgbV9kYXRhYmFzZVBhdGgobV90cmFja2VyLT5kYXRhYmFzZVBhdGgobV9zZWN1cml0eU9y
aWdpbikpCisgICAgLCBtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlKGZhbHNlKQorICAgICwgbV9kaWRJ
bXBvcnRJdGVtcyhmYWxzZSkKKyAgICAsIG1faXNDbG9zZWQoZmFsc2UpCisgICAgLCBtX2RpZFNj
aGVkdWxlRGF0YWJhc2VVcGRhdGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZENsZWFySXRlbXMoZmFs
c2UpCit7Cit9CisKK0xvY2FsU3RvcmFnZURhdGFiYXNlOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2Uo
KQoreworICAgIEFTU0VSVChtX2lzQ2xvc2VkKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRh
YmFzZTo6b3BlbkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5IG9wZW5pbmdTdHJhdGVn
eSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2UuaXNPcGVuKCkpOworICAgIEFTU0VSVCghbV9m
YWlsZWRUb09wZW5EYXRhYmFzZSk7CisKKyAgICBpZiAoIXRyeVRvT3BlbkRhdGFiYXNlKG9wZW5p
bmdTdHJhdGVneSkpIHsKKyAgICAgICAgbV9mYWlsZWRUb09wZW5EYXRhYmFzZSA9IHRydWU7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKKyAg
ICAgICAgbV90cmFja2VyLT5kaWRPcGVuRGF0YWJhc2VXaXRoT3JpZ2luKG1fc2VjdXJpdHlPcmln
aW4pOworfQorCitib29sIExvY2FsU3RvcmFnZURhdGFiYXNlOjp0cnlUb09wZW5EYXRhYmFzZShE
YXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCit7CisgICAgaWYgKCFmaWxl
RXhpc3RzKG1fZGF0YWJhc2VQYXRoKSAmJiBvcGVuaW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhp
c3RlbnQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlz
RW1wdHkoKSkgeworICAgICAgICBMT0dfRVJST1IoIkZpbGVuYW1lIGZvciBsb2NhbCBzdG9yYWdl
IGRhdGFiYXNlIGlzIGVtcHR5IC0gY2Fubm90IG9wZW4gZm9yIHBlcnNpc3RlbnQgc3RvcmFnZSIp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLm9w
ZW4obV9kYXRhYmFzZVBhdGgpKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4g
ZGF0YWJhc2UgZmlsZSAlcyBmb3IgbG9jYWwgc3RvcmFnZSIsIG1fZGF0YWJhc2VQYXRoLnV0Zjgo
KS5kYXRhKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2luY2Ug
YSBXb3JrUXVldWUgaXNuJ3QgYm91bmQgdG8gYSBzcGVjaWZpYyB0aHJlYWQsIHdlIGhhdmUgdG8g
ZGlzYWJsZSB0aHJlYWRpbmcgY2hlY2tzCisgICAgLy8gZXZlbiB0aG91Z2ggd2UgbmV2ZXIgYWNj
ZXNzIHRoZSBkYXRhYmFzZSBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5Lgor
ICAgIG1fZGF0YWJhc2UuZGlzYWJsZVRocmVhZGluZ0NoZWNrcygpOworCisgICAgaWYgKCFtaWdy
YXRlSXRlbVRhYmxlSWZOZWVkZWQoKSkgeworICAgICAgICAvLyBXZSBmYWlsZWQgdG8gbWlncmF0
ZSB0aGUgaXRlbSB0YWJsZS4gSW4gb3JkZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIG1pZ3JhdGUgdGhl
IHRhYmxlIG92ZXIgYW5kIG92ZXIsCisgICAgICAgIC8vIGp1c3QgZGVsZXRlIGl0IGFuZCBzdGFy
dCBmcm9tIHNjcmF0Y2guCisgICAgICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgi
RFJPUCBUQUJMRSBJdGVtVGFibGUiKSkKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IGRlbGV0ZSB0YWJsZSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKKyAgICB9CisKKyAg
ICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJ
U1RTIEl0ZW1UYWJsZSAoa2V5IFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHZhbHVl
IEJMT0IgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCkiKSkgeworICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byBjcmVhdGUgdGFibGUgSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6bWlncmF0ZUl0ZW1UYWJsZUlmTmVlZGVkKCkKK3sKKyAg
ICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkl0ZW1UYWJsZSIpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RhdGFiYXNlLCAiU0VMRUNU
IHZhbHVlIEZST00gSXRlbVRhYmxlIExJTUlUIDEiKTsKKworICAgIC8vIFRoaXMgcXVlcnkgaXNu
J3QgZXZlciBleGVjdXRlZCwgaXQncyBqdXN0IHVzZWQgdG8gY2hlY2sgdGhlIGNvbHVtbiB0eXBl
LgorICAgIGlmIChxdWVyeS5pc0NvbHVtbkRlY2xhcmVkQXNCbG9iKDApKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyB0YWJsZSB3aXRoIHRoZSByaWdodCB0eXBl
LCBjb3B5IGFsbCB0aGUgZGF0YSBvdmVyIHRvIGl0IGFuZCB0aGVuIHJlcGxhY2UgdGhlIG5ldyB0
YWJsZSB3aXRoIHRoZSBvbGQgdGFibGUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRz
W10gPSB7CisgICAgICAgICJEUk9QIFRBQkxFIElGIEVYSVNUUyBJdGVtVGFibGUyIiwKKyAgICAg
ICAgIkNSRUFURSBUQUJMRSBJdGVtVGFibGUyIChrZXkgVEVYVCBVTklRVUUgT04gQ09ORkxJQ1Qg
UkVQTEFDRSwgdmFsdWUgQkxPQiBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKSIsCisgICAgICAg
ICJJTlNFUlQgSU5UTyBJdGVtVGFibGUyIFNFTEVDVCAqIGZyb20gSXRlbVRhYmxlIiwKKyAgICAg
ICAgIkRST1AgVEFCTEUgSXRlbVRhYmxlIiwKKyAgICAgICAgIkFMVEVSIFRBQkxFIEl0ZW1UYWJs
ZTIgUkVOQU1FIFRPIEl0ZW1UYWJsZSIsCisgICAgICAgIDAsCisgICAgfTsKKworICAgIFNRTGl0
ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKG1fZGF0YWJhc2UsIGZhbHNlKTsKKyAgICB0cmFuc2Fj
dGlvbi5iZWdpbigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGNvbW1hbmRzW2ldOyArK2kp
IHsKKyAgICAgICAgaWYgKG1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0pKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gbWln
cmF0ZSB0YWJsZSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2Ugd2hlbiBleGVjdXRpbmc6ICVz
IiwgY29tbWFuZHNbaV0pOworICAgICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjaygpOworCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6aW1wb3J0SXRl
bXMoU3RvcmFnZU1hcCYgc3RvcmFnZU1hcCkKK3sKKyAgICBpZiAobV9kaWRJbXBvcnRJdGVtcykK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IElmIGl0IGNhbid0IGltcG9ydCwgdGhl
biB0aGUgZGVmYXVsdCBXZWJLaXQgYmVoYXZpb3Igc2hvdWxkIGJlIHRoYXQgb2YgcHJpdmF0ZSBi
cm93c2luZywKKyAgICAvLyBub3Qgc2lsZW50bHkgaWdub3JpbmcgaXQuIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTg5NAorCisgICAgLy8gV2Ugc2V0IHRoaXMgdG8g
dHJ1ZSBldmVuIGlmIHdlIGRvbid0IGVuZCB1cCBpbXBvcnRpbmcgYW55IGl0ZW1zIGR1ZSB0byBm
YWlsdXJlIGJlY2F1c2UKKyAgICAvLyB0aGVyZSdzIHJlYWxseSBubyBnb29kIHdheSB0byByZWNv
dmVyIG90aGVyIHRoYW4gbm90IGltcG9ydGluZyBhbnl0aGluZy4KKyAgICBtX2RpZEltcG9ydEl0
ZW1zID0gdHJ1ZTsKKworICAgIG9wZW5EYXRhYmFzZShTa2lwSWZOb25FeGlzdGVudCk7CisgICAg
aWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBTUUxpdGVT
dGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCBrZXksIHZhbHVlIEZST00gSXRlbVRh
YmxlIik7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gc2VsZWN0IGl0ZW1zIGZyb20gSXRlbVRhYmxlIGZvciBsb2Nh
bCBzdG9yYWdlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIYXNoTWFwPFN0cmlu
ZywgU3RyaW5nPiBpdGVtczsKKworICAgIGludCByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAg
d2hpbGUgKHJlc3VsdCA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBxdWVy
eS5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeS5nZXRDb2x1
bW5CbG9iQXNTdHJpbmcoMSk7CisgICAgICAgIGlmICgha2V5LmlzTnVsbCgpICYmICF2YWx1ZS5p
c051bGwoKSkKKyAgICAgICAgICAgIGl0ZW1zLnNldChrZXksIHZhbHVlKTsKKyAgICAgICAgcmVz
dWx0ID0gcXVlcnkuc3RlcCgpOworICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RP
TkUpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZWFkaW5nIGl0ZW1zIGZyb20gSXRlbVRh
YmxlIGZvciBsb2NhbCBzdG9yYWdlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBz
dG9yYWdlTWFwLmltcG9ydEl0ZW1zKGl0ZW1zKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRh
YmFzZTo6c2V0SXRlbShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sK
KyAgICBpdGVtRGlkQ2hhbmdlKGtleSwgdmFsdWUpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURh
dGFiYXNlOjpyZW1vdmVJdGVtKGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIGl0ZW1EaWRDaGFu
Z2Uoa2V5LCBTdHJpbmcoKSk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNsZWFy
KCkKK3sKKyAgICBtX2NoYW5nZWRJdGVtcy5jbGVhcigpOworICAgIG1fc2hvdWxkQ2xlYXJJdGVt
cyA9IHRydWU7CisKKyAgICBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7Cit9CisKK3ZvaWQgTG9j
YWxTdG9yYWdlRGF0YWJhc2U6OmNsb3NlKCkKK3sKKyAgICBBU1NFUlQoIW1faXNDbG9zZWQpOwor
ICAgIG1faXNDbG9zZWQgPSB0cnVlOworCisgICAgaWYgKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVw
ZGF0ZSkgeworICAgICAgICB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMobV9jaGFuZ2Vk
SXRlbXMpOworICAgICAgICBtX2NoYW5nZWRJdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIGJv
b2wgaXNFbXB0eSA9IGRhdGFiYXNlSXNFbXB0eSgpOworCisgICAgaWYgKG1fZGF0YWJhc2UuaXNP
cGVuKCkpCisgICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKKworICAgIGlmIChpc0VtcHR5KQor
ICAgICAgICBtX3RyYWNrZXItPmRlbGV0ZURhdGFiYXNlV2l0aE9yaWdpbihtX3NlY3VyaXR5T3Jp
Z2luKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6aXRlbURpZENoYW5nZShjb25z
dCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBtX2NoYW5nZWRJdGVt
cy5zZXQoa2V5LCB2YWx1ZSk7CisgICAgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOworfQorCit2
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCkKK3sKKyAg
ICBpZiAobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoIW1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3Jh
Z2UpCisgICAgICAgIG1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2Nh
bFN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFN1ZGRlblRlcm1pbmF0aW9uRGlzYWJsZXI+KCk7
CisKKyAgICBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUgPSB0cnVlOworCisgICAgUmVmUHRy
PExvY2FsU3RvcmFnZURhdGFiYXNlPiBsb2NhbFN0b3JhZ2VEYXRhYmFzZSh0aGlzKTsKKyAgICBt
X3F1ZXVlLT5kaXNwYXRjaEFmdGVyKGRhdGFiYXNlVXBkYXRlSW50ZXJ2YWwsIFtsb2NhbFN0b3Jh
Z2VEYXRhYmFzZV0geworICAgICAgICBsb2NhbFN0b3JhZ2VEYXRhYmFzZS0+dXBkYXRlRGF0YWJh
c2UoKTsKKyAgICB9KTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0
YWJhc2UoKQoreworICAgIGlmIChtX2lzQ2xvc2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBB
U1NFUlQobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKTsKKyAgICBtX2RpZFNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUgPSBmYWxzZTsKKworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNoYW5n
ZWRJdGVtczsKKyAgICBpZiAobV9jaGFuZ2VkSXRlbXMuc2l6ZSgpIDw9IG1heGltdW1JdGVtc1Rv
VXBkYXRlKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBmZXcgZW5vdWdoIGNoYW5nZWQgaXRlbXMg
dGhhdCB3ZSBjYW4ganVzdCBhbHdheXMgd3JpdGUgYWxsIG9mIHRoZW0uCisgICAgICAgIG1fY2hh
bmdlZEl0ZW1zLnN3YXAoY2hhbmdlZEl0ZW1zKTsKKyAgICAgICAgdXBkYXRlRGF0YWJhc2VXaXRo
Q2hhbmdlZEl0ZW1zKGNoYW5nZWRJdGVtcyk7CisgICAgICAgIG1fZGlzYWJsZVN1ZGRlblRlcm1p
bmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UgPSBudWxscHRyOworICAgIH0gZWxzZSB7
CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4aW11bUl0ZW1zVG9VcGRhdGU7ICsraSkg
eworICAgICAgICAgICAgYXV0byBpdCA9IG1fY2hhbmdlZEl0ZW1zLmJlZ2luKCk7CisgICAgICAg
ICAgICBjaGFuZ2VkSXRlbXMuYWRkKGl0LT5rZXksIGl0LT52YWx1ZSk7CisKKyAgICAgICAgICAg
IG1fY2hhbmdlZEl0ZW1zLnJlbW92ZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlQo
Y2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBtYXhpbXVtSXRlbXNUb1VwZGF0ZSk7CisKKyAgICAgICAg
Ly8gUmVzY2hlZHVsZSB0aGUgdXBkYXRlIGZvciB0aGUgcmVtYWluaW5nIGl0ZW1zLgorICAgICAg
ICBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7CisgICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENo
YW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMpOworICAgIH0KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VE
YXRhYmFzZTo6dXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNvbnN0IEhhc2hNYXA8U3Ry
aW5nLCBTdHJpbmc+JiBjaGFuZ2VkSXRlbXMpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Bl
bigpKQorICAgICAgICBvcGVuRGF0YWJhc2UoQ3JlYXRlSWZOb25FeGlzdGVudCk7CisgICAgaWYg
KCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9zaG91
bGRDbGVhckl0ZW1zKSB7CisgICAgICAgIG1fc2hvdWxkQ2xlYXJJdGVtcyA9IGZhbHNlOworCisg
ICAgICAgIFNRTGl0ZVN0YXRlbWVudCBjbGVhclN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRF
IEZST00gSXRlbVRhYmxlIik7CisgICAgICAgIGlmIChjbGVhclN0YXRlbWVudC5wcmVwYXJlKCkg
IT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJl
IGNsZWFyIHN0YXRlbWVudCAtIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNl
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVzdWx0
ID0gY2xlYXJTdGF0ZW1lbnQuc3RlcCgpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9E
T05FKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjbGVhciBhbGwgaXRlbXMg
aW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgLSAlaSIsIHJlc3VsdCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgaW5zZXJ0
U3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBJdGVtVGFibGUgVkFMVUVTICg/LCA/
KSIpOworICAgIGlmIChpbnNlcnRTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewor
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGluc2VydCBzdGF0ZW1lbnQgLSBj
YW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNl
LCAiREVMRVRFIEZST00gSXRlbVRhYmxlIFdIRVJFIGtleT0/Iik7CisgICAgaWYgKGRlbGV0ZVN0
YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmFp
bGVkIHRvIHByZXBhcmUgZGVsZXRlIHN0YXRlbWVudCAtIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBz
dG9yYWdlIGRhdGFiYXNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTUUxpdGVU
cmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RhdGFiYXNlKTsKKyAgICB0cmFuc2FjdGlvbi5iZWdp
bigpOworCisgICAgZm9yIChhdXRvIGl0ID0gY2hhbmdlZEl0ZW1zLmJlZ2luKCksIGVuZCA9IGNo
YW5nZWRJdGVtcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIC8vIEEgbnVsbCB2
YWx1ZSBtZWFucyB0aGF0IHRoZSBrZXkvdmFsdWUgcGFpciBzaG91bGQgYmUgZGVsZXRlZC4KKyAg
ICAgICAgU1FMaXRlU3RhdGVtZW50JiBzdGF0ZW1lbnQgPSBpdC0+dmFsdWUuaXNOdWxsKCkgPyBk
ZWxldGVTdGF0ZW1lbnQgOiBpbnNlcnRTdGF0ZW1lbnQ7CisKKyAgICAgICAgc3RhdGVtZW50LmJp
bmRUZXh0KDEsIGl0LT5rZXkpOworCisgICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhIGtl
eS92YWx1ZSBwYWlyLCBiaW5kIHRoZSB2YWx1ZSBhcyB3ZWxsLgorICAgICAgICBpZiAoIWl0LT52
YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kQmxvYigyLCBpdC0+dmFs
dWUpOworCisgICAgICAgIGludCByZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpOworICAgICAgICBp
ZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxl
ZCB0byB1cGRhdGUgaXRlbSBpbiB0aGUgbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSAtICVpIiwgcmVz
dWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50
LnJlc2V0KCk7CisgICAgfQorCisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7Cit9CisKK2Jvb2wg
TG9jYWxTdG9yYWdlRGF0YWJhc2U6OmRhdGFiYXNlSXNFbXB0eSgpCit7CisgICAgaWYgKCFtX2Rh
dGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTUUxpdGVTdGF0
ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCBDT1VOVCgqKSBGUk9NIEl0ZW1UYWJsZSIp
OworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19F
UlJPUigiVW5hYmxlIHRvIGNvdW50IG51bWJlciBvZiByb3dzIGluIEl0ZW1UYWJsZSBmb3IgbG9j
YWwgc3RvcmFnZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJl
c3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKKyAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ST1cpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJObyByZXN1bHRzIHdoZW4gY291bnRpbmcgbnVtYmVyIG9mIHJvd3Mg
aW4gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICByZXR1cm4gIXF1ZXJ5LmdldENvbHVtbkludCgwKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJT
dG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9X
ZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTk5MjAzMWY0NDhm
YjNkOTE1ODAxODZkODg2MGExMmQ4NDg1OTU2MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuaApAQCAtMCww
ICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9T
ZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9U
aHJlYWRTYWZlUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgU2VjdXJpdHlPcmlnaW47CitjbGFzcyBTdG9yYWdlTWFw
OworY2xhc3MgU3VkZGVuVGVybWluYXRpb25EaXNhYmxlcjsKK30KKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK2NsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjsKKworY2xhc3MgTG9jYWxT
dG9yYWdlRGF0YWJhc2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdl
RGF0YWJhc2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNl
PiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cj4mJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7CisgICAgfkxvY2FsU3Rv
cmFnZURhdGFiYXNlKCk7CisKKyAgICAvLyBXaWxsIGJsb2NrIHVudGlsIHRoZSBpbXBvcnQgaXMg
Y29tcGxldGUuCisgICAgdm9pZCBpbXBvcnRJdGVtcyhXZWJDb3JlOjpTdG9yYWdlTWFwJik7CisK
KyAgICB2b2lkIHNldEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUp
OworICAgIHZvaWQgcmVtb3ZlSXRlbShjb25zdCBTdHJpbmcmIGtleSk7CisgICAgdm9pZCBjbGVh
cigpOworCisgICAgLy8gV2lsbCBibG9jayB1bnRpbCBhbGwgcGVuZGluZyBjaGFuZ2VzIGhhdmUg
YmVlbiB3cml0dGVuIHRvIGRpc2suCisgICAgdm9pZCBjbG9zZSgpOworCitwcml2YXRlOgorICAg
IExvY2FsU3RvcmFnZURhdGFiYXNlKFJlZjxXb3JrUXVldWU+JiYsIFJlZjxMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOwor
CisgICAgZW51bSBEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSB7CisgICAgICAgIENyZWF0ZUlmTm9u
RXhpc3RlbnQsCisgICAgICAgIFNraXBJZk5vbkV4aXN0ZW50CisgICAgfTsKKyAgICBib29sIHRy
eVRvT3BlbkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5KTsKKyAgICB2b2lkIG9wZW5E
YXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSk7CisKKyAgICBib29sIG1pZ3JhdGVJdGVt
VGFibGVJZk5lZWRlZCgpOworCisgICAgdm9pZCBpdGVtRGlkQ2hhbmdlKGNvbnN0IFN0cmluZyYg
a2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKworICAgIHZvaWQgc2NoZWR1bGVEYXRhYmFzZVVw
ZGF0ZSgpOworICAgIHZvaWQgdXBkYXRlRGF0YWJhc2UoKTsKKyAgICB2b2lkIHVwZGF0ZURhdGFi
YXNlV2l0aENoYW5nZWRJdGVtcyhjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYpOworCisg
ICAgYm9vbCBkYXRhYmFzZUlzRW1wdHkoKTsKKworICAgIFJlZjxXb3JrUXVldWU+IG1fcXVldWU7
CisgICAgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gbV90cmFja2VyOworICAgIFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luOworCisgICAgU3RyaW5n
IG1fZGF0YWJhc2VQYXRoOworICAgIFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlIG1fZGF0YWJhc2U7
CisgICAgYm9vbCBtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlOworICAgIGJvb2wgbV9kaWRJbXBvcnRJ
dGVtczsKKyAgICBib29sIG1faXNDbG9zZWQ7CisKKyAgICBib29sIG1fZGlkU2NoZWR1bGVEYXRh
YmFzZVVwZGF0ZTsKKyAgICBib29sIG1fc2hvdWxkQ2xlYXJJdGVtczsKKyAgICBIYXNoTWFwPFN0
cmluZywgU3RyaW5nPiBtX2NoYW5nZWRJdGVtczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJD
b3JlOjpTdWRkZW5UZXJtaW5hdGlvbkRpc2FibGVyPiBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlv
bldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlOworfTsKKworCit9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0
b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xOWIyMjlm
NmI1Mzc0YTc3NDYzYWFmOWI0NjRjZTkzNmEwNGFjYzJiCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXIuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEz
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgorCisjaW5j
bHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVGaWxl
U3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9y
aWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRFbmNvZGluZy5oPgorI2luY2x1ZGUg
PHd0Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNsdWRlIDx3
dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1JlZjxMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKFJl
ZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5
KQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cihXVEZNb3ZlKHF1ZXVlKSwgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSk7Cit9CisKK0xvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcjo6TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3Jr
UXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQorICAg
IDogbV9xdWV1ZShXVEZNb3ZlKHF1ZXVlKSkKKyAgICAsIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5
KGxvY2FsU3RvcmFnZURpcmVjdG9yeS5pc29sYXRlZENvcHkoKSkKK3sKKyAgICBBU1NFUlQoIW1f
bG9jYWxTdG9yYWdlRGlyZWN0b3J5LmlzRW1wdHkoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhl
IGVuY29kaW5nIGlzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0aGlu
Z3MgdG8gdGhlIHF1ZXVlLgorICAgIFVURjhFbmNvZGluZygpOworCisgICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0oKSBtdXRhYmxlIHsKKyAgICAg
ICAgcHJvdGVjdGVkVGhpcy0+aW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKKyAgICB9KTsKK30K
KworTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyKCkKK3sKK30KKworU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGF0YWJh
c2VQYXRoKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pIGNvbnN0Cit7
CisgICAgcmV0dXJuIGRhdGFiYXNlUGF0aChzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZp
ZXIoKSArICIubG9jYWxzdG9yYWdlIik7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyOjpkaWRPcGVuRGF0YWJhc2VXaXRoT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0
YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmll
cihzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSwgZGF0YWJhc2VQYXRoKHNlY3Vy
aXR5T3JpZ2luKSk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxl
dGVEYXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9y
aWdpbikKK3sKKyAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKHNlY3VyaXR5
T3JpZ2luLmRhdGFiYXNlSWRlbnRpZmllcigpKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcygpCit7CisgICAgbV9vcmlnaW5zLmNsZWFy
KCk7CisKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKyAgICBp
ZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4sIHBhdGggRlJPTSBP
cmlnaW5zIik7CisgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Cisg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaW50IHJlc3VsdDsKKyAgICB3aGlsZSAoKHJlc3VsdCA9
IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgZGVsZXRlRmlsZShz
dGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKSk7CisKKyAgICAgICAgLy8gRklYTUU6IENhbGwgb3V0
IHRvIHRoZSBjbGllbnQuCisgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkK
KyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRo
ZSBkYXRhYmFzZS4iKTsKKworICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICBt
X2RhdGFiYXNlLmNsb3NlKCk7CisKKyAgICBpZiAoIWRlbGV0ZUZpbGUodHJhY2tlckRhdGFiYXNl
UGF0aCgpKSkgeworICAgICAgICAvLyBJbiB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgcG9zc2li
bGUgdG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlIChlLmcgc29tZSBvdGhlciBwcm9ncmFtCisg
ICAgICAgIC8vIGxpa2UgYSB2aXJ1cyBzY2FubmVyIGlzIGFjY2Vzc2luZyBpdCksIG1ha2Ugc3Vy
ZSB0byByZW1vdmUgYWxsIGVudHJpZXMuCisgICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tp
cElmTm9uRXhpc3RlbnQpOworICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVu
dChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyIpOworICAgICAgICBpZiAoZGVsZXRl
U3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2YgYWxsIG9yaWdpbnMiKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVj
dXRlQ29tbWFuZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRl
IGRlbGV0aW9uIG9mIGFsbCBvcmlnaW5zIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBkZWxldGVFbXB0eURpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVj
dG9yeSk7Cit9CisKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gZmlsZUNyZWF0aW9uVGlt
ZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAgIHRpbWVfdCB0aW1lOworICAgIHJldHVy
biBnZXRGaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoLCB0aW1lKSA/IHRpbWUgOiBzdGQ6Om9wdGlv
bmFsPHRpbWVfdD4oc3RkOjpudWxsb3B0KTsKK30KKworc3RhdGljIHN0ZDo6b3B0aW9uYWw8dGlt
ZV90PiBmaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAg
IHRpbWVfdCB0aW1lOworICAgIGlmICghZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgs
IHRpbWUpKQorICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworCisgICAgcmV0dXJuIHRpbWU7
Cit9CisKK1ZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlcjo6ZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Ns
b2NrOjp0aW1lX3BvaW50IHRpbWUpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7
CisgICAgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBvcmln
aW5JZGVudGlmaWVyc1RvRGVsZXRlOworCisgICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbiA6
IG1fb3JpZ2lucykgeworICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBwYXRoRm9yRGF0YWJhc2VX
aXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW4pOworCisgICAgICAgIGF1dG8gbW9kaWZpY2F0aW9u
VGltZSA9IGZpbGVNb2RpZmljYXRpb25UaW1lKGZpbGVQYXRoKTsKKyAgICAgICAgaWYgKCFtb2Rp
ZmljYXRpb25UaW1lKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG1vZGlm
aWNhdGlvblRpbWUudmFsdWUoKSA+PSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1l
X3QodGltZSkpCisgICAgICAgICAgICBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlLmFwcGVuZChv
cmlnaW4pOworICAgIH0KKworICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZWRE
YXRhYmFzZU9yaWdpbnM7CisgICAgZGVsZXRlZERhdGFiYXNlT3JpZ2lucy5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUuc2l6ZSgpKTsKKworICAgIGZvciAo
Y29uc3QgYXV0byYgb3JpZ2luSWRlbnRpZmllciA6IG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUp
IHsKKyAgICAgICAgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVu
dGlmaWVyKTsKKworICAgICAgICBpZiAoYXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6
OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAgICBk
ZWxldGVkRGF0YWJhc2VPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgcmV0
dXJuIGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7Cit9CisKK1ZlY3RvcjxTZWN1cml0eU9yaWdpbkRh
dGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2lucygpIGNvbnN0Cit7CisgICAg
VmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKyAgICBvcmlnaW5zLnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkobV9vcmlnaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IFN0cmlu
ZyYgb3JpZ2luSWRlbnRpZmllciA6IG1fb3JpZ2lucykgeworICAgICAgICBpZiAoYXV0byBvcmln
aW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRl
bnRpZmllcikpCisgICAgICAgICAgICBvcmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQor
CisgICAgcmV0dXJuIG9yaWdpbnM7Cit9CisKK1ZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI6Ok9yaWdpbkRldGFpbHM+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2lu
RGV0YWlscygpCit7CisgICAgVmVjdG9yPE9yaWdpbkRldGFpbHM+IHJlc3VsdDsKKyAgICByZXN1
bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX29yaWdpbnMuc2l6ZSgpKTsKKworICAgIGZvciAo
Y29uc3QgU3RyaW5nJiBvcmlnaW4gOiBtX29yaWdpbnMpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVQ
YXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luKTsKKworICAg
ICAgICBPcmlnaW5EZXRhaWxzIGRldGFpbHM7CisgICAgICAgIGRldGFpbHMub3JpZ2luSWRlbnRp
ZmllciA9IG9yaWdpbi5pc29sYXRlZENvcHkoKTsKKyAgICAgICAgZGV0YWlscy5jcmVhdGlvblRp
bWUgPSBmaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoKTsKKyAgICAgICAgZGV0YWlscy5tb2RpZmlj
YXRpb25UaW1lID0gZmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgpOworICAgICAgICByZXN1
bHQudW5jaGVja2VkQXBwZW5kKGRldGFpbHMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK1N0cmluZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChj
b25zdCBTdHJpbmcmIGZpbGVuYW1lKSBjb25zdAoreworICAgIGlmICghbWFrZUFsbERpcmVjdG9y
aWVzKG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFiYXNlIHBhdGggJXMiLCBtX2xvY2FsU3RvcmFn
ZURpcmVjdG9yeS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAg
IH0KKworI2lmIFBMQVRGT1JNKElPUykKKyAgICBwbGF0Zm9ybU1heWJlRXhjbHVkZUZyb21CYWNr
dXAoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtX2xv
Y2FsU3RvcmFnZURpcmVjdG9yeSwgZmlsZW5hbWUpOworfQorCitTdHJpbmcgTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZGF0YWJhc2VQYXRoKCJTdG9yYWdlVHJhY2tlci5kYiIpOworfQorCit2b2lkIExvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdT
dHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCit7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBkYXRhYmFzZVBhdGggPSB0cmFja2VyRGF0
YWJhc2VQYXRoKCk7CisKKyAgICBpZiAoIWZpbGVFeGlzdHMoZGF0YWJhc2VQYXRoKSAmJiBvcGVu
aW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhpc3RlbnQpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghbV9kYXRhYmFzZS5vcGVuKGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZVBhdGggJXMuIiwgZGF0YWJhc2VQYXRoLmFzY2lpKCku
ZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNpbmNlIGEgV29ya1F1
ZXVlIGlzbid0IGJvdW5kIHRvIGEgc3BlY2lmaWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUg
dGhyZWFkaW5nIGNoZWNrcworICAgIC8vIGV2ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUg
ZGF0YWJhc2UgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KKyAgICBtX2Rh
dGFiYXNlLmRpc2FibGVUaHJlYWRpbmdDaGVja3MoKTsKKworICAgIGlmIChtX2RhdGFiYXNlLnRh
YmxlRXhpc3RzKCJPcmlnaW5zIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9kYXRh
YmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIE9yaWdpbnMgKG9yaWdpbiBURVhUIFVO
SVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBwYXRoIFRFWFQpOyIpKQorICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBjcmVhdGUgT3JpZ2lucyB0YWJsZS4iKTsKK30KKwordm9pZCBMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmltcG9ydE9yaWdpbklkZW50aWZpZXJzKCkKK3sKKyAgICBv
cGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKworICAgIGlmIChtX2RhdGFi
YXNlLmlzT3BlbigpKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRh
YmFzZSwgIlNFTEVDVCBvcmlnaW4gRlJPTSBPcmlnaW5zIik7CisgICAgICAgIGlmIChzdGF0ZW1l
bnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBpbnQgcmVzdWx0OworCisgICAgICAgIHdoaWxlICgocmVzdWx0ID0gc3Rh
dGVtZW50LnN0ZXAoKSkgPT0gU1FMSVRFX1JPVykKKyAgICAgICAgICAgIG1fb3JpZ2lucy5hZGQo
c3RhdGVtZW50LmdldENvbHVtblRleHQoMCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gU1FM
SVRFX0RPTkUpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxs
IG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB1cGRhdGVUcmFja2VyRGF0YWJhc2VGcm9tTG9jYWxTdG9yYWdl
RGF0YWJhc2VGaWxlcygpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6
dXBkYXRlVHJhY2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKQorewor
ICAgIFZlY3RvcjxTdHJpbmc+IHBhdGhzID0gbGlzdERpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURp
cmVjdG9yeSwgIioubG9jYWxzdG9yYWdlIik7CisKKyAgICBIYXNoU2V0PFN0cmluZz4gb3JpZ2lu
cyhtX29yaWdpbnMpOworICAgIEhhc2hTZXQ8U3RyaW5nPiBvcmlnaW5zRnJvbUxvY2FsU3RvcmFn
ZURhdGFiYXNlRmlsZXM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGhzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgcGF0aCA9IHBhdGhzW2ldOworCisgICAg
ICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLmxvY2Fsc3RvcmFnZSIpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aEdldEZpbGVOYW1lKHBhdGgp
OworCisgICAgICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0gZmlsZW5hbWUuc3Vic3RyaW5n
KDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gc3RybGVuKCIubG9jYWxzdG9yYWdlIikpOworCisgICAg
ICAgIGlmICghbV9vcmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKQorICAgICAgICAg
ICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyLCBwYXRo
KTsKKworICAgICAgICBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMuYWRkKG9y
aWdpbklkZW50aWZpZXIpOworICAgIH0KKworICAgIGZvciAoYXV0byBpdCA9IG9yaWdpbnMuYmVn
aW4oKSwgZW5kID0gb3JpZ2lucy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNv
bnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA9ICppdDsKKyAgICAgICAgaWYgKG9yaWdpbnMu
Y29udGFpbnMob3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIp
OworICAgIH0KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFi
YXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBj
b25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCkKK3sKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKENy
ZWF0ZUlmTm9uRXhpc3RlbnQpOworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAi
SU5TRVJUIElOVE8gT3JpZ2lucyBWQUxVRVMgKD8sID8pIik7CisgICAgaWYgKHN0YXRlbWVudC5w
cmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVz
dGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIudXRm
OCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0ZW1lbnQuYmlu
ZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7CisgICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIGRh
dGFiYXNlUGF0aCk7CisKKyAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkK
KyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAnJXMnIGluIHRo
ZSB0cmFja2VyIiwgb3JpZ2luSWRlbnRpZmllci51dGY4KCkuZGF0YSgpKTsKKworICAgIG1fb3Jp
Z2lucy5hZGQob3JpZ2luSWRlbnRpZmllcik7CisKKyAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRz
IHRoYXQgdGhlIG9yaWdpbiB3YXMgYWRkZWQuCit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyOjpyZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmlu
ZyYgb3JpZ2luSWRlbnRpZmllcikKK3sKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5v
bkV4aXN0ZW50KTsKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIFN0cmluZyBwYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZp
ZXIob3JpZ2luSWRlbnRpZmllcik7CisgICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2Us
ICJERUxFVEUgRlJPTSBPcmlnaW5zIHdoZXJlIG9yaWdpbj0/Iik7CisgICAgaWYgKGRlbGV0ZVN0
YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICclcyciLCBvcmlnaW5JZGVudGlmaWVy
LmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWxldGVTdGF0
ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7CisgICAgaWYgKCFkZWxldGVTdGF0
ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBl
eGVjdXRlIGRlbGV0aW9uIG9mIG9yaWdpbiAnJXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgp
LmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTUUxpdGVGaWxlU3lzdGVt
OjpkZWxldGVEYXRhYmFzZUZpbGUocGF0aCk7CisKKyAgICBtX29yaWdpbnMucmVtb3ZlKG9yaWdp
bklkZW50aWZpZXIpOworICAgIGlmIChtX29yaWdpbnMuaXNFbXB0eSgpKSB7CisgICAgICAgIC8v
IFRoZXJlIGFyZSBubyBvcmlnaW5zIGxlZnQ7IGRlbGV0ZSB0aGUgdHJhY2tlciBkYXRhYmFzZS4K
KyAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpk
ZWxldGVEYXRhYmFzZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKTsKKyAgICAgICAgZGVsZXRl
RW1wdHlEaXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworICAgIH0KKworICAgIC8v
IEZJWE1FOiBUZWxsIGNsaWVudHMgdGhhdCB0aGUgb3JpZ2luIHdhcyByZW1vdmVkLgorfQorCitT
dHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpwYXRoRm9yRGF0YWJhc2VXaXRoT3Jp
Z2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIpCit7CisgICAgaWYg
KCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBT
UUxpdGVTdGF0ZW1lbnQgcGF0aFN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJP
TSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgaWYgKHBhdGhTdGF0ZW1lbnQucHJlcGFy
ZSgpICE9IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJl
IHNlbGVjdGlvbiBvZiBwYXRoIGZvciBvcmlnaW4gJyVzJyIsIG9yaWdpbklkZW50aWZpZXIudXRm
OCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwYXRo
U3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOworCisgICAgaW50IHJlc3Vs
dCA9IHBhdGhTdGF0ZW1lbnQuc3RlcCgpOworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX1JPVykK
KyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJuIHBhdGhTdGF0ZW1lbnQuZ2V0
Q29sdW1uVGV4dCgwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlci5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43Y2ViMTkxNmQ5MzRlNTZmMWY0YTI0MTU1N2Q3
MzE4MzRiZTc3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
V2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaApAQCAtMCwwICsxLDEwMSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8V2ViQ29yZS9T
UUxpdGVEYXRhYmFzZS5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3Rm
L09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJl
YWRTYWZlUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFNlY3VyaXR5T3JpZ2luOworc3RydWN0IFNl
Y3VyaXR5T3JpZ2luRGF0YTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0cnVjdCBMb2Nh
bFN0b3JhZ2VEZXRhaWxzOworCitjbGFzcyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIgOiBw
dWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiB7
CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IGNy
ZWF0ZShSZWY8V29ya1F1ZXVlPiYmLCBjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9y
eSk7CisgICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcigpOworCisgICAgU3RyaW5nIGRh
dGFiYXNlUGF0aChjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKSBjb25zdDsKKwor
ICAgIHZvaWQgZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lkIGRlbGV0ZURhdGFiYXNlV2l0aE9yaWdpbihjb25zdCBX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lkIGRlbGV0ZUFsbERhdGFiYXNl
cygpOworCisgICAgLy8gUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgb3JpZ2lucyB3aG9zZSBkYXRh
YmFzZXMgaGF2ZSBiZWVuIGRlbGV0ZWQuCisgICAgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YT4gZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVt
X2Nsb2NrOjp0aW1lX3BvaW50KTsKKworICAgIFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGE+IG9yaWdpbnMoKSBjb25zdDsKKworICAgIHN0cnVjdCBPcmlnaW5EZXRhaWxzIHsKKyAg
ICAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXI7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8dGlt
ZV90PiBjcmVhdGlvblRpbWU7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8dGltZV90PiBtb2RpZmlj
YXRpb25UaW1lOworICAgIH07CisgICAgVmVjdG9yPE9yaWdpbkRldGFpbHM+IG9yaWdpbkRldGFp
bHMoKTsKKworcHJpdmF0ZToKKyAgICBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIoUmVmPFdv
cmtRdWV1ZT4mJiwgY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworCisgICAg
U3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVuYW1lKSBjb25zdDsKKyAgICBT
dHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0OworCisgICAgZW51bSBEYXRhYmFzZU9w
ZW5pbmdTdHJhdGVneSB7CisgICAgICAgIENyZWF0ZUlmTm9uRXhpc3RlbnQsCisgICAgICAgIFNr
aXBJZk5vbkV4aXN0ZW50CisgICAgfTsKKyAgICB2b2lkIG9wZW5UcmFja2VyRGF0YWJhc2UoRGF0
YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOworCisgICAgdm9pZCBpbXBvcnRPcmlnaW5JZGVudGlmaWVy
cygpOworICAgIHZvaWQgdXBkYXRlVHJhY2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFi
YXNlRmlsZXMoKTsKKworICAgIHZvaWQgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihj
b25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRo
KTsKKyAgICB2b2lkIHJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3Ry
aW5nJiBvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBTdHJpbmcgcGF0aEZvckRhdGFiYXNlV2l0aE9y
aWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyKTsKKworICAgIFJl
ZlB0cjxXb3JrUXVldWU+IG1fcXVldWU7CisgICAgU3RyaW5nIG1fbG9jYWxTdG9yYWdlRGlyZWN0
b3J5OworCisgICAgV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNo
U2V0PFN0cmluZz4gbV9vcmlnaW5zOworCisjaWYgUExBVEZPUk0oSU9TKQorICAgIHZvaWQgcGxh
dGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIGJvb2wg
bV9oYXNFeGNsdWRlZEZyb21CYWNrdXAgeyBmYWxzZSB9OworI2VuZGlmCit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0
b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3Rv
cmFnZS9TdG9yYWdlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjM4Y2E2Y2I1MjYyMWY3MjNiYTgw
NDQxMDFlMGNkMDU5NGM5NGI5OQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsODcxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RvcmFnZU1h
bmFnZXIuaCIKKworI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlLmgiCisjaW5jbHVkZSAi
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXBN
ZXNzYWdlcy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyTWVzc2FnZXMuaCIKKyNpbmNsdWRl
ICJXZWJQcm9jZXNzUHJveHkuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0
YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5IYXNoLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9TdG9yYWdlTWFwLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9UZXh0RW5jb2RpbmcuaD4K
KyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgorI2luY2x1ZGUg
PHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdl
QXJlYSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxTdG9yYWdlTWFuYWdlcjo6U3RvcmFn
ZUFyZWE+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhPiBjcmVhdGUoTG9j
YWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5zaWduZWQg
cXVvdGFJbkJ5dGVzKTsKKyAgICB+U3RvcmFnZUFyZWEoKTsKKworICAgIGNvbnN0IFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3Nl
Y3VyaXR5T3JpZ2luOyB9CisKKyAgICB2b2lkIGFkZExpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYs
IHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCk7CisgICAgdm9pZCByZW1vdmVMaXN0ZW5lcihJUEM6OkNv
bm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOworCisgICAgUmVmPFN0b3JhZ2VBcmVh
PiBjbG9uZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiogc291
cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBib29s
JiBxdW90YUV4Y2VwdGlvbik7CisgICAgdm9pZCByZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiog
c291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3Ry
aW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAgICB2b2lkIGNsZWFyKElQQzo6
Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJ
RCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworCisgICAgY29uc3QgSGFzaE1hcDxTdHJpbmcs
IFN0cmluZz4mIGl0ZW1zKCkgY29uc3Q7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBp
c1Nlc3Npb25TdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNl
OyB9CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU3RvcmFnZUFyZWEoTG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVz
KTsKKworICAgIHZvaWQgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpIGNvbnN0
OworCisgICAgdm9pZCBkaXNwYXRjaEV2ZW50cyhJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5l
Y3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBj
b25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJp
bmcmIHVybFN0cmluZykgY29uc3Q7CisKKyAgICAvLyBXaWxsIGJlIG51bGwgaWYgdGhlIHN0b3Jh
Z2UgYXJlYSBiZWxvbmdzIHRvIGEgc2Vzc2lvbiBzdG9yYWdlIG5hbWVzcGFjZS4KKyAgICBMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UqIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlOworICAgIG11dGFibGUg
UmVmUHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBtX2xvY2FsU3RvcmFnZURhdGFiYXNlOworICAg
IG11dGFibGUgYm9vbCBtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlIHsgZmFsc2UgfTsKKwor
ICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luOworICAgIHVuc2lnbmVkIG1f
cXVvdGFJbkJ5dGVzOworCisgICAgUmVmUHRyPFN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKKyAg
ICBIYXNoU2V0PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBt
X2V2ZW50TGlzdGVuZXJzOworfTsKKworY2xhc3MgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFn
ZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3JhZ2VOYW1l
c3BhY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4g
Y3JlYXRlKFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3RvcmFnZU1hbmFnZXJJRCk7CisgICAg
fkxvY2FsU3RvcmFnZU5hbWVzcGFjZSgpOworCisgICAgU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VN
YW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlTWFuYWdlcjsgfQorCisgICAgUmVmPFN0
b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmKTsK
KyAgICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYShTdG9yYWdlQXJlYSopOworCisgICAgdm9p
ZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0
YSYpOworICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsKKworcHJpdmF0ZToKKyAgICBl
eHBsaWNpdCBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoU3RvcmFnZU1hbmFnZXIqLCB1aW50NjRfdCBz
dG9yYWdlTWFuYWdlcklEKTsKKworICAgIFN0b3JhZ2VNYW5hZ2VyKiBtX3N0b3JhZ2VNYW5hZ2Vy
OworICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlEOworICAgIHVuc2lnbmVkIG1fcXVv
dGFJbkJ5dGVzOworCisgICAgLy8gV2UgZG9uJ3QgaG9sZCBhbiBleHBsaWNpdCByZWZlcmVuY2Ug
dG8gdGhlIFN0b3JhZ2VBcmVhczsgdGhleSBhcmUga2VwdCBhbGl2ZSBieSB0aGUgbV9zdG9yYWdl
QXJlYXNCeUNvbm5lY3Rpb24gbWFwIGluIFN0b3JhZ2VNYW5hZ2VyLgorICAgIEhhc2hNYXA8U2Vj
dXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYSo+IG1fc3RvcmFnZUFyZWFNYXA7Cit9OworCitj
bGFzcyBTdG9yYWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogcHVi
bGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4g
eworcHVibGljOgorICAgIHN0YXRpYyBSZWY8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNl
PiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgVHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkpOworICAgIH0KKworICAgIH5UcmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UoKQorICAgIHsKKyAgICB9CisKKyAgICBSZWY8U3RvcmFnZUFyZWE+IGdl
dE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4p
CisgICAgeworICAgICAgICByZXR1cm4gKm1fc3RvcmFnZUFyZWFNYXAuZW5zdXJlKHNlY3VyaXR5
T3JpZ2luLCBbdGhpcywgc2VjdXJpdHlPcmlnaW5dKCkgbXV0YWJsZSB7CisgICAgICAgICAgICBy
ZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2lu
KSwgbV9xdW90YUluQnl0ZXMpOworICAgICAgICB9KS5pdGVyYXRvci0+dmFsdWUuY29weVJlZigp
OworICAgIH0KKworICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25z
dAorICAgIHsKKyAgICAgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKwor
ICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52
YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKCFzdG9yYWdlQXJlYS0+aXRlbXMoKS5pc0VtcHR5
KCkpCisgICAgICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQoc3RvcmFnZUFyZWEtPnNlY3VyaXR5
T3JpZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9yaWdpbnM7CisgICAgfQor
CisgICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5
T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCisgICAgeworICAgICAgICBmb3IgKGF1dG8mIHN0
b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYg
KHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpID09IHNlY3VyaXR5T3JpZ2luKQorICAgICAg
ICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAg
dm9pZCBjbGVhckFsbFN0b3JhZ2VBcmVhcygpCisgICAgeworICAgICAgICBmb3IgKGF1dG8mIHN0
b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN0b3Jh
Z2VBcmVhLT5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBUcmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCB1bnNp
Z25lZCBtX3F1b3RhSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKKworICAgIEhhc2hNYXA8U2Vj
dXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VBcmVhTWFwOwor
fTsKKworYXV0byBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmNyZWF0ZShMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgY29uc3QgU2VjdXJpdHlPcmlnaW5E
YXRhJiBzZWN1cml0eU9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKSAtPiBSZWY8U3RvcmFn
ZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPgoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFN0b3Jh
Z2VBcmVhKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgc2VjdXJpdHlPcmlnaW4sIHF1b3RhSW5CeXRl
cykpOworfQorCitTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OlN0b3JhZ2VBcmVhKExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSogbG9jYWxTdG9yYWdlTmFtZXNwYWNlLCBjb25zdCBTZWN1cml0eU9y
aWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCisgICAgOiBt
X2xvY2FsU3RvcmFnZU5hbWVzcGFjZShsb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgLCBtX3Nl
Y3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQorICAgICwgbV9xdW90YUluQnl0ZXMocXVvdGFJ
bkJ5dGVzKQorICAgICwgbV9zdG9yYWdlTWFwKFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5C
eXRlcykpCit7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6flN0b3JhZ2VBcmVh
KCkKK3sKKyAgICBBU1NFUlQobV9ldmVudExpc3RlbmVycy5pc0VtcHR5KCkpOworCisgICAgaWYg
KG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2Ut
PmNsb3NlKCk7CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgICAgIG1f
bG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFnZUFyZWEodGhpcyk7Cit9CisK
K3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjphZGRMaXN0ZW5lcihJUEM6OkNvbm5l
Y3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAgICBBU1NFUlQo
IW1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0
b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJzLmFkZChzdGQ6Om1ha2VfcGFpcigm
Y29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhOjpyZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAgICBBU1NFUlQoaXNTZXNzaW9uU3RvcmFnZSgpIHx8
IG1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0
b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJzLnJlbW92ZShzdGQ6Om1ha2VfcGFp
cigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Cit9CisKK1JlZjxTdG9yYWdlTWFuYWdlcjo6
U3RvcmFnZUFyZWE+IFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xvbmUoKSBjb25zdAor
eworICAgIEFTU0VSVCghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpOworCisgICAgYXV0byBzdG9y
YWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0ciwgbV9zZWN1cml0eU9yaWdpbiwg
bV9xdW90YUluQnl0ZXMpOworICAgIHN0b3JhZ2VBcmVhLT5tX3N0b3JhZ2VNYXAgPSBtX3N0b3Jh
Z2VNYXA7CisKKyAgICByZXR1cm4gc3RvcmFnZUFyZWE7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFn
ZXI6OlN0b3JhZ2VBcmVhOjpzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlv
biwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0
IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2Vw
dGlvbikKK3sKKyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAg
ICBTdHJpbmcgb2xkVmFsdWU7CisKKyAgICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VN
YXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKTsKKyAgICBp
ZiAobmV3U3RvcmFnZU1hcCkKKyAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9y
YWdlTWFwKTsKKworICAgIGlmIChxdW90YUV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0
YWJhc2UtPnNldEl0ZW0oa2V5LCB2YWx1ZSk7CisKKyAgICBkaXNwYXRjaEV2ZW50cyhzb3VyY2VD
b25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9sZFZhbHVlLCB2YWx1ZSwgdXJs
U3RyaW5nKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OnJlbW92ZUl0
ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9y
YWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCit7
CisgICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpOworCisgICAgU3RyaW5n
IG9sZFZhbHVlOworICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IG1fc3RvcmFnZU1hcC0+cmVtb3Zl
SXRlbShrZXksIG9sZFZhbHVlKTsKKyAgICBpZiAobmV3U3RvcmFnZU1hcCkKKyAgICAgICAgbV9z
dG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKKworICAgIGlmIChvbGRWYWx1ZS5p
c051bGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJh
c2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnJlbW92ZUl0ZW0oa2V5KTsKKwor
ICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQs
IGtleSwgb2xkVmFsdWUsIFN0cmluZygpLCB1cmxTdHJpbmcpOworfQorCit2b2lkIFN0b3JhZ2VN
YW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0
aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIHVybFN0cmlu
ZykKK3sKKyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAgICBp
ZiAoIW1fc3RvcmFnZU1hcC0+bGVuZ3RoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3Rv
cmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisKKyAgICBpZiAo
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKKyAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+
Y2xlYXIoKTsKKworICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIFN0cmluZygpLCBTdHJpbmcoKSwgU3RyaW5nKCksIHVybFN0cmluZyk7Cit9
CisKK2NvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFn
ZUFyZWE6Oml0ZW1zKCkgY29uc3QKK3sKKyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lm
TmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5pdGVtcygpOworfQorCit2b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoKQoreworICAgIG1fc3RvcmFnZU1h
cCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisKKyAgICBpZiAobV9sb2Nh
bFN0b3JhZ2VEYXRhYmFzZSkgeworICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbG9z
ZSgpOworICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlID0gbnVsbHB0cjsKKyAgICB9CisK
KyAgICBmb3IgKGF1dG8gaXQgPSBtX2V2ZW50TGlzdGVuZXJzLmJlZ2luKCksIGVuZCA9IG1fZXZl
bnRMaXN0ZW5lcnMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgaXQtPmZpcnN0LT5z
ZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6Q2xlYXJDYWNoZSgpLCBpdC0+c2Vjb25kKTsK
K30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6Om9wZW5EYXRhYmFzZUFuZElt
cG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25zdAoreworICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1l
c3BhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG9wZW4gdGhlIGRhdGFiYXNlIGhl
cmUgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGltcG9ydGVkIG91ciBpdGVtcyB0byBlbnN1cmUgdGhh
dCB0aGUgZGF0YWJhc2UgaXMgb3BlbiBpZiB3ZSBuZWVkIHRvIHdyaXRlIHRvIGl0LgorICAgIGlm
ICghbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKKyAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFz
ZSA9IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjcmVhdGUobV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2Ut
PnN0b3JhZ2VNYW5hZ2VyKCktPm1fcXVldWUuY29weVJlZigpLCBtX2xvY2FsU3RvcmFnZU5hbWVz
cGFjZS0+c3RvcmFnZU1hbmFnZXIoKS0+bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY29w
eVJlZigpLCBtX3NlY3VyaXR5T3JpZ2luKTsKKworICAgIGlmIChtX2RpZEltcG9ydEl0ZW1zRnJv
bURhdGFiYXNlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNl
LT5pbXBvcnRJdGVtcygqbV9zdG9yYWdlTWFwKTsKKyAgICBtX2RpZEltcG9ydEl0ZW1zRnJvbURh
dGFiYXNlID0gdHJ1ZTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmRp
c3BhdGNoRXZlbnRzKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qg
c291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xk
VmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKSBj
b25zdAoreworICAgIGZvciAoSGFzaFNldDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlv
bj4sIHVpbnQ2NF90Pj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ldmVudExpc3RlbmVycy5iZWdp
bigpLCBlbmQgPSBtX2V2ZW50TGlzdGVuZXJzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCA9IGl0LT5maXJzdCA9PSBzb3VyY2VDb25uZWN0
aW9uID8gc291cmNlU3RvcmFnZUFyZWFJRCA6IDA7CisKKyAgICAgICAgaXQtPmZpcnN0LT5zZW5k
KE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlzcGF0Y2hTdG9yYWdlRXZlbnQoc3RvcmFnZUFy
ZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZyksIGl0LT5zZWNvbmQpOwor
ICAgIH0KK30KKworUmVmPFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IFN0
b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZShTdG9yYWdlTWFuYWdl
ciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKK3sKKyAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uoc3RvcmFnZU1hbmFnZXIs
IHN0b3JhZ2VOYW1lc3BhY2VJRCkpOworfQorCisvLyBGSVhNRTogVGhlIHF1b3RhIHZhbHVlIGlz
IGNvcGllZCBmcm9tIEdyb3VwU2V0dGluZ3MuY3BwLgorLy8gV2Ugc2hvdWxkIGludmVzdGlnYXRl
IGEgd2F5IHRvIHNoYXJlIGl0IHdpdGggV2ViQ29yZS4KK1N0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0
b3JhZ2VOYW1lc3BhY2U6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZShTdG9yYWdlTWFuYWdlciogc3Rv
cmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKKyAgICA6IG1fc3RvcmFn
ZU1hbmFnZXIoc3RvcmFnZU1hbmFnZXIpCisgICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9y
YWdlTmFtZXNwYWNlSUQpCisgICAgLCBtX3F1b3RhSW5CeXRlcyg1ICogMTAyNCAqIDEwMjQpCit7
Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6On5Mb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UoKQoreworICAgIEFTU0VSVChtX3N0b3JhZ2VBcmVhTWFwLmlzRW1wdHkoKSk7
Cit9CisKK2F1dG8gU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Z2V0T3JD
cmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikgLT4g
UmVmPFN0b3JhZ2VBcmVhPgoreworICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhTWFwLmFk
ZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmIChzbG90
KQorICAgICAgICByZXR1cm4gKnNsb3Q7CisKKyAgICBhdXRvIHN0b3JhZ2VBcmVhID0gU3RvcmFn
ZUFyZWE6OmNyZWF0ZSh0aGlzLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0
ZXMpOworICAgIHNsb3QgPSAmc3RvcmFnZUFyZWEuZ2V0KCk7CisKKyAgICByZXR1cm4gc3RvcmFn
ZUFyZWE7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6
ZGlkRGVzdHJveVN0b3JhZ2VBcmVhKFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSkKK3sKKyAgICBB
U1NFUlQobV9zdG9yYWdlQXJlYU1hcC5jb250YWlucyhzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmln
aW4oKSkpOworCisgICAgbV9zdG9yYWdlQXJlYU1hcC5yZW1vdmUoc3RvcmFnZUFyZWEtPnNlY3Vy
aXR5T3JpZ2luKCkpOworICAgIGlmICghbV9zdG9yYWdlQXJlYU1hcC5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFn
ZU5hbWVzcGFjZXMuY29udGFpbnMobV9zdG9yYWdlTmFtZXNwYWNlSUQpKTsKKyAgICBtX3N0b3Jh
Z2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMucmVtb3ZlKG1fc3RvcmFnZU5hbWVz
cGFjZUlEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNl
OjpjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0
YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW5BbmRTdG9y
YWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXApIHsKKyAgICAgICAgaWYgKG9yaWdpbkFuZFN0b3Jh
Z2VBcmVhLmtleSA9PSBzZWN1cml0eU9yaWdpbikKKyAgICAgICAgICAgIG9yaWdpbkFuZFN0b3Jh
Z2VBcmVhLnZhbHVlLT5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6
TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhckFsbFN0b3JhZ2VBcmVhcygpCit7CisgICAgZm9y
IChhdXRvKiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCisgICAgICAg
IHN0b3JhZ2VBcmVhLT5jbGVhcigpOworfQorCitjbGFzcyBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlPiBjcmVhdGUodW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB+U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UoKTsKKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgpOyB9CisKKyAgICBJUEM6OkNvbm5lY3Rpb24qIGFsbG93
ZWRDb25uZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hbGxvd2VkQ29ubmVjdGlvbi5nZXQoKTsg
fQorICAgIHZvaWQgc2V0QWxsb3dlZENvbm5lY3Rpb24oSVBDOjpDb25uZWN0aW9uKik7CisKKyAg
ICBSZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5E
YXRhJiYpOworCisgICAgdm9pZCBjbG9uZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7CisKKyAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRh
PiBvcmlnaW5zKCkgY29uc3QKKyAgICB7CisgICAgICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRh
dGE+IG9yaWdpbnM7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdG9yYWdlQXJlYSA6IG1f
c3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmICghc3RvcmFnZUFyZWEt
Pml0ZW1zKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG9yaWdpbnMuYXBwZW5kKHN0b3Jh
Z2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBv
cmlnaW5zOworICAgIH0KKworICAgIHZvaWQgY2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdp
bihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQorICAgIHsKKyAgICAg
ICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsK
KyAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSA9PSBzZWN1cml0
eU9yaWdpbikKKyAgICAgICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKQorICAgIHsKKyAgICAg
ICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCisg
ICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
ZXhwbGljaXQgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsK
KworICAgIFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+IG1fYWxsb3dlZENvbm5lY3Rpb247CisgICAg
dW5zaWduZWQgbV9xdW90YUluQnl0ZXM7CisKKyAgICBIYXNoTWFwPFNlY3VyaXR5T3JpZ2luRGF0
YSwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYU1hcDsKK307CisKK1JlZjxTdG9y
YWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAg
ICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShxdW90YUluQnl0
ZXMpKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YUluQnl0ZXMpCisgICAgOiBtX3F1b3Rh
SW5CeXRlcyhxdW90YUluQnl0ZXMpCit7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZTo6flNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKCkKK3sKK30KKwordm9pZCBT
dG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6OnNldEFsbG93ZWRDb25uZWN0
aW9uKElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24pCit7CisgICAgQVNTRVJUKCFh
bGxvd2VkQ29ubmVjdGlvbiB8fCAhbV9hbGxvd2VkQ29ubmVjdGlvbik7CisKKyAgICBtX2FsbG93
ZWRDb25uZWN0aW9uID0gYWxsb3dlZENvbm5lY3Rpb247Cit9CisKK2F1dG8gU3RvcmFnZU1hbmFn
ZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3Vy
aXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKSAtPiBSZWY8U3RvcmFnZUFyZWE+Cit7Cisg
ICAgcmV0dXJuICptX3N0b3JhZ2VBcmVhTWFwLmVuc3VyZShzZWN1cml0eU9yaWdpbiwgW3RoaXMs
IHNlY3VyaXR5T3JpZ2luXSgpIG11dGFibGUgeworICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6
OmNyZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMp
OworICAgIH0pLml0ZXJhdG9yLT52YWx1ZS5jb3B5UmVmKCk7Cit9CisKK3ZvaWQgU3RvcmFnZU1h
bmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpjbG9uZVRvKFNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSkKK3sKKyAgICBBU1NFUlRfVU5VU0VE
KG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLCBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS5p
c0VtcHR5KCkpOworCisgICAgZm9yIChhdXRvJiBwYWlyIDogbV9zdG9yYWdlQXJlYU1hcCkKKyAg
ICAgICAgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UubV9zdG9yYWdlQXJlYU1hcC5hZGQocGFp
ci5rZXksIHBhaXIudmFsdWUtPmNsb25lKCkpOworfQorCitSZWY8U3RvcmFnZU1hbmFnZXI+IFN0
b3JhZ2VNYW5hZ2VyOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3Rvcnkp
Cit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZU1hbmFnZXIobG9jYWxTdG9yYWdl
RGlyZWN0b3J5KSk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlTWFuYWdlcihjb25zdCBT
dHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKKyAgICA6IG1fcXVldWUoV29ya1F1ZXVlOjpj
cmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuU3RvcmFnZU1hbmFnZXIiKSkKKyAgICAsIG1fbG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyKExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRl
KG1fcXVldWUuY29weVJlZigpLCBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpKQoreworICAgIC8vIE1h
a2Ugc3VyZSB0aGUgZW5jb2RpbmcgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIHN0YXJ0IGRpc3Bh
dGNoaW5nIHRoaW5ncyB0byB0aGUgcXVldWUuCisgICAgVVRGOEVuY29kaW5nKCk7Cit9CisKK1N0
b3JhZ2VNYW5hZ2VyOjp+U3RvcmFnZU1hbmFnZXIoKQoreworfQorCit2b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChb
dGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBzdG9yYWdlTmFtZXNwYWNlSUQs
IHF1b3RhSW5CeXRlc10oKSBtdXRhYmxlIHsKKyAgICAgICAgQVNTRVJUKCFtX3Nlc3Npb25TdG9y
YWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKKworICAgICAgICBt
X3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5zZXQoc3RvcmFnZU5hbWVzcGFjZUlELCBTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHF1b3RhSW5CeXRlcykpOworICAgIH0pOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0
X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBw
cm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3JhZ2VOYW1lc3BhY2VJRF0geworICAg
ICAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMoc3RvcmFnZU5h
bWVzcGFjZUlEKSk7CisgICAgICAgIG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnJlbW92ZShz
dG9yYWdlTmFtZXNwYWNlSUQpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpz
ZXRBbGxvd2VkU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VDb25uZWN0aW9uKHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgSVBDOjpDb25uZWN0aW9uKiBhbGxvd2VkQ29ubmVjdGlvbikKK3sKKyAg
ICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMp
LCBjb25uZWN0aW9uID0gUmVmUHRyPElQQzo6Q29ubmVjdGlvbj4oYWxsb3dlZENvbm5lY3Rpb24p
LCBzdG9yYWdlTmFtZXNwYWNlSURdKCkgbXV0YWJsZSB7CisgICAgICAgIEFTU0VSVChtX3Nlc3Np
b25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKKworICAg
ICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKS0+
c2V0QWxsb3dlZENvbm5lY3Rpb24oY29ubmVjdGlvbi5nZXQoKSk7CisgICAgfSk7Cit9CisKK3Zv
aWQgU3RvcmFnZU1hbmFnZXI6OmNsb25lU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9yYWdlTmFtZXNwYWNlSUQpCit7Cisg
ICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KSwgc3RvcmFnZU5hbWVzcGFjZUlELCBuZXdTdG9yYWdlTmFtZXNwYWNlSURdIHsKKyAgICAgICAg
U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UqIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCk7CisgICAgICAgIGlm
ICghc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBj
YW4gZ2V0IGludG8gdGhpcyBzaXR1YXRpb24gaWYgc29tZW9uZSBjbG9zZXMgdGhlIG9yaWdpbmF0
aW5nIHBhZ2UgZnJvbSB3aXRoaW4gYQorICAgICAgICAgICAgLy8gY3JlYXRlTmV3UGFnZSBjYWxs
YmFjay4gV2UgYmFpbCBmb3Igbm93LCBidXQgd2Ugc2hvdWxkIHJlYWxseSBmaW5kIGEgd2F5IHRv
IGtlZXAgdGhlIHNlc3Npb24gc3RvcmFnZSBhbGl2ZQorICAgICAgICAgICAgLy8gc28gd2Ugd2Un
bGwgY2xvbmUgdGhlIHNlc3Npb24gc3RvcmFnZSBjb3JyZWN0bHkuCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogbmV3U2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQobmV3
U3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAgICAgICAgQVNTRVJUKG5ld1Nlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlKTsKKworICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xvbmVUbygqbmV3
U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29u
bmVjdGlvbiYgY29ubmVjdGlvbikKK3sKKyAgICBjb25uZWN0aW9uLmFkZFdvcmtRdWV1ZU1lc3Nh
Z2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6Om1lc3NhZ2VSZWNlaXZlck5hbWUo
KSwgbV9xdWV1ZS5nZXQoKSwgdGhpcyk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OnByb2Nl
c3NEaWRDbG9zZUNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJiBj
b25uZWN0aW9uKQoreworICAgIGNvbm5lY3Rpb24ucmVtb3ZlV29ya1F1ZXVlTWVzc2FnZVJlY2Vp
dmVyKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpKTsKKwor
ICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhp
cyksIGNvbm5lY3Rpb24gPSBSZWY8SVBDOjpDb25uZWN0aW9uPihjb25uZWN0aW9uKV0oKSBtdXRh
YmxlIHsKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwg
dWludDY0X3Q+PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZTsKKyAgICAg
ICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7
CisgICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEua2V5LmZpcnN0ICE9IGNvbm5lY3Rpb24ucHRy
KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHN0b3JhZ2VBcmVh
LnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqc3RvcmFnZUFyZWEua2V5LmZpcnN0LCBzdG9yYWdlQXJl
YS5rZXkuc2Vjb25kKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWly
c1RvUmVtb3ZlLmFwcGVuZChzdG9yYWdlQXJlYS5rZXkpOworICAgICAgICB9CisKKyAgICAgICAg
Zm9yIChhdXRvJiBwYWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUp
CisgICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUocGFpcik7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldFNlc3Npb25TdG9yYWdlT3JpZ2lu
cyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4m
JiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJv
dGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUo
Y29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBIYXNoU2V0PFNlY3VyaXR5
T3JpZ2luRGF0YT4gb3JpZ2luczsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpIHsK
KyAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2Ut
Pm9yaWdpbnMoKSkKKyAgICAgICAgICAgICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOworICAgICAg
ICB9CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5zID0gV1RGTW92
ZShvcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVy
KV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3Jp
Z2lucykpOworICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6
ZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9u
SGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9
IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhh
bmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAg
ICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsKKworICAg
ICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikp
OworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZWxldGVTZXNzaW9uU3RvcmFn
ZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7Cisg
ICAgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4gY29waWVkT3JpZ2luczsKKyAg
ICBjb3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkob3JpZ2lucy5zaXplKCkpOwor
CisgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQorICAgICAgICBjb3BpZWRPcmlnaW5z
LnVuY2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5KCkpOworCisgICAgbV9xdWV1ZS0+
ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29waWVkT3Jp
Z2lucyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIGZvciAoYXV0byYgb3Jp
Z2luIDogY29waWVkT3JpZ2lucykgeworICAgICAgICAgICAgZm9yIChhdXRvJiBzZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQorICAg
ICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01h
dGNoaW5nT3JpZ2luKG9yaWdpbik7CisgICAgICAgIH0KKworICAgICAgICBSdW5Mb29wOjptYWlu
KCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOworICAgIH0pOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQo
SGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5k
bGVyKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFr
ZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxl
cildKCkgbXV0YWJsZSB7CisgICAgICAgIEhhc2hTZXQ8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmln
aW5zOworCisgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogbV9sb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXItPm9yaWdpbnMoKSkKKyAgICAgICAgICAgIG9yaWdpbnMuYWRkKG9yaWdpbik7CisK
KyAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3Ry
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZv
ciAoYXV0byYgb3JpZ2luIDogdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5vcmlnaW5z
KCkpCisgICAgICAgICAgICAgICAgb3JpZ2lucy5hZGQob3JpZ2luKTsKKyAgICAgICAgfQorCisg
ICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3JpZ2lucyA9IFdURk1vdmUob3JpZ2lu
cyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0
YWJsZSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbnMpKTsK
KyAgICAgICAgfSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldExvY2Fs
U3RvcmFnZU9yaWdpbkRldGFpbHMoRnVuY3Rpb248dm9pZCAoVmVjdG9yPExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBsZXRpb25IYW5kbGVyKQorewor
ICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhp
cyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0
YWJsZSB7CisgICAgICAgIGF1dG8gb3JpZ2luRGV0YWlscyA9IG1fbG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyLT5vcmlnaW5EZXRhaWxzKCk7CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRp
c3BhdGNoKFtvcmlnaW5EZXRhaWxzID0gV1RGTW92ZShvcmlnaW5EZXRhaWxzKSwgY29tcGxldGlv
bkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAg
ICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2luRGV0YWlscykpOworICAgICAg
ICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9y
YWdlRW50cmllc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikK
K3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYo
KnRoaXMpLCBjb3BpZWRPcmlnaW4gPSBzZWN1cml0eU9yaWdpbi5pc29sYXRlZENvcHkoKV0oKSBt
dXRhYmxlIHsKKyAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX2xv
Y2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAgICBsb2NhbFN0b3JhZ2VO
YW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29waWVkT3JpZ2luKTsK
KworICAgICAgICBmb3IgKGF1dG8mIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1f
dHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09y
aWdpbihjb3BpZWRPcmlnaW4pOworCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29waWVkT3JpZ2luKTsKKyAgICB9KTsKK30K
Kwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlT3JpZ2luc01vZGlmaWVk
U2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lLCBGdW5jdGlv
bjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2go
W3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgdGltZSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAg
YXV0byBkZWxldGVkT3JpZ2lucyA9IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxl
dGVEYXRhYmFzZXNNb2RpZmllZFNpbmNlKHRpbWUpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0
byYgb3JpZ2luIDogZGVsZXRlZE9yaWdpbnMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbG9j
YWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQor
ICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNN
YXRjaGluZ09yaWdpbihvcmlnaW4pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiB0
cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5h
bWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAgICB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UtPmNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigp
LmRpc3BhdGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKKyAgICB9KTsKK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29u
c3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mIG9yaWdpbnMsIEZ1bmN0aW9u
PHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBWZWN0b3I8U2VjdXJpdHlPcmln
aW5EYXRhPiBjb3BpZWRPcmlnaW5zOworICAgIGNvcGllZE9yaWdpbnMucmVzZXJ2ZUluaXRpYWxD
YXBhY2l0eShvcmlnaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IG9yaWdp
bnMpCisgICAgICAgIGNvcGllZE9yaWdpbnMudW5jaGVja2VkQXBwZW5kKG9yaWdpbi5pc29sYXRl
ZENvcHkoKSk7CisKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9
IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW5zID0gV1RGTW92ZShjb3BpZWRPcmlnaW5zKSwg
Y29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxl
IHsKKyAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBjb3BpZWRPcmlnaW5zKSB7CisgICAgICAg
ICAgICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fbG9jYWxTdG9yYWdlTmFt
ZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2Ut
PmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3JpZ2luKTsKKworICAgICAgICAgICAg
Zm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExv
Y2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgdHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9y
aWdpbik7CisKKyAgICAgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxl
dGVEYXRhYmFzZVdpdGhPcmlnaW4ob3JpZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkxv
b3A6Om1haW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7CisgICAgfSk7
Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNv
bm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbkRhdGEp
Cit7CisgICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4gY29u
bmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisK
KyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VS
VCgoSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Piwg
UmVmUHRyPFN0b3JhZ2VBcmVhPj46OmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJ
RFBhaXIpKSk7CisKKyAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9u
PiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+Pjo6QWRkUmVzdWx0IHJlc3VsdCA9IG1f
c3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZChjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFp
ciwgbnVsbHB0cik7CisKKyAgICAvLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIGEgbWVzc2FnZSBj
aGVja3MuCisgICAgQVNTRVJUKHJlc3VsdC5pc05ld0VudHJ5KTsKKyAgICBBU1NFUlQoKEhhc2hN
YXA8dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+Pjo6aXNWYWxpZEtleShz
dG9yYWdlTmFtZXNwYWNlSUQpKSk7CisKKyAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2Fs
U3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3Jh
Z2VOYW1lc3BhY2VJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdl
IGNoZWNrLgorICAgIEFTU0VSVChsb2NhbFN0b3JhZ2VOYW1lc3BhY2UpOworCisgICAgYXV0byBz
dG9yYWdlQXJlYSA9IGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJl
YShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOworICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0
ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworCisgICAgcmVzdWx0Lml0ZXJhdG9yLT52
YWx1ZSA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpj
cmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9u
LCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2Vj
dXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW5EYXRhLCBTZWN1cml0eU9yaWdpbkRhdGEm
JiBvcmlnaW4pCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVj
ay4KKyAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uaXNWYWxpZEtleSh7ICZj
b25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSkpOworCisgICAgLy8gU2VlIGlmIHdlIGFscmVhZHkg
aGF2ZSBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXMgY29ubmVjdGlvbi9vcmlnaW4gY29tYm8uCisg
ICAgLy8gSWYgc28sIHVwZGF0ZSB0aGUgbWFwIHdpdGggdGhlIG5ldyBJRCwgb3RoZXJ3aXNlIGtl
ZXAgb24gdHJ1Y2tpbmcuCisgICAgZm9yIChhdXRvIGl0ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5l
Y3Rpb24uYmVnaW4oKSwgZW5kID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5kKCk7IGl0
ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoaXQtPmtleS5maXJzdCAhPSAmY29ubmVjdGlv
bikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBSZWY8U3RvcmFnZUFyZWE+IGFyZWEg
PSAqaXQtPnZhbHVlOworICAgICAgICBpZiAoIWFyZWEtPmlzU2Vzc2lvblN0b3JhZ2UoKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIW9yaWdpbi5zZWN1cml0eU9yaWdpbigp
LT5pc1NhbWVTY2hlbWVIb3N0UG9ydChhcmVhLT5zZWN1cml0eU9yaWdpbigpLnNlY3VyaXR5T3Jp
Z2luKCkuZ2V0KCkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFyZWEtPmFkZExp
c3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisgICAgICAgIG1fc3RvcmFnZUFyZWFz
QnlDb25uZWN0aW9uLnJlbW92ZShpdCk7CisgICAgICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0
aW9uLmFkZCh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSwgV1RGTW92ZShhcmVhKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYXNC
eUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCB9LCBudWxscHRyKS5p
dGVyYXRvci0+dmFsdWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdl
IGNoZWNrLgorICAgIEFTU0VSVCghc2xvdCk7CisKKyAgICBUcmFuc2llbnRMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UqIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlVHJh
bnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCwgV1RGTW92ZSh0
b3BMZXZlbE9yaWdpbkRhdGEpKTsKKworICAgIGF1dG8gc3RvcmFnZUFyZWEgPSB0cmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92ZShvcmln
aW4pKTsKKyAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKTsKKworICAgIHNsb3QgPSBXVEZNb3ZlKHN0b3JhZ2VBcmVhKTsKK30KKwordm9pZCBTdG9y
YWdlTWFuYWdlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25u
ZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJ
RCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW5EYXRhKQoreworICAgIC8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSk7CisKKyAg
ICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nl
c3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAgICBpZiAo
IXNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKSB7CisgICAgICAgIC8vIFdlJ3JlIGdldHRpbmcgYW4g
aW5jb21pbmcgbWVzc2FnZSBmcm9tIHRoZSB3ZWIgcHJvY2VzcyB0aGF0J3MgZm9yIHNlc3Npb24g
c3RvcmFnZSBmb3IgYSB3ZWIgcGFnZQorICAgICAgICAvLyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4g
Y2xvc2VkLCBqdXN0IGlnbm9yZSBpdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc3Rv
cmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEIH0pKTsKKworICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5h
ZGQoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1
ZTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAg
QVNTRVJUKCFzbG90KTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2Ug
Y2hlY2suCisgICAgQVNTRVJUKCZjb25uZWN0aW9uID09IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
LT5hbGxvd2VkQ29ubmVjdGlvbigpKTsKKworICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBzZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5
T3JpZ2luRGF0YSkpOworICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQpOworCisgICAgc2xvdCA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNv
bm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAgICBzdGQ6OnBhaXI8UmVmUHRy
PElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFp
cigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0
aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKTsKKworICAgIGF1
dG8gaXQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5maW5kKGNvbm5lY3Rpb25BbmRTdG9y
YWdlTWFwSURQYWlyKTsKKyAgICBpZiAoaXQgPT0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24u
ZW5kKCkpIHsKKyAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBiZWNh
dXNlIHRoZSBsYXN0IHBhZ2Ugd2FzIGNsb3NlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGl0LT52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsK
KworICAgIC8vIERvbid0IHJlbW92ZSBzZXNzaW9uIHN0b3JhZ2UgbWFwcy4gVGhlIHdlYiBwcm9j
ZXNzIG1heSByZWNvbm5lY3QgYW5kIGV4cGVjdCB0aGUgZGF0YSB0byBzdGlsbCBiZSBhcm91bmQu
CisgICAgaWYgKGl0LT52YWx1ZS0+aXNTZXNzaW9uU3RvcmFnZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoY29ubmVjdGlvbkFuZFN0
b3JhZ2VNYXBJRFBhaXIpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRWYWx1ZXMoSVBD
OjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90
IHN0b3JhZ2VNYXBTZWVkLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgdmFsdWVzKQoreworICAg
IFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBp
cyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVu
IGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFsdWVz
ID0gc3RvcmFnZUFyZWEtPml0ZW1zKCk7CisgICAgY29ubmVjdGlvbi5zZW5kKE1lc3NhZ2VzOjpT
dG9yYWdlQXJlYU1hcDo6RGlkR2V0VmFsdWVzKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElE
KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0SXRlbShJUEM6OkNvbm5lY3Rpb24mIGNv
bm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFy
ZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBT
dHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBTdG9yYWdlQXJl
YSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
KTsKKyAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9u
IHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIEln
bm9yZSBpdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcXVvdGFFcnJvcjsK
KyAgICBzdG9yYWdlQXJlYS0+c2V0SXRlbSgmY29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJ
RCwga2V5LCB2YWx1ZSwgdXJsU3RyaW5nLCBxdW90YUVycm9yKTsKKyAgICBjb25uZWN0aW9uLnNl
bmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRTZXRJdGVtKHN0b3JhZ2VNYXBTZWVkLCBr
ZXksIHF1b3RhRXJyb3IpLCBzdG9yYWdlTWFwSUQpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2Vy
OjpyZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFn
ZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFw
U2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAg
IFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBp
cyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVu
IGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RvcmFn
ZUFyZWEtPnJlbW92ZUl0ZW0oJmNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwg
dXJsU3RyaW5nKTsKKyAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFw
OjpEaWRSZW1vdmVJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXkpLCBzdG9yYWdlTWFwSUQpOworfQor
Cit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjbGVhcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24s
IHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWlu
dDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIFN0
b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9y
YWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBh
IHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNs
b3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RvcmFnZUFy
ZWEtPmNsZWFyKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1cmxTdHJpbmcpOwor
ICAgIGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6OkRpZENsZWFyKHN0
b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6
YXBwbGljYXRpb25XaWxsVGVybWluYXRlKCkKK3sKKyAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBo
b3JlOworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCAmc2VtYXBob3JlXSB7CisgICAgICAg
IFZlY3RvcjxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gY29u
bmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmU7CisgICAgICAgIGZvciAoYXV0byYg
Y29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7
CisgICAgICAgICAgICBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyLnZhbHVlLT5yZW1vdmVMaXN0
ZW5lcigqY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkuZmlyc3QsIGNvbm5lY3Rpb25TdG9y
YWdlQXJlYVBhaXIua2V5LnNlY29uZCk7CisgICAgICAgICAgICBjb25uZWN0aW9uQW5kU3RvcmFn
ZU1hcElEUGFpcnNUb1JlbW92ZS5hcHBlbmQoY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkp
OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBjb25uZWN0aW9uU3RvcmFnZUFyZWFQ
YWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUpCisgICAgICAgICAg
ICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoY29ubmVjdGlvblN0b3JhZ2VBcmVh
UGFpcik7CisKKyAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOworICAgIH0pOworICAgIHNlbWFw
aG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhKiBTdG9yYWdlTWFuYWdlcjo6ZmluZFN0b3JhZ2VBcmVhKElQQzo6Q29ubmVjdGlv
biYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKSBjb25zdAoreworICAgIHN0ZDo6
cGFpcjxJUEM6OkNvbm5lY3Rpb24qLCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJ
RFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisKKyAgICBpZiAoIW1fc3RvcmFnZUFy
ZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIp
KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhc0J5
Q29ubmVjdGlvbi5nZXQoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOworfQorCitTdG9y
YWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBTdG9yYWdlTWFuYWdlcjo6Z2V0T3JD
cmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQor
eworICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5h
bWVzcGFjZUlEKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBhdXRvJiBzbG90ID0g
bV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmFkZChzdG9yYWdlTmFtZXNwYWNlSUQsIG51bGxwdHIp
Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoIXNsb3QpCisgICAgICAgIHNsb3QgPSBMb2NhbFN0
b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZSh0aGlzLCBzdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAg
cmV0dXJuIHNsb3QuZ2V0KCk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpUcmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UqIFN0b3JhZ2VNYW5hZ2VyOjpnZXRPckNyZWF0ZVRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNl
Y3VyaXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luKQoreworICAgIGlmICghbV90cmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoeyBzdG9yYWdlTmFtZXNwYWNlSUQs
IHRvcExldmVsT3JpZ2luIH0pKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGF1dG8m
IHNsb3QgPSBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMuYWRkKHsgc3RvcmFnZU5h
bWVzcGFjZUlELCBXVEZNb3ZlKHRvcExldmVsT3JpZ2luKSB9LCBudWxscHRyKS5pdGVyYXRvci0+
dmFsdWU7CisgICAgaWYgKCFzbG90KQorICAgICAgICBzbG90ID0gVHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlOjpjcmVhdGUoKTsKKworICAgIHJldHVybiBzbG90LmdldCgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dl
YlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMWY2OWViNzA3M2EzY2E1ZjNi
OGUyN2Q5MzNkMWI4YWUyODFhMDliCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5oCkBAIC0wLDAgKzEsMTE0IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisjaW5j
bHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9T
ZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luSGFz
aC5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1
ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8
d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFz
aC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBTZWN1cml0eU9yaWdpbjsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjsK
K2NsYXNzIFdlYlByb2Nlc3NQcm94eTsKKworY2xhc3MgU3RvcmFnZU1hbmFnZXIgOiBwdWJsaWMg
SVBDOjpDb25uZWN0aW9uOjpXb3JrUXVldWVNZXNzYWdlUmVjZWl2ZXIgeworcHVibGljOgorICAg
IHN0YXRpYyBSZWY8U3RvcmFnZU1hbmFnZXI+IGNyZWF0ZShjb25zdCBTdHJpbmcmIGxvY2FsU3Rv
cmFnZURpcmVjdG9yeSk7CisgICAgflN0b3JhZ2VNYW5hZ2VyKCk7CisKKyAgICB2b2lkIGNyZWF0
ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB2b2lkIGRlc3Ryb3lTZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpOworICAgIHZvaWQgc2V0QWxsb3dlZFNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlQ29ubmVjdGlvbih1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNl
SUQsIElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24pOworICAgIHZvaWQgY2xvbmVT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVpbnQ2
NF90IG5ld1N0b3JhZ2VOYW1lc3BhY2VJRCk7CisKKyAgICB2b2lkIHByb2Nlc3NXaWxsT3BlbkNv
bm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJik7CisgICAgdm9pZCBw
cm9jZXNzRGlkQ2xvc2VDb25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlv
biYpOworICAgIHZvaWQgYXBwbGljYXRpb25XaWxsVGVybWluYXRlKCk7CisKKyAgICB2b2lkIGdl
dFNlc3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgdm9pZCBkZWxl
dGVTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5k
bGVyKTsKKyAgICB2b2lkIGRlbGV0ZVNlc3Npb25TdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29u
c3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+
JiYgY29tcGxldGlvbkhhbmRsZXIpOworCisgICAgdm9pZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5z
KEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYm
IGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNG
b3JPcmlnaW4oV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYpOworCisgICAgdm9pZCBkZWxl
dGVMb2NhbFN0b3JhZ2VPcmlnaW5zTW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Ns
b2NrOjp0aW1lX3BvaW50LCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOwor
ICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9y
PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxl
dGlvbkhhbmRsZXIpOworCisgICAgdm9pZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5EZXRhaWxzKEZ1
bmN0aW9uPHZvaWQoVmVjdG9yPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0
YWlscz4pPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBT
dG9yYWdlTWFuYWdlcihjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7CisKKyAg
ICAvLyBJUEM6OkNvbm5lY3Rpb246OldvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlci4KKyAgICB2b2lk
IGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYpIG92ZXJy
aWRlOworICAgIHZvaWQgZGlkUmVjZWl2ZVN5bmNNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQ
Qzo6RGVjb2RlciYsIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+JiByZXBseUVuY29kZXIp
IG92ZXJyaWRlOworCisgICAgLy8gTWVzc2FnZSBoYW5kbGVycy4KKyAgICB2b2lkIGNyZWF0ZUxv
Y2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYp
OworICAgIHZvaWQgY3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlv
biYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9yaWdpbkRhdGEsIFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKKyAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTWFw
KElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFn
ZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJik7CisgICAgdm9pZCBk
ZXN0cm95U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQp
OworCisgICAgdm9pZCBnZXRWYWx1ZXMoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFn
ZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4m
IHZhbHVlcyk7CisgICAgdm9pZCBzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0
b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3Qg
U3RyaW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgcmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24m
LCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVp
bnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB1
cmxTdHJpbmcpOworICAgIHZvaWQgY2xlYXIoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3Rv
cmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworCisgICAgY2xhc3MgU3RvcmFnZUFy
ZWE7CisgICAgU3RvcmFnZUFyZWEqIGZpbmRTdG9yYWdlQXJlYShJUEM6OkNvbm5lY3Rpb24mLCB1
aW50NjRfdCkgY29uc3Q7CisKKyAgICBjbGFzcyBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U7CisgICAg
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBnZXRPckNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1
aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAgY2xhc3MgVHJhbnNpZW50TG9jYWxT
dG9yYWdlTmFtZXNwYWNlOworICAgIFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSogZ2V0
T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5h
bWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9yaWdpbik7
CisKKyAgICBSZWY8V29ya1F1ZXVlPiBtX3F1ZXVlOworCisgICAgUmVmPExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcj4gbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI7CisgICAgSGFzaE1h
cDx1aW50NjRfdCwgUmVmUHRyPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4+IG1fbG9jYWxTdG9yYWdl
TmFtZXNwYWNlczsKKworICAgIEhhc2hNYXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGE+LCBSZWZQdHI8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNl
Pj4gbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzOworCisgICAgY2xhc3MgU2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2U7CisgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlPj4gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXM7CisKKyAgICBIYXNo
TWFwPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8
U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbjsKK307CisKK30gLy8gbmFt
ZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3Rv
cmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjU3ODlm
NzRjYzA4MWIwNzRiNTg4NTBkMmI3ZDdiYzQxODA0OWM4YQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMu
aW4KQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCittZXNzYWdlcyAtPiBTdG9yYWdlTWFuYWdlciB7CisgICAgQ3JlYXRlTG9jYWxTdG9yYWdl
TWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBz
dHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2Fu
dHNDb25uZWN0aW9uCisgICAgQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90
IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29y
ZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHRvcExldmVsU2VjdXJpdHlPcmlnaW5EYXRhLCBzdHJ1Y3Qg
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2FudHNDb25u
ZWN0aW9uCisgICAgQ3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1hcElE
LCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5EYXRhKSBXYW50c0Nvbm5lY3Rpb24KKyAgICBEZXN0cm95
U3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQpIFdhbnRzQ29ubmVjdGlvbgorCisgICAg
R2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQp
IC0+IChIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMpIFdhbnRzQ29ubmVjdGlvbgorCisg
ICAgU2V0SXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VB
cmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUs
IFN0cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgorICAgIFJlbW92ZUl0ZW0odWludDY0
X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBz
dG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtleSwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0
aW9uCisgICAgQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9y
YWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIHVybFN0cmluZykgV2Fu
dHNDb25uZWN0aW9uCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJT
dG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0gYi9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJ
T1MubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZmQ5MDllYTZiMjUwMzE5YjAxMzA2YzQzNmJkMGYxMzJjMGY4Mjg1
NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2Uv
aW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbQpAQCAtMCwwICsxLDQ4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlci5oIgorCisjaWYgUExBVEZPUk0oSU9TKQorCisjaW5jbHVkZSAiVmVyc2lv
bkNoZWNrcy5oIgorCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXI6OnBsYXRmb3JtTWF5YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0Cit7Cisg
ICAgaWYgKG1faGFzRXhjbHVkZWRGcm9tQmFja3VwKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X2hhc0V4Y2x1ZGVkRnJvbUJhY2t1cCA9IHRydWU7CisKKyAgICBpZiAobGlua2VkT25PckFmdGVy
KFNES1ZlcnNpb246OkZpcnN0VG9FeGNsdWRlTG9jYWxTdG9yYWdlRnJvbUJhY2t1cCkpCisgICAg
ICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0cmluZyAqKW1fbG9jYWxTdG9yYWdlRGly
ZWN0b3J5XSBzZXRSZXNvdXJjZVZhbHVlOkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21C
YWNrdXBLZXkgZXJyb3I6bmlsXTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvaW9zL1Jlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0KbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uNWI1Y2JkMjhlMjQ5MjkxM2E0MzI3NjRjOWJhOTM2NTI3N2M5NzcyMQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0KQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlLmgiCisKKyNpZiBQTEFURk9STShJT1MpCisKK25hbWVzcGFjZSBXZWJLaXQg
eworCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZXhjbHVk
ZUZyb21CYWNrdXAoKSBjb25zdAoreworICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0
cmluZyAqKW1fc3RvcmFnZURpcmVjdG9yeVBhdGhdIHNldFJlc291cmNlVmFsdWU6QFlFUyBmb3JL
ZXk6TlNVUkxJc0V4Y2x1ZGVkRnJvbUJhY2t1cEtleSBlcnJvcjpuaWxdOworfQorCit9CisKKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvaiBiL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oK
aW5kZXggYWVjOGQzN2FmZDg2YjViMDRkYTQ3MDZlY2NlZjRlMmNhNGE3MTY3OS4uOTg5NTY2Yjg1
ZWYyMzk5MzcyY2M3ZmNjOTQxY2JmODU4MDNjZDM4MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViS2l0L1dl
YktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0xMDc5LDYgKzEwNzksOSBAQAogCQk1
MUUzNTIwMjE4MEY1RDFFMDBFNTNCRTkgLyogRGF0YWJhc2VQcm9jZXNzTWFjLm1tIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFFMzUyMDExODBGNUQxRTAw
RTUzQkU5IC8qIERhdGFiYXNlUHJvY2Vzc01hYy5tbSAqLzsgfTsKIAkJNTFFMzUyMDkxODBGNUQ2
QjAwRTUzQkU5IC8qIERhdGFiYXNlU2VydmljZUVudHJ5UG9pbnQubW0gaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MUUzNTIwODE4MEY1RDZCMDBFNTNCRTkg
LyogRGF0YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbSAqLzsgfTsKIAkJNTFFMzk5MDYxRDZGNTRD
NzAwOUM4ODMxIC8qIFVJR2FtZXBhZFByb3ZpZGVyQ29jb2EubW0gaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MUUzOTkwNTFENkY1NEM1MDA5Qzg4MzEgLyog
VUlHYW1lcGFkUHJvdmlkZXJDb2NvYS5tbSAqLzsgfTsKKwkJNTFFNkMxNjAxRjI5MzU2MDAwRkQz
NDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbSBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUxRTZDMTVGMUYyOTM1
NTEwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1Mu
bW0gKi87IH07CisJCTUxRTZDMTYzMUYyOTM1RDgwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNTFFNkMxNjIxRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi87IH07CisJCTUxRTZDMTY0MUYyOTM1
REQwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUxRTZDMTYxMUYy
OTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
aCAqLzsgfTsKIAkJNTFFOEI2OEUxRTcxMjg3NzAwMUI3MTMyIC8qIFdlYlVSTFNjaGVtZVRhc2su
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFFOEI2
OEQxRTcxMjg3MzAwMUI3MTMyIC8qIFdlYlVSTFNjaGVtZVRhc2suY3BwICovOyB9OwogCQk1MUU5
NDk5NzFENzYyMTEzMDBFQzlFQjkgLyogVUlHYW1lcGFkUHJvdmlkZXJJT1MubW0gaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MUU5NDk5NjFENzYxQ0M3MDBF
QzlFQjkgLyogVUlHYW1lcGFkUHJvdmlkZXJJT1MubW0gKi87IH07CiAJCTUxRUZDMUNGMTUyNEU2
MjUwMEM5QTkzOCAvKiBXS0J1bmRsZURPTVdpbmRvd0V4dGVuc2lvbi5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFGQTJENTQxNTIxMTE4NjAwQzFCQTBC
IC8qIFdLQnVuZGxlRE9NV2luZG93RXh0ZW5zaW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTEzMjUsNyArMTMyOCw2IEBACiAJCTgzMTA0MjhD
MUJENkI2NkYwMEE3MTVFNCAvKiBOZXR3b3JrQ2FjaGVTdWJyZXNvdXJjZXNFbnRyeS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzEwNDI4QTFCRDZC
NjZGMDBBNzE1RTQgLyogTmV0d29ya0NhY2hlU3VicmVzb3VyY2VzRW50cnkuY3BwICovOyB9Owog
CQk4MzFFRUJCRDFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2Fk
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzFFRUJC
QjFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmggKi87IH07
CiAJCTgzMUVFQkJFMUJEODVDNDMwMEJCNjRDMyAvKiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxv
YWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMx
RUVCQkMxQkQ4NUM0MzAwQkI2NEMzIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5jcHAg
Ki87IH07Ci0JCTgzMjQzNTVDMUYxNzE0NjcwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4MzI0MzU1QjFGMTcxNDYxMDAzNUFBM0EgLyogUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovOyB9OwogCQk4MzJBRTI1MjFCRTJF
OENEMDBGQUFFMTAgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdlci5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMyQUUyNTAxQkUyRThD
RDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuaCAqLzsgfTsK
IAkJODMyQUUyNTMxQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9h
ZE1hbmFnZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gODMyQUUyNTExQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9h
ZE1hbmFnZXIuY3BwICovOyB9OwogCQk4MzJFRDE4QjFFMkZFMTU3MDA2QkE2NEEgLyogUGVyQWN0
aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA4MzJFRDE4OTFFMkZFMTNCMDA2QkE2NEEgLyogUGVyQWN0aXZp
dHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5jcHAgKi87IH07CkBAIC0xMzM5LDggKzEzNDEsNiBAQAog
CQk4MzcyREIyODFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xp
ZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgz
NzJEQjI2MUE2NzU2MjgwMEM2OTdDNSAvKiBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQu
Y3BwICovOyB9OwogCQk4MzcyREIyOTFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0
aWNMb2dnaW5nQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA4MzcyREIyNzFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dn
aW5nQ2xpZW50LmggKi87IH07CiAJCTgzNzJEQjJGMUE2NzdENEEwMEM2OTdDNSAvKiBXS0RpYWdu
b3N0aWNMb2dnaW5nUmVzdWx0VHlwZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gODM3MkRCMkUxQTY3N0Q0QTAwQzY5N0M1IC8qIFdLRGlhZ25vc3RpY0xv
Z2dpbmdSZXN1bHRUeXBlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKLQkJODM4NTBDMEMxRjE2QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4Mzg1MEMwQTFGMTZCQTZDMDBDMTVFNTIgLyogUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCAqLzsgfTsKLQkJODM4NTBDMEQxRjE2QkE5
MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM4NTBDMEIxRjE2
QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5o
ICovOyB9OwogCQk4Mzg5MUI2MzFBNjhCMzQyMDAzMEYzODYgLyogQVBJRGlhZ25vc3RpY0xvZ2dp
bmdDbGllbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDgzODkxQjYyMUE2OEIzNDIwMDMwRjM4NiAvKiBBUElEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5o
ICovOyB9OwogCQk4Mzg5MUI2OTFBNjhCRUJDMDAzMEYzODYgLyogX1dLRGlhZ25vc3RpY0xvZ2dp
bmdEZWxlZ2F0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gODM4OTFCNjgxQTY4QkVCQzAwMzBGMzg2IC8qIF9XS0RpYWdub3N0aWNMb2dnaW5nRGVsZWdh
dGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4
Mzg5MUI2QzFBNjhDMzBCMDAzMEYzODYgLyogRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzODkxQjZBMUE2OEMz
MEIwMDMwRjM4NiAvKiBEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oICovOyB9OwpAQCAtMzM0Miw2
ICszMzQyLDkgQEAKIAkJNTFFMzUyMDcxODBGNUQ2MTAwRTUzQkU5IC8qIEluZm8ucGxpc3QgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0
LnhtbDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTUx
RTM1MjA4MTgwRjVENkIwMEU1M0JFOSAvKiBEYXRhYmFzZVNlcnZpY2VFbnRyeVBvaW50Lm1tICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gRGF0YWJhc2VTZXJ2aWNlRW50
cnlQb2ludC5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTFFMzk5MDUxRDZGNTRD
NTAwOUM4ODMxIC8qIFVJR2FtZXBhZFByb3ZpZGVyQ29jb2EubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5vYmpjcHA7IHBhdGggPSBVSUdhbWVwYWRQcm92aWRlckNvY29hLm1tOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQk1MUU2QzE1RjFGMjkzNTUxMDBGRDM0MzcgLyogUmVzb3Vy
Y2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBu
YW1lID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tOyBwYXRo
ID0gaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbTsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTFFNkMxNjExRjI5MzVDRDAwRkQzNDM3IC8qIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJNTFFNkMxNjIxRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk1MUU4QjY4RDFFNzEyODczMDAxQjcxMzIgLyogV2ViVVJMU2NoZW1lVGFzay5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJVUkxTY2hlbWVUYXNr
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTFFOTQ5OTYxRDc2MUNDNzAwRUM5
RUI5IC8qIFVJR2FtZXBhZFByb3ZpZGVySU9TLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBwYXRoID0gVUlHYW1lcGFkUHJvdmlkZXJJT1MubW07IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTUxRjA2MEREMTY1NDMxNzUwMEYzMjgxQiAvKiBXZWJSZXNvdXJjZUxvYWRl
ck1lc3NhZ2VSZWNlaXZlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJSZXNvdXJjZUxvYWRl
ck1lc3NhZ2VSZWNlaXZlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0zNjE0
LDcgKzM2MTcsNiBAQAogCQk4MzEwNDI4QTFCRDZCNjZGMDBBNzE1RTQgLyogTmV0d29ya0NhY2hl
U3VicmVzb3VyY2VzRW50cnkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gTmV0d29ya0NhY2hlU3VicmVzb3VyY2VzRW50cnkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk4MzFFRUJCQjFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3Vs
YXRpdmVMb2FkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNo
ZVNwZWN1bGF0aXZlTG9hZC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzFFRUJC
QzFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZl
TG9hZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTgzMjQzNTVCMUYxNzE0NjEw
MDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0g
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTgzMkFFMjUwMUJFMkU4Q0QwMEZBQUUxMCAvKiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxv
YWRNYW5hZ2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNo
ZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
ODMyQUUyNTExQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1h
bmFnZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0Nh
Y2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTgzMkVEMTg5MUUyRkUxM0IwMDZCQTY0QSAvKiBQZXJBY3Rpdml0eVN0YXRlQ1BVVXNhZ2VT
YW1wbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBlckFjdGl2
aXR5U3RhdGVDUFVVc2FnZVNhbXBsZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtMzYyOCw4ICszNjMwLDYgQEAKIAkJODM3MkRCMjYxQTY3NTYyODAwQzY5N0M1IC8qIFdlYlBh
Z2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk4MzcyREIyNzFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURp
YWdub3N0aWNMb2dnaW5nQ2xpZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQk4MzcyREIyRTFBNjc3RDRBMDBDNjk3QzUgLyogV0tEaWFnbm9zdGljTG9nZ2luZ1Jl
c3VsdFR5cGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV0tEaWFnbm9zdGlj
TG9nZ2luZ1Jlc3VsdFR5cGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJODM4NTBD
MEExRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwotCQk4Mzg1MEMwQjFGMTZCQTZDMDBDMTVFNTIgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk4Mzg5MUI2MjFBNjhCMzQyMDAzMEYzODYgLyogQVBJRGlhZ25vc3RpY0xv
Z2dpbmdDbGllbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQVBJRGlhZ25v
c3RpY0xvZ2dpbmdDbGllbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODM4OTFC
NjgxQTY4QkVCQzAwMzBGMzg2IC8qIF9XS0RpYWdub3N0aWNMb2dnaW5nRGVsZWdhdGUuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gX1dLRGlhZ25vc3RpY0xvZ2dpbmdEZWxlZ2F0
ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4Mzg5MUI2QTFBNjhDMzBCMDAzMEYz
ODYgLyogRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKQEAgLTQ2NzksNyArNDY3OSw3IEBACiAJCQluYW1lID0gRGVwcmVjYXRlZDsKIAkJCXNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07Ci0JCTFBNDRCOTU4MTZCNzNGOEMwMEI3QkJEOCAv
KiBTdG9yYWdlICovID0geworCQkxQTQ0Qjk1ODE2QjczRjhDMDBCN0JCRDggLyogV2ViU3RvcmFn
ZSAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJNTEyMEM4
MkQxRTU0RTIwNDAwMjVCMjUwIC8qIGlvcyAqLywKQEAgLTQ2ODcsMTMgKzQ2ODcsMTEgQEAKIAkJ
CQkxQTFEOEJBMDE3MzFBMzYzMDAxNDFEQTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2UuaCAqLywK
IAkJCQkxQThDNzI4QTE3Mzg0NzdDMDAwQTY1NTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyLmNwcCAqLywKIAkJCQkxQThDNzI4QjE3Mzg0NzdDMDAwQTY1NTQgLyogTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyLmggKi8sCi0JCQkJODM4NTBDMEExRjE2QkE2QzAwQzE1RTUyIC8qIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8sCi0JCQkJODM4NTBD
MEIxRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZS5oICovLAogCQkJCTFBNDRCOTU5MTZCNzNGOUYwMEI3QkJEOCAvKiBTdG9yYWdlTWFuYWdl
ci5jcHAgKi8sCiAJCQkJMUE0NEI5NUExNkI3M0Y5RjAwQjdCQkQ4IC8qIFN0b3JhZ2VNYW5hZ2Vy
LmggKi8sCiAJCQkJMUFCMzFBOTMxNkJDNjVBQjAwRjZEQkM5IC8qIFN0b3JhZ2VNYW5hZ2VyLm1l
c3NhZ2VzLmluICovLAogCQkJKTsKLQkJCXBhdGggPSBTdG9yYWdlOworCQkJcGF0aCA9IFdlYlN0
b3JhZ2U7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OwogCQkxQTQ4MzJDMDFBOTY1
QTMzMDA4QjRERkUgLyogQ29jb2EgKi8gPSB7CkBAIC00ODYxLDcgKzQ4NTksNyBAQAogCQkJcGF0
aCA9IGNnOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKLQkJMUFBQzREREUxNkIx
Q0JGNjAwOTQyNUUzIC8qIFN0b3JhZ2UgKi8gPSB7CisJCTFBQUM0RERFMTZCMUNCRjYwMDk0MjVF
MyAvKiBXZWJTdG9yYWdlICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9
ICgKIAkJCQkxQUQzMzA2QzE2QjFEOTkxMDA0RjYwRTcgLyogU3RvcmFnZUFyZWFJbXBsLmNwcCAq
LywKQEAgLTQ4NzQsNyArNDg3Miw3IEBACiAJCQkJMUE1MkMwRjUxQTM4Q0RDNzAwMTYxNjBBIC8q
IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAgKi8sCiAJCQkJMUE1MkMwRjYxQTM4Q0RD
NzAwMTYxNjBBIC8qIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oICovLAogCQkJKTsKLQkJ
CXBhdGggPSBTdG9yYWdlOworCQkJcGF0aCA9IFdlYlN0b3JhZ2U7CiAJCQlzb3VyY2VUcmVlID0g
Ijxncm91cD4iOwogCQl9OwogCQkxQUFEREY0QjEwRDgyQUYwMDBEM0Q2M0QgLyogU2hhcmVkICov
ID0gewpAQCAtNTQwMiw2ICs1NDAwLDcgQEAKIAkJCQk4NkY5NTM2MjE4RkY1NTBCMDAxREIyRUYg
LyogUHJvY2Vzc0Fzc2VydGlvbklPUy5tbSAqLywKIAkJCQkwRjBDMzY1NzE4QzA1MUJBMDBGNjA3
RDcgLyogUmVtb3RlTGF5ZXJUcmVlSG9zdElPUy5tbSAqLywKIAkJCQkwRjBDMzY1QjE4QzA1Q0Ex
MDBGNjA3RDcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JQcm94eUlPUy5tbSAqLywKKwkJ
CQk1MUU2QzE1RjFGMjkzNTUxMDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlSU9TLm1tICovLAogCQkJCTJEQUYwNkQ0MThCRDFBNDcwMDgxQ0VCMSAvKiBT
bWFydE1hZ25pZmljYXRpb25Db250cm9sbGVyLmggKi8sCiAJCQkJMkRBRjA2RDgxOEJEMjNCQTAw
ODFDRUIxIC8qIFNtYXJ0TWFnbmlmaWNhdGlvbkNvbnRyb2xsZXIubWVzc2FnZXMuaW4gKi8sCiAJ
CQkJMkRBRjA2RDUxOEJEMUE0NzAwODFDRUIxIC8qIFNtYXJ0TWFnbmlmaWNhdGlvbkNvbnRyb2xs
ZXIubW0gKi8sCkBAIC02MDAwLDcgKzU5OTksNiBAQAogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQlj
aGlsZHJlbiA9ICgKIAkJCQk1MTIwQzgzMDFFNTRFMjY1MDAyNUIyNTAgLyogTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VySU9TLm1tICovLAotCQkJCTgzMjQzNTVCMUYxNzE0NjEwMDM1QUEzQSAv
KiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gKi8sCiAJCQkp
OwogCQkJcGF0aCA9IGlvczsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC02NTM5LDEw
ICs2NTM3LDEwIEBACiAJCQkJMzEwOTk5NzQxNDZDOEFBODAwMjlERUI5IC8qIE5vdGlmaWNhdGlv
bnMgKFVzZXIpICovLAogCQkJCTFBNkZCN0FBMTFFNjRCNDkwMERCMTM3MSAvKiBQbHVnaW5zICov
LAogCQkJCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1NyAvKiBTY3JvbGxpbmcgKi8sCi0JCQkJMUFB
QzREREUxNkIxQ0JGNjAwOTQyNUUzIC8qIFN0b3JhZ2UgKi8sCiAJCQkJMUFBRjA4QUExOTI2OTMw
QjAwQjYzOTBDIC8qIFVzZXJDb250ZW50ICovLAogCQkJCUJDMDMyRDVEMTBGNDM3MjIwMDU4QzE1
QSAvKiBXZWJDb3JlU3VwcG9ydCAqLywKIAkJCQlCQzAzMkQ1RTEwRjQzNzJCMDA1OEMxNUEgLyog
V2ViUGFnZSAqLywKKwkJCQkxQUFDNERERTE2QjFDQkY2MDA5NDI1RTMgLyogV2ViU3RvcmFnZSAq
LywKIAkJCQlCQ0U5QzBDRjE0ODU5NjVEMDBFMzNENjEgLyogV2ViQ29ubmVjdGlvblRvVUlQcm9j
ZXNzLmNwcCAqLywKIAkJCQlCQ0U5QzBEMDE0ODU5NjVEMDBFMzNENjEgLyogV2ViQ29ubmVjdGlv
blRvVUlQcm9jZXNzLmggKi8sCiAJCQkJQkMxMTFBRTMxMTJGNUMyNjAwMzM3QkFCIC8qIFdlYlBy
b2Nlc3MuY3BwICovLApAQCAtNjY4OSw4ICs2Njg3LDggQEAKIAkJCQkzMUEyRUM0MDE0ODk5NzM3
MDA4MTBENzEgLyogTm90aWZpY2F0aW9ucyAqLywKIAkJCQkxQUVGQ0MwNTExRDAxRjM0MDA4MjE5
RDMgLyogUGx1Z2lucyAqLywKIAkJCQkwRjU5NDc5MzE4N0IzQjRDMDA0Mzc4NTcgLyogU2Nyb2xs
aW5nICovLAotCQkJCTFBNDRCOTU4MTZCNzNGOEMwMEI3QkJEOCAvKiBTdG9yYWdlICovLAogCQkJ
CTFBQUYwODlFMTkyNjgxQUMwMEI2MzkwQyAvKiBVc2VyQ29udGVudCAqLywKKwkJCQkxQTQ0Qjk1
ODE2QjczRjhDMDBCN0JCRDggLyogV2ViU3RvcmFnZSAqLywKIAkJCQkxQTUzQzJBMzFBMzI1Njkx
MDA0RThDNzAgLyogV2Vic2l0ZURhdGEgKi8sCiAJCQkJN0NEMTAyRDkxODY2NzcwNjAwRUQ0MjlE
IC8qIEF1dG9Db3JyZWN0aW9uQ2FsbGJhY2suaCAqLywKIAkJCQk0NkEyQjYwNjFFNTY3NUEyMDBD
M0RFREEgLyogQmFja2dyb3VuZFByb2Nlc3NSZXNwb25zaXZlbmVzc1RpbWVyLmNwcCAqLywKQEAg
LTY3MjQsNiArNjcyMiw4IEBACiAJCQkJQTU1QkE4MUIxQkEyNUIxRTAwN0NEMzNEIC8qIFJlbW90
ZVdlYkluc3BlY3RvclByb3h5LmNwcCAqLywKIAkJCQlBNTVCQTgxOTFCQTI1QjFFMDA3Q0QzM0Qg
LyogUmVtb3RlV2ViSW5zcGVjdG9yUHJveHkuaCAqLywKIAkJCQlBNTVCQTgxQTFCQTI1QjFFMDA3
Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVjdG9yUHJveHkubWVzc2FnZXMuaW4gKi8sCisJCQkJNTFF
NkMxNjIxRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZS5jcHAgKi8sCisJCQkJNTFFNkMxNjExRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovLAogCQkJCUJDMTExQjA4MTEyRjVF
M0MwMDMzN0JBQiAvKiBSZXNwb25zaXZlbmVzc1RpbWVyLmNwcCAqLywKIAkJCQkxQTMwMDY2QzEx
MTBGNEY3MDAzMTkzN0MgLyogUmVzcG9uc2l2ZW5lc3NUaW1lci5oICovLAogCQkJCTUxQTRENUE4
MTZDQUM0RkYwMDBFNjE1RSAvKiBTdGF0aXN0aWNzUmVxdWVzdC5jcHAgKi8sCkBAIC04NTMyLDcg
Kzg1MzIsNiBAQAogCQkJCUE1NUJBODE3MUJBMjNFMTIwMDdDRDMzRCAvKiBSZW1vdGVXZWJJbnNw
ZWN0b3JVSS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNkJFOTY5Q0QxRTU0RTA1NDAwOEI3NDgzIC8q
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NDbGFzc2lmaWVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk2
QkU5NjlDQjFFNTRENENGMDA4Qjc0ODMgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc0NsYXNzaWZp
ZXJDb2NvYS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJODM4NTBDMEQxRjE2QkE5MDAwQzE1RTUyIC8q
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMUEzMDA2NkUxMTEwRjRGNzAwMzE5MzdDIC8qIFJlc3BvbnNpdmVuZXNzVGltZXIuaCBp
biBIZWFkZXJzICovLAogCQkJCTQxMDQ4MkNFMURERDMyNEYwMEYwMDZEMCAvKiBSVENOZXR3b3Jr
LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzJEMDIxNzEyQUM0MUNCMDBFNzMyQTMgLyogU2FtZURv
Y3VtZW50TmF2aWdhdGlvblR5cGUuaCBpbiBIZWFkZXJzICovLApAQCAtODk1Nyw2ICs4OTU2LDcg
QEAKIAkJCQkxQUJDM0RGQzE4OTlGNTFDMDA0RjA2MjYgLyogV0tOYXZpZ2F0aW9uRGVsZWdhdGUu
aCBpbiBIZWFkZXJzICovLAogCQkJCTFBQTIwRDUxMThBRDUwRTAwMDVEMUVENCAvKiBXS05hdmln
YXRpb25EZWxlZ2F0ZVByaXZhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBQkMzREYxMTg5OUM2
QjYwMDRGMDYyNiAvKiBXS05hdmlnYXRpb25JbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
NTFFNkMxNjQxRjI5MzVERDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMUFDQzg3QkExOTgxQzM0MTAwM0QxQUY0
IC8qIFdLTmF2aWdhdGlvblByaXZhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTJEM0E2NUUzMUE3
QzNBOTMwMENBQzYzNyAvKiBXS05hdmlnYXRpb25SZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCTFB
MUIwRUI2MThBNDI0OTUwMDM4NDgxQSAvKiBXS05hdmlnYXRpb25SZXNwb25zZS5oIGluIEhlYWRl
cnMgKi8sCkBAIC0xMDEwMiw4ICsxMDEwMiw2IEBACiAJCQkJMUJCQkU0QTAxOUI2NkM1MzAwNkI3
RDgxIC8qIFJlbW90ZVdlYkluc3BlY3RvclVJTWVzc2FnZVJlY2VpdmVyLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTZCRTk2OUM3MUU1NEQ0QjYwMDhCNzQ4MyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzQ2xhc3NpZmllci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk2QkU5NjlDQTFFNTRENENGMDA4
Qjc0ODMgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc0NsYXNzaWZpZXJDb2NvYS5jcHAgaW4gU291
cmNlcyAqLywKLQkJCQk4Mzg1MEMwQzFGMTZCQTkwMDBDMTVFNTIgLyogUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTgzMjQzNTVD
MUYxNzE0NjcwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2VJT1MubW0gaW4gU291cmNlcyAqLywKIAkJCQlCQzExMUIwOTExMkY1RTNDMDAzMzdCQUIgLyog
UmVzcG9uc2l2ZW5lc3NUaW1lci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk0MTA0ODJDRDFEREQz
MjRDMDBGMDA2RDAgLyogUlRDTmV0d29yay5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxQUFCNEFB
QTEyOTZGMTU0MDAyMzk1MkYgLyogU2FuZGJveEV4dGVuc2lvbk1hYy5tbSBpbiBTb3VyY2VzICov
LApAQCAtMTAzMTUsNiArMTAzMTMsNyBAQAogCQkJCUJDOTYzRDZFMTEzREQxQTUwMDU3NEJFMiAv
KiBXZWJQYWdlTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQzBDRTcyQTAxMjQ3RTcxRDAwQkMw
RUM0IC8qIFdlYlBhZ2VNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkQ1
QzlEMDUxOUM4MUQ4RjAwQjNDNUMxIC8qIFdlYlBhZ2VPdmVybGF5LmNwcCBpbiBTb3VyY2VzICov
LAorCQkJCTUxRTZDMTYwMUYyOTM1NjAwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLywKIAkJCQlCQzExMUIwRjExMkY1
RTRGMDAzMzdCQUIgLyogV2ViUGFnZVByb3h5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBQzAy
NzNGMTk2NjIyRDYwMEMxMkI3NSAvKiBXZWJQYWdlUHJveHlDb2NvYS5tbSBpbiBTb3VyY2VzICov
LAogCQkJCTJEQTk0NEFGMTg4NEU5QkEwMEVEODZEQiAvKiBXZWJQYWdlUHJveHlJT1MubW0gaW4g
U291cmNlcyAqLywKQEAgLTEwNTI3LDYgKzEwNTI2LDcgQEAKIAkJCQkyRDNBNjVFMjFBN0MzQTkz
MDBDQUM2MzcgLyogV0tOYXZpZ2F0aW9uUmVmLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBMUIw
RUI1MThBNDI0OTUwMDM4NDgxQSAvKiBXS05hdmlnYXRpb25SZXNwb25zZS5tbSBpbiBTb3VyY2Vz
ICovLAogCQkJCTJEM0E2NURFMUE3QzNBN0QwMENBQzYzNyAvKiBXS05hdmlnYXRpb25SZXNwb25z
ZVJlZi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk1MUU2QzE2MzFGMjkzNUQ4MDBGRDM0MzcgLyog
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTMxOEJFMTc3MTQ3NDNFNjAwMEE4RkJCMiAvKiBXS05vdGlmaWNhdGlvbi5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkzMThCRTE3NTE0NzQzREQ3MDBBOEZCQjIgLyogV0tOb3RpZmljYXRp
b25NYW5hZ2VyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTMxQTJFQzc3MTQ4RDY2MkUwMDgxMEQ3
MSAvKiBXS05vdGlmaWNhdGlvblBlcm1pc3Npb25SZXF1ZXN0LmNwcCBpbiBTb3VyY2VzICovLApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJ
bXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1w
bC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODUwN2EzMTMyNjQyZGJkYzBm
MThhNjk5ZDFlN2NmM2JhNDg2MWQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJ
bXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgotCi0jaW5jbHVk
ZSAiU3RvcmFnZUFyZWFNYXAuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0RvY3VtZW50Lmg+Ci0jaW5j
bHVkZSA8V2ViQ29yZS9GcmFtZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvU2NoZW1lUmVnaXN0cnkuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5
T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2V0dGluZ3MuaD4KLQotdXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdGF0aWMgdWludDY0X3Qg
Z2VuZXJhdGVTdG9yYWdlQXJlYUlEKCkKLXsKLSAgICBzdGF0aWMgdWludDY0X3Qgc3RvcmFnZUFy
ZWFJRDsKLSAgICByZXR1cm4gKytzdG9yYWdlQXJlYUlEOwotfQotCi1SZWY8U3RvcmFnZUFyZWFJ
bXBsPiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShSZWY8U3RvcmFnZUFyZWFNYXA+JiYgc3RvcmFn
ZUFyZWFNYXApCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWFJbXBsKFdU
Rk1vdmUoc3RvcmFnZUFyZWFNYXApKSk7Ci19Ci0KLVN0b3JhZ2VBcmVhSW1wbDo6U3RvcmFnZUFy
ZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJiBzdG9yYWdlQXJlYU1hcCkKLSAgICA6IG1fc3Rv
cmFnZUFyZWFJRChnZW5lcmF0ZVN0b3JhZ2VBcmVhSUQoKSkKLSAgICAsIG1fc3RvcmFnZUFyZWFN
YXAoV1RGTW92ZShzdG9yYWdlQXJlYU1hcCkpCi17Ci19Ci0KLVN0b3JhZ2VBcmVhSW1wbDo6flN0
b3JhZ2VBcmVhSW1wbCgpCi17Ci19Ci0KLXVuc2lnbmVkIFN0b3JhZ2VBcmVhSW1wbDo6bGVuZ3Ro
KCkKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+bGVuZ3RoKCk7Ci19Ci0KLVN0cmlu
ZyBTdG9yYWdlQXJlYUltcGw6OmtleSh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICByZXR1cm4gbV9z
dG9yYWdlQXJlYU1hcC0+a2V5KGluZGV4KTsKLX0KLQotU3RyaW5nIFN0b3JhZ2VBcmVhSW1wbDo6
aXRlbShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+
aXRlbShrZXkpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhSW1wbDo6c2V0SXRlbShGcmFtZSogc291
cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBx
dW90YUV4Y2VwdGlvbikKLXsKLSAgICBBU1NFUlQoIXZhbHVlLmlzTnVsbCgpKTsKLQotICAgIG1f
c3RvcmFnZUFyZWFNYXAtPnNldEl0ZW0oc291cmNlRnJhbWUsIHRoaXMsIGtleSwgdmFsdWUsIHF1
b3RhRXhjZXB0aW9uKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OnJlbW92ZUl0ZW0oRnJh
bWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBtX3N0b3JhZ2VBcmVh
TWFwLT5yZW1vdmVJdGVtKHNvdXJjZUZyYW1lLCB0aGlzLCBrZXkpOwotfQotCi12b2lkIFN0b3Jh
Z2VBcmVhSW1wbDo6Y2xlYXIoRnJhbWUqIHNvdXJjZUZyYW1lKQotewotICAgIG1fc3RvcmFnZUFy
ZWFNYXAtPmNsZWFyKHNvdXJjZUZyYW1lLCB0aGlzKTsKLX0KLQotYm9vbCBTdG9yYWdlQXJlYUlt
cGw6OmNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KQotewotICAgIHJldHVybiBtX3N0b3JhZ2VB
cmVhTWFwLT5jb250YWlucyhrZXkpOwotfQotCi1ib29sIFN0b3JhZ2VBcmVhSW1wbDo6Y2FuQWNj
ZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCi17Ci0gICAgcmV0dXJuIGZyYW1lICYmIGZyYW1lLT5w
YWdlKCk7Ci19Ci0KLVN0b3JhZ2VUeXBlIFN0b3JhZ2VBcmVhSW1wbDo6c3RvcmFnZVR5cGUoKSBj
b25zdAotewotICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5zdG9yYWdlVHlwZSgpOwotfQot
Ci1zaXplX3QgU3RvcmFnZUFyZWFJbXBsOjptZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkKLXsKLSAg
ICByZXR1cm4gMDsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmluY3JlbWVudEFjY2Vzc0Nv
dW50KCkKLXsKLSAgICAvLyBTdG9yYWdlIGFjY2VzcyBpcyBoYW5kbGVkIGluIHRoZSBVSSBwcm9j
ZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS4KLX0KLQotdm9pZCBTdG9yYWdlQXJl
YUltcGw6OmRlY3JlbWVudEFjY2Vzc0NvdW50KCkKLXsKLSAgICAvLyBTdG9yYWdlIGFjY2VzcyBp
cyBoYW5kbGVkIGluIHRoZSBVSSBwcm9jZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVy
ZS4KLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmNsb3NlRGF0YWJhc2VJZklkbGUoKQotewot
ICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhpcy4KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LX0KLQotV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIFN0b3JhZ2VBcmVhSW1wbDo6c2VjdXJp
dHlPcmlnaW4oKSBjb25zdAotewotICAgIHJldHVybiBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3N0b3JhZ2VBcmVhTWFwLT5zZWN1cml0eU9yaWdpbigp
KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuaCBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCBkZGE0N2M4ZDgzOGU4ZmJkYzVkNDdiZjc4Y2Y3NmUxOWEwMTk4YjMyLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgU3RvcmFnZUFyZWFJbXBsX2gKLSNkZWZpbmUg
U3RvcmFnZUFyZWFJbXBsX2gKLQotI2luY2x1ZGUgIk1lc3NhZ2VSZWNlaXZlci5oIgotI2luY2x1
ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaENvdW50ZWRTZXQu
aD4KLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFz
cyBTZWN1cml0eU9yaWdpbjsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3Jh
Z2VBcmVhTWFwOwotCi1jbGFzcyBTdG9yYWdlQXJlYUltcGwgZmluYWwgOiBwdWJsaWMgV2ViQ29y
ZTo6U3RvcmFnZUFyZWEgewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8U3RvcmFnZUFyZWFJbXBs
PiBjcmVhdGUoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKLSAgICB2aXJ0dWFsIH5TdG9yYWdlQXJl
YUltcGwoKTsKLQotICAgIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQoKSBjb25zdCB7IHJldHVybiBt
X3N0b3JhZ2VBcmVhSUQ7IH0KLQotcHJpdmF0ZToKLSAgICBTdG9yYWdlQXJlYUltcGwoUmVmPFN0
b3JhZ2VBcmVhTWFwPiYmKTsKLQotICAgIC8vIFdlYkNvcmU6OlN0b3JhZ2VBcmVhLgotICAgIHVu
c2lnbmVkIGxlbmd0aCgpIG92ZXJyaWRlOwotICAgIFN0cmluZyBrZXkodW5zaWduZWQgaW5kZXgp
IG92ZXJyaWRlOwotICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsK
LSAgICB2b2lkIHNldEl0ZW0oV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJp
bmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRpb24pIG92ZXJy
aWRlOwotICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIGNv
bnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKLSAgICB2b2lkIGNsZWFyKFdlYkNvcmU6OkZyYW1l
KiBzb3VyY2VGcmFtZSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBjb250YWlucyhjb25zdCBTdHJpbmcm
IGtleSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBjYW5BY2Nlc3NTdG9yYWdlKFdlYkNvcmU6OkZyYW1l
Kikgb3ZlcnJpZGU7Ci0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25z
dCBvdmVycmlkZTsKLSAgICBzaXplX3QgbWVtb3J5Qnl0ZXNVc2VkQnlDYWNoZSgpIG92ZXJyaWRl
OwotICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQoKSBvdmVycmlkZTsKLSAgICB2b2lkIGRl
Y3JlbWVudEFjY2Vzc0NvdW50KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJ
ZGxlKCkgb3ZlcnJpZGU7Ci0gICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5
T3JpZ2luKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB1aW50NjRfdCBtX3N0b3JhZ2VBcmVhSUQ7
Ci0gICAgUmVmPFN0b3JhZ2VBcmVhTWFwPiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsKLQotfSAvLyBu
YW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAvLyBTdG9yYWdlQXJlYUltcGxfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY1MGQxYjNlYmZjNzI4YzI3NWVlMDEwYmZlYTNh
MjY4YjBiODg2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcAorKysg
L2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCi0KLSNpbmNsdWRlICJTdG9yYWdlQXJl
YUltcGwuaCIKLSNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcE1lc3NhZ2VzLmgiCi0jaW5jbHVkZSAi
U3RvcmFnZU1hbmFnZXJNZXNzYWdlcy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VOYW1lc3BhY2VJbXBs
LmgiCi0jaW5jbHVkZSAiV2ViUGFnZS5oIgotI2luY2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5Lmgi
Ci0jaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRE9NV2luZG93Lmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9Eb2N1bWVudC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvTWFpbkZy
YW1lLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9QYWdlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9QYWdl
R3JvdXAuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvU3RvcmFnZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUV2ZW50RGlz
cGF0Y2hlci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgotI2luY2x1ZGUgPFdl
YkNvcmUvU3RvcmFnZVR5cGUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1zdGF0aWMgdWludDY0X3QgZ2VuZXJhdGVTdG9yYWdlTWFwSUQoKQot
ewotICAgIHN0YXRpYyB1aW50NjRfdCBzdG9yYWdlTWFwSUQ7Ci0gICAgcmV0dXJuICsrc3RvcmFn
ZU1hcElEOwotfQotCi1SZWY8U3RvcmFnZUFyZWFNYXA+IFN0b3JhZ2VBcmVhTWFwOjpjcmVhdGUo
U3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpTZWN1
cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5l
dyBTdG9yYWdlQXJlYU1hcChzdG9yYWdlTmFtZXNwYWNlLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2lu
KSkpOwotfQotCi1TdG9yYWdlQXJlYU1hcDo6U3RvcmFnZUFyZWFNYXAoU3RvcmFnZU5hbWVzcGFj
ZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBz
ZWN1cml0eU9yaWdpbikKLSAgICA6IG1fc3RvcmFnZU5hbWVzcGFjZSgqc3RvcmFnZU5hbWVzcGFj
ZSkKLSAgICAsIG1fc3RvcmFnZU1hcElEKGdlbmVyYXRlU3RvcmFnZU1hcElEKCkpCi0gICAgLCBt
X3N0b3JhZ2VUeXBlKHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VUeXBlKCkpCi0gICAgLCBtX3N0
b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSkK
LSAgICAsIG1fcXVvdGFJbkJ5dGVzKHN0b3JhZ2VOYW1lc3BhY2UtPnF1b3RhSW5CeXRlcygpKQot
ICAgICwgbV9zZWN1cml0eU9yaWdpbihXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkKLSAgICAsIG1f
Y3VycmVudFNlZWQoMCkKLSAgICAsIG1faGFzUGVuZGluZ0NsZWFyKGZhbHNlKQotICAgICwgbV9o
YXNQZW5kaW5nR2V0VmFsdWVzKGZhbHNlKQotewotICAgIHN3aXRjaCAobV9zdG9yYWdlVHlwZSkg
ewotICAgIGNhc2UgU3RvcmFnZVR5cGU6OkxvY2FsOgotICAgIGNhc2UgU3RvcmFnZVR5cGU6OlRy
YW5zaWVudExvY2FsOgotICAgICAgICBpZiAoU2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2lu
ID0gc3RvcmFnZU5hbWVzcGFjZS0+dG9wTGV2ZWxPcmlnaW4oKSkKLSAgICAgICAgICAgIFdlYlBy
b2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2Fn
ZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAobV9zdG9y
YWdlTWFwSUQsIHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VOYW1lc3BhY2VJRCgpLCBTZWN1cml0
eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbigqdG9wTGV2ZWxPcmlnaW4pLCBTZWN1cml0
eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSksIDApOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQ
cm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRl
TG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElELCBzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdl
TmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9z
ZWN1cml0eU9yaWdpbikpLCAwKTsKLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU3RvcmFn
ZVR5cGU6OlNlc3Npb246Ci0gICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFBy
b2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVT
ZXNzaW9uU3RvcmFnZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFn
ZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1f
c2VjdXJpdHlPcmlnaW4pKSwgMCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTdG9yYWdl
VHlwZTo6RXBoZW1lcmFsTG9jYWw6Ci0gICAgICAgIC8vIFRoZSBVSSBwcm9jZXNzIGlzIG5vdCBp
bnZvbHZlZCBmb3IgRXBoZW1lcmFsTG9jYWwgc3RvcmFnZXMuCi0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoTWVz
c2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fc3RvcmFnZU1h
cElELCAqdGhpcyk7Ci19Ci0KLVN0b3JhZ2VBcmVhTWFwOjp+U3RvcmFnZUFyZWFNYXAoKQotewot
ICAgIGlmIChtX3N0b3JhZ2VUeXBlICE9IFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCkgewot
ICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigp
LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6RGVzdHJveVN0b3JhZ2VNYXAobV9zdG9y
YWdlTWFwSUQpLCAwKTsKLSAgICAgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVz
c2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6bWVzc2FnZVJlY2VpdmVyTmFt
ZSgpLCBtX3N0b3JhZ2VNYXBJRCk7Ci0gICAgfQotCi0gICAgbV9zdG9yYWdlTmFtZXNwYWNlLT5k
aWREZXN0cm95U3RvcmFnZUFyZWFNYXAoKnRoaXMpOwotfQotCi11bnNpZ25lZCBTdG9yYWdlQXJl
YU1hcDo6bGVuZ3RoKCkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVy
biBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpOwotfQotCi1TdHJpbmcgU3RvcmFnZUFyZWFNYXA6Omtl
eSh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJl
dHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRleCk7Ci19Ci0KLVN0cmluZyBTdG9yYWdlQXJlYU1h
cDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsK
LQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsKLX0KLQotdm9pZCBTdG9y
YWdlQXJlYU1hcDo6c2V0SXRlbShGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCog
c291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wm
IHF1b3RhRXhjZXB0aW9uKQotewotICAgIGxvYWRWYWx1ZXNJZk5lZWRlZCgpOwotCi0gICAgQVNT
RVJUKG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOwotCi0gICAgU3RyaW5nIG9sZFZhbHVlOwot
ICAgIHF1b3RhRXhjZXB0aW9uID0gZmFsc2U7Ci0gICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVtKGtl
eSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbik7Ci0gICAgaWYgKHF1b3RhRXhjZXB0
aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAob2xkVmFsdWUgPT0gdmFsdWUpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5hZGQoa2V5KTsKLQotICAg
IFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQo
TWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpTZXRJdGVtKG1fc3RvcmFnZU1hcElELCBzb3VyY2VB
cmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQsIGtleSwgdmFsdWUsIHNvdXJjZUZy
YW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpy
ZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBz
b3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQo
KTsKLSAgICBBU1NFUlQobV9zdG9yYWdlTWFwLT5oYXNPbmVSZWYoKSk7Ci0KLSAgICBTdHJpbmcg
b2xkVmFsdWU7Ci0gICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOwot
Ci0gICAgaWYgKG9sZFZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Bl
bmRpbmdWYWx1ZUNoYW5nZXMuYWRkKGtleSk7Ci0KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24o
KS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdl
cjo6UmVtb3ZlSXRlbShtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgp
LCBtX2N1cnJlbnRTZWVkLCBrZXksIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDAp
OwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNl
RnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSkKLXsKLSAgICByZXNldFZhbHVlcygp
OwotCi0gICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSB0cnVlOwotICAgIG1fc3RvcmFnZU1hcCA9IFN0
b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0gICAgV2ViUHJvY2Vzczo6c2luZ2xl
dG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1h
bmFnZXI6OkNsZWFyKG1fc3RvcmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCks
IG1fY3VycmVudFNlZWQsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOwotfQot
Ci1ib29sIFN0b3JhZ2VBcmVhTWFwOjpjb250YWlucyhjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAg
ICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmNvbnRh
aW5zKGtleSk7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OnJlc2V0VmFsdWVzKCkKLXsKLSAg
ICBtX3N0b3JhZ2VNYXAgPSBudWxscHRyOwotCi0gICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNs
ZWFyKCk7Ci0gICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxzZTsKLSAgICBtX2hhc1BlbmRpbmdH
ZXRWYWx1ZXMgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRTZWVkKys7Ci19Ci0KLXZvaWQgU3RvcmFn
ZUFyZWFNYXA6OmxvYWRWYWx1ZXNJZk5lZWRlZCgpCi17Ci0gICAgaWYgKG1fc3RvcmFnZU1hcCkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzOwot
ICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgYSBzcGVjaWFsIHNlbmRTeW5jIGZsYWcgdG8g
aW5kaWNhdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMg
d2hpbGUgd2FpdGluZyBmb3IgYSByZXBseS4KLSAgICAvLyAoVGhpcyBmbGFnIGRvZXMgbm90IHll
dCBleGlzdCkuIFNpbmNlIGxvYWRWYWx1ZXNJZk5lZWRlZCgpIGVuZHMgdXAgYmVpbmcgY2FsbGVk
IGZyb20gd2l0aGluIEphdmFTY3JpcHQgY29kZSwgcHJvY2Vzc2luZyBpbmNvbWluZyBzeW5jaHJv
bm91cyBtZXNzYWdlcwotICAgIC8vIGNvdWxkIGxlYWQgdG8gd2VpcmQgcmVlbnRyZW5jeSBidWdz
IG90aGVyd2lzZS4KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29u
bmVjdGlvbigpLT5zZW5kU3luYyhNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVlcyht
X3N0b3JhZ2VNYXBJRCwgbV9jdXJyZW50U2VlZCksIE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6
R2V0VmFsdWVzOjpSZXBseSh2YWx1ZXMpLCAwKTsKLQotICAgIG1fc3RvcmFnZU1hcCA9IFN0b3Jh
Z2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0gICAgbV9zdG9yYWdlTWFwLT5pbXBvcnRJ
dGVtcyh2YWx1ZXMpOwotCi0gICAgLy8gV2Ugd2FudCB0byBpZ25vcmUgYWxsIGNoYW5nZXMgdW50
aWwgd2UgZ2V0IHRoZSBEaWRHZXRWYWx1ZXMgbWVzc2FnZS4KLSAgICBtX2hhc1BlbmRpbmdHZXRW
YWx1ZXMgPSB0cnVlOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRHZXRWYWx1ZXModWlu
dDY0X3Qgc3RvcmFnZU1hcFNlZWQpCi17Ci0gICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFn
ZU1hcFNlZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX2hhc1BlbmRpbmdHZXRW
YWx1ZXMpOwotICAgIG1faGFzUGVuZGluZ0dldFZhbHVlcyA9IGZhbHNlOwotfQotCi12b2lkIFN0
b3JhZ2VBcmVhTWFwOjpkaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBT
dHJpbmcmIGtleSwgYm9vbCBxdW90YUVycm9yKQotewotICAgIGlmIChtX2N1cnJlbnRTZWVkICE9
IHN0b3JhZ2VNYXBTZWVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQobV9wZW5kaW5n
VmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpOwotCi0gICAgaWYgKHF1b3RhRXJyb3IpIHsKLSAg
ICAgICAgcmVzZXRWYWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fcGVu
ZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUoa2V5KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6
ZGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkp
Ci17Ci0gICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIEFTU0VSVChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSk7
Ci0gICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLnJlbW92ZShrZXkpOwotfQotCi12b2lkIFN0b3Jh
Z2VBcmVhTWFwOjpkaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKLXsKLSAgICBpZiAo
bV9jdXJyZW50U2VlZCAhPSBzdG9yYWdlTWFwU2VlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
QVNTRVJUKG1faGFzUGVuZGluZ0NsZWFyKTsKLSAgICBtX2hhc1BlbmRpbmdDbGVhciA9IGZhbHNl
OwotfQotCi1ib29sIFN0b3JhZ2VBcmVhTWFwOjpzaG91bGRBcHBseUNoYW5nZUZvcktleShjb25z
dCBTdHJpbmcmIGtleSkgY29uc3QKLXsKLSAgICAvLyBXZSBoYXZlIG5vdCB5ZXQgbG9hZGVkIGFu
eXRoaW5nIGZyb20gdGhpcyBzdG9yYWdlIG1hcC4KLSAgICBpZiAoIW1fc3RvcmFnZU1hcCkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBzdG9yYWdlIGFyZWEg
aXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZSBzdG9yYWdlIG1hbmFnZXIgdG8gdXBkYXRlIHRo
ZSBnaXZlbiBrZXkuCi0gICAgLy8gSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0
byBhcHBseSBhbnkgY2hhbmdlcyBtYWRlIGJ5IG90aGVyIHN0b3JhZ2UgYXJlYXMsIHNpbmNlCi0g
ICAgLy8gb3VyIGNoYW5nZSB3YXMgbWFkZSBsYXN0LgotICAgIGlmIChtX3BlbmRpbmdWYWx1ZUNo
YW5nZXMuY29udGFpbnMoa2V5KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmFwcGx5Q2hhbmdlKGNvbnN0IFN0cmlu
ZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKQotewotICAgIEFTU0VSVCghbV9zdG9yYWdl
TWFwIHx8IG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOwotCi0gICAgLy8gVGhlcmUncyBhIGNs
ZWFyIHBlbmRpbmcgb3IgZ2V0VmFsdWVzIHBlbmRpbmcgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBh
bnkgY2hhbmdlcyB1bnRpbCB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgRGlkQ2xlYXIvRGlkR2V0
VmFsdWVzIG1lc3NhZ2VzLgotICAgIGlmIChtX2hhc1BlbmRpbmdDbGVhciB8fCBtX2hhc1BlbmRp
bmdHZXRWYWx1ZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgha2V5KSB7Ci0gICAgICAg
IC8vIEEgbnVsbCBrZXkgbWVhbnMgY2xlYXIuCi0gICAgICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9
IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0KLSAgICAgICAgLy8gQW55IGNo
YW5nZXMgdGhhdCB3ZXJlIG1hZGUgbG9jYWxseSBhZnRlciB0aGUgY2xlYXIgbXVzdCBzdGlsbCBi
ZSBrZXB0IGFyb3VuZCBpbiB0aGUgbmV3IG1hcC4KLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbV9w
ZW5kaW5nVmFsdWVDaGFuZ2VzLmJlZ2luKCkua2V5cygpLCBlbmQgPSBtX3BlbmRpbmdWYWx1ZUNo
YW5nZXMuZW5kKCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGNvbnN0
IFN0cmluZyYga2V5ID0gKml0OwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtX3N0b3Jh
Z2VNYXAtPmdldEl0ZW0oa2V5KTsKLSAgICAgICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAg
ICAgICAgICAvLyBUaGlzIGNoYW5nZSBtdXN0IGhhdmUgYmVlbiBhIHBlbmRpbmcgcmVtb3ZlLCBp
Z25vcmUgaXQuCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICAgICAgICAgIG5ld1N0b3JhZ2VNYXAtPnNl
dEl0ZW1JZ25vcmluZ1F1b3RhKGtleSwgb2xkVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAg
bV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGlmICghc2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoa2V5KSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKCFuZXdWYWx1ZSkgewotICAgICAgICAvLyBBIG51bGwgbmV3IHZh
bHVlIG1lYW5zIHRoYXQgdGhlIGl0ZW0gc2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgICAgIFN0cmlu
ZyBvbGRWYWx1ZTsKLSAgICAgICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFs
dWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVt
SWdub3JpbmdRdW90YShrZXksIG5ld1ZhbHVlKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6
ZGlzcGF0Y2hTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3Qg
U3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFs
dWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIGlmICghc291cmNlU3RvcmFnZUFy
ZWFJRCkgewotICAgICAgICAvLyBUaGlzIHN0b3JhZ2UgZXZlbnQgb3JpZ2luYXRlcyBmcm9tIGFu
b3RoZXIgcHJvY2VzcyBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBjaGFuZ2UgdG8gb3VyIHN0b3Jh
Z2UgYXJlYSBtYXAuCi0gICAgICAgIGFwcGx5Q2hhbmdlKGtleSwgbmV3VmFsdWUpOwotICAgIH0K
LQotICAgIGlmIChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQotICAgICAg
ICBkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQoc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCBv
bGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgICBkaXNwYXRj
aExvY2FsU3RvcmFnZUV2ZW50KHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5l
d1ZhbHVlLCB1cmxTdHJpbmcpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhckNhY2hl
KCkKLXsKLSAgICByZXNldFZhbHVlcygpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaXNw
YXRjaFNlc3Npb25TdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3
VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIEFTU0VSVChzdG9yYWdlVHlw
ZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKTsKLQotICAgIC8vIE5hbWVzcGFjZSBJRHMgZm9y
IHNlc3Npb24gc3RvcmFnZSBuYW1lc3BhY2VzIGFyZSBlcXVpdmFsZW50IHRvIHdlYiBwYWdlIElE
cwotICAgIC8vIHNvIHdlIGNhbiBnZXQgdGhlIHJpZ2h0IHBhZ2UgaGVyZS4KLSAgICBXZWJQYWdl
KiB3ZWJQYWdlID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2ViUGFnZShtX3N0b3JhZ2VOYW1l
c3BhY2VJRCk7Ci0gICAgaWYgKCF3ZWJQYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0
b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVzOwotCi0gICAgUGFnZSogcGFnZSA9IHdlYlBhZ2UtPmNv
cmVQYWdlKCk7Ci0gICAgZm9yIChGcmFtZSogZnJhbWUgPSAmcGFnZS0+bWFpbkZyYW1lKCk7IGZy
YW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCkudHJhdmVyc2VOZXh0KCkpIHsKLSAgICAgICAgRG9j
dW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jdW1l
bnQtPnNlY3VyaXR5T3JpZ2luKCkuZXF1YWwobV9zZWN1cml0eU9yaWdpbi5wdHIoKSkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQt
PmRvbVdpbmRvdygpLT5vcHRpb25hbFNlc3Npb25TdG9yYWdlKCk7Ci0gICAgICAgIGlmICghc3Rv
cmFnZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFN0b3JhZ2VBcmVhSW1wbCYg
c3RvcmFnZUFyZWEgPSBzdGF0aWNfY2FzdDxTdG9yYWdlQXJlYUltcGwmPihzdG9yYWdlLT5hcmVh
KCkpOwotICAgICAgICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFnZUFyZWFJRCgpID09IHNvdXJjZVN0
b3JhZ2VBcmVhSUQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJlYSB0
aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KLSAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJhbWVzLmFwcGVuZChmcmFtZSk7Ci0gICAgfQot
Ci0gICAgU3RvcmFnZUV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50
c1RvRnJhbWVzKCpwYWdlLCBmcmFtZXMsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJp
bmcsIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmln
aW4pKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVu
dCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3Qg
U3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1
cmxTdHJpbmcpCi17Ci0gICAgQVNTRVJUKGlzTG9jYWxTdG9yYWdlKHN0b3JhZ2VUeXBlKCkpKTsK
LQotICAgIFZlY3RvcjxSZWZQdHI8RnJhbWU+PiBmcmFtZXM7Ci0KLSAgICBQYWdlR3JvdXAmIHBh
Z2VHcm91cCA9ICpXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53ZWJQYWdlR3JvdXAobV9zdG9yYWdl
TmFtZXNwYWNlSUQpLT5jb3JlUGFnZUdyb3VwKCk7Ci0gICAgY29uc3QgSGFzaFNldDxQYWdlKj4m
IHBhZ2VzID0gcGFnZUdyb3VwLnBhZ2VzKCk7Ci0gICAgZm9yIChIYXNoU2V0PFBhZ2UqPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBwYWdlcy5iZWdpbigpLCBlbmQgPSBwYWdlcy5lbmQoKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIGZvciAoRnJhbWUqIGZyYW1lID0gJigqaXQpLT5tYWluRnJh
bWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS50cmF2ZXJzZU5leHQoKSkgewotICAg
ICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7Ci0gICAgICAg
ICAgICBpZiAoIWRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpLmVxdWFsKG1fc2VjdXJpdHlPcmln
aW4ucHRyKCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTdG9y
YWdlKiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5vcHRpb25hbExvY2FsU3RvcmFn
ZSgpOwotICAgICAgICAgICAgaWYgKCFzdG9yYWdlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotCi0gICAgICAgICAgICBTdG9yYWdlQXJlYUltcGwmIHN0b3JhZ2VBcmVhID0gc3RhdGljX2Nh
c3Q8U3RvcmFnZUFyZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgpKTsKLSAgICAgICAgICAgIGlmIChz
dG9yYWdlQXJlYS5zdG9yYWdlQXJlYUlEKCkgPT0gc291cmNlU3RvcmFnZUFyZWFJRCkgewotICAg
ICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUg
ZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWVzLmFwcGVuZChmcmFtZSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBTdG9yYWdlRXZlbnREaXNwYXRjaGVyOjpkaXNwYXRjaExvY2FsU3RvcmFn
ZUV2ZW50c1RvRnJhbWVzKHBhZ2VHcm91cCwgZnJhbWVzLCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1
ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3Nl
Y3VyaXR5T3JpZ2luKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuaCBiL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTQzZTgwNzdmMGRlNDU4YjEwNjk3ZDk5NmYxY2U2NmFiNzFj
YzguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuaAorKysgL2Rldi9udWxs
CkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBTdG9yYWdlQXJlYU1hcF9o
Ci0jZGVmaW5lIFN0b3JhZ2VBcmVhTWFwX2gKLQotI2luY2x1ZGUgIk1lc3NhZ2VSZWNlaXZlci5o
IgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3Jl
L1N0b3JhZ2VBcmVhLmg+Ci0jaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYv
SGFzaENvdW50ZWRTZXQuaD4KLSNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgotI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJpdHlPcmln
aW47Ci1jbGFzcyBTdG9yYWdlTWFwOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3Mg
U3RvcmFnZUFyZWFJbXBsOwotY2xhc3MgU3RvcmFnZU5hbWVzcGFjZUltcGw7Ci0KLWNsYXNzIFN0
b3JhZ2VBcmVhTWFwIDogcHVibGljIFJlZkNvdW50ZWQ8U3RvcmFnZUFyZWFNYXA+LCBwcml2YXRl
IElQQzo6TWVzc2FnZVJlY2VpdmVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFN0b3JhZ2VB
cmVhTWFwPiBjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwqLCBSZWY8V2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW4+JiYpOwotICAgIH5TdG9yYWdlQXJlYU1hcCgpOwotCi0gICAgV2ViQ29yZTo6U3Rv
cmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VUeXBlOyB9Ci0K
LSAgICB1bnNpZ25lZCBsZW5ndGgoKTsKLSAgICBTdHJpbmcga2V5KHVuc2lnbmVkIGluZGV4KTsK
LSAgICBTdHJpbmcgaXRlbShjb25zdCBTdHJpbmcmIGtleSk7Ci0gICAgdm9pZCBzZXRJdGVtKFdl
YkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBj
b25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRp
b24pOwotICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0
b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXkpOwotICAgIHZvaWQg
Y2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJj
ZUFyZWEpOwotICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpOwotCi0gICAgY29u
c3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHNlY3VyaXR5T3JpZ2luKCkgY29uc3QgeyByZXR1
cm4gbV9zZWN1cml0eU9yaWdpbi5nZXQoKTsgfQotCi1wcml2YXRlOgotICAgIFN0b3JhZ2VBcmVh
TWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiwgUmVmPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiYm
KTsKLQotICAgIC8vIElQQzo6TWVzc2FnZVJlY2VpdmVyCi0gICAgdm9pZCBkaWRSZWNlaXZlTWVz
c2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImKSBvdmVycmlkZTsKLQotICAgIHZv
aWQgZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKTsKLSAgICB2b2lkIGRpZFNl
dEl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBib29sIHF1
b3RhRXJyb3IpOwotICAgIHZvaWQgZGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCwgY29uc3QgU3RyaW5nJiBrZXkpOwotICAgIHZvaWQgZGlkQ2xlYXIodWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQpOwotCi0gICAgdm9pZCBkaXNwYXRjaFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3Vy
Y2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1
ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotICAg
IHZvaWQgY2xlYXJDYWNoZSgpOwotCi0gICAgdm9pZCByZXNldFZhbHVlcygpOwotICAgIHZvaWQg
bG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0KLSAgICBib29sIHNob3VsZEFwcGx5Q2hhbmdlRm9yS2V5
KGNvbnN0IFN0cmluZyYga2V5KSBjb25zdDsKLSAgICB2b2lkIGFwcGx5Q2hhbmdlKGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKTsKLQotICAgIHZvaWQgZGlzcGF0Y2hT
ZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVl
LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0gICAgdm9pZCBkaXNwYXRjaExvY2FsU3RvcmFn
ZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBj
b25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJp
bmcmIHVybFN0cmluZyk7Ci0KLSAgICBSZWY8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG1fc3RvcmFn
ZU5hbWVzcGFjZTsKLQotICAgIHVpbnQ2NF90IG1fc3RvcmFnZU1hcElEOwotCi0gICAgV2ViQ29y
ZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdlVHlwZTsKLSAgICB1aW50NjRfdCBtX3N0b3JhZ2VOYW1l
c3BhY2VJRDsKLSAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKLSAgICBSZWY8V2ViQ29yZTo6
U2VjdXJpdHlPcmlnaW4+IG1fc2VjdXJpdHlPcmlnaW47Ci0KLSAgICBSZWZQdHI8V2ViQ29yZTo6
U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwotCi0gICAgdWludDY0X3QgbV9jdXJyZW50U2VlZDsK
LSAgICBib29sIG1faGFzUGVuZGluZ0NsZWFyOwotICAgIGJvb2wgbV9oYXNQZW5kaW5nR2V0VmFs
dWVzOwotICAgIEhhc2hDb3VudGVkU2V0PFN0cmluZz4gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzOwot
fTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAvLyBTdG9yYWdlQXJlYU1hcF9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJl
YU1hcC5tZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VBcmVhTWFwLm1lc3NhZ2VzLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU5
MDRmMTZiZWMxNDJiMTBiNDgwMGQxMDY0NTAwOTMzODMwMGQ1Li4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAs
MCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAot
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0jIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0j
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSMgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIyBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUgotIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotIyBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1tZXNzYWdlcyAt
PiBTdG9yYWdlQXJlYU1hcCB7Ci0gICAgRGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBT
ZWVkKQotICAgIERpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXks
IGJvb2wgcXVvdGFFeGNlcHRpb24pCi0gICAgRGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCwgU3RyaW5nIGtleSkKLSAgICBEaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCkKLQotICAgIERpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVh
SUQsIFN0cmluZyBrZXksIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlLCBTdHJpbmcg
dXJsU3RyaW5nKQotICAgIENsZWFyQ2FjaGUoKQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWJiYzVjMjFjMTgxMDg4ZmY1ODYwNDVmMDI3MTllMDI0
MjY4NzI1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcAor
KysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEz
LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU3RvcmFnZU5hbWVzcGFjZUltcGwuaCIKLQotI2luY2x1
ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCi0jaW5j
bHVkZSAiV2ViUGFnZS5oIgotI2luY2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCi0jaW5jbHVk
ZSAiV2ViUHJvY2Vzcy5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1BhZ2VHcm91cC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4K
LSNpbmNsdWRlIDxXZWJDb3JlL1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdl
VHlwZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7
Ci0KLVJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNy
ZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVk
IHF1b3RhSW5CeXRlcykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsKFN0b3JhZ2VUeXBlOjpTZXNzaW9uLCBpZGVudGlmaWVyLCBudWxscHRyLCBxdW90YUlu
Qnl0ZXMpKTsKLX0KLQotUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFtZXNw
YWNlSW1wbDo6Y3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlk
ZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCwgaWRl
bnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdlTmFt
ZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVz
cGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi17Ci0gICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6TG9j
YWwsIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5CeXRlcykpOwotfQotCi1SZWZQdHI8U3Rv
cmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVUcmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpCi17Ci0gICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6VHJh
bnNpZW50TG9jYWwsIGlkZW50aWZpZXIsICZ0b3BMZXZlbE9yaWdpbiwgcXVvdGFJbkJ5dGVzKSk7
Ci19Ci0KLVN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpTdG9yYWdlTmFtZXNwYWNlSW1wbChXZWJDb3Jl
OjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5C
eXRlcykKLSAgICA6IG1fc3RvcmFnZVR5cGUoc3RvcmFnZVR5cGUpCi0gICAgLCBtX3N0b3JhZ2VO
YW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCi0gICAgLCBtX3RvcExldmVsT3JpZ2luKHRv
cExldmVsT3JpZ2luKQotICAgICwgbV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQotewotfQot
Ci1TdG9yYWdlTmFtZXNwYWNlSW1wbDo6flN0b3JhZ2VOYW1lc3BhY2VJbXBsKCkKLXsKLX0KLQot
dm9pZCBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKFN0b3Jh
Z2VBcmVhTWFwJiBtYXApCi17Ci0gICAgbV9zdG9yYWdlQXJlYU1hcHMucmVtb3ZlKFNlY3VyaXR5
T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1hcC5zZWN1cml0eU9yaWdpbigpKSk7Ci19
Ci0KLVJlZlB0cjxTdG9yYWdlQXJlYT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OnN0b3JhZ2VBcmVh
KGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgaWYgKG1f
c3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsKQotICAgICAgICByZXR1
cm4gZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShzZWN1cml0eU9yaWdpbik7Ci0KLSAgICBSZWZQ
dHI8U3RvcmFnZUFyZWFNYXA+IG1hcDsKLQotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVh
TWFwcy5hZGQoc2VjdXJpdHlPcmlnaW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBp
ZiAoIXNsb3QpIHsKLSAgICAgICAgbWFwID0gU3RvcmFnZUFyZWFNYXA6OmNyZWF0ZSh0aGlzLCBz
ZWN1cml0eU9yaWdpbi5zZWN1cml0eU9yaWdpbigpKTsKLSAgICAgICAgc2xvdCA9IG1hcC5nZXQo
KTsKLSAgICB9IGVsc2UKLSAgICAgICAgbWFwID0gc2xvdDsKLQotICAgIHJldHVybiBTdG9yYWdl
QXJlYUltcGw6OmNyZWF0ZShtYXAucmVsZWFzZU5vbk51bGwoKSk7Ci19Ci0KLWNsYXNzIFN0b3Jh
Z2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYSBmaW5hbCA6IHB1YmxpYyBTdG9y
YWdlQXJlYSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4g
Y3JlYXRlKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgb3JpZ2luLCB1bnNpZ25lZCBxdW90YUlu
Qnl0ZXMpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9y
YWdlQXJlYShvcmlnaW4sIHF1b3RhSW5CeXRlcykpOwotICAgIH0KLQotICAgIFJlZjxFcGhlbWVy
YWxTdG9yYWdlQXJlYT4gY29weSgpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5l
dyBFcGhlbWVyYWxTdG9yYWdlQXJlYSgqdGhpcykpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBF
cGhlbWVyYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIG9yaWdpbiwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKQotICAgICAgICA6IG1fc2VjdXJpdHlPcmlnaW5EYXRhKG9yaWdp
bikKLSAgICAgICAgLCBtX3N0b3JhZ2VNYXAoU3RvcmFnZU1hcDo6Y3JlYXRlKHF1b3RhSW5CeXRl
cykpCi0gICAgewotICAgIH0KLQotICAgIEVwaGVtZXJhbFN0b3JhZ2VBcmVhKEVwaGVtZXJhbFN0
b3JhZ2VBcmVhJiBvdGhlcikKLSAgICAgICAgOiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvdGhlci5t
X3NlY3VyaXR5T3JpZ2luRGF0YSkKLSAgICAgICAgLCBtX3N0b3JhZ2VNYXAob3RoZXIubV9zdG9y
YWdlTWFwKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBXZWJDb3JlOjpTdG9yYWdlQXJlYS4KLSAg
ICB1bnNpZ25lZCBsZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+
bGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGtleSh1bnNpZ25lZCBpbmRleCkKLSAgICB7
Ci0gICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRleCk7Ci0gICAgfQotCi0gICAg
U3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gbV9z
dG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRJdGVtKEZyYW1l
KiwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhj
ZXB0aW9uKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG9sZFZhbHVlOwotICAgICAgICBpZiAoYXV0
byBuZXdNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1
b3RhRXhjZXB0aW9uKSkKLSAgICAgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3TWFw
KTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZUl0ZW0oRnJhbWUqLCBjb25zdCBTdHJpbmcmIGtl
eSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICAgICAgaWYgKGF1dG8gbmV3
TWFwID0gbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpKQotICAgICAgICAg
ICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdNYXApOwotICAgIH0KLQotICAgIHZvaWQgY2xl
YXIoRnJhbWUqKQotICAgIHsKLSAgICAgICAgaWYgKCFtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpKQot
ICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6
OmNyZWF0ZShtX3N0b3JhZ2VNYXAtPnF1b3RhKCkpOwotICAgIH0KLQotICAgIGJvb2wgY29udGFp
bnMoY29uc3QgU3RyaW5nJiBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFw
LT5jb250YWlucyhrZXkpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFnZShGcmFt
ZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2UoKTsK
LSAgICB9Ci0KLSAgICBTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSgpIGNvbnN0Ci0gICAgewotICAg
ICAgICByZXR1cm4gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsOwotICAgIH0KLQotICAgIHNp
emVfdCBtZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQoKSB7IH0KLSAgICB2b2lkIGRl
Y3JlbWVudEFjY2Vzc0NvdW50KCkgeyB9Ci0gICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkg
eyB9Ci0KLSAgICBTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW4oKSBjb25zdAotICAg
IHsKLSAgICAgICAgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW5EYXRhOwotICAgIH0KLQotICAgIFNl
Y3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luRGF0YTsKLSAgICBSZWZQdHI8U3RvcmFn
ZU1hcD4gbV9zdG9yYWdlTWFwOwotfTsKLQotUmVmUHRyPFN0b3JhZ2VBcmVhPiBTdG9yYWdlTmFt
ZXNwYWNlSW1wbDo6ZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdp
bkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIGF1dG8mIHNsb3QgPSBtX2VwaGVtZXJhbExv
Y2FsU3RvcmFnZUFyZWFzLmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZh
bHVlOwotICAgIGlmICghc2xvdCkKLSAgICAgICAgc2xvdCA9IFN0b3JhZ2VOYW1lc3BhY2VJbXBs
OjpFcGhlbWVyYWxTdG9yYWdlQXJlYTo6Y3JlYXRlKHNlY3VyaXR5T3JpZ2luLCBtX3F1b3RhSW5C
eXRlcyk7Ci0KLSAgICByZXR1cm4gc2xvdC5nZXQoKTsKLX0KLQotUmVmUHRyPFN0b3JhZ2VOYW1l
c3BhY2U+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjb3B5KFBhZ2UqIG5ld1BhZ2UpCi17Ci0gICAg
QVNTRVJUKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKLQotICAgIGlmIChtX3N0b3JhZ2VUeXBlID09
IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQotICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKG5ld1BhZ2UpLT5wYWdlSUQoKSwgbV9x
dW90YUluQnl0ZXMpOwotCi0gICAgQVNTRVJUKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6
OkVwaGVtZXJhbExvY2FsKTsKLSAgICBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG5ld05h
bWVzcGFjZSA9IGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChtX3N0b3JhZ2VUeXBl
LCBtX3N0b3JhZ2VOYW1lc3BhY2VJRCwgbV90b3BMZXZlbE9yaWdpbi5nZXQoKSwgbV9xdW90YUlu
Qnl0ZXMpKTsKLQotICAgIGZvciAoYXV0byYgaXRlciA6IG1fZXBoZW1lcmFsTG9jYWxTdG9yYWdl
QXJlYXMpCi0gICAgICAgIG5ld05hbWVzcGFjZS0+bV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVh
cy5zZXQoaXRlci5rZXksIGl0ZXIudmFsdWUtPmNvcHkoKSk7Ci0KLSAgICByZXR1cm4gbmV3TmFt
ZXNwYWNlOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmggYi9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNhMjJkY2JkMjFiNjc0MGU0NTIzN2Y0ZGZhZDgzMTI1
NjcyOWUzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzLTIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9u
Y2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8
V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhhc2guaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VB
cmVhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9TdG9yYWdlTmFtZXNwYWNlLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KLQotbmFtZXNw
YWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwOwotY2xhc3MgV2ViUGFnZTsKLQot
Y2xhc3MgU3RvcmFnZU5hbWVzcGFjZUltcGwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5hbWVz
cGFjZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4g
Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWdu
ZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBs
PiBjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmll
ciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1l
c3BhY2VJbXBsPiBjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmll
ciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1l
c3BhY2VJbXBsPiBjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
aWRlbnRpZmllciwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50
NjRfdCBxdW90YUluQnl0ZXMpOwotCi0gICAgdmlydHVhbCB+U3RvcmFnZU5hbWVzcGFjZUltcGwo
KTsKLQotICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3QgeyByZXR1
cm4gbV9zdG9yYWdlVHlwZTsgfQotICAgIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCgpIGNv
bnN0IHsgcmV0dXJuIG1fc3RvcmFnZU5hbWVzcGFjZUlEOyB9Ci0gICAgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW4qIHRvcExldmVsT3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV90b3BMZXZlbE9yaWdp
bi5nZXQoKTsgfQotICAgIHVuc2lnbmVkIHF1b3RhSW5CeXRlcygpIGNvbnN0IHsgcmV0dXJuIG1f
cXVvdGFJbkJ5dGVzOyB9Ci0KLSAgICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYU1hcChTdG9y
YWdlQXJlYU1hcCYpOwotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsKFdlYkNvcmU6OlN0b3JhZ2VUeXBlLCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5
dGVzKTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlQXJlYT4gc3RvcmFnZUFyZWEoY29u
c3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJikgb3ZlcnJpZGU7Ci0gICAgUmVmUHRyPFdl
YkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNvcHkoV2ViQ29yZTo6UGFnZSopIG92ZXJyaWRlOwot
Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VBcmVhPiBlcGhlbWVyYWxMb2NhbFN0b3JhZ2VB
cmVhKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOwotCi0gICAgY29uc3QgV2Vi
Q29yZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdlVHlwZTsKLSAgICBjb25zdCB1aW50NjRfdCBtX3N0
b3JhZ2VOYW1lc3BhY2VJRDsKLQotICAgIC8vIE9ubHkgdXNlZCBmb3IgdHJhbnNpZW50IGxvY2Fs
IHN0b3JhZ2UgbmFtZXNwYWNlcy4KLSAgICBjb25zdCBSZWZQdHI8V2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW4+IG1fdG9wTGV2ZWxPcmlnaW47Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5C
eXRlczsKLQotICAgIEhhc2hNYXA8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdl
QXJlYU1hcCo+IG1fc3RvcmFnZUFyZWFNYXBzOwotCi0gICAgY2xhc3MgRXBoZW1lcmFsU3RvcmFn
ZUFyZWE7Ci0gICAgSGFzaE1hcDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEsIFJlZlB0cjxF
cGhlbWVyYWxTdG9yYWdlQXJlYT4+IG1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXM7Ci19Owot
Ci19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAgYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc1OGViODc0Mjg4ZmZkODk2NjJkMDI1ZTE1
OGQ2NmEwNzBjNTcwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE0LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiV2ViU3RvcmFnZU5hbWVzcGFjZVBy
b3ZpZGVyLmgiCi0KLSNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIgotI2luY2x1ZGUg
IldlYlBhZ2UuaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9OZXZl
ckRlc3Ryb3llZC5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdl
YktpdCB7Ci0KLXN0YXRpYyBIYXNoTWFwPHVpbnQ2NF90LCBXZWJTdG9yYWdlTmFtZXNwYWNlUHJv
dmlkZXIqPiYgc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpCi17Ci0gICAgc3RhdGljIE5ldmVy
RGVzdHJveWVkPEhhc2hNYXA8dWludDY0X3QsIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcio+
PiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzOwotCi0gICAgcmV0dXJuIHN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlcnM7Ci19Ci0KLVJlZlB0cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI+IFdl
YlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Z2V0T3JDcmVhdGUodWludDY0X3QgaWRlbnRpZmll
cikKLXsKLSAgICBhdXRvJiBzbG90ID0gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpLmFkZChp
ZGVudGlmaWVyLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgaWYgKHNsb3QpCi0gICAg
ICAgIHJldHVybiBzbG90OwotCi0gICAgUmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRl
cj4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyID0gYWRvcHRSZWYobmV3IFdlYlN0b3JhZ2VOYW1l
c3BhY2VQcm92aWRlcihpZGVudGlmaWVyKSk7Ci0gICAgc2xvdCA9IHN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlci5nZXQoKTsKLQotICAgIHJldHVybiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI7Ci19
Ci0KLVdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6V2ViU3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIpCi0gICAgOiBtX2lkZW50aWZpZXIoaWRlbnRpZmllcikK
LXsKLX0KLQotV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjp+V2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyKCkKLXsKLSAgICBBU1NFUlQoc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpLmNv
bnRhaW5zKG1faWRlbnRpZmllcikpOwotCi0gICAgc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygp
LnJlbW92ZShtX2lkZW50aWZpZXIpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVz
cGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBxdW90YSkKLXsKLSAgICByZXR1cm4gU3RvcmFn
ZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYlBhZ2U6OmZy
b21Db3JlUGFnZSgmcGFnZSktPnBhZ2VJRCgpLCBxdW90YSk7Ci19Ci0KLVJlZlB0cjxXZWJDb3Jl
OjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNyZWF0ZUVw
aGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBxdW90YSkK
LXsKLSAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUVwaGVtZXJhbExvY2Fs
U3RvcmFnZU5hbWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2UoJnBhZ2UpLT5wYWdlSUQoKSwg
cXVvdGEpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQg
cXVvdGEpCi17Ci0gICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UobV9pZGVudGlmaWVyLCBxdW90YSk7Ci19Ci0KLVJlZlB0cjxXZWJDb3Jl
OjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNyZWF0ZVRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiYgdG9w
TGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhKQotewotICAgIHJldHVybiBTdG9yYWdlTmFtZXNw
YWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKG1faWRlbnRpZmll
ciwgdG9wTGV2ZWxPcmlnaW4sIHF1b3RhKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmggYi9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjMjE0MjRiZjI2ZTM0MTAxMDg4
YmMwMjgyYjQzMTIyNmE2NDlhNi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g
KgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgotICovCi0KLSNpZm5kZWYgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKLSNkZWZpbmUg
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKLQotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyLmg+Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBXZWJT
dG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIgZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmUHRyPFdlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcj4gZ2V0T3JDcmVhdGUodWludDY0X3QgaWRlbnRpZmllcik7Ci0gICAg
dmlydHVhbCB+V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAg
ZXhwbGljaXQgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIp
OwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZVNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6OlBhZ2UmLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7
Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZUVwaGVtZXJhbExv
Y2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdlJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJy
aWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJD
b3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7Ci0K
LSAgICBjb25zdCB1aW50NjRfdCBtX2lkZW50aWZpZXI7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBX
ZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYmU4
NTA3YTMxMzI2NDJkYmRjMGYxOGE2OTlkMWU3Y2YzYmE0ODYxZAotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAK
QEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgiCisKKyNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcC5oIgor
I2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lLmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TY2hlbWVSZWdp
c3RyeS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9TZXR0aW5ncy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFt
ZXNwYWNlIFdlYktpdCB7CisKK3N0YXRpYyB1aW50NjRfdCBnZW5lcmF0ZVN0b3JhZ2VBcmVhSUQo
KQoreworICAgIHN0YXRpYyB1aW50NjRfdCBzdG9yYWdlQXJlYUlEOworICAgIHJldHVybiArK3N0
b3JhZ2VBcmVhSUQ7Cit9CisKK1JlZjxTdG9yYWdlQXJlYUltcGw+IFN0b3JhZ2VBcmVhSW1wbDo6
Y3JlYXRlKFJlZjxTdG9yYWdlQXJlYU1hcD4mJiBzdG9yYWdlQXJlYU1hcCkKK3sKKyAgICByZXR1
cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYUltcGwoV1RGTW92ZShzdG9yYWdlQXJlYU1hcCkp
KTsKK30KKworU3RvcmFnZUFyZWFJbXBsOjpTdG9yYWdlQXJlYUltcGwoUmVmPFN0b3JhZ2VBcmVh
TWFwPiYmIHN0b3JhZ2VBcmVhTWFwKQorICAgIDogbV9zdG9yYWdlQXJlYUlEKGdlbmVyYXRlU3Rv
cmFnZUFyZWFJRCgpKQorICAgICwgbV9zdG9yYWdlQXJlYU1hcChXVEZNb3ZlKHN0b3JhZ2VBcmVh
TWFwKSkKK3sKK30KKworU3RvcmFnZUFyZWFJbXBsOjp+U3RvcmFnZUFyZWFJbXBsKCkKK3sKK30K
KwordW5zaWduZWQgU3RvcmFnZUFyZWFJbXBsOjpsZW5ndGgoKQoreworICAgIHJldHVybiBtX3N0
b3JhZ2VBcmVhTWFwLT5sZW5ndGgoKTsKK30KKworU3RyaW5nIFN0b3JhZ2VBcmVhSW1wbDo6a2V5
KHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5rZXkoaW5k
ZXgpOworfQorCitTdHJpbmcgU3RvcmFnZUFyZWFJbXBsOjppdGVtKGNvbnN0IFN0cmluZyYga2V5
KQoreworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5pdGVtKGtleSk7Cit9CisKK3ZvaWQg
U3RvcmFnZUFyZWFJbXBsOjpzZXRJdGVtKEZyYW1lKiBzb3VyY2VGcmFtZSwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQoreworICAg
IEFTU0VSVCghdmFsdWUuaXNOdWxsKCkpOworCisgICAgbV9zdG9yYWdlQXJlYU1hcC0+c2V0SXRl
bShzb3VyY2VGcmFtZSwgdGhpcywga2V5LCB2YWx1ZSwgcXVvdGFFeGNlcHRpb24pOworfQorCit2
b2lkIFN0b3JhZ2VBcmVhSW1wbDo6cmVtb3ZlSXRlbShGcmFtZSogc291cmNlRnJhbWUsIGNvbnN0
IFN0cmluZyYga2V5KQoreworICAgIG1fc3RvcmFnZUFyZWFNYXAtPnJlbW92ZUl0ZW0oc291cmNl
RnJhbWUsIHRoaXMsIGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFJbXBsOjpjbGVhcihGcmFt
ZSogc291cmNlRnJhbWUpCit7CisgICAgbV9zdG9yYWdlQXJlYU1hcC0+Y2xlYXIoc291cmNlRnJh
bWUsIHRoaXMpOworfQorCitib29sIFN0b3JhZ2VBcmVhSW1wbDo6Y29udGFpbnMoY29uc3QgU3Ry
aW5nJiBrZXkpCit7CisgICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAtPmNvbnRhaW5zKGtleSk7
Cit9CisKK2Jvb2wgU3RvcmFnZUFyZWFJbXBsOjpjYW5BY2Nlc3NTdG9yYWdlKEZyYW1lKiBmcmFt
ZSkKK3sKKyAgICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2UoKTsKK30KKworU3RvcmFnZVR5
cGUgU3RvcmFnZUFyZWFJbXBsOjpzdG9yYWdlVHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
c3RvcmFnZUFyZWFNYXAtPnN0b3JhZ2VUeXBlKCk7Cit9CisKK3NpemVfdCBTdG9yYWdlQXJlYUlt
cGw6Om1lbW9yeUJ5dGVzVXNlZEJ5Q2FjaGUoKQoreworICAgIHJldHVybiAwOworfQorCit2b2lk
IFN0b3JhZ2VBcmVhSW1wbDo6aW5jcmVtZW50QWNjZXNzQ291bnQoKQoreworICAgIC8vIFN0b3Jh
Z2UgYWNjZXNzIGlzIGhhbmRsZWQgaW4gdGhlIFVJIHByb2Nlc3MsIHNvIHRoZXJlJ3Mgbm90aGlu
ZyB0byBkbyBoZXJlLgorfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6ZGVjcmVtZW50QWNjZXNz
Q291bnQoKQoreworICAgIC8vIFN0b3JhZ2UgYWNjZXNzIGlzIGhhbmRsZWQgaW4gdGhlIFVJIHBy
b2Nlc3MsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlLgorfQorCit2b2lkIFN0b3JhZ2VB
cmVhSW1wbDo6Y2xvc2VEYXRhYmFzZUlmSWRsZSgpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVu
dCB0aGlzLgorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCitXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGEgU3RvcmFnZUFyZWFJbXBsOjpzZWN1cml0eU9yaWdpbigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2lu
KG1fc3RvcmFnZUFyZWFNYXAtPnNlY3VyaXR5T3JpZ2luKCkpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdl
L1N0b3JhZ2VBcmVhSW1wbC5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2Uv
U3RvcmFnZUFyZWFJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGRhNDdjOGQ4MzhlOGZiZGM1ZDQ3YmY3OGNm
NzZlMTlhMDE5OGIzMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIFN0b3JhZ2VBcmVhSW1wbF9oCisjZGVmaW5lIFN0b3JhZ2VBcmVhSW1wbF9o
CisKKyNpbmNsdWRlICJNZXNzYWdlUmVjZWl2ZXIuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3Jh
Z2VBcmVhLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hDb3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgU2VjdXJpdHlPcmlnaW47
Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBTdG9yYWdlQXJlYU1hcDsKKworY2xh
c3MgU3RvcmFnZUFyZWFJbXBsIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VBcmVhIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhSW1wbD4gY3JlYXRlKFJlZjxTdG9y
YWdlQXJlYU1hcD4mJik7CisgICAgdmlydHVhbCB+U3RvcmFnZUFyZWFJbXBsKCk7CisKKyAgICB1
aW50NjRfdCBzdG9yYWdlQXJlYUlEKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlQXJlYUlEOyB9
CisKK3ByaXZhdGU6CisgICAgU3RvcmFnZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJik7
CisKKyAgICAvLyBXZWJDb3JlOjpTdG9yYWdlQXJlYS4KKyAgICB1bnNpZ25lZCBsZW5ndGgoKSBv
dmVycmlkZTsKKyAgICBTdHJpbmcga2V5KHVuc2lnbmVkIGluZGV4KSBvdmVycmlkZTsKKyAgICBT
dHJpbmcgaXRlbShjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRJdGVt
KFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0
cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKSBvdmVycmlkZTsKKyAgICB2b2lkIHJl
bW92ZUl0ZW0oV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkg
b3ZlcnJpZGU7CisgICAgdm9pZCBjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUpIG92
ZXJyaWRlOworICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOwor
ICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFnZShXZWJDb3JlOjpGcmFtZSopIG92ZXJyaWRlOworICAg
IFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAg
c2l6ZV90IG1lbW9yeUJ5dGVzVXNlZEJ5Q2FjaGUoKSBvdmVycmlkZTsKKyAgICB2b2lkIGluY3Jl
bWVudEFjY2Vzc0NvdW50KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWNyZW1lbnRBY2Nlc3NDb3Vu
dCgpIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2VEYXRhYmFzZUlmSWRsZSgpIG92ZXJyaWRlOwor
ICAgIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBzZWN1cml0eU9yaWdpbigpIGNvbnN0IG92
ZXJyaWRlOworCisgICAgdWludDY0X3QgbV9zdG9yYWdlQXJlYUlEOworICAgIFJlZjxTdG9yYWdl
QXJlYU1hcD4gbV9zdG9yYWdlQXJlYU1hcDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAor
CisjZW5kaWYgLy8gU3RvcmFnZUFyZWFJbXBsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMjY1
MGQxYjNlYmZjNzI4YzI3NWVlMDEwYmZlYTNhMjY4YjBiODg2Ci0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCkBA
IC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCisKKyNpbmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKKyNp
bmNsdWRlICJTdG9yYWdlQXJlYU1hcE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAiU3RvcmFnZU1hbmFn
ZXJNZXNzYWdlcy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCisjaW5jbHVk
ZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCisjaW5jbHVkZSAi
V2ViUHJvY2Vzcy5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRE9NV2luZG93Lmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9Eb2N1bWVudC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvTWFpbkZyYW1lLmg+CisjaW5j
bHVkZSA8V2ViQ29yZS9QYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U3RvcmFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFn
ZVR5cGUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQg
eworCitzdGF0aWMgdWludDY0X3QgZ2VuZXJhdGVTdG9yYWdlTWFwSUQoKQoreworICAgIHN0YXRp
YyB1aW50NjRfdCBzdG9yYWdlTWFwSUQ7CisgICAgcmV0dXJuICsrc3RvcmFnZU1hcElEOworfQor
CitSZWY8U3RvcmFnZUFyZWFNYXA+IFN0b3JhZ2VBcmVhTWFwOjpjcmVhdGUoU3RvcmFnZU5hbWVz
cGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4m
JiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJl
YU1hcChzdG9yYWdlTmFtZXNwYWNlLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkpOworfQorCitT
dG9yYWdlQXJlYU1hcDo6U3RvcmFnZUFyZWFNYXAoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3Jh
Z2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdp
bikKKyAgICA6IG1fc3RvcmFnZU5hbWVzcGFjZSgqc3RvcmFnZU5hbWVzcGFjZSkKKyAgICAsIG1f
c3RvcmFnZU1hcElEKGdlbmVyYXRlU3RvcmFnZU1hcElEKCkpCisgICAgLCBtX3N0b3JhZ2VUeXBl
KHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VUeXBlKCkpCisgICAgLCBtX3N0b3JhZ2VOYW1lc3Bh
Y2VJRChzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSkKKyAgICAsIG1fcXVv
dGFJbkJ5dGVzKHN0b3JhZ2VOYW1lc3BhY2UtPnF1b3RhSW5CeXRlcygpKQorICAgICwgbV9zZWN1
cml0eU9yaWdpbihXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkKKyAgICAsIG1fY3VycmVudFNlZWQo
MCkKKyAgICAsIG1faGFzUGVuZGluZ0NsZWFyKGZhbHNlKQorICAgICwgbV9oYXNQZW5kaW5nR2V0
VmFsdWVzKGZhbHNlKQoreworICAgIHN3aXRjaCAobV9zdG9yYWdlVHlwZSkgeworICAgIGNhc2Ug
U3RvcmFnZVR5cGU6OkxvY2FsOgorICAgIGNhc2UgU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2Fs
OgorICAgICAgICBpZiAoU2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2luID0gc3RvcmFnZU5h
bWVzcGFjZS0+dG9wTGV2ZWxPcmlnaW4oKSkKKyAgICAgICAgICAgIFdlYlByb2Nlc3M6OnNpbmds
ZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VN
YW5hZ2VyOjpDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0
b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VOYW1lc3BhY2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6
OmZyb21TZWN1cml0eU9yaWdpbigqdG9wTGV2ZWxPcmlnaW4pLCBTZWN1cml0eU9yaWdpbkRhdGE6
OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSksIDApOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVj
dGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlTG9jYWxTdG9yYWdl
TWFwKG1fc3RvcmFnZU1hcElELCBzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQo
KSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdp
bikpLCAwKTsKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU3RvcmFnZVR5cGU6OlNlc3Np
b246CisgICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0
aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVTZXNzaW9uU3RvcmFn
ZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlE
KCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmln
aW4pKSwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTdG9yYWdlVHlwZTo6RXBoZW1l
cmFsTG9jYWw6CisgICAgICAgIC8vIFRoZSBVSSBwcm9jZXNzIGlzIG5vdCBpbnZvbHZlZCBmb3Ig
RXBoZW1lcmFsTG9jYWwgc3RvcmFnZXMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBX
ZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0b3Jh
Z2VBcmVhTWFwOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fc3RvcmFnZU1hcElELCAqdGhpcyk7
Cit9CisKK1N0b3JhZ2VBcmVhTWFwOjp+U3RvcmFnZUFyZWFNYXAoKQoreworICAgIGlmIChtX3N0
b3JhZ2VUeXBlICE9IFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCkgeworICAgICAgICBXZWJQ
cm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3Nh
Z2VzOjpTdG9yYWdlTWFuYWdlcjo6RGVzdHJveVN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQpLCAw
KTsKKyAgICAgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVy
KE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3Jh
Z2VNYXBJRCk7CisgICAgfQorCisgICAgbV9zdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3Rv
cmFnZUFyZWFNYXAoKnRoaXMpOworfQorCit1bnNpZ25lZCBTdG9yYWdlQXJlYU1hcDo6bGVuZ3Ro
KCkKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3JhZ2VN
YXAtPmxlbmd0aCgpOworfQorCitTdHJpbmcgU3RvcmFnZUFyZWFNYXA6OmtleSh1bnNpZ25lZCBp
bmRleCkKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3Jh
Z2VNYXAtPmtleShpbmRleCk7Cit9CisKK1N0cmluZyBTdG9yYWdlQXJlYU1hcDo6aXRlbShjb25z
dCBTdHJpbmcmIGtleSkKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIHJldHVy
biBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6
c2V0SXRlbShGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwg
Y29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0
aW9uKQoreworICAgIGxvYWRWYWx1ZXNJZk5lZWRlZCgpOworCisgICAgQVNTRVJUKG1fc3RvcmFn
ZU1hcC0+aGFzT25lUmVmKCkpOworCisgICAgU3RyaW5nIG9sZFZhbHVlOworICAgIHF1b3RhRXhj
ZXB0aW9uID0gZmFsc2U7CisgICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9s
ZFZhbHVlLCBxdW90YUV4Y2VwdGlvbik7CisgICAgaWYgKHF1b3RhRXhjZXB0aW9uKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAob2xkVmFsdWUgPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5hZGQoa2V5KTsKKworICAgIFdlYlByb2Nlc3M6
OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0
b3JhZ2VNYW5hZ2VyOjpTZXRJdGVtKG1fc3RvcmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdl
QXJlYUlEKCksIG1fY3VycmVudFNlZWQsIGtleSwgdmFsdWUsIHNvdXJjZUZyYW1lLT5kb2N1bWVu
dCgpLT51cmwoKSksIDApOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpyZW1vdmVJdGVtKFdl
YkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBj
b25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKyAgICBBU1NF
UlQobV9zdG9yYWdlTWFwLT5oYXNPbmVSZWYoKSk7CisKKyAgICBTdHJpbmcgb2xkVmFsdWU7Cisg
ICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOworCisgICAgaWYgKG9s
ZFZhbHVlLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3BlbmRpbmdWYWx1ZUNo
YW5nZXMuYWRkKGtleSk7CisKKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9j
ZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6UmVtb3ZlSXRl
bShtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRT
ZWVkLCBrZXksIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOworfQorCit2b2lk
IFN0b3JhZ2VBcmVhTWFwOjpjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3Jh
Z2VBcmVhSW1wbCogc291cmNlQXJlYSkKK3sKKyAgICByZXNldFZhbHVlcygpOworCisgICAgbV9o
YXNQZW5kaW5nQ2xlYXIgPSB0cnVlOworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNy
ZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50
UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkNsZWFy
KG1fc3RvcmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNl
ZWQsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOworfQorCitib29sIFN0b3Jh
Z2VBcmVhTWFwOjpjb250YWlucyhjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBsb2FkVmFsdWVz
SWZOZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmNvbnRhaW5zKGtleSk7Cit9
CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OnJlc2V0VmFsdWVzKCkKK3sKKyAgICBtX3N0b3JhZ2VN
YXAgPSBudWxscHRyOworCisgICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNsZWFyKCk7CisgICAg
bV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxzZTsKKyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBm
YWxzZTsKKyAgICBtX2N1cnJlbnRTZWVkKys7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6Omxv
YWRWYWx1ZXNJZk5lZWRlZCgpCit7CisgICAgaWYgKG1fc3RvcmFnZU1hcCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzOworICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCB1c2UgYSBzcGVjaWFsIHNlbmRTeW5jIGZsYWcgdG8gaW5kaWNhdGUgdGhh
dCB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgd2hpbGUgd2FpdGlu
ZyBmb3IgYSByZXBseS4KKyAgICAvLyAoVGhpcyBmbGFnIGRvZXMgbm90IHlldCBleGlzdCkuIFNp
bmNlIGxvYWRWYWx1ZXNJZk5lZWRlZCgpIGVuZHMgdXAgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGlu
IEphdmFTY3JpcHQgY29kZSwgcHJvY2Vzc2luZyBpbmNvbWluZyBzeW5jaHJvbm91cyBtZXNzYWdl
cworICAgIC8vIGNvdWxkIGxlYWQgdG8gd2VpcmQgcmVlbnRyZW5jeSBidWdzIG90aGVyd2lzZS4K
KyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5z
ZW5kU3luYyhNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVlcyhtX3N0b3JhZ2VNYXBJ
RCwgbV9jdXJyZW50U2VlZCksIE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6R2V0VmFsdWVzOjpS
ZXBseSh2YWx1ZXMpLCAwKTsKKworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0
ZShtX3F1b3RhSW5CeXRlcyk7CisgICAgbV9zdG9yYWdlTWFwLT5pbXBvcnRJdGVtcyh2YWx1ZXMp
OworCisgICAgLy8gV2Ugd2FudCB0byBpZ25vcmUgYWxsIGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRo
ZSBEaWRHZXRWYWx1ZXMgbWVzc2FnZS4KKyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSB0cnVl
OworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQpCit7CisgICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCisg
ICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpOworICAg
IG1faGFzUGVuZGluZ0dldFZhbHVlcyA9IGZhbHNlOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFw
OjpkaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwg
Ym9vbCBxdW90YUVycm9yKQoreworICAgIGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBT
ZWVkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2Vz
LmNvbnRhaW5zKGtleSkpOworCisgICAgaWYgKHF1b3RhRXJyb3IpIHsKKyAgICAgICAgcmVzZXRW
YWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fcGVuZGluZ1ZhbHVlQ2hh
bmdlcy5yZW1vdmUoa2V5KTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkUmVtb3ZlSXRl
bSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgaWYg
KG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCisgICAgICAgIHJldHVybjsKKworICAg
IEFTU0VSVChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSk7CisgICAgbV9wZW5k
aW5nVmFsdWVDaGFuZ2VzLnJlbW92ZShrZXkpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpk
aWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKK3sKKyAgICBpZiAobV9jdXJyZW50U2Vl
ZCAhPSBzdG9yYWdlTWFwU2VlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1faGFz
UGVuZGluZ0NsZWFyKTsKKyAgICBtX2hhc1BlbmRpbmdDbGVhciA9IGZhbHNlOworfQorCitib29s
IFN0b3JhZ2VBcmVhTWFwOjpzaG91bGRBcHBseUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtl
eSkgY29uc3QKK3sKKyAgICAvLyBXZSBoYXZlIG5vdCB5ZXQgbG9hZGVkIGFueXRoaW5nIGZyb20g
dGhpcyBzdG9yYWdlIG1hcC4KKyAgICBpZiAoIW1fc3RvcmFnZU1hcCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBzdG9yYWdlIGFyZWEgaXMgY3VycmVudGx5
IHdhaXRpbmcgZm9yIHRoZSBzdG9yYWdlIG1hbmFnZXIgdG8gdXBkYXRlIHRoZSBnaXZlbiBrZXku
CisgICAgLy8gSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkg
Y2hhbmdlcyBtYWRlIGJ5IG90aGVyIHN0b3JhZ2UgYXJlYXMsIHNpbmNlCisgICAgLy8gb3VyIGNo
YW5nZSB3YXMgbWFkZSBsYXN0LgorICAgIGlmIChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFp
bnMoa2V5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmFwcGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBTdHJpbmcmIG5ld1ZhbHVlKQoreworICAgIEFTU0VSVCghbV9zdG9yYWdlTWFwIHx8IG1fc3Rv
cmFnZU1hcC0+aGFzT25lUmVmKCkpOworCisgICAgLy8gVGhlcmUncyBhIGNsZWFyIHBlbmRpbmcg
b3IgZ2V0VmFsdWVzIHBlbmRpbmcgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyB1
bnRpbCB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgRGlkQ2xlYXIvRGlkR2V0VmFsdWVzIG1lc3Nh
Z2VzLgorICAgIGlmIChtX2hhc1BlbmRpbmdDbGVhciB8fCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmICgha2V5KSB7CisgICAgICAgIC8vIEEgbnVsbCBr
ZXkgbWVhbnMgY2xlYXIuCisgICAgICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6
OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisKKyAgICAgICAgLy8gQW55IGNoYW5nZXMgdGhhdCB3
ZXJlIG1hZGUgbG9jYWxseSBhZnRlciB0aGUgY2xlYXIgbXVzdCBzdGlsbCBiZSBrZXB0IGFyb3Vu
ZCBpbiB0aGUgbmV3IG1hcC4KKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nVmFsdWVD
aGFuZ2VzLmJlZ2luKCkua2V5cygpLCBlbmQgPSBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuZW5kKCku
a2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZyYga2V5
ID0gKml0OworCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtX3N0b3JhZ2VNYXAtPmdldEl0
ZW0oa2V5KTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyBU
aGlzIGNoYW5nZSBtdXN0IGhhdmUgYmVlbiBhIHBlbmRpbmcgcmVtb3ZlLCBpZ25vcmUgaXQuCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0
cmluZyBvbGRWYWx1ZTsKKyAgICAgICAgICAgIG5ld1N0b3JhZ2VNYXAtPnNldEl0ZW1JZ25vcmlu
Z1F1b3RhKGtleSwgb2xkVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgbV9zdG9yYWdlTWFw
ID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmICghc2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoa2V5KSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCFuZXdWYWx1ZSkgeworICAgICAgICAvLyBBIG51bGwgbmV3IHZhbHVlIG1lYW5zIHRo
YXQgdGhlIGl0ZW0gc2hvdWxkIGJlIHJlbW92ZWQuCisgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsK
KyAgICAgICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90
YShrZXksIG5ld1ZhbHVlKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTdG9y
YWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0
cmluZyYgdXJsU3RyaW5nKQoreworICAgIGlmICghc291cmNlU3RvcmFnZUFyZWFJRCkgeworICAg
ICAgICAvLyBUaGlzIHN0b3JhZ2UgZXZlbnQgb3JpZ2luYXRlcyBmcm9tIGFub3RoZXIgcHJvY2Vz
cyBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBjaGFuZ2UgdG8gb3VyIHN0b3JhZ2UgYXJlYSBtYXAu
CisgICAgICAgIGFwcGx5Q2hhbmdlKGtleSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIGlmIChz
dG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQorICAgICAgICBkaXNwYXRjaFNl
c3Npb25TdG9yYWdlRXZlbnQoc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3
VmFsdWUsIHVybFN0cmluZyk7CisgICAgZWxzZQorICAgICAgICBkaXNwYXRjaExvY2FsU3RvcmFn
ZUV2ZW50KHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxT
dHJpbmcpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhckNhY2hlKCkKK3sKKyAgICBy
ZXNldFZhbHVlcygpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaXNwYXRjaFNlc3Npb25T
dG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0
IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIEFTU0VSVChzdG9yYWdlVHlwZSgpID09IFN0b3Jh
Z2VUeXBlOjpTZXNzaW9uKTsKKworICAgIC8vIE5hbWVzcGFjZSBJRHMgZm9yIHNlc3Npb24gc3Rv
cmFnZSBuYW1lc3BhY2VzIGFyZSBlcXVpdmFsZW50IHRvIHdlYiBwYWdlIElEcworICAgIC8vIHNv
IHdlIGNhbiBnZXQgdGhlIHJpZ2h0IHBhZ2UgaGVyZS4KKyAgICBXZWJQYWdlKiB3ZWJQYWdlID0g
V2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2ViUGFnZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7Cisg
ICAgaWYgKCF3ZWJQYWdlKQorICAgICAgICByZXR1cm47CisKKyAgICBWZWN0b3I8UmVmUHRyPEZy
YW1lPj4gZnJhbWVzOworCisgICAgUGFnZSogcGFnZSA9IHdlYlBhZ2UtPmNvcmVQYWdlKCk7Cisg
ICAgZm9yIChGcmFtZSogZnJhbWUgPSAmcGFnZS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9
IGZyYW1lLT50cmVlKCkudHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgICAgIGlmICghZG9jdW1lbnQtPnNlY3VyaXR5
T3JpZ2luKCkuZXF1YWwobV9zZWN1cml0eU9yaWdpbi5wdHIoKSkpCisgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygp
LT5vcHRpb25hbFNlc3Npb25TdG9yYWdlKCk7CisgICAgICAgIGlmICghc3RvcmFnZSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFN0b3JhZ2VBcmVhSW1wbCYgc3RvcmFnZUFyZWEg
PSBzdGF0aWNfY2FzdDxTdG9yYWdlQXJlYUltcGwmPihzdG9yYWdlLT5hcmVhKCkpOworICAgICAg
ICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFnZUFyZWFJRCgpID09IHNvdXJjZVN0b3JhZ2VBcmVhSUQp
IHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0
aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB9CisKKyAgICAgICAgZnJhbWVzLmFwcGVuZChmcmFtZSk7CisgICAgfQorCisgICAgU3RvcmFn
ZUV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50c1RvRnJhbWVzKCpw
YWdlLCBmcmFtZXMsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcsIFNlY3VyaXR5
T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKTsKK30KKwor
dm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBz
b3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRW
YWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCit7
CisgICAgQVNTRVJUKGlzTG9jYWxTdG9yYWdlKHN0b3JhZ2VUeXBlKCkpKTsKKworICAgIFZlY3Rv
cjxSZWZQdHI8RnJhbWU+PiBmcmFtZXM7CisKKyAgICBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9ICpX
ZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53ZWJQYWdlR3JvdXAobV9zdG9yYWdlTmFtZXNwYWNlSUQp
LT5jb3JlUGFnZUdyb3VwKCk7CisgICAgY29uc3QgSGFzaFNldDxQYWdlKj4mIHBhZ2VzID0gcGFn
ZUdyb3VwLnBhZ2VzKCk7CisgICAgZm9yIChIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBwYWdlcy5iZWdpbigpLCBlbmQgPSBwYWdlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgIGZvciAoRnJhbWUqIGZyYW1lID0gJigqaXQpLT5tYWluRnJhbWUoKTsgZnJhbWU7
IGZyYW1lID0gZnJhbWUtPnRyZWUoKS50cmF2ZXJzZU5leHQoKSkgeworICAgICAgICAgICAgRG9j
dW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgICAgICAgICBpZiAoIWRv
Y3VtZW50LT5zZWN1cml0eU9yaWdpbigpLmVxdWFsKG1fc2VjdXJpdHlPcmlnaW4ucHRyKCkpKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBTdG9yYWdlKiBzdG9yYWdl
ID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5vcHRpb25hbExvY2FsU3RvcmFnZSgpOworICAgICAg
ICAgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
ICAgICBTdG9yYWdlQXJlYUltcGwmIHN0b3JhZ2VBcmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFy
ZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgpKTsKKyAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS5z
dG9yYWdlQXJlYUlEKCkgPT0gc291cmNlU3RvcmFnZUFyZWFJRCkgeworICAgICAgICAgICAgICAg
IC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUg
ZGlzcGF0Y2hlZC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgZnJhbWVzLmFwcGVuZChmcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBTdG9yYWdlRXZlbnREaXNwYXRjaGVyOjpkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50c1RvRnJh
bWVzKHBhZ2VHcm91cCwgZnJhbWVzLCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5n
LCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2lu
KSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuaCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjllNDNl
ODA3N2YwZGU0NThiMTA2OTdkOTk2ZjFjZTY2YWI3MWNjOAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmgKQEAgLTAs
MCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFN0b3JhZ2VBcmVhTWFwX2gKKyNkZWZp
bmUgU3RvcmFnZUFyZWFNYXBfaAorCisjaW5jbHVkZSAiTWVzc2FnZVJlY2VpdmVyLmgiCisjaW5j
bHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFn
ZUFyZWEuaD4KKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoQ291
bnRlZFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1Jl
ZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBTZWN1cml0eU9yaWdpbjsKK2Ns
YXNzIFN0b3JhZ2VNYXA7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBTdG9yYWdl
QXJlYUltcGw7CitjbGFzcyBTdG9yYWdlTmFtZXNwYWNlSW1wbDsKKworY2xhc3MgU3RvcmFnZUFy
ZWFNYXAgOiBwdWJsaWMgUmVmQ291bnRlZDxTdG9yYWdlQXJlYU1hcD4sIHByaXZhdGUgSVBDOjpN
ZXNzYWdlUmVjZWl2ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBSZWY8U3RvcmFnZUFyZWFNYXA+
IGNyZWF0ZShTdG9yYWdlTmFtZXNwYWNlSW1wbCosIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bj4mJik7CisgICAgflN0b3JhZ2VBcmVhTWFwKCk7CisKKyAgICBXZWJDb3JlOjpTdG9yYWdlVHlw
ZSBzdG9yYWdlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZVR5cGU7IH0KKworICAgIHVu
c2lnbmVkIGxlbmd0aCgpOworICAgIFN0cmluZyBrZXkodW5zaWduZWQgaW5kZXgpOworICAgIFN0
cmluZyBpdGVtKGNvbnN0IFN0cmluZyYga2V5KTsKKyAgICB2b2lkIHNldEl0ZW0oV2ViQ29yZTo6
RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbik7Cisg
ICAgdm9pZCByZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFy
ZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSk7CisgICAgdm9pZCBjbGVhcihX
ZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSk7
CisgICAgYm9vbCBjb250YWlucyhjb25zdCBTdHJpbmcmIGtleSk7CisKKyAgICBjb25zdCBXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbiYgc2VjdXJpdHlPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3Nl
Y3VyaXR5T3JpZ2luLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgU3RvcmFnZUFyZWFNYXAoU3Rv
cmFnZU5hbWVzcGFjZUltcGwqLCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYpOworCisg
ICAgLy8gSVBDOjpNZXNzYWdlUmVjZWl2ZXIKKyAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQ
Qzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYpIG92ZXJyaWRlOworCisgICAgdm9pZCBkaWRH
ZXRWYWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpOworICAgIHZvaWQgZGlkU2V0SXRlbSh1
aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGJvb2wgcXVvdGFFcnJv
cik7CisgICAgdm9pZCBkaWRSZW1vdmVJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25z
dCBTdHJpbmcmIGtleSk7CisgICAgdm9pZCBkaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCk7CisKKyAgICB2b2lkIGRpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3Jh
Z2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25z
dCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7CisgICAgdm9pZCBj
bGVhckNhY2hlKCk7CisKKyAgICB2b2lkIHJlc2V0VmFsdWVzKCk7CisgICAgdm9pZCBsb2FkVmFs
dWVzSWZOZWVkZWQoKTsKKworICAgIGJvb2wgc2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoY29uc3Qg
U3RyaW5nJiBrZXkpIGNvbnN0OworICAgIHZvaWQgYXBwbHlDaGFuZ2UoY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUpOworCisgICAgdm9pZCBkaXNwYXRjaFNlc3Npb25T
dG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0
IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAgICB2b2lkIGRpc3BhdGNoTG9jYWxTdG9yYWdlRXZlbnQo
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0
cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJs
U3RyaW5nKTsKKworICAgIFJlZjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gbV9zdG9yYWdlTmFtZXNw
YWNlOworCisgICAgdWludDY0X3QgbV9zdG9yYWdlTWFwSUQ7CisKKyAgICBXZWJDb3JlOjpTdG9y
YWdlVHlwZSBtX3N0b3JhZ2VUeXBlOworICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlE
OworICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworICAgIFJlZjxXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbj4gbV9zZWN1cml0eU9yaWdpbjsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdl
TWFwPiBtX3N0b3JhZ2VNYXA7CisKKyAgICB1aW50NjRfdCBtX2N1cnJlbnRTZWVkOworICAgIGJv
b2wgbV9oYXNQZW5kaW5nQ2xlYXI7CisgICAgYm9vbCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXM7Cisg
ICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiBtX3BlbmRpbmdWYWx1ZUNoYW5nZXM7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFN0b3JhZ2VBcmVhTWFwX2gKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFw
Lm1lc3NhZ2VzLmluIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFn
ZUFyZWFNYXAubWVzc2FnZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjE1OTA0ZjE2YmVjMTQyYjEwYjQ4MDBk
MTA2NDUwMDkzMzgzMDBkNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCkBAIC0wLDAgKzEsMzEg
QEAKKyMgQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWVzc2FnZXMgLT4g
U3RvcmFnZUFyZWFNYXAgeworICAgIERpZEdldFZhbHVlcyh1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCkKKyAgICBEaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBi
b29sIHF1b3RhRXhjZXB0aW9uKQorICAgIERpZFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1h
cFNlZWQsIFN0cmluZyBrZXkpCisgICAgRGlkQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQp
CisKKyAgICBEaXNwYXRjaFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlE
LCBTdHJpbmcga2V5LCBTdHJpbmcgb2xkVmFsdWUsIFN0cmluZyBuZXdWYWx1ZSwgU3RyaW5nIHVy
bFN0cmluZykKKyAgICBDbGVhckNhY2hlKCkKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4yYWJiYzVjMjFjMTgxMDg4ZmY1ODYwNDVmMDI3MTllMDI0MjY4NzI1Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5h
bWVzcGFjZUltcGwuY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RvcmFnZU5hbWVzcGFjZUltcGwuaCIKKworI2lu
Y2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgorI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCisj
aW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCisjaW5j
bHVkZSAiV2ViUHJvY2Vzcy5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL1BhZ2VHcm91cC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4u
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NldHRpbmdzLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9y
YWdlVHlwZS5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK1JlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6
OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2ln
bmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1l
c3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpTZXNzaW9uLCBpZGVudGlmaWVyLCBudWxscHRyLCBxdW90
YUluQnl0ZXMpKTsKK30KKworUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFt
ZXNwYWNlSW1wbDo6Y3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90
IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCwg
aWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Cit9CisKK1JlZlB0cjxTdG9yYWdl
TmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUxvY2FsU3RvcmFnZU5h
bWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6
TG9jYWwsIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5CeXRlcykpOworfQorCitSZWZQdHI8
U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVUcmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6
VHJhbnNpZW50TG9jYWwsIGlkZW50aWZpZXIsICZ0b3BMZXZlbE9yaWdpbiwgcXVvdGFJbkJ5dGVz
KSk7Cit9CisKK1N0b3JhZ2VOYW1lc3BhY2VJbXBsOjpTdG9yYWdlTmFtZXNwYWNlSW1wbChXZWJD
b3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlE
LCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3Rh
SW5CeXRlcykKKyAgICA6IG1fc3RvcmFnZVR5cGUoc3RvcmFnZVR5cGUpCisgICAgLCBtX3N0b3Jh
Z2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCisgICAgLCBtX3RvcExldmVsT3JpZ2lu
KHRvcExldmVsT3JpZ2luKQorICAgICwgbV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQorewor
fQorCitTdG9yYWdlTmFtZXNwYWNlSW1wbDo6flN0b3JhZ2VOYW1lc3BhY2VJbXBsKCkKK3sKK30K
Kwordm9pZCBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKFN0
b3JhZ2VBcmVhTWFwJiBtYXApCit7CisgICAgbV9zdG9yYWdlQXJlYU1hcHMucmVtb3ZlKFNlY3Vy
aXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1hcC5zZWN1cml0eU9yaWdpbigpKSk7
Cit9CisKK1JlZlB0cjxTdG9yYWdlQXJlYT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OnN0b3JhZ2VB
cmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgaWYg
KG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsKQorICAgICAgICBy
ZXR1cm4gZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShzZWN1cml0eU9yaWdpbik7CisKKyAgICBS
ZWZQdHI8U3RvcmFnZUFyZWFNYXA+IG1hcDsKKworICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VB
cmVhTWFwcy5hZGQoc2VjdXJpdHlPcmlnaW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAg
ICBpZiAoIXNsb3QpIHsKKyAgICAgICAgbWFwID0gU3RvcmFnZUFyZWFNYXA6OmNyZWF0ZSh0aGlz
LCBzZWN1cml0eU9yaWdpbi5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAgc2xvdCA9IG1hcC5n
ZXQoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbWFwID0gc2xvdDsKKworICAgIHJldHVybiBTdG9y
YWdlQXJlYUltcGw6OmNyZWF0ZShtYXAucmVsZWFzZU5vbk51bGwoKSk7Cit9CisKK2NsYXNzIFN0
b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYSBmaW5hbCA6IHB1YmxpYyBT
dG9yYWdlQXJlYSB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJl
YT4gY3JlYXRlKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgb3JpZ2luLCB1bnNpZ25lZCBxdW90
YUluQnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxT
dG9yYWdlQXJlYShvcmlnaW4sIHF1b3RhSW5CeXRlcykpOworICAgIH0KKworICAgIFJlZjxFcGhl
bWVyYWxTdG9yYWdlQXJlYT4gY29weSgpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYo
Km5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYSgqdGhpcykpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBFcGhlbWVyYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIG9yaWdpbiwg
dW5zaWduZWQgcXVvdGFJbkJ5dGVzKQorICAgICAgICA6IG1fc2VjdXJpdHlPcmlnaW5EYXRhKG9y
aWdpbikKKyAgICAgICAgLCBtX3N0b3JhZ2VNYXAoU3RvcmFnZU1hcDo6Y3JlYXRlKHF1b3RhSW5C
eXRlcykpCisgICAgeworICAgIH0KKworICAgIEVwaGVtZXJhbFN0b3JhZ2VBcmVhKEVwaGVtZXJh
bFN0b3JhZ2VBcmVhJiBvdGhlcikKKyAgICAgICAgOiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvdGhl
ci5tX3NlY3VyaXR5T3JpZ2luRGF0YSkKKyAgICAgICAgLCBtX3N0b3JhZ2VNYXAob3RoZXIubV9z
dG9yYWdlTWFwKQorICAgIHsKKyAgICB9CisKKyAgICAvLyBXZWJDb3JlOjpTdG9yYWdlQXJlYS4K
KyAgICB1bnNpZ25lZCBsZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1h
cC0+bGVuZ3RoKCk7CisgICAgfQorCisgICAgU3RyaW5nIGtleSh1bnNpZ25lZCBpbmRleCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRleCk7CisgICAgfQorCisg
ICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCisgICAgeworICAgICAgICByZXR1cm4g
bV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7CisgICAgfQorCisgICAgdm9pZCBzZXRJdGVtKEZy
YW1lKiwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3Rh
RXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG9sZFZhbHVlOworICAgICAgICBpZiAo
YXV0byBuZXdNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUs
IHF1b3RhRXhjZXB0aW9uKSkKKyAgICAgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3
TWFwKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZUl0ZW0oRnJhbWUqLCBjb25zdCBTdHJpbmcm
IGtleSkKKyAgICB7CisgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKKyAgICAgICAgaWYgKGF1dG8g
bmV3TWFwID0gbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpKQorICAgICAg
ICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdNYXApOworICAgIH0KKworICAgIHZvaWQg
Y2xlYXIoRnJhbWUqKQorICAgIHsKKyAgICAgICAgaWYgKCFtX3N0b3JhZ2VNYXAtPmxlbmd0aCgp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VN
YXA6OmNyZWF0ZShtX3N0b3JhZ2VNYXAtPnF1b3RhKCkpOworICAgIH0KKworICAgIGJvb2wgY29u
dGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gbV9zdG9yYWdl
TWFwLT5jb250YWlucyhrZXkpOworICAgIH0KKworICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFnZShG
cmFtZSogZnJhbWUpCisgICAgeworICAgICAgICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2Uo
KTsKKyAgICB9CisKKyAgICBTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsOworICAgIH0KKworICAg
IHNpemVfdCBtZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQoKSB7IH0KKyAgICB2b2lk
IGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgeyB9CisgICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJZGxl
KCkgeyB9CisKKyAgICBTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW4oKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW5EYXRhOworICAgIH0KKworICAg
IFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luRGF0YTsKKyAgICBSZWZQdHI8U3Rv
cmFnZU1hcD4gbV9zdG9yYWdlTWFwOworfTsKKworUmVmUHRyPFN0b3JhZ2VBcmVhPiBTdG9yYWdl
TmFtZXNwYWNlSW1wbDo6ZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9y
aWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQoreworICAgIGF1dG8mIHNsb3QgPSBtX2VwaGVtZXJh
bExvY2FsU3RvcmFnZUFyZWFzLmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3It
PnZhbHVlOworICAgIGlmICghc2xvdCkKKyAgICAgICAgc2xvdCA9IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYTo6Y3JlYXRlKHNlY3VyaXR5T3JpZ2luLCBtX3F1b3Rh
SW5CeXRlcyk7CisKKyAgICByZXR1cm4gc2xvdC5nZXQoKTsKK30KKworUmVmUHRyPFN0b3JhZ2VO
YW1lc3BhY2U+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjb3B5KFBhZ2UqIG5ld1BhZ2UpCit7Cisg
ICAgQVNTRVJUKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKKworICAgIGlmIChtX3N0b3JhZ2VUeXBl
ID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQorICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKG5ld1BhZ2UpLT5wYWdlSUQoKSwg
bV9xdW90YUluQnl0ZXMpOworCisgICAgQVNTRVJUKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5
cGU6OkVwaGVtZXJhbExvY2FsKTsKKyAgICBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG5l
d05hbWVzcGFjZSA9IGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChtX3N0b3JhZ2VU
eXBlLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRCwgbV90b3BMZXZlbE9yaWdpbi5nZXQoKSwgbV9xdW90
YUluQnl0ZXMpKTsKKworICAgIGZvciAoYXV0byYgaXRlciA6IG1fZXBoZW1lcmFsTG9jYWxTdG9y
YWdlQXJlYXMpCisgICAgICAgIG5ld05hbWVzcGFjZS0+bV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VB
cmVhcy5zZXQoaXRlci5rZXksIGl0ZXIudmFsdWUtPmNvcHkoKSk7CisKKyAgICByZXR1cm4gbmV3
TmFtZXNwYWNlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmggYi9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmYxM2EyMmRjYmQyMWI2NzQwZTQ1MjM3ZjRkZmFkODMxMjU2NzI5ZTMKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9y
YWdlTmFtZXNwYWNlSW1wbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luSGFzaC5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U3RvcmFnZUFyZWEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VNYXAuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL1N0b3JhZ2VOYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgor
CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgU3RvcmFnZUFyZWFNYXA7CitjbGFzcyBXZWJQ
YWdlOworCitjbGFzcyBTdG9yYWdlTmFtZXNwYWNlSW1wbCA6IHB1YmxpYyBXZWJDb3JlOjpTdG9y
YWdlTmFtZXNwYWNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsPiBjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVy
LCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOworICAgIHN0YXRpYyBSZWZQdHI8U3RvcmFnZU5hbWVz
cGFjZUltcGw+IGNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBp
ZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOworICAgIHN0YXRpYyBSZWZQdHI8U3Rv
cmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBp
ZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOworICAgIHN0YXRpYyBSZWZQdHI8U3Rv
cmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1
aW50NjRfdCBpZGVudGlmaWVyLCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiYgdG9wTGV2ZWxPcmln
aW4sIHVpbnQ2NF90IHF1b3RhSW5CeXRlcyk7CisKKyAgICB2aXJ0dWFsIH5TdG9yYWdlTmFtZXNw
YWNlSW1wbCgpOworCisgICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25z
dCB7IHJldHVybiBtX3N0b3JhZ2VUeXBlOyB9CisgICAgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFj
ZUlEKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlTmFtZXNwYWNlSUQ7IH0KKyAgICBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbiogdG9wTGV2ZWxPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3RvcExl
dmVsT3JpZ2luLmdldCgpOyB9CisgICAgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9xdW90YUluQnl0ZXM7IH0KKworICAgIHZvaWQgZGlkRGVzdHJveVN0b3JhZ2VBcmVh
TWFwKFN0b3JhZ2VBcmVhTWFwJik7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU3RvcmFnZU5h
bWVzcGFjZUltcGwoV2ViQ29yZTo6U3RvcmFnZVR5cGUsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3Bh
Y2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2luLCB1bnNpZ25lZCBx
dW90YUluQnl0ZXMpOworCisgICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VBcmVhPiBzdG9yYWdl
QXJlYShjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKSBvdmVycmlkZTsKKyAgICBS
ZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gY29weShXZWJDb3JlOjpQYWdlKikgb3Zl
cnJpZGU7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZUFyZWE+IGVwaGVtZXJhbExvY2Fs
U3RvcmFnZUFyZWEoY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7CisKKyAgICBj
b25zdCBXZWJDb3JlOjpTdG9yYWdlVHlwZSBtX3N0b3JhZ2VUeXBlOworICAgIGNvbnN0IHVpbnQ2
NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlEOworCisgICAgLy8gT25seSB1c2VkIGZvciB0cmFuc2ll
bnQgbG9jYWwgc3RvcmFnZSBuYW1lc3BhY2VzLgorICAgIGNvbnN0IFJlZlB0cjxXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbj4gbV90b3BMZXZlbE9yaWdpbjsKKworICAgIGNvbnN0IHVuc2lnbmVkIG1f
cXVvdGFJbkJ5dGVzOworCisgICAgSGFzaE1hcDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEs
IFN0b3JhZ2VBcmVhTWFwKj4gbV9zdG9yYWdlQXJlYU1hcHM7CisKKyAgICBjbGFzcyBFcGhlbWVy
YWxTdG9yYWdlQXJlYTsKKyAgICBIYXNoTWFwPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSwg
UmVmUHRyPEVwaGVtZXJhbFN0b3JhZ2VBcmVhPj4gbV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVh
czsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcCBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTM3NThlYjg3NDI4OGZmZDg5NjYyZDAyNWUxNThkNjZh
MDcwYzU3MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJT
dG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAKQEAgLTAsMCArMSw4OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlN0b3Jh
Z2VOYW1lc3BhY2VQcm92aWRlci5oIgorCisjaW5jbHVkZSAiU3RvcmFnZU5hbWVzcGFjZUltcGwu
aCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvTmV2ZXJEZXN0cm95ZWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgSGFzaE1hcDx1aW50NjRfdCwgV2ViU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyKj4mIHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKQoreworICAg
IHN0YXRpYyBOZXZlckRlc3Ryb3llZDxIYXNoTWFwPHVpbnQ2NF90LCBXZWJTdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIqPj4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyczsKKworICAgIHJldHVybiBz
dG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzOworfQorCitSZWZQdHI8V2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmdldE9yQ3JlYXRlKHVpbnQ2
NF90IGlkZW50aWZpZXIpCit7CisgICAgYXV0byYgc2xvdCA9IHN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlcnMoKS5hZGQoaWRlbnRpZmllciwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlm
IChzbG90KQorICAgICAgICByZXR1cm4gc2xvdDsKKworICAgIFJlZlB0cjxXZWJTdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXI+IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlciA9IGFkb3B0UmVmKG5ldyBX
ZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIoaWRlbnRpZmllcikpOworICAgIHNsb3QgPSBzdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXIuZ2V0KCk7CisKKyAgICByZXR1cm4gc3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyOworfQorCitXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OldlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcih1aW50NjRfdCBpZGVudGlmaWVyKQorICAgIDogbV9pZGVudGlmaWVy
KGlkZW50aWZpZXIpCit7Cit9CisKK1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6fldlYlN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlcigpCit7CisgICAgQVNTRVJUKHN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcnMoKS5jb250YWlucyhtX2lkZW50aWZpZXIpKTsKKworICAgIHN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlcnMoKS5yZW1vdmUobV9pZGVudGlmaWVyKTsKK30KKworUmVmUHRyPFdlYkNvcmU6
OlN0b3JhZ2VOYW1lc3BhY2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlU2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UoUGFnZSYgcGFnZSwgdW5zaWduZWQgcXVvdGEpCit7CisgICAg
cmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2UoJnBhZ2UpLT5wYWdlSUQoKSwgcXVvdGEpOworfQorCitS
ZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyOjpjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoUGFnZSYgcGFnZSwgdW5z
aWduZWQgcXVvdGEpCit7CisgICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVF
cGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKCZwYWdl
KS0+cGFnZUlEKCksIHF1b3RhKTsKK30KKworUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNw
YWNlKHVuc2lnbmVkIHF1b3RhKQoreworICAgIHJldHVybiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6
Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKG1faWRlbnRpZmllciwgcXVvdGEpOworfQorCitS
ZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1bnNpZ25lZCBxdW90YSkKK3sKKyAgICByZXR1cm4g
U3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFj
ZShtX2lkZW50aWZpZXIsIHRvcExldmVsT3JpZ2luLCBxdW90YSk7Cit9CisKK30KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlci5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3Rv
cmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTRjMjE0MjRiZjI2ZTM0MTAxMDg4
YmMwMjgyYjQzMTIyNmE2NDlhNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oCkBAIC0wLDAg
KzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV2ViU3RvcmFnZU5hbWVzcGFjZVBy
b3ZpZGVyX2gKKyNkZWZpbmUgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKKworI2luY2x1
ZGUgPFdlYkNvcmUvU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmg+CisKK25hbWVzcGFjZSBXZWJL
aXQgeworCitjbGFzcyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIgZmluYWwgOiBwdWJsaWMg
V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcj4gZ2V0T3JDcmVhdGUodWludDY0X3Qg
aWRlbnRpZmllcik7CisgICAgdmlydHVhbCB+V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCk7
CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVp
bnQ2NF90IGlkZW50aWZpZXIpOworCisgICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6OlBhZ2UmLCB1bnNpZ25l
ZCBxdW90YSkgb3ZlcnJpZGU7CisgICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+
IGNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdlJiwgdW5z
aWduZWQgcXVvdGEpIG92ZXJyaWRlOworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNw
YWNlPiBjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGEpIG92ZXJyaWRl
OworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVUcmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mLCB1bnNpZ25lZCBx
dW90YSkgb3ZlcnJpZGU7CisKKyAgICBjb25zdCB1aW50NjRfdCBtX2lkZW50aWZpZXI7Cit9Owor
Cit9CisKKyNlbmRpZiAvLyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316474</attachid>
            <date>2017-07-26 13:56:40 -0700</date>
            <delta_ts>2017-07-26 14:12:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174871-20170726135639.patch</filename>
            <type>text/plain</type>
            <size>317399</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5OTYwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZkMDA4NjNkMWFmZjRkZDFm
YmZhMzAxNzNiYjEwODFkOWVhYzVlYjQuLjcyNWM2ZTc0NjY4YzMyMTYzNWU3ZmI1Y2MyNjYyZTEz
NTI4ZmU3NWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDAgQEAKIDIwMTctMDctMjYgIEJyYWR5IEVp
ZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCisgICAgICAgIFJlbmFtZSB7V2ViL1VJfVByb2Nl
c3MvU3RvcmFnZSB0byB7V2ViL1VJfVByb2Nlc3MvV2ViU3RvcmFnZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDg3MQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBzdGFuZGFyZCB0aGVzZSBkaXJl
Y3RvcmllcyBoZWxwIGltcGxlbWVudCBpcyB0aGUgIldlYiBTdG9yYWdlIiBzdGFuZGFyZC4KKyAg
ICAgICAgIlN0b3JhZ2UiIGlzIHRvbyBnZW5lcmFsIG9mIGEgd29yZCB0aGF0IHdlIGhhdmUgcGxh
bnMgdG8gc3RhcnQgdXNpbmcgaW4gb3RoZXIgY29udGV4dHMgc29vbi4KKworICAgICAgICAqIENN
YWtlTGlzdHMudHh0OgorICAgICAgICAqIFdlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
OgorCisgICAgICAgICogVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZS5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAuCisgICAgICAgICog
VUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oOiBSZW5h
bWVkIGZyb20gU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViU3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcC4KKyAgICAgICAgKiBVSVBy
b2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oOiBSZW5hbWVkIGZyb20gU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oLgorICAg
ICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5j
cHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlci5jcHAuCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2Uv
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oLgorICAgICAg
ICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcDogUmVuYW1lZCBmcm9t
IFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwLgorICAg
ICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmg6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmguCisgICAg
ICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW46IFJl
bmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2Vy
Lm1lc3NhZ2VzLmluLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW06IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0uCisg
ICAgICAgICogVUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2VJT1MubW06IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0uCisKKyAg
ICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcDogUmVuYW1l
ZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5j
cHAuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oOiBS
ZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJ
bXBsLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNw
cDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VB
cmVhTWFwLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFN
YXAuaDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VBcmVhTWFwLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVh
TWFwLm1lc3NhZ2VzLmluOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4uCisgICAgICAgICogV2ViUHJvY2Vzcy9X
ZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcC4KKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaDogUmVuYW1l
ZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJ
bXBsLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlci5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3Rv
cmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwLgorICAgICAgICAqIFdlYlByb2Nl
c3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaDogUmVuYW1lZCBmcm9t
IFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlci5oLgorCisyMDE3LTA3LTI2ICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4K
KwogICAgICAgICBSZW1vdmUgREFUQUJBU0VfUFJPQ0VTUyBidWlsZCBmbGFnLgogICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODY4CiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViS2l0L0NNYWtlTGlz
dHMudHh0CmluZGV4IDEyM2Y0YmZhODEzZjAzZDFkNzMwNTUxZDcwNGVlYTVmMjFkNmI2YjYuLjQ0
NWZkMTY0MGQ1YTU3MDhjNTU3MDlkOTBlYzhjYzI5ODhjMDgxZTcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYktpdC9DTWFrZUxpc3RzLnR4
dApAQCAtNDQsOCArNDQsOCBAQCBzZXQoV2ViS2l0Ml9JTkNMVURFX0RJUkVDVE9SSUVTCiAgICAg
IiR7V0VCS0lUMl9ESVJ9L1VJUHJvY2Vzcy9OZXR3b3JrL0N1c3RvbVByb3RvY29scyIKICAgICAi
JHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL05vdGlmaWNhdGlvbnMiCiAgICAgIiR7V0VCS0lUMl9E
SVJ9L1VJUHJvY2Vzcy9QbHVnaW5zIgotICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3MvU3Rv
cmFnZSIKICAgICAiJHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL1VzZXJDb250ZW50IgorICAgICIk
e1dFQktJVDJfRElSfS9VSVByb2Nlc3MvV2ViU3RvcmFnZSIKICAgICAiJHtXRUJLSVQyX0RJUn0v
VUlQcm9jZXNzL1dlYnNpdGVEYXRhIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzIgog
ICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL0FwcGxlUGF5IgpAQCAtNzMsMTAgKzczLDEw
IEBAIHNldChXZWJLaXQyX0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtXRUJLSVQyX0RJUn0v
V2ViUHJvY2Vzcy9QbHVnaW5zIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1BsdWdp
bnMvTmV0c2NhcGUiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvUmVzb3VyY2VDYWNo
ZSIKLSAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9TdG9yYWdlIgogICAgICIke1dFQktJ
VDJfRElSfS9XZWJQcm9jZXNzL1VzZXJDb250ZW50IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQ
cm9jZXNzL1dlYkNvcmVTdXBwb3J0IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dl
YlBhZ2UiCisgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvV2ViU3RvcmFnZSIKICAgICAi
JHtERVJJVkVEX1NPVVJDRVNfV0VCS0lUMl9ESVJ9IgogICAgICIke0RFUklWRURfU09VUkNFU19X
RUJLSVQyX0RJUn0vaW5jbHVkZSIKICAgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9XZWJLaXRMaWJy
YXJpZXMiCkBAIC0yODQsNiArMjg0LDcgQEAgc2V0KFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJv
Y2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmNwcAogICAgIFVJUHJvY2Vzcy9Qcm9jZXNzVGhyb3R0bGVy
LmNwcAogICAgIFVJUHJvY2Vzcy9SZW1vdGVXZWJJbnNwZWN0b3JQcm94eS5jcHAKKyAgICBVSVBy
b2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcAogICAgIFVJ
UHJvY2Vzcy9SZXNwb25zaXZlbmVzc1RpbWVyLmNwcAogICAgIFVJUHJvY2Vzcy9TdGF0aXN0aWNz
UmVxdWVzdC5jcHAKICAgICBVSVByb2Nlc3MvVGV4dENoZWNrZXJDb21wbGV0aW9uLmNwcApAQCAt
NDI5LDEzICs0MzAsMTIgQEAgc2V0KFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9QbHVn
aW5zL1BsdWdpblByb2Nlc3NNYW5hZ2VyLmNwcAogICAgIFVJUHJvY2Vzcy9QbHVnaW5zL1BsdWdp
blByb2Nlc3NQcm94eS5jcHAKIAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURh
dGFiYXNlLmNwcAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlci5jcHAKLSAgICBVSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2UuY3BwCi0KICAgICBVSVByb2Nlc3MvVXNlckNvbnRlbnQvV2ViU2NyaXB0
TWVzc2FnZUhhbmRsZXIuY3BwCiAgICAgVUlQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250
ZW50Q29udHJvbGxlclByb3h5LmNwcAogCisgICAgVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxT
dG9yYWdlRGF0YWJhc2UuY3BwCisgICAgVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyLmNwcAorCiAgICAgVUlQcm9jZXNzL1dlYnNpdGVEYXRhL1dlYnNpdGVE
YXRhUmVjb3JkLmNwcAogICAgIFVJUHJvY2Vzcy9XZWJzaXRlRGF0YS9XZWJzaXRlRGF0YVN0b3Jl
LmNwcAogCkBAIC01MjcsMTEgKzUyNyw2IEBAIHNldChXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQ
cm9jZXNzL1BsdWdpbnMvTmV0c2NhcGUvTmV0c2NhcGVQbHVnaW5Ob25lLmNwcAogICAgIFdlYlBy
b2Nlc3MvUGx1Z2lucy9OZXRzY2FwZS9OZXRzY2FwZVBsdWdpblN0cmVhbS5jcHAKIAotICAgIFdl
YlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuY3BwCi0gICAgV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLmNwcAotICAgIFdlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTmFt
ZXNwYWNlSW1wbC5jcHAKLSAgICBXZWJQcm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyLmNwcAotCiAgICAgV2ViUHJvY2Vzcy9Vc2VyQ29udGVudC9XZWJVc2VyQ29udGVu
dENvbnRyb2xsZXIuY3BwCiAKICAgICBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1Nlc3Npb25T
dGF0ZUNvbnZlcnNpb24uY3BwCkBAIC01NzYsNiArNTcxLDExIEBAIHNldChXZWJLaXQyX1NPVVJD
RVMKICAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViVVJMU2NoZW1lSGFuZGxlclByb3h5LmNwcAog
ICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJVUkxTY2hlbWVUYXNrUHJveHkuY3BwCiAgICAgV2Vi
UHJvY2Vzcy9XZWJQYWdlL1dlYlVuZG9TdGVwLmNwcAorCisgICAgV2ViUHJvY2Vzcy9XZWJTdG9y
YWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKKyAgICBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFn
ZUFyZWFNYXAuY3BwCisgICAgV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJ
bXBsLmNwcAorICAgIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJv
dmlkZXIuY3BwCiApCiAKIHNldChXZWJLaXQyX01FU1NBR0VTX0lOX0ZJTEVTCkBAIC02MzEsMTAg
KzYzMSwxMCBAQCBzZXQoV2ViS2l0Ml9NRVNTQUdFU19JTl9GSUxFUwogCiAgICAgVUlQcm9jZXNz
L1BsdWdpbnMvUGx1Z2luUHJvY2Vzc1Byb3h5Lm1lc3NhZ2VzLmluCiAKLSAgICBVSVByb2Nlc3Mv
U3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5pbgotCiAgICAgVUlQcm9jZXNzL1VzZXJD
b250ZW50L1dlYlVzZXJDb250ZW50Q29udHJvbGxlclByb3h5Lm1lc3NhZ2VzLmluCiAKKyAgICBV
SVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5pbgorCiAgICAgV2Vi
UHJvY2Vzcy9XZWJQcm9jZXNzLm1lc3NhZ2VzLmluCiAKICAgICBXZWJQcm9jZXNzL0F1dG9tYXRp
b24vV2ViQXV0b21hdGlvblNlc3Npb25Qcm94eS5tZXNzYWdlcy5pbgpAQCAtNjYxLDggKzY2MSw2
IEBAIHNldChXZWJLaXQyX01FU1NBR0VTX0lOX0ZJTEVTCiAgICAgV2ViUHJvY2Vzcy9QbHVnaW5z
L1BsdWdpblByb2Nlc3NDb25uZWN0aW9uTWFuYWdlci5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nl
c3MvUGx1Z2lucy9QbHVnaW5Qcm94eS5tZXNzYWdlcy5pbgogCi0gICAgV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCi0KICAgICBXZWJQcm9jZXNzL1VzZXJDb250
ZW50L1dlYlVzZXJDb250ZW50Q29udHJvbGxlci5tZXNzYWdlcy5pbgogCiAgICAgV2ViUHJvY2Vz
cy9XZWJQYWdlL0RyYXdpbmdBcmVhLm1lc3NhZ2VzLmluCkBAIC02NzMsNiArNjcxLDggQEAgc2V0
KFdlYktpdDJfTUVTU0FHRVNfSU5fRklMRVMKICAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViSW5z
cGVjdG9ySW50ZXJydXB0RGlzcGF0Y2hlci5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvV2Vi
UGFnZS9XZWJJbnNwZWN0b3JVSS5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9X
ZWJQYWdlLm1lc3NhZ2VzLmluCisKKyAgICBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFy
ZWFNYXAubWVzc2FnZXMuaW4KICkKIAogc2V0KFdlYlByb2Nlc3NfTElCUkFSSUVTCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kMzA0NTI1Nzc3ODhlOWIw
MzgzMTEwZmYwZTU0MjdhOGQ5OTZlNTBiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcApA
QCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCIKKworI2luY2x1
ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUu
aCIKKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVNb25pdG9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9G
aWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9LZXllZENvZGluZy5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvU2hhcmVkQnVmZmVyLmg+CisjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNs
dWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8d3RmL3RocmVhZHMvQmluYXJ5U2VtYXBo
b3JlLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjb25zdGV4cHIgU2Vjb25kcyBtaW5pbXVt
V3JpdGVJbnRlcnZhbCB7IDVfbWluIH07CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitz
dGF0aWMgYm9vbCBoYXNGaWxlQ2hhbmdlZFNpbmNlKGNvbnN0IFN0cmluZyYgcGF0aCwgV2FsbFRp
bWUgc2luY2UpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgdGltZV90
IG1vZGlmaWNhdGlvblRpbWU7CisgICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShwYXRo
LCBtb2RpZmljYXRpb25UaW1lKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4g
V2FsbFRpbWU6OmZyb21SYXdTZWNvbmRzKG1vZGlmaWNhdGlvblRpbWUpID4gc2luY2U7Cit9CisK
K3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8S2V5ZWREZWNvZGVyPiBjcmVhdGVEZWNvZGVyRm9yRmls
ZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7
CisgICAgYXV0byBoYW5kbGUgPSBvcGVuQW5kTG9ja0ZpbGUocGF0aCwgT3BlbkZvclJlYWQpOwor
ICAgIGlmIChoYW5kbGUgPT0gaW52YWxpZFBsYXRmb3JtRmlsZUhhbmRsZSkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICBsb25nIGxvbmcgZmlsZVNpemUgPSAwOworICAgIGlmICghZ2V0
RmlsZVNpemUoaGFuZGxlLCBmaWxlU2l6ZSkpIHsKKyAgICAgICAgdW5sb2NrQW5kQ2xvc2VGaWxl
KGhhbmRsZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBi
eXRlc1RvUmVhZDsKKyAgICBpZiAoIVdURjo6Y29udmVydFNhZmVseShmaWxlU2l6ZSwgYnl0ZXNU
b1JlYWQpKSB7CisgICAgICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOworICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyKGJ5dGVzVG9S
ZWFkKTsKKyAgICBzaXplX3QgdG90YWxCeXRlc1JlYWQgPSByZWFkRnJvbUZpbGUoaGFuZGxlLCBi
dWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKworICAgIHVubG9ja0FuZENsb3NlRmlsZSho
YW5kbGUpOworCisgICAgaWYgKHRvdGFsQnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKQorICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBLZXllZERlY29kZXI6OmRlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyLmRhdGEoKSksIGJ1ZmZlci5zaXpl
KCkpOworfQorCitSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OlJlc291
cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZShXZWJSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzU3RvcmUmIHN0b3JlLCBjb25zdCBTdHJpbmcmIHN0b3JhZ2VEaXJlY3RvcnlQYXRoKQorICAg
IDogbV9tZW1vcnlTdG9yZShzdG9yZSkKKyAgICAsIG1fc3RvcmFnZURpcmVjdG9yeVBhdGgoc3Rv
cmFnZURpcmVjdG9yeVBhdGgpCisgICAgLCBtX2FzeW5jV3JpdGVUaW1lcihSdW5Mb29wOjptYWlu
KCksIHRoaXMsICZSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmFzeW5j
V3JpdGVUaW1lckZpcmVkKQoreworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZTo6aW5pdGlhbGl6ZSgpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01h
aW4oKSk7CisgICAgcG9wdWxhdGVNZW1vcnlTdG9yZUZyb21EaXNrKCk7CisgICAgc3RhcnRNb25p
dG9yaW5nRGlzaygpOworfQorCitSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2U6On5SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoKQoreworICAgIGZp
bmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgpOworICAgIEFTU0VSVCghbV9oYXNQZW5k
aW5nV3JpdGUpOworfQorCitTdHJpbmcgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlOjpzdG9yYWdlRGlyZWN0b3J5UGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc3Rv
cmFnZURpcmVjdG9yeVBhdGguaXNvbGF0ZWRDb3B5KCk7Cit9CisKK1N0cmluZyBSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlc291cmNlTG9nRmlsZVBhdGgoKSBjb25z
dAoreworICAgIFN0cmluZyBzdG9yYWdlUGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7Cisg
ICAgaWYgKHN0b3JhZ2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGVtcHR5U3RyaW5n
KCk7CisKKyAgICByZXR1cm4gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHN0b3JhZ2VQYXRoLCAi
ZnVsbF9icm93c2luZ19zZXNzaW9uX3Jlc291cmNlTG9nLnBsaXN0Iik7Cit9CisKK3ZvaWQgUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpzdGFydE1vbml0b3JpbmdEaXNr
KCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBpZiAobV9maWxlTW9u
aXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RyaW5nIHJlc291cmNlTG9nUGF0aCA9IHJl
c291cmNlTG9nRmlsZVBhdGgoKTsKKyAgICBpZiAocmVzb3VyY2VMb2dQYXRoLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV9maWxlTW9uaXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8
RmlsZU1vbml0b3I+KHJlc291cmNlTG9nUGF0aCwgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVl
dWUoKSwgW3RoaXNdIChGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGUgdHlwZSkgeworICAgICAg
ICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlOjpNb2RpZmljYXRpb246Cisg
ICAgICAgICAgICByZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlzaygpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlOjpSZW1vdmFsOgor
ICAgICAgICAgICAgbV9tZW1vcnlTdG9yZS5jbGVhckluTWVtb3J5KCk7CisgICAgICAgICAgICBt
X2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1vbml0b3JEaXJlY3RvcnlGb3JO
ZXdTdGF0aXN0aWNzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0pOwor
fQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6bW9uaXRv
ckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKQoreworICAgIFN0cmluZyBzdG9yYWdlUGF0aCA9
IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7CisgICAgQVNTRVJUKCFzdG9yYWdlUGF0aC5pc0VtcHR5
KCkpOworCisgICAgaWYgKCFmaWxlRXhpc3RzKHN0b3JhZ2VQYXRoKSkgeworICAgICAgICBpZiAo
IW1ha2VBbGxEaXJlY3RvcmllcyhzdG9yYWdlUGF0aCkpIHsKKyAgICAgICAgICAgIFJFTEVBU0Vf
TE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6IEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IHBhdGggJXMiLCBz
dG9yYWdlUGF0aC51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIG1fZmlsZU1vbml0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpbGVNb25p
dG9yPihzdG9yYWdlUGF0aCwgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKSwgW3RoaXNd
IChGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGUgdHlwZSkgeworICAgICAgICBBU1NFUlQoIVJ1
bkxvb3A6OmlzTWFpbigpKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gRmlsZU1vbml0b3I6OkZpbGVD
aGFuZ2VUeXBlOjpSZW1vdmFsKSB7CisgICAgICAgICAgICAvLyBEaXJlY3Rvcnkgd2FzIHJlbW92
ZWQhCisgICAgICAgICAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXNvdXJjZUxvZ1BhdGggPSByZXNv
dXJjZUxvZ0ZpbGVQYXRoKCk7CisgICAgICAgIEFTU0VSVCghcmVzb3VyY2VMb2dQYXRoLmlzRW1w
dHkoKSk7CisKKyAgICAgICAgaWYgKCFmaWxlRXhpc3RzKHJlc291cmNlTG9nUGF0aCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7CisKKyAg
ICAgICAgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKTsKKyAgICAgICAgc3RhcnRNb25pdG9y
aW5nRGlzaygpOworICAgIH0pOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZTo6c3RvcE1vbml0b3JpbmdEaXNrKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxv
b3A6OmlzTWFpbigpKTsKKyAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKK30KKworLy8gVGhp
cyBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2suCit2b2lkIFJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6cmVmcmVzaE1lbW9yeVN0b3JlRnJvbURp
c2soKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgU3RyaW5nIGZp
bGVQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOworICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIHNvbWV0aW1lcyBzZWUgZmlsZSBjaGFu
Z2VkIGV2ZW50cyBmcm9tIGJlZm9yZSBvdXIgbG9hZCBjb21wbGV0ZWQgKHdlIHN0YXJ0CisgICAg
Ly8gcmVhZGluZyBhdCB0aGUgZmlyc3QgY2hhbmdlIGV2ZW50LCBidXQgd2UgbWlnaHQgcmVjZWl2
ZSBhIHNlcmllcyBvZiBldmVudHMgcmVsYXRlZAorICAgIC8vIHRvIHRoZSBzYW1lIGZpbGUgb3Bl
cmF0aW9uKS4gQ2F0Y2ggdGhpcyBjYXNlIHRvIGF2b2lkIHJlYWRpbmcgb3Zlcmx5IG9mdGVuLgor
ICAgIGlmICghaGFzRmlsZUNoYW5nZWRTaW5jZShmaWxlUGF0aCwgbV9sYXN0U3RhdGlzdGljc0Zp
bGVTeW5jVGltZSkpCisgICAgICAgIHJldHVybjsKKworICAgIFdhbGxUaW1lIHJlYWRUaW1lID0g
V2FsbFRpbWU6Om5vdygpOworCisgICAgYXV0byBkZWNvZGVyID0gY3JlYXRlRGVjb2RlckZvckZp
bGUoZmlsZVBhdGgpOworICAgIGlmICghZGVjb2RlcikKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9tZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURlY29kZXIoKmRlY29kZXIpOworICAgIG1f
bGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSByZWFkVGltZTsKK30KKwordm9pZCBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnBvcHVsYXRlTWVtb3J5U3RvcmVGcm9t
RGlzaygpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBTdHJpbmcg
ZmlsZVBhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7CisgICAgaWYgKGZpbGVQYXRoLmlzRW1w
dHkoKSB8fCAhZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHsKKyAgICAgICAgbV9tZW1vcnlTdG9yZS5n
cmFuZGZhdGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsKKyAgICAgICAgbW9uaXRvckRpcmVjdG9y
eUZvck5ld1N0YXRpc3RpY3MoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgh
aGFzRmlsZUNoYW5nZWRTaW5jZShmaWxlUGF0aCwgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGlt
ZSkpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byBncmFuZGZhdGhlciBpbiB0aGlzIGNhc2UuCisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXYWxsVGltZSByZWFkVGltZSA9IFdhbGxUaW1l
Ojpub3coKTsKKworICAgIGF1dG8gZGVjb2RlciA9IGNyZWF0ZURlY29kZXJGb3JGaWxlKGZpbGVQ
YXRoKTsKKyAgICBpZiAoIWRlY29kZXIpIHsKKyAgICAgICAgbV9tZW1vcnlTdG9yZS5ncmFuZGZh
dGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IEFTU0VSVF9XSVRIX01FU1NBR0UobV9tZW1vcnlTdG9yZS5pc0VtcHR5KCksICJUaGlzIGlzIHRo
ZSBpbml0aWFsIGltcG9ydCBzbyB0aGUgc3RvcmUgc2hvdWxkIGJlIGVtcHR5Iik7CisgICAgbV9t
ZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURlY29kZXIoKmRlY29kZXIpOworCisgICAgbV9s
YXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSA9IHJlYWRUaW1lOworCisgICAgbV9tZW1vcnlTdG9y
ZS5sb2dUZXN0aW5nRXZlbnQoQVNDSUlMaXRlcmFsKCJQb3B1bGF0ZWRXaXRob3V0R3JhbmRmYXRo
ZXJpbmciKSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlOjphc3luY1dyaXRlVGltZXJGaXJlZCgpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFp
bigpKTsKKyAgICBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLmRpc3BhdGNoKFt0aGlz
XSAoKSBtdXRhYmxlIHsKKyAgICAgICAgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOworICAgIH0p
OworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6d3Jp
dGVNZW1vcnlTdG9yZVRvRGlzaygpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7
CisKKyAgICBtX2hhc1BlbmRpbmdXcml0ZSA9IGZhbHNlOworICAgIHN0b3BNb25pdG9yaW5nRGlz
aygpOworCisgICAgYXV0byBlbmNvZGVyID0gbV9tZW1vcnlTdG9yZS5jcmVhdGVFbmNvZGVyRnJv
bURhdGEoKTsKKyAgICBhdXRvIHJhd0RhdGEgPSBlbmNvZGVyLT5maW5pc2hFbmNvZGluZygpOwor
ICAgIGlmICghcmF3RGF0YSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBzdG9yYWdlUGF0
aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7CisgICAgaWYgKCFzdG9yYWdlUGF0aC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgbWFrZUFsbERpcmVjdG9yaWVzKHN0b3JhZ2VQYXRoKTsKKyAgICAgICAg
ZXhjbHVkZUZyb21CYWNrdXAoKTsKKyAgICB9CisKKyAgICBhdXRvIGhhbmRsZSA9IG9wZW5BbmRM
b2NrRmlsZShyZXNvdXJjZUxvZ0ZpbGVQYXRoKCksIE9wZW5Gb3JXcml0ZSk7CisgICAgaWYgKGhh
bmRsZSA9PSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpbnQ2NF90IHdyaXR0ZW5CeXRlcyA9IHdyaXRlVG9GaWxlKGhhbmRsZSwgcmF3RGF0YS0+ZGF0
YSgpLCByYXdEYXRhLT5zaXplKCkpOworICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOwor
CisgICAgaWYgKHdyaXR0ZW5CeXRlcyAhPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihyYXdEYXRhLT5z
aXplKCkpKQorICAgICAgICBSRUxFQVNFX0xPR19FUlJPUihSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
LCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOiBXZSBvbmx5IHdyb3Rl
ICVkIG91dCBvZiAlenUgYnl0ZXMgdG8gZGlzayIsIHN0YXRpY19jYXN0PHVuc2lnbmVkPih3cml0
dGVuQnl0ZXMpLCByYXdEYXRhLT5zaXplKCkpOworCisgICAgbV9sYXN0U3RhdGlzdGljc0ZpbGVT
eW5jVGltZSA9IFdhbGxUaW1lOjpub3coKTsKKyAgICBtX2xhc3RTdGF0aXN0aWNzV3JpdGVUaW1l
ID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisKKyAgICBzdGFydE1vbml0b3JpbmdEaXNrKCk7Cit9
CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpzY2hlZHVs
ZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVkaWF0ZVdyaXRlIGZvcmNlSW1tZWRpYXRlV3Jp
dGUpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBhdXRvIHRpbWVT
aW5jZUxhc3RXcml0ZSA9IE1vbm90b25pY1RpbWU6Om5vdygpIC0gbV9sYXN0U3RhdGlzdGljc1dy
aXRlVGltZTsKKyAgICBpZiAoZm9yY2VJbW1lZGlhdGVXcml0ZSAhPSBGb3JjZUltbWVkaWF0ZVdy
aXRlOjpZZXMgJiYgdGltZVNpbmNlTGFzdFdyaXRlIDwgbWluaW11bVdyaXRlSW50ZXJ2YWwpIHsK
KyAgICAgICAgaWYgKCFtX2hhc1BlbmRpbmdXcml0ZSkgeworICAgICAgICAgICAgbV9oYXNQZW5k
aW5nV3JpdGUgPSB0cnVlOworICAgICAgICAgICAgU2Vjb25kcyBkZWxheSA9IG1pbmltdW1Xcml0
ZUludGVydmFsIC0gdGltZVNpbmNlTGFzdFdyaXRlICsgMV9zOworICAgICAgICAgICAgUnVuTG9v
cDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGRlbGF5XSB7CisgICAgICAgICAgICAgICAgbV9hc3luY1dyaXRlVGltZXIuc3RhcnRPbmVTaG90
KGRlbGF5KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpjbGVhcigpCit7CisgICAgQVNTRVJUKCFS
dW5Mb29wOjppc01haW4oKSk7CisgICAgU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2VMb2dGaWxl
UGF0aCgpOworICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHN0b3BNb25pdG9yaW5nRGlzaygpOworCisgICAgaWYgKCFkZWxldGVGaWxlKGZpbGVQYXRo
KSkKKyAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVzb3VyY2VMb2FkU3RhdGlzdGljcywgIlJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTogVW5hYmxlIHRvIGRlbGV0ZSBz
dGF0aXN0aWNzIGZpbGU6ICVzIiwgZmlsZVBhdGgudXRmOCgpLmRhdGEoKSk7Cit9CisKK3ZvaWQg
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpmaW5pc2hBbGxQZW5kaW5n
V29ya1N5bmNocm9ub3VzbHkoKQoreworICAgIG1fYXN5bmNXcml0ZVRpbWVyLnN0b3AoKTsKKwor
ICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgLy8gTWFrZSBzdXJlIGFueSBwZW5k
aW5nIHdvcmsgaW4gb3VyIHF1ZXVlIGlzIGZpbmlzaGVkIGJlZm9yZSB3ZSB0ZXJtaW5hdGUuCisg
ICAgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKS5kaXNwYXRjaChbJnNlbWFwaG9yZSwg
dGhpc10geworICAgICAgICAvLyBXcml0ZSBmaW5hbCBmaWxlIHN0YXRlIHRvIGRpc2suCisgICAg
ICAgIGlmIChtX2hhc1BlbmRpbmdXcml0ZSkKKyAgICAgICAgICAgIHdyaXRlTWVtb3J5U3RvcmVU
b0Rpc2soKTsKKyAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOworICAgIH0pOworICAgIHNlbWFw
aG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlZigpCit7CisgICAgbV9tZW1vcnlTdG9yZS5y
ZWYoKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OmRlcmVmKCkKK3sKKyAgICBtX21lbW9yeVN0b3JlLmRlcmVmKCk7Cit9CisKKyNpZiAhUExBVEZP
Uk0oSU9TKQordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmV4
Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKK3sKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBX
ZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzVkMmVk
NGJjNjkzYmExZWEyMTk0MmU0MDNjZDEzNmQ0ZTc2NzI1YwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lu
Y2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL01vbm90b25pY1RpbWUuaD4KKyNp
bmNsdWRlIDx3dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi9XYWxsVGltZS5oPgorI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBG
aWxlTW9uaXRvcjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYlJlc291cmNl
TG9hZFN0YXRpc3RpY3NTdG9yZTsKKworY2xhc3MgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlIHsKK3B1YmxpYzoKKyAgICBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UoV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiwgY29uc3QgU3RyaW5n
JiBzdG9yYWdlRGlyZWN0b3J5UGF0aCk7CisgICAgflJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZSgpOworCisgICAgdm9pZCBpbml0aWFsaXplKCk7CisgICAgdm9pZCBjbGVh
cigpOworCisgICAgdm9pZCBmaW5pc2hBbGxQZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKTsKKwor
ICAgIHZvaWQgcmVmKCk7CisgICAgdm9pZCBkZXJlZigpOworCisgICAgZW51bSBjbGFzcyBGb3Jj
ZUltbWVkaWF0ZVdyaXRlIHsKKyAgICAgICAgTm8sCisgICAgICAgIFllcywKKyAgICB9OworICAg
IHZvaWQgc2NoZWR1bGVPcldyaXRlTWVtb3J5U3RvcmUoRm9yY2VJbW1lZGlhdGVXcml0ZSk7CisK
K3ByaXZhdGU6CisgICAgU3RyaW5nIHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCkgY29uc3Q7CisgICAg
U3RyaW5nIHJlc291cmNlTG9nRmlsZVBhdGgoKSBjb25zdDsKKworICAgIHZvaWQgc3RhcnRNb25p
dG9yaW5nRGlzaygpOworICAgIHZvaWQgc3RvcE1vbml0b3JpbmdEaXNrKCk7CisgICAgdm9pZCBt
b25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygpOworCisgICAgdm9pZCB3cml0ZU1lbW9y
eVN0b3JlVG9EaXNrKCk7CisgICAgdm9pZCBwb3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKTsK
KyAgICB2b2lkIGV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3Q7CisgICAgdm9pZCByZWZyZXNoTWVt
b3J5U3RvcmVGcm9tRGlzaygpOworICAgIHZvaWQgYXN5bmNXcml0ZVRpbWVyRmlyZWQoKTsKKwor
ICAgIFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9yZSYgbV9tZW1vcnlTdG9yZTsKKyAgICBj
b25zdCBTdHJpbmcgbV9zdG9yYWdlRGlyZWN0b3J5UGF0aDsKKyAgICBSdW5Mb29wOjpUaW1lcjxS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U+IG1fYXN5bmNXcml0ZVRpbWVy
OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpGaWxlTW9uaXRvcj4gbV9maWxlTW9uaXRv
cjsKKyAgICBXYWxsVGltZSBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lOworICAgIE1vbm90
b25pY1RpbWUgbV9sYXN0U3RhdGlzdGljc1dyaXRlVGltZTsKKyAgICBib29sIG1faGFzUGVuZGlu
Z1dyaXRlIHsgZmFsc2UgfTsKK307CisKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDU5OGEzYmQ2ODkwZTUzZDkxYzM5MDRjOTk3OWU5MWRhZTQ1NTA1MTEu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwg
MjAxMCwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZS5oIgotCi0j
aW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCi0jaW5jbHVkZSA8V2ViQ29y
ZS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KLSNp
bmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVRyYW5zYWN0aW9uLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9T
ZWN1cml0eU9yaWdpbi5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvU3VkZGVuVGVybWluYXRpb24uaD4KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hh
c2guaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KLQotdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Ci0KLXN0YXRpYyBjb25zdCBhdXRvIGRhdGFiYXNlVXBkYXRlSW50ZXJ2YWwgPSAx
X3M7Ci0KLXN0YXRpYyBjb25zdCBpbnQgbWF4aW11bUl0ZW1zVG9VcGRhdGUgPSAxMDA7Ci0KLW5h
bWVzcGFjZSBXZWJLaXQgewotCi1SZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IExvY2FsU3RvcmFn
ZURhdGFiYXNlOjpjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiBxdWV1ZSwgUmVmPExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcj4mJiB0cmFja2VyLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNl
Y3VyaXR5T3JpZ2luKQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IExvY2FsU3RvcmFnZURh
dGFiYXNlKFdURk1vdmUocXVldWUpLCBXVEZNb3ZlKHRyYWNrZXIpLCBzZWN1cml0eU9yaWdpbikp
OwotfQotCi1Mb2NhbFN0b3JhZ2VEYXRhYmFzZTo6TG9jYWxTdG9yYWdlRGF0YWJhc2UoUmVmPFdv
cmtRdWV1ZT4mJiBxdWV1ZSwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiB0cmFj
a2VyLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotICAgIDogbV9x
dWV1ZShXVEZNb3ZlKHF1ZXVlKSkKLSAgICAsIG1fdHJhY2tlcihXVEZNb3ZlKHRyYWNrZXIpKQot
ICAgICwgbV9zZWN1cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbikKLSAgICAsIG1fZGF0YWJhc2VQ
YXRoKG1fdHJhY2tlci0+ZGF0YWJhc2VQYXRoKG1fc2VjdXJpdHlPcmlnaW4pKQotICAgICwgbV9m
YWlsZWRUb09wZW5EYXRhYmFzZShmYWxzZSkKLSAgICAsIG1fZGlkSW1wb3J0SXRlbXMoZmFsc2Up
Ci0gICAgLCBtX2lzQ2xvc2VkKGZhbHNlKQotICAgICwgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBk
YXRlKGZhbHNlKQotICAgICwgbV9zaG91bGRDbGVhckl0ZW1zKGZhbHNlKQotewotfQotCi1Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZTo6fkxvY2FsU3RvcmFnZURhdGFiYXNlKCkKLXsKLSAgICBBU1NFUlQo
bV9pc0Nsb3NlZCk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Om9wZW5EYXRhYmFz
ZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCi17Ci0gICAgQVNTRVJU
KCFtX2RhdGFiYXNlLmlzT3BlbigpKTsKLSAgICBBU1NFUlQoIW1fZmFpbGVkVG9PcGVuRGF0YWJh
c2UpOwotCi0gICAgaWYgKCF0cnlUb09wZW5EYXRhYmFzZShvcGVuaW5nU3RyYXRlZ3kpKSB7Ci0g
ICAgICAgIG1fZmFpbGVkVG9PcGVuRGF0YWJhc2UgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIG1fdHJhY2tlci0+
ZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKTsKLX0KLQotYm9vbCBM
b2NhbFN0b3JhZ2VEYXRhYmFzZTo6dHJ5VG9PcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3Ry
YXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQotewotICAgIGlmICghZmlsZUV4aXN0cyhtX2RhdGFiYXNl
UGF0aCkgJiYgb3BlbmluZ1N0cmF0ZWd5ID09IFNraXBJZk5vbkV4aXN0ZW50KQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2RhdGFiYXNlUGF0aC5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgTE9HX0VSUk9SKCJGaWxlbmFtZSBmb3IgbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSBpcyBlbXB0
eSAtIGNhbm5vdCBvcGVuIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UiKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKG1fZGF0YWJhc2VQYXRo
KSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGZpbGUgJXMg
Zm9yIGxvY2FsIHN0b3JhZ2UiLCBtX2RhdGFiYXNlUGF0aC51dGY4KCkuZGF0YSgpKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0
IGJvdW5kIHRvIGEgc3BlY2lmaWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhyZWFkaW5n
IGNoZWNrcwotICAgIC8vIGV2ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUgZGF0YWJhc2Ug
ZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KLSAgICBtX2RhdGFiYXNlLmRp
c2FibGVUaHJlYWRpbmdDaGVja3MoKTsKLQotICAgIGlmICghbWlncmF0ZUl0ZW1UYWJsZUlmTmVl
ZGVkKCkpIHsKLSAgICAgICAgLy8gV2UgZmFpbGVkIHRvIG1pZ3JhdGUgdGhlIGl0ZW0gdGFibGUu
IEluIG9yZGVyIHRvIGF2b2lkIHRyeWluZyB0byBtaWdyYXRlIHRoZSB0YWJsZSBvdmVyIGFuZCBv
dmVyLAotICAgICAgICAvLyBqdXN0IGRlbGV0ZSBpdCBhbmQgc3RhcnQgZnJvbSBzY3JhdGNoLgot
ICAgICAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkRST1AgVEFCTEUgSXRlbVRh
YmxlIikpCi0gICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBkZWxldGUgdGFibGUgSXRl
bVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAgfQotCi0gICAgaWYgKCFtX2RhdGFiYXNl
LmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBJdGVtVGFibGUgKGtl
eSBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCB2YWx1ZSBCTE9CIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwpIikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRl
IHRhYmxlIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTG9jYWxTdG9yYWdlRGF0
YWJhc2U6Om1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgpCi17Ci0gICAgaWYgKCFtX2RhdGFiYXNl
LnRhYmxlRXhpc3RzKCJJdGVtVGFibGUiKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBT
UUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCB2YWx1ZSBGUk9NIEl0ZW1U
YWJsZSBMSU1JVCAxIik7Ci0KLSAgICAvLyBUaGlzIHF1ZXJ5IGlzbid0IGV2ZXIgZXhlY3V0ZWQs
IGl0J3MganVzdCB1c2VkIHRvIGNoZWNrIHRoZSBjb2x1bW4gdHlwZS4KLSAgICBpZiAocXVlcnku
aXNDb2x1bW5EZWNsYXJlZEFzQmxvYigwKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAv
LyBDcmVhdGUgYSBuZXcgdGFibGUgd2l0aCB0aGUgcmlnaHQgdHlwZSwgY29weSBhbGwgdGhlIGRh
dGEgb3ZlciB0byBpdCBhbmQgdGhlbiByZXBsYWNlIHRoZSBuZXcgdGFibGUgd2l0aCB0aGUgb2xk
IHRhYmxlLgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0gewotICAgICAgICAi
RFJPUCBUQUJMRSBJRiBFWElTVFMgSXRlbVRhYmxlMiIsCi0gICAgICAgICJDUkVBVEUgVEFCTEUg
SXRlbVRhYmxlMiAoa2V5IFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHZhbHVlIEJM
T0IgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCkiLAotICAgICAgICAiSU5TRVJUIElOVE8gSXRl
bVRhYmxlMiBTRUxFQ1QgKiBmcm9tIEl0ZW1UYWJsZSIsCi0gICAgICAgICJEUk9QIFRBQkxFIEl0
ZW1UYWJsZSIsCi0gICAgICAgICJBTFRFUiBUQUJMRSBJdGVtVGFibGUyIFJFTkFNRSBUTyBJdGVt
VGFibGUiLAotICAgICAgICAwLAotICAgIH07Ci0KLSAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFu
c2FjdGlvbihtX2RhdGFiYXNlLCBmYWxzZSk7Ci0gICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKLQot
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBjb21tYW5kc1tpXTsgKytpKSB7Ci0gICAgICAgIGlmICht
X2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmRzW2ldKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG1pZ3JhdGUgdGFibGUgSXRlbVRh
YmxlIGZvciBsb2NhbCBzdG9yYWdlIHdoZW4gZXhlY3V0aW5nOiAlcyIsIGNvbW1hbmRzW2ldKTsK
LSAgICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmltcG9ydEl0ZW1zKFN0b3JhZ2VNYXAmIHN0
b3JhZ2VNYXApCi17Ci0gICAgaWYgKG1fZGlkSW1wb3J0SXRlbXMpCi0gICAgICAgIHJldHVybjsK
LQotICAgIC8vIEZJWE1FOiBJZiBpdCBjYW4ndCBpbXBvcnQsIHRoZW4gdGhlIGRlZmF1bHQgV2Vi
S2l0IGJlaGF2aW9yIHNob3VsZCBiZSB0aGF0IG9mIHByaXZhdGUgYnJvd3NpbmcsCi0gICAgLy8g
bm90IHNpbGVudGx5IGlnbm9yaW5nIGl0LiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjU4OTQKLQotICAgIC8vIFdlIHNldCB0aGlzIHRvIHRydWUgZXZlbiBpZiB3ZSBk
b24ndCBlbmQgdXAgaW1wb3J0aW5nIGFueSBpdGVtcyBkdWUgdG8gZmFpbHVyZSBiZWNhdXNlCi0g
ICAgLy8gdGhlcmUncyByZWFsbHkgbm8gZ29vZCB3YXkgdG8gcmVjb3ZlciBvdGhlciB0aGFuIG5v
dCBpbXBvcnRpbmcgYW55dGhpbmcuCi0gICAgbV9kaWRJbXBvcnRJdGVtcyA9IHRydWU7Ci0KLSAg
ICBvcGVuRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOwotICAgIGlmICghbV9kYXRhYmFzZS5p
c09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1f
ZGF0YWJhc2UsICJTRUxFQ1Qga2V5LCB2YWx1ZSBGUk9NIEl0ZW1UYWJsZSIpOwotICAgIGlmIChx
dWVyeS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIHNlbGVjdCBpdGVtcyBmcm9tIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaXRlbXM7
Ci0KLSAgICBpbnQgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOwotICAgIHdoaWxlIChyZXN1bHQgPT0g
U1FMSVRFX1JPVykgewotICAgICAgICBTdHJpbmcga2V5ID0gcXVlcnkuZ2V0Q29sdW1uVGV4dCgw
KTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDEp
OwotICAgICAgICBpZiAoIWtleS5pc051bGwoKSAmJiAhdmFsdWUuaXNOdWxsKCkpCi0gICAgICAg
ICAgICBpdGVtcy5zZXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJlc3VsdCA9IHF1ZXJ5LnN0ZXAo
KTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7Ci0gICAgICAgIExP
R19FUlJPUigiRXJyb3IgcmVhZGluZyBpdGVtcyBmcm9tIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3Rv
cmFnZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RvcmFnZU1hcC5pbXBvcnRJ
dGVtcyhpdGVtcyk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnNldEl0ZW0oY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgaXRlbURpZENoYW5n
ZShrZXksIHZhbHVlKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6cmVtb3ZlSXRl
bShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBpdGVtRGlkQ2hhbmdlKGtleSwgU3RyaW5nKCkp
OwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpjbGVhcigpCi17Ci0gICAgbV9jaGFu
Z2VkSXRlbXMuY2xlYXIoKTsKLSAgICBtX3Nob3VsZENsZWFySXRlbXMgPSB0cnVlOwotCi0gICAg
c2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNl
OjpjbG9zZSgpCi17Ci0gICAgQVNTRVJUKCFtX2lzQ2xvc2VkKTsKLSAgICBtX2lzQ2xvc2VkID0g
dHJ1ZTsKLQotICAgIGlmIChtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUpIHsKLSAgICAgICAg
dXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKG1fY2hhbmdlZEl0ZW1zKTsKLSAgICAgICAg
bV9jaGFuZ2VkSXRlbXMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBib29sIGlzRW1wdHkgPSBkYXRh
YmFzZUlzRW1wdHkoKTsKLQotICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICBt
X2RhdGFiYXNlLmNsb3NlKCk7Ci0KLSAgICBpZiAoaXNFbXB0eSkKLSAgICAgICAgbV90cmFja2Vy
LT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4obV9zZWN1cml0eU9yaWdpbik7Ci19Ci0KLXZvaWQg
TG9jYWxTdG9yYWdlRGF0YWJhc2U6Oml0ZW1EaWRDaGFuZ2UoY29uc3QgU3RyaW5nJiBrZXksIGNv
bnN0IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgbV9jaGFuZ2VkSXRlbXMuc2V0KGtleSwgdmFsdWUp
OwotICAgIHNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VE
YXRhYmFzZTo6c2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpCi17Ci0gICAgaWYgKG1fZGlkU2NoZWR1
bGVEYXRhYmFzZVVwZGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFtX2Rpc2FibGVT
dWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlKQotICAgICAgICBtX2Rp
c2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlID0gc3RkOjpt
YWtlX3VuaXF1ZTxTdWRkZW5UZXJtaW5hdGlvbkRpc2FibGVyPigpOwotCi0gICAgbV9kaWRTY2hl
ZHVsZURhdGFiYXNlVXBkYXRlID0gdHJ1ZTsKLQotICAgIFJlZlB0cjxMb2NhbFN0b3JhZ2VEYXRh
YmFzZT4gbG9jYWxTdG9yYWdlRGF0YWJhc2UodGhpcyk7Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2hB
ZnRlcihkYXRhYmFzZVVwZGF0ZUludGVydmFsLCBbbG9jYWxTdG9yYWdlRGF0YWJhc2VdIHsKLSAg
ICAgICAgbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnVwZGF0ZURhdGFiYXNlKCk7Ci0gICAgfSk7Ci19
Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnVwZGF0ZURhdGFiYXNlKCkKLXsKLSAgICBp
ZiAobV9pc0Nsb3NlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKG1fZGlkU2NoZWR1
bGVEYXRhYmFzZVVwZGF0ZSk7Ci0gICAgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlID0gZmFs
c2U7Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBjaGFuZ2VkSXRlbXM7Ci0gICAgaWYg
KG1fY2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBtYXhpbXVtSXRlbXNUb1VwZGF0ZSkgewotICAgICAg
ICAvLyBUaGVyZSBhcmUgZmV3IGVub3VnaCBjaGFuZ2VkIGl0ZW1zIHRoYXQgd2UgY2FuIGp1c3Qg
YWx3YXlzIHdyaXRlIGFsbCBvZiB0aGVtLgotICAgICAgICBtX2NoYW5nZWRJdGVtcy5zd2FwKGNo
YW5nZWRJdGVtcyk7Ci0gICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjaGFu
Z2VkSXRlbXMpOwotICAgICAgICBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGlu
Z1RvTG9jYWxTdG9yYWdlID0gbnVsbHB0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG1heGltdW1JdGVtc1RvVXBkYXRlOyArK2kpIHsKLSAgICAgICAgICAgIGF1
dG8gaXQgPSBtX2NoYW5nZWRJdGVtcy5iZWdpbigpOwotICAgICAgICAgICAgY2hhbmdlZEl0ZW1z
LmFkZChpdC0+a2V5LCBpdC0+dmFsdWUpOwotCi0gICAgICAgICAgICBtX2NoYW5nZWRJdGVtcy5y
ZW1vdmUoaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUKGNoYW5nZWRJdGVtcy5zaXpl
KCkgPD0gbWF4aW11bUl0ZW1zVG9VcGRhdGUpOwotCi0gICAgICAgIC8vIFJlc2NoZWR1bGUgdGhl
IHVwZGF0ZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcy4KLSAgICAgICAgc2NoZWR1bGVEYXRhYmFz
ZVVwZGF0ZSgpOwotICAgICAgICB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMoY2hhbmdl
ZEl0ZW1zKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnVwZGF0ZURh
dGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgY2hh
bmdlZEl0ZW1zKQotewotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgb3Bl
bkRhdGFiYXNlKENyZWF0ZUlmTm9uRXhpc3RlbnQpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09w
ZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fc2hvdWxkQ2xlYXJJdGVtcykgewot
ICAgICAgICBtX3Nob3VsZENsZWFySXRlbXMgPSBmYWxzZTsKLQotICAgICAgICBTUUxpdGVTdGF0
ZW1lbnQgY2xlYXJTdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIEl0ZW1UYWJsZSIp
OwotICAgICAgICBpZiAoY2xlYXJTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewot
ICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBjbGVhciBzdGF0ZW1lbnQg
LSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIpOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlc3VsdCA9IGNsZWFyU3RhdGVtZW50
LnN0ZXAoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY2xlYXIgYWxsIGl0ZW1zIGluIHRoZSBsb2NhbCBzdG9y
YWdlIGRhdGFiYXNlIC0gJWkiLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgU1FMaXRlU3RhdGVtZW50IGluc2VydFN0YXRlbWVudChtX2RhdGFi
YXNlLCAiSU5TRVJUIElOVE8gSXRlbVRhYmxlIFZBTFVFUyAoPywgPykiKTsKLSAgICBpZiAoaW5z
ZXJ0U3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gcHJlcGFyZSBpbnNlcnQgc3RhdGVtZW50IC0gY2Fubm90IHdyaXRlIHRvIGxv
Y2FsIHN0b3JhZ2UgZGF0YWJhc2UiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNR
TGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIEl0
ZW1UYWJsZSBXSEVSRSBrZXk9PyIpOwotICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgp
ICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGRl
bGV0ZSBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNh
Y3Rpb24obV9kYXRhYmFzZSk7Ci0gICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKLQotICAgIGZvciAo
YXV0byBpdCA9IGNoYW5nZWRJdGVtcy5iZWdpbigpLCBlbmQgPSBjaGFuZ2VkSXRlbXMuZW5kKCk7
IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAvLyBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCB0
aGUga2V5L3ZhbHVlIHBhaXIgc2hvdWxkIGJlIGRlbGV0ZWQuCi0gICAgICAgIFNRTGl0ZVN0YXRl
bWVudCYgc3RhdGVtZW50ID0gaXQtPnZhbHVlLmlzTnVsbCgpID8gZGVsZXRlU3RhdGVtZW50IDog
aW5zZXJ0U3RhdGVtZW50OwotCi0gICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBpdC0+a2V5
KTsKLQotICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYSBrZXkvdmFsdWUgcGFpciwgYmlu
ZCB0aGUgdmFsdWUgYXMgd2VsbC4KLSAgICAgICAgaWYgKCFpdC0+dmFsdWUuaXNOdWxsKCkpCi0g
ICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEJsb2IoMiwgaXQtPnZhbHVlKTsKLQotICAgICAgICBp
bnQgcmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJ
VEVfRE9ORSkgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIGl0ZW0g
aW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgLSAlaSIsIHJlc3VsdCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRlbWVudC5yZXNldCgpOwotICAgIH0K
LQotICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOwotfQotCi1ib29sIExvY2FsU3RvcmFnZURhdGFi
YXNlOjpkYXRhYmFzZUlzRW1wdHkoKQotewotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGF0
YWJhc2UsICJTRUxFQ1QgQ09VTlQoKikgRlJPTSBJdGVtVGFibGUiKTsKLSAgICBpZiAocXVlcnku
cHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBj
b3VudCBudW1iZXIgb2Ygcm93cyBpbiBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCByZXN1bHQgPSBxdWVyeS5zdGVw
KCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfUk9XKSB7Ci0gICAgICAgIExPR19FUlJPUigi
Tm8gcmVzdWx0cyB3aGVuIGNvdW50aW5nIG51bWJlciBvZiByb3dzIGluIEl0ZW1UYWJsZSBmb3Ig
bG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0
dXJuICFxdWVyeS5nZXRDb2x1bW5JbnQoMCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VE
YXRhYmFzZS5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VE
YXRhYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTkyMDMxZjQ0OGZiM2Q5
MTU4MDE4NmQ4ODYwYTEyZDg0ODU5NTYyLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9y
YWdlRGF0YWJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0g
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0g
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvU1FM
aXRlRGF0YWJhc2UuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgot
I2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KLSNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+
Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFz
cyBTZWN1cml0eU9yaWdpbjsKLWNsYXNzIFN0b3JhZ2VNYXA7Ci1jbGFzcyBTdWRkZW5UZXJtaW5h
dGlvbkRpc2FibGVyOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyOwotCi1jbGFzcyBMb2NhbFN0b3JhZ2VEYXRhYmFzZSA6IHB1Ymxp
YyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gewotcHVibGljOgot
ICAgIHN0YXRpYyBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IGNyZWF0ZShSZWY8V29ya1F1ZXVl
PiYmLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmLCBjb25zdCBXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGEmKTsKLSAgICB+TG9jYWxTdG9yYWdlRGF0YWJhc2UoKTsKLQotICAg
IC8vIFdpbGwgYmxvY2sgdW50aWwgdGhlIGltcG9ydCBpcyBjb21wbGV0ZS4KLSAgICB2b2lkIGlt
cG9ydEl0ZW1zKFdlYkNvcmU6OlN0b3JhZ2VNYXAmKTsKLQotICAgIHZvaWQgc2V0SXRlbShjb25z
dCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7Ci0gICAgdm9pZCByZW1vdmVJdGVt
KGNvbnN0IFN0cmluZyYga2V5KTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAvLyBXaWxsIGJs
b2NrIHVudGlsIGFsbCBwZW5kaW5nIGNoYW5nZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gZGlzay4K
LSAgICB2b2lkIGNsb3NlKCk7Ci0KLXByaXZhdGU6Ci0gICAgTG9jYWxTdG9yYWdlRGF0YWJhc2Uo
UmVmPFdvcmtRdWV1ZT4mJiwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiwgY29u
c3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7Ci0KLSAgICBlbnVtIERhdGFiYXNlT3Bl
bmluZ1N0cmF0ZWd5IHsKLSAgICAgICAgQ3JlYXRlSWZOb25FeGlzdGVudCwKLSAgICAgICAgU2tp
cElmTm9uRXhpc3RlbnQKLSAgICB9OwotICAgIGJvb2wgdHJ5VG9PcGVuRGF0YWJhc2UoRGF0YWJh
c2VPcGVuaW5nU3RyYXRlZ3kpOwotICAgIHZvaWQgb3BlbkRhdGFiYXNlKERhdGFiYXNlT3Blbmlu
Z1N0cmF0ZWd5KTsKLQotICAgIGJvb2wgbWlncmF0ZUl0ZW1UYWJsZUlmTmVlZGVkKCk7Ci0KLSAg
ICB2b2lkIGl0ZW1EaWRDaGFuZ2UoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUpOwotCi0gICAgdm9pZCBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7Ci0gICAgdm9pZCB1cGRh
dGVEYXRhYmFzZSgpOwotICAgIHZvaWQgdXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNv
bnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+Jik7Ci0KLSAgICBib29sIGRhdGFiYXNlSXNFbXB0
eSgpOwotCi0gICAgUmVmPFdvcmtRdWV1ZT4gbV9xdWV1ZTsKLSAgICBSZWY8TG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyPiBtX3RyYWNrZXI7Ci0gICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5E
YXRhIG1fc2VjdXJpdHlPcmlnaW47Ci0KLSAgICBTdHJpbmcgbV9kYXRhYmFzZVBhdGg7Ci0gICAg
V2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKLSAgICBib29sIG1fZmFpbGVkVG9P
cGVuRGF0YWJhc2U7Ci0gICAgYm9vbCBtX2RpZEltcG9ydEl0ZW1zOwotICAgIGJvb2wgbV9pc0Ns
b3NlZDsKLQotICAgIGJvb2wgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlOwotICAgIGJvb2wg
bV9zaG91bGRDbGVhckl0ZW1zOwotICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1fY2hhbmdl
ZEl0ZW1zOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlN1ZGRlblRlcm1pbmF0aW9u
RGlzYWJsZXI+IG1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0
b3JhZ2U7Ci19OwotCi0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3Bw
IGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIyMjlmNmI1Mzc0YTc3
NDYzYWFmOWI0NjRjZTkzNmEwNGFjYzJiLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkxvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlci5oIgotCi0jaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVGaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9TUUxpdGVTdGF0ZW1lbnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL1RleHRFbmNvZGluZy5oPgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVk
ZSA8d3RmL1J1bkxvb3AuaD4KLSNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNw
YWNlIFdlYktpdCB7Ci0KLVJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IExvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0
IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQotewotICAgIHJldHVybiBhZG9wdFJlZigq
bmV3IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcihXVEZNb3ZlKHF1ZXVlKSwgbG9jYWxTdG9y
YWdlRGlyZWN0b3J5KSk7Ci19Ci0KLUxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6TG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmlu
ZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQotICAgIDogbV9xdWV1ZShXVEZNb3ZlKHF1ZXVlKSkK
LSAgICAsIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KGxvY2FsU3RvcmFnZURpcmVjdG9yeS5pc29s
YXRlZENvcHkoKSkKLXsKLSAgICBBU1NFUlQoIW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5LmlzRW1w
dHkoKSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIGlzIGluaXRpYWxpemVkIGJl
Zm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0aGluZ3MgdG8gdGhlIHF1ZXVlLgotICAgIFVURjhF
bmNvZGluZygpOwotCi0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBtYWtl
UmVmKCp0aGlzKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgcHJvdGVjdGVkVGhpcy0+aW1wb3J0T3Jp
Z2luSWRlbnRpZmllcnMoKTsKLSAgICB9KTsKLX0KLQotTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKCkKLXsKLX0KLQotU3RyaW5nIExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VQYXRoKGNvbnN0IFNlY3VyaXR5T3JpZ2lu
RGF0YSYgc2VjdXJpdHlPcmlnaW4pIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRhdGFiYXNlUGF0aChz
ZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIubG9jYWxzdG9yYWdlIik7Ci19
Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkaWRPcGVuRGF0YWJhc2VXaXRo
T3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAg
YWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlk
ZW50aWZpZXIoKSwgZGF0YWJhc2VQYXRoKHNlY3VyaXR5T3JpZ2luKSk7Ci19Ci0KLXZvaWQgTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29uc3Qg
U2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKLXsKLSAgICByZW1vdmVEYXRhYmFz
ZVdpdGhPcmlnaW5JZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmRhdGFiYXNlSWRlbnRpZmllcigp
KTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFi
YXNlcygpCi17Ci0gICAgbV9vcmlnaW5zLmNsZWFyKCk7Ci0KLSAgICBvcGVuVHJhY2tlckRhdGFi
YXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIlNFTEVDVCBvcmlnaW4sIHBhdGggRlJPTSBPcmlnaW5zIik7Ci0gICAgaWYgKHN0YXRlbWVu
dC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IHByZXBhcmUgc3RhdGVtZW50LiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50
IHJlc3VsdDsKLSAgICB3aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTElU
RV9ST1cpIHsKLSAgICAgICAgZGVsZXRlRmlsZShzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKSk7
Ci0KLSAgICAgICAgLy8gRklYTUU6IENhbGwgb3V0IHRvIHRoZSBjbGllbnQuCi0gICAgfQotCi0g
ICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQg
dG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKLQotICAgIGlmICht
X2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7Ci0KLSAgICBp
ZiAoIWRlbGV0ZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKSkgewotICAgICAgICAvLyBJbiB0
aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBm
aWxlIChlLmcgc29tZSBvdGhlciBwcm9ncmFtCi0gICAgICAgIC8vIGxpa2UgYSB2aXJ1cyBzY2Fu
bmVyIGlzIGFjY2Vzc2luZyBpdCksIG1ha2Ugc3VyZSB0byByZW1vdmUgYWxsIGVudHJpZXMuCi0g
ICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOwotICAgICAgICBp
ZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAg
U1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00g
T3JpZ2lucyIpOwotICAgICAgICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJ
VEVfT0spIHsKLSAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRp
b24gb2YgYWxsIG9yaWdpbnMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGFsbCBvcmlnaW5zIik7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGVFbXB0
eURpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSk7Ci19Ci0KLXN0YXRpYyBzdGQ6Om9w
dGlvbmFsPHRpbWVfdD4gZmlsZUNyZWF0aW9uVGltZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQot
ewotICAgIHRpbWVfdCB0aW1lOwotICAgIHJldHVybiBnZXRGaWxlQ3JlYXRpb25UaW1lKGZpbGVQ
YXRoLCB0aW1lKSA/IHRpbWUgOiBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4oc3RkOjpudWxsb3B0KTsK
LX0KLQotc3RhdGljIHN0ZDo6b3B0aW9uYWw8dGltZV90PiBmaWxlTW9kaWZpY2F0aW9uVGltZShj
b25zdCBTdHJpbmcmIGZpbGVQYXRoKQotewotICAgIHRpbWVfdCB0aW1lOwotICAgIGlmICghZ2V0
RmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgsIHRpbWUpKQotICAgICAgICByZXR1cm4gc3Rk
OjpudWxsb3B0OwotCi0gICAgcmV0dXJuIHRpbWU7Ci19Ci0KLVZlY3RvcjxTZWN1cml0eU9yaWdp
bkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VzTW9kaWZp
ZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUpCi17Ci0g
ICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgaW1wb3J0T3JpZ2luSWRlbnRpZmll
cnMoKTsKLSAgICBWZWN0b3I8U3RyaW5nPiBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlOwotCi0g
ICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbiA6IG1fb3JpZ2lucykgewotICAgICAgICBTdHJp
bmcgZmlsZVBhdGggPSBwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW4p
OwotCi0gICAgICAgIGF1dG8gbW9kaWZpY2F0aW9uVGltZSA9IGZpbGVNb2RpZmljYXRpb25UaW1l
KGZpbGVQYXRoKTsKLSAgICAgICAgaWYgKCFtb2RpZmljYXRpb25UaW1lKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgaWYgKG1vZGlmaWNhdGlvblRpbWUudmFsdWUoKSA+PSBzdGQ6
OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QodGltZSkpCi0gICAgICAgICAgICBvcmln
aW5JZGVudGlmaWVyc1RvRGVsZXRlLmFwcGVuZChvcmlnaW4pOwotICAgIH0KLQotICAgIFZlY3Rv
cjxTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7Ci0gICAgZGVsZXRl
ZERhdGFiYXNlT3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG9yaWdpbklkZW50aWZpZXJz
VG9EZWxldGUuc2l6ZSgpKTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luSWRlbnRpZmll
ciA6IG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUpIHsKLSAgICAgICAgcmVtb3ZlRGF0YWJhc2VX
aXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKLQotICAgICAgICBpZiAoYXV0
byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3Jp
Z2luSWRlbnRpZmllcikpCi0gICAgICAgICAgICBkZWxldGVkRGF0YWJhc2VPcmlnaW5zLnVuY2hl
Y2tlZEFwcGVuZCgqb3JpZ2luKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7
Ci19Ci0KLVZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlcjo6b3JpZ2lucygpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4g
b3JpZ2luczsKLSAgICBvcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9vcmlnaW5zLnNp
emUoKSk7Ci0KLSAgICBmb3IgKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA6IG1fb3Jp
Z2lucykgewotICAgICAgICBpZiAoYXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZy
b21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcikpCi0gICAgICAgICAgICBvcmln
aW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9yaWdpbnM7Ci19Ci0K
LVZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+IExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2luRGV0YWlscygpCi17Ci0gICAgVmVjdG9yPE9y
aWdpbkRldGFpbHM+IHJlc3VsdDsKLSAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSht
X29yaWdpbnMuc2l6ZSgpKTsKLQotICAgIGZvciAoY29uc3QgU3RyaW5nJiBvcmlnaW4gOiBtX29y
aWdpbnMpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9y
aWdpbklkZW50aWZpZXIob3JpZ2luKTsKLQotICAgICAgICBPcmlnaW5EZXRhaWxzIGRldGFpbHM7
Ci0gICAgICAgIGRldGFpbHMub3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi5pc29sYXRlZENvcHko
KTsKLSAgICAgICAgZGV0YWlscy5jcmVhdGlvblRpbWUgPSBmaWxlQ3JlYXRpb25UaW1lKGZpbGVQ
YXRoKTsKLSAgICAgICAgZGV0YWlscy5tb2RpZmljYXRpb25UaW1lID0gZmlsZU1vZGlmaWNhdGlv
blRpbWUoZmlsZVBhdGgpOwotICAgICAgICByZXN1bHQudW5jaGVja2VkQXBwZW5kKGRldGFpbHMp
OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVN0cmluZyBMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVuYW1lKSBjb25z
dAotewotICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5
KSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRh
dGFiYXNlIHBhdGggJXMiLCBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeS51dGY4KCkuZGF0YSgpKTsK
LSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKElPUykKLSAg
ICBwbGF0Zm9ybU1heWJlRXhjbHVkZUZyb21CYWNrdXAoKTsKLSNlbmRpZgotCi0gICAgcmV0dXJu
IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgZmlsZW5h
bWUpOwotfQotCi1TdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0
YWJhc2VQYXRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZGF0YWJhc2VQYXRoKCJTdG9yYWdlVHJh
Y2tlci5kYiIpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3BlblRy
YWNrZXJEYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCi17
Ci0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0
cmluZyBkYXRhYmFzZVBhdGggPSB0cmFja2VyRGF0YWJhc2VQYXRoKCk7Ci0KLSAgICBpZiAoIWZp
bGVFeGlzdHMoZGF0YWJhc2VQYXRoKSAmJiBvcGVuaW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhp
c3RlbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKGRhdGFi
YXNlUGF0aCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZVBh
dGggJXMuIiwgZGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0IGJvdW5kIHRvIGEgc3BlY2lm
aWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhyZWFkaW5nIGNoZWNrcwotICAgIC8vIGV2
ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUgZGF0YWJhc2UgZnJvbSBkaWZmZXJlbnQgdGhy
ZWFkcyBzaW11bHRhbmVvdXNseS4KLSAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJlYWRpbmdDaGVj
a3MoKTsKLQotICAgIGlmIChtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJPcmlnaW5zIikpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRF
IFRBQkxFIE9yaWdpbnMgKG9yaWdpbiBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBw
YXRoIFRFWFQpOyIpKQotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgT3JpZ2lu
cyB0YWJsZS4iKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmltcG9y
dE9yaWdpbklkZW50aWZpZXJzKCkKLXsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5v
bkV4aXN0ZW50KTsKLQotICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgIFNR
TGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4gRlJPTSBP
cmlnaW5zIik7Ci0gICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykg
ewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmVzdWx0Owot
Ci0gICAgICAgIHdoaWxlICgocmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMSVRFX1JP
VykKLSAgICAgICAgICAgIG1fb3JpZ2lucy5hZGQoc3RhdGVtZW50LmdldENvbHVtblRleHQoMCkp
OwotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgICAgIExP
R19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2Uu
Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1cGRhdGVU
cmFja2VyRGF0YWJhc2VGcm9tTG9jYWxTdG9yYWdlRGF0YWJhc2VGaWxlcygpOwotfQotCi12b2lk
IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6dXBkYXRlVHJhY2tlckRhdGFiYXNlRnJvbUxv
Y2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKQotewotICAgIFZlY3RvcjxTdHJpbmc+IHBhdGhzID0g
bGlzdERpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgIioubG9jYWxzdG9yYWdlIik7
Ci0KLSAgICBIYXNoU2V0PFN0cmluZz4gb3JpZ2lucyhtX29yaWdpbnMpOwotICAgIEhhc2hTZXQ8
U3RyaW5nPiBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXM7Ci0KLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHBhdGhzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFN0
cmluZyYgcGF0aCA9IHBhdGhzW2ldOwotCi0gICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLmxv
Y2Fsc3RvcmFnZSIpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgU3RyaW5nIGZp
bGVuYW1lID0gcGF0aEdldEZpbGVOYW1lKHBhdGgpOwotCi0gICAgICAgIFN0cmluZyBvcmlnaW5J
ZGVudGlmaWVyID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gc3Ry
bGVuKCIubG9jYWxzdG9yYWdlIikpOwotCi0gICAgICAgIGlmICghbV9vcmlnaW5zLmNvbnRhaW5z
KG9yaWdpbklkZW50aWZpZXIpKQotICAgICAgICAgICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRl
bnRpZmllcihvcmlnaW5JZGVudGlmaWVyLCBwYXRoKTsKLQotICAgICAgICBvcmlnaW5zRnJvbUxv
Y2FsU3RvcmFnZURhdGFiYXNlRmlsZXMuYWRkKG9yaWdpbklkZW50aWZpZXIpOwotICAgIH0KLQot
ICAgIGZvciAoYXV0byBpdCA9IG9yaWdpbnMuYmVnaW4oKSwgZW5kID0gb3JpZ2lucy5lbmQoKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmll
ciA9ICppdDsKLSAgICAgICAgaWYgKG9yaWdpbnMuY29udGFpbnMob3JpZ2luSWRlbnRpZmllcikp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmln
aW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOwotICAgIH0KLX0KLQotdm9pZCBMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29u
c3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCkK
LXsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKENyZWF0ZUlmTm9uRXhpc3RlbnQpOwotICAgIGlm
ICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU1FMaXRlU3Rh
dGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gT3JpZ2lucyBWQUxVRVMg
KD8sID8pIik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0g
ICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUg
dHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7
Ci0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIGRhdGFiYXNlUGF0aCk7Ci0KLSAgICBpZiAoc3Rh
dGVtZW50LnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gZXN0YWJsaXNoIG9yaWdpbiAnJXMnIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luSWRlbnRpZmll
ci51dGY4KCkuZGF0YSgpKTsKLQotICAgIG1fb3JpZ2lucy5hZGQob3JpZ2luSWRlbnRpZmllcik7
Ci0KLSAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRzIHRoYXQgdGhlIG9yaWdpbiB3YXMgYWRkZWQu
Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVEYXRhYmFzZVdp
dGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcikKLXsKLSAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAoIW1fZGF0
YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cmluZyBwYXRoID0gcGF0
aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcik7Ci0gICAg
aWYgKHBhdGguaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTUUxpdGVTdGF0ZW1l
bnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIHdoZXJl
IG9yaWdpbj0/Iik7Ci0gICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRF
X09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Yg
b3JpZ2luICclcyciLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBkZWxldGVTdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRl
bnRpZmllcik7Ci0gICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgewot
ICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIG9yaWdpbiAn
JXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUocGF0aCk7
Ci0KLSAgICBtX29yaWdpbnMucmVtb3ZlKG9yaWdpbklkZW50aWZpZXIpOwotICAgIGlmIChtX29y
aWdpbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIFRoZXJlIGFyZSBubyBvcmlnaW5zIGxlZnQ7
IGRlbGV0ZSB0aGUgdHJhY2tlciBkYXRhYmFzZS4KLSAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgp
OwotICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUodHJhY2tlckRh
dGFiYXNlUGF0aCgpKTsKLSAgICAgICAgZGVsZXRlRW1wdHlEaXJlY3RvcnkobV9sb2NhbFN0b3Jh
Z2VEaXJlY3RvcnkpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUZWxsIGNsaWVudHMgdGhhdCB0
aGUgb3JpZ2luIHdhcyByZW1vdmVkLgotfQotCi1TdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyOjpwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcm
IG9yaWdpbklkZW50aWZpZXIpCi17Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAg
ICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgcGF0aFN0YXRlbWVu
dChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7
Ci0gICAgaWYgKHBhdGhTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIHNlbGVjdGlvbiBvZiBwYXRoIGZvciBvcmln
aW4gJyVzJyIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVy
biBTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwYXRoU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdp
bklkZW50aWZpZXIpOwotCi0gICAgaW50IHJlc3VsdCA9IHBhdGhTdGF0ZW1lbnQuc3RlcCgpOwot
ICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX1JPVykKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwot
Ci0gICAgcmV0dXJuIHBhdGhTdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKTsKLX0KLQotfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9y
YWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nl
c3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggN2NlYjE5MTZkOTM0ZTU2ZjFmNGEyNDE1NTdkNzMxODM0YmU3N2ZkMS4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oCisrKyAv
ZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIw
MTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9u
Y2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlRGF0YWJhc2UuaD4KLSNpbmNsdWRlIDx3dGYv
SGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9PcHRpb25hbC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQ
dHIuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3
dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBT
ZWN1cml0eU9yaWdpbjsKLXN0cnVjdCBTZWN1cml0eU9yaWdpbkRhdGE7Ci19Ci0KLW5hbWVzcGFj
ZSBXZWJLaXQgewotCi1zdHJ1Y3QgTG9jYWxTdG9yYWdlRGV0YWlsczsKLQotY2xhc3MgTG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8TG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyPiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiwgY29uc3QgU3Ry
aW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotICAgIH5Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIoKTsKLQotICAgIFN0cmluZyBkYXRhYmFzZVBhdGgoY29uc3QgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJikgY29uc3Q7Ci0KLSAgICB2b2lkIGRpZE9wZW5EYXRhYmFzZVdpdGhPcmln
aW4oY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7Ci0gICAgdm9pZCBkZWxldGVE
YXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7Ci0g
ICAgdm9pZCBkZWxldGVBbGxEYXRhYmFzZXMoKTsKLQotICAgIC8vIFJldHVybnMgYSB2ZWN0b3Ig
b2YgdGhlIG9yaWdpbnMgd2hvc2UgZGF0YWJhc2VzIGhhdmUgYmVlbiBkZWxldGVkLgotICAgIFZl
Y3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZURhdGFiYXNlc01vZGlmaWVk
U2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCk7Ci0KLSAgICBWZWN0
b3I8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3Q7Ci0KLSAgICBz
dHJ1Y3QgT3JpZ2luRGV0YWlscyB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyOwot
ICAgICAgICBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gY3JlYXRpb25UaW1lOwotICAgICAgICBzdGQ6
Om9wdGlvbmFsPHRpbWVfdD4gbW9kaWZpY2F0aW9uVGltZTsKLSAgICB9OwotICAgIFZlY3RvcjxP
cmlnaW5EZXRhaWxzPiBvcmlnaW5EZXRhaWxzKCk7Ci0KLXByaXZhdGU6Ci0gICAgTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVldWU+JiYsIGNvbnN0IFN0cmluZyYgbG9jYWxT
dG9yYWdlRGlyZWN0b3J5KTsKLQotICAgIFN0cmluZyBkYXRhYmFzZVBhdGgoY29uc3QgU3RyaW5n
JiBmaWxlbmFtZSkgY29uc3Q7Ci0gICAgU3RyaW5nIHRyYWNrZXJEYXRhYmFzZVBhdGgoKSBjb25z
dDsKLQotICAgIGVudW0gRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgewotICAgICAgICBDcmVhdGVJ
Zk5vbkV4aXN0ZW50LAotICAgICAgICBTa2lwSWZOb25FeGlzdGVudAotICAgIH07Ci0gICAgdm9p
ZCBvcGVuVHJhY2tlckRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5KTsKLQotICAgIHZv
aWQgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKLSAgICB2b2lkIHVwZGF0ZVRyYWNrZXJEYXRh
YmFzZUZyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVzKCk7Ci0KLSAgICB2b2lkIGFkZERhdGFi
YXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBj
b25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCk7Ci0gICAgdm9pZCByZW1vdmVEYXRhYmFzZVdpdGhP
cmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcik7Ci0gICAgU3Ry
aW5nIHBhdGhGb3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3Jp
Z2luSWRlbnRpZmllcik7Ci0KLSAgICBSZWZQdHI8V29ya1F1ZXVlPiBtX3F1ZXVlOwotICAgIFN0
cmluZyBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeTsKLQotICAgIFdlYkNvcmU6OlNRTGl0ZURhdGFi
YXNlIG1fZGF0YWJhc2U7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1fb3JpZ2luczsKLQotI2lmIFBM
QVRGT1JNKElPUykKLSAgICB2b2lkIHBsYXRmb3JtTWF5YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNv
bnN0OwotCi0gICAgbXV0YWJsZSBib29sIG1faGFzRXhjbHVkZWRGcm9tQmFja3VwIHsgZmFsc2Ug
fTsKLSNlbmRpZgotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IGQzMDQ1MjU3Nzc4OGU5YjAzODMxMTBmZjBlNTQyN2E4ZDk5NmU1MGIuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
Y3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlLmgiCi0KLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSAiV2ViUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1N0b3JlLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9GaWxlTW9uaXRvci5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvS2V5ZWRD
b2RpbmcuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NoYXJlZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHd0
Zi9SdW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90
aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY29uc3Rl
eHByIFNlY29uZHMgbWluaW11bVdyaXRlSW50ZXJ2YWwgeyA1X21pbiB9OwotCi11c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKLQotc3RhdGljIGJvb2wgaGFzRmlsZUNoYW5nZWRTaW5jZShjb25zdCBT
dHJpbmcmIHBhdGgsIFdhbGxUaW1lIHNpbmNlKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNN
YWluKCkpOwotICAgIHRpbWVfdCBtb2RpZmljYXRpb25UaW1lOwotICAgIGlmICghZ2V0RmlsZU1v
ZGlmaWNhdGlvblRpbWUocGF0aCwgbW9kaWZpY2F0aW9uVGltZSkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgcmV0dXJuIFdhbGxUaW1lOjpmcm9tUmF3U2Vjb25kcyhtb2RpZmljYXRpb25U
aW1lKSA+IHNpbmNlOwotfQotCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEtleWVkRGVjb2Rlcj4g
Y3JlYXRlRGVjb2RlckZvckZpbGUoY29uc3QgU3RyaW5nJiBwYXRoKQotewotICAgIEFTU0VSVCgh
UnVuTG9vcDo6aXNNYWluKCkpOwotICAgIGF1dG8gaGFuZGxlID0gb3BlbkFuZExvY2tGaWxlKHBh
dGgsIE9wZW5Gb3JSZWFkKTsKLSAgICBpZiAoaGFuZGxlID09IGludmFsaWRQbGF0Zm9ybUZpbGVI
YW5kbGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgbG9uZyBsb25nIGZpbGVTaXpl
ID0gMDsKLSAgICBpZiAoIWdldEZpbGVTaXplKGhhbmRsZSwgZmlsZVNpemUpKSB7Ci0gICAgICAg
IHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAg
ICB9Ci0KLSAgICBzaXplX3QgYnl0ZXNUb1JlYWQ7Ci0gICAgaWYgKCFXVEY6OmNvbnZlcnRTYWZl
bHkoZmlsZVNpemUsIGJ5dGVzVG9SZWFkKSkgewotICAgICAgICB1bmxvY2tBbmRDbG9zZUZpbGUo
aGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgVmVjdG9yPGNo
YXI+IGJ1ZmZlcihieXRlc1RvUmVhZCk7Ci0gICAgc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gcmVh
ZEZyb21GaWxlKGhhbmRsZSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci0KLSAgICB1
bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKLQotICAgIGlmICh0b3RhbEJ5dGVzUmVhZCAhPSBi
eXRlc1RvUmVhZCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICByZXR1cm4gS2V5ZWRE
ZWNvZGVyOjpkZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlci5k
YXRhKCkpLCBidWZmZXIuc2l6ZSgpKTsKLX0KLQotUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlOjpSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoV2Vi
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiBzdG9yZSwgY29uc3QgU3RyaW5nJiBzdG9yYWdl
RGlyZWN0b3J5UGF0aCkKLSAgICA6IG1fbWVtb3J5U3RvcmUoc3RvcmUpCi0gICAgLCBtX3N0b3Jh
Z2VEaXJlY3RvcnlQYXRoKHN0b3JhZ2VEaXJlY3RvcnlQYXRoKQotICAgICwgbV9hc3luY1dyaXRl
VGltZXIoUnVuTG9vcDo6bWFpbigpLCB0aGlzLCAmUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlOjphc3luY1dyaXRlVGltZXJGaXJlZCkKLXsKLX0KLQotdm9pZCBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmluaXRpYWxpemUoKQotewotICAgIEFT
U0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIHBvcHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlz
aygpOwotICAgIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsKLX0KLQotUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlOjp+UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlKCkKLXsKLSAgICBmaW5pc2hBbGxQZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKTsKLSAg
ICBBU1NFUlQoIW1faGFzUGVuZGluZ1dyaXRlKTsKLX0KLQotU3RyaW5nIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RvcmFnZURpcmVjdG9yeVBhdGgoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3N0b3JhZ2VEaXJlY3RvcnlQYXRoLmlzb2xhdGVkQ29weSgpOwotfQot
Ci1TdHJpbmcgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpyZXNvdXJj
ZUxvZ0ZpbGVQYXRoKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgc3RvcmFnZVBhdGggPSBzdG9yYWdl
RGlyZWN0b3J5UGF0aCgpOwotICAgIGlmIChzdG9yYWdlUGF0aC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybiBlbXB0eVN0cmluZygpOwotCi0gICAgcmV0dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBv
bmVudChzdG9yYWdlUGF0aCwgImZ1bGxfYnJvd3Npbmdfc2Vzc2lvbl9yZXNvdXJjZUxvZy5wbGlz
dCIpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6
c3RhcnRNb25pdG9yaW5nRGlzaygpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7
Ci0gICAgaWYgKG1fZmlsZU1vbml0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cmluZyBy
ZXNvdXJjZUxvZ1BhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7Ci0gICAgaWYgKHJlc291cmNl
TG9nUGF0aC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fZmlsZU1vbml0b3Ig
PSBzdGQ6Om1ha2VfdW5pcXVlPEZpbGVNb25pdG9yPihyZXNvdXJjZUxvZ1BhdGgsIG1fbWVtb3J5
U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCksIFt0aGlzXSAoRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VU
eXBlIHR5cGUpIHsKLSAgICAgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgICAg
IHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlw
ZTo6TW9kaWZpY2F0aW9uOgotICAgICAgICAgICAgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2so
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpbGVNb25pdG9yOjpGaWxlQ2hh
bmdlVHlwZTo6UmVtb3ZhbDoKLSAgICAgICAgICAgIG1fbWVtb3J5U3RvcmUuY2xlYXJJbk1lbW9y
eSgpOwotICAgICAgICAgICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7Ci0gICAgICAgICAgICBt
b25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICB9KTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2U6Om1vbml0b3JEaXJlY3RvcnlGb3JOZXdTdGF0aXN0aWNzKCkKLXsKLSAgICBT
dHJpbmcgc3RvcmFnZVBhdGggPSBzdG9yYWdlRGlyZWN0b3J5UGF0aCgpOwotICAgIEFTU0VSVCgh
c3RvcmFnZVBhdGguaXNFbXB0eSgpKTsKLQotICAgIGlmICghZmlsZUV4aXN0cyhzdG9yYWdlUGF0
aCkpIHsKLSAgICAgICAgaWYgKCFtYWtlQWxsRGlyZWN0b3JpZXMoc3RvcmFnZVBhdGgpKSB7Ci0g
ICAgICAgICAgICBSRUxFQVNFX0xPR19FUlJPUihSZXNvdXJjZUxvYWRTdGF0aXN0aWNzLCAiUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOiBGYWlsZWQgdG8gY3JlYXRlIGRp
cmVjdG9yeSBwYXRoICVzIiwgc3RvcmFnZVBhdGgudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2ZpbGVNb25pdG9yID0gc3RkOjpt
YWtlX3VuaXF1ZTxGaWxlTW9uaXRvcj4oc3RvcmFnZVBhdGgsIG1fbWVtb3J5U3RvcmUuc3RhdGlz
dGljc1F1ZXVlKCksIFt0aGlzXSAoRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlIHR5cGUpIHsK
LSAgICAgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgICAgIGlmICh0eXBlID09
IEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6UmVtb3ZhbCkgewotICAgICAgICAgICAgLy8g
RGlyZWN0b3J5IHdhcyByZW1vdmVkIQotICAgICAgICAgICAgbV9maWxlTW9uaXRvciA9IG51bGxw
dHI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVz
b3VyY2VMb2dQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOwotICAgICAgICBBU1NFUlQoIXJl
c291cmNlTG9nUGF0aC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGlmICghZmlsZUV4aXN0cyhyZXNv
dXJjZUxvZ1BhdGgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fZmlsZU1vbml0
b3IgPSBudWxscHRyOwotCi0gICAgICAgIHJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0g
ICAgICAgIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsKLSAgICB9KTsKLX0KLQotdm9pZCBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnN0b3BNb25pdG9yaW5nRGlzaygpCi17
Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgbV9maWxlTW9uaXRvciA9IG51
bGxwdHI7Ci19Ci0KLS8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBvbiBk
aXNrLgotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlZnJl
c2hNZW1vcnlTdG9yZUZyb21EaXNrKCkKLXsKLSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigp
KTsKLQotICAgIFN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBp
ZiAoZmlsZVBhdGguaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBzb21l
dGltZXMgc2VlIGZpbGUgY2hhbmdlZCBldmVudHMgZnJvbSBiZWZvcmUgb3VyIGxvYWQgY29tcGxl
dGVkICh3ZSBzdGFydAotICAgIC8vIHJlYWRpbmcgYXQgdGhlIGZpcnN0IGNoYW5nZSBldmVudCwg
YnV0IHdlIG1pZ2h0IHJlY2VpdmUgYSBzZXJpZXMgb2YgZXZlbnRzIHJlbGF0ZWQKLSAgICAvLyB0
byB0aGUgc2FtZSBmaWxlIG9wZXJhdGlvbikuIENhdGNoIHRoaXMgY2FzZSB0byBhdm9pZCByZWFk
aW5nIG92ZXJseSBvZnRlbi4KLSAgICBpZiAoIWhhc0ZpbGVDaGFuZ2VkU2luY2UoZmlsZVBhdGgs
IG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBX
YWxsVGltZSByZWFkVGltZSA9IFdhbGxUaW1lOjpub3coKTsKLQotICAgIGF1dG8gZGVjb2RlciA9
IGNyZWF0ZURlY29kZXJGb3JGaWxlKGZpbGVQYXRoKTsKLSAgICBpZiAoIWRlY29kZXIpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fbWVtb3J5U3RvcmUubWVyZ2VXaXRoRGF0YUZyb21EZWNvZGVy
KCpkZWNvZGVyKTsKLSAgICBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lID0gcmVhZFRpbWU7
Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpwb3B1
bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWlu
KCkpOwotCi0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOwotICAg
IGlmIChmaWxlUGF0aC5pc0VtcHR5KCkgfHwgIWZpbGVFeGlzdHMoZmlsZVBhdGgpKSB7Ci0gICAg
ICAgIG1fbWVtb3J5U3RvcmUuZ3JhbmRmYXRoZXJFeGlzdGluZ1dlYnNpdGVEYXRhKCk7Ci0gICAg
ICAgIG1vbml0b3JEaXJlY3RvcnlGb3JOZXdTdGF0aXN0aWNzKCk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoIWhhc0ZpbGVDaGFuZ2VkU2luY2UoZmlsZVBhdGgsIG1fbGFzdFN0
YXRpc3RpY3NGaWxlU3luY1RpbWUpKSB7Ci0gICAgICAgIC8vIE5vIG5lZWQgdG8gZ3JhbmRmYXRo
ZXIgaW4gdGhpcyBjYXNlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgV2FsbFRpbWUg
cmVhZFRpbWUgPSBXYWxsVGltZTo6bm93KCk7Ci0KLSAgICBhdXRvIGRlY29kZXIgPSBjcmVhdGVE
ZWNvZGVyRm9yRmlsZShmaWxlUGF0aCk7Ci0gICAgaWYgKCFkZWNvZGVyKSB7Ci0gICAgICAgIG1f
bWVtb3J5U3RvcmUuZ3JhbmRmYXRoZXJFeGlzdGluZ1dlYnNpdGVEYXRhKCk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fbWVtb3J5U3RvcmUuaXNF
bXB0eSgpLCAiVGhpcyBpcyB0aGUgaW5pdGlhbCBpbXBvcnQgc28gdGhlIHN0b3JlIHNob3VsZCBi
ZSBlbXB0eSIpOwotICAgIG1fbWVtb3J5U3RvcmUubWVyZ2VXaXRoRGF0YUZyb21EZWNvZGVyKCpk
ZWNvZGVyKTsKLQotICAgIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSByZWFkVGltZTsK
LQotICAgIG1fbWVtb3J5U3RvcmUubG9nVGVzdGluZ0V2ZW50KEFTQ0lJTGl0ZXJhbCgiUG9wdWxh
dGVkV2l0aG91dEdyYW5kZmF0aGVyaW5nIikpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6YXN5bmNXcml0ZVRpbWVyRmlyZWQoKQotewotICAgIEFT
U0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVl
dWUoKS5kaXNwYXRjaChbdGhpc10gKCkgbXV0YWJsZSB7Ci0gICAgICAgIHdyaXRlTWVtb3J5U3Rv
cmVUb0Rpc2soKTsKLSAgICB9KTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2U6OndyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKQotewotICAgIEFTU0VSVCgh
UnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgbV9oYXNQZW5kaW5nV3JpdGUgPSBmYWxzZTsKLSAg
ICBzdG9wTW9uaXRvcmluZ0Rpc2soKTsKLQotICAgIGF1dG8gZW5jb2RlciA9IG1fbWVtb3J5U3Rv
cmUuY3JlYXRlRW5jb2RlckZyb21EYXRhKCk7Ci0gICAgYXV0byByYXdEYXRhID0gZW5jb2Rlci0+
ZmluaXNoRW5jb2RpbmcoKTsKLSAgICBpZiAoIXJhd0RhdGEpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGF1dG8gc3RvcmFnZVBhdGggPSBzdG9yYWdlRGlyZWN0b3J5UGF0aCgpOwotICAgIGlmICgh
c3RvcmFnZVBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1ha2VBbGxEaXJlY3RvcmllcyhzdG9y
YWdlUGF0aCk7Ci0gICAgICAgIGV4Y2x1ZGVGcm9tQmFja3VwKCk7Ci0gICAgfQotCi0gICAgYXV0
byBoYW5kbGUgPSBvcGVuQW5kTG9ja0ZpbGUocmVzb3VyY2VMb2dGaWxlUGF0aCgpLCBPcGVuRm9y
V3JpdGUpOwotICAgIGlmIChoYW5kbGUgPT0gaW52YWxpZFBsYXRmb3JtRmlsZUhhbmRsZSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaW50NjRfdCB3cml0dGVuQnl0ZXMgPSB3cml0ZVRvRmlsZSho
YW5kbGUsIHJhd0RhdGEtPmRhdGEoKSwgcmF3RGF0YS0+c2l6ZSgpKTsKLSAgICB1bmxvY2tBbmRD
bG9zZUZpbGUoaGFuZGxlKTsKLQotICAgIGlmICh3cml0dGVuQnl0ZXMgIT0gc3RhdGljX2Nhc3Q8
aW50NjRfdD4ocmF3RGF0YS0+c2l6ZSgpKSkKLSAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVz
b3VyY2VMb2FkU3RhdGlzdGljcywgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZTogV2Ugb25seSB3cm90ZSAlZCBvdXQgb2YgJXp1IGJ5dGVzIHRvIGRpc2siLCBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4od3JpdHRlbkJ5dGVzKSwgcmF3RGF0YS0+c2l6ZSgpKTsKLQotICAgIG1f
bGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSBXYWxsVGltZTo6bm93KCk7Ci0gICAgbV9sYXN0
U3RhdGlzdGljc1dyaXRlVGltZSA9IE1vbm90b25pY1RpbWU6Om5vdygpOwotCi0gICAgc3RhcnRN
b25pdG9yaW5nRGlzaygpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZTo6c2NoZWR1bGVPcldyaXRlTWVtb3J5U3RvcmUoRm9yY2VJbW1lZGlhdGVXcml0
ZSBmb3JjZUltbWVkaWF0ZVdyaXRlKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkp
OwotCi0gICAgYXV0byB0aW1lU2luY2VMYXN0V3JpdGUgPSBNb25vdG9uaWNUaW1lOjpub3coKSAt
IG1fbGFzdFN0YXRpc3RpY3NXcml0ZVRpbWU7Ci0gICAgaWYgKGZvcmNlSW1tZWRpYXRlV3JpdGUg
IT0gRm9yY2VJbW1lZGlhdGVXcml0ZTo6WWVzICYmIHRpbWVTaW5jZUxhc3RXcml0ZSA8IG1pbmlt
dW1Xcml0ZUludGVydmFsKSB7Ci0gICAgICAgIGlmICghbV9oYXNQZW5kaW5nV3JpdGUpIHsKLSAg
ICAgICAgICAgIG1faGFzUGVuZGluZ1dyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIFNlY29uZHMg
ZGVsYXkgPSBtaW5pbXVtV3JpdGVJbnRlcnZhbCAtIHRpbWVTaW5jZUxhc3RXcml0ZSArIDFfczsK
LSAgICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhp
cyA9IG1ha2VSZWYoKnRoaXMpLCBkZWxheV0gewotICAgICAgICAgICAgICAgIG1fYXN5bmNXcml0
ZVRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOwot
fQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6Y2xlYXIo
KQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIFN0cmluZyBmaWxlUGF0
aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBpZiAoZmlsZVBhdGguaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBzdG9wTW9uaXRvcmluZ0Rpc2soKTsKLQotICAgIGlmICgh
ZGVsZXRlRmlsZShmaWxlUGF0aCkpCi0gICAgICAgIFJFTEVBU0VfTE9HX0VSUk9SKFJlc291cmNl
TG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
IFVuYWJsZSB0byBkZWxldGUgc3RhdGlzdGljcyBmaWxlOiAlcyIsIGZpbGVQYXRoLnV0ZjgoKS5k
YXRhKCkpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZTo6ZmluaXNoQWxsUGVuZGluZ1dvcmtTeW5jaHJvbm91c2x5KCkKLXsKLSAgICBtX2FzeW5jV3Jp
dGVUaW1lci5zdG9wKCk7Ci0KLSAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOwotICAgIC8v
IE1ha2Ugc3VyZSBhbnkgcGVuZGluZyB3b3JrIGluIG91ciBxdWV1ZSBpcyBmaW5pc2hlZCBiZWZv
cmUgd2UgdGVybWluYXRlLgotICAgIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCkuZGlz
cGF0Y2goWyZzZW1hcGhvcmUsIHRoaXNdIHsKLSAgICAgICAgLy8gV3JpdGUgZmluYWwgZmlsZSBz
dGF0ZSB0byBkaXNrLgotICAgICAgICBpZiAobV9oYXNQZW5kaW5nV3JpdGUpCi0gICAgICAgICAg
ICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7Ci0gICAgICAgIHNlbWFwaG9yZS5zaWduYWwoKTsK
LSAgICB9KTsKLSAgICBzZW1hcGhvcmUud2FpdChXYWxsVGltZTo6aW5maW5pdHkoKSk7Ci19Ci0K
LXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpyZWYoKQotewot
ICAgIG1fbWVtb3J5U3RvcmUucmVmKCk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlOjpkZXJlZigpCi17Ci0gICAgbV9tZW1vcnlTdG9yZS5kZXJlZigp
OwotfQotCi0jaWYgIVBMQVRGT1JNKElPUykKLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlOjpleGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0Ci17Ci19Ci0jZW5kaWYK
LQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGIv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkMmVkNGJj
NjkzYmExZWEyMTk0MmU0MDNjZDEzNmQ0ZTc2NzI1Yy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oCisrKyAvZGV2L251bGwKQEAg
LTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8d3Rm
L0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYvTW9ub3RvbmljVGltZS5oPgotI2luY2x1ZGUgPHd0
Zi9SdW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL1dhbGxUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL3Rl
eHQvV1RGU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLWNsYXNzIEZpbGVNb25pdG9y
OwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgV2ViUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1N0b3JlOwotCi1jbGFzcyBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2UgewotcHVibGljOgotICAgIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZShXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUmLCBjb25zdCBTdHJpbmcmIHN0b3JhZ2VE
aXJlY3RvcnlQYXRoKTsKLSAgICB+UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlKCk7Ci0KLSAgICB2b2lkIGluaXRpYWxpemUoKTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAg
ICB2b2lkIGZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgpOwotCi0gICAgdm9pZCBy
ZWYoKTsKLSAgICB2b2lkIGRlcmVmKCk7Ci0KLSAgICBlbnVtIGNsYXNzIEZvcmNlSW1tZWRpYXRl
V3JpdGUgewotICAgICAgICBObywKLSAgICAgICAgWWVzLAotICAgIH07Ci0gICAgdm9pZCBzY2hl
ZHVsZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVkaWF0ZVdyaXRlKTsKLQotcHJpdmF0ZToK
LSAgICBTdHJpbmcgc3RvcmFnZURpcmVjdG9yeVBhdGgoKSBjb25zdDsKLSAgICBTdHJpbmcgcmVz
b3VyY2VMb2dGaWxlUGF0aCgpIGNvbnN0OwotCi0gICAgdm9pZCBzdGFydE1vbml0b3JpbmdEaXNr
KCk7Ci0gICAgdm9pZCBzdG9wTW9uaXRvcmluZ0Rpc2soKTsKLSAgICB2b2lkIG1vbml0b3JEaXJl
Y3RvcnlGb3JOZXdTdGF0aXN0aWNzKCk7Ci0KLSAgICB2b2lkIHdyaXRlTWVtb3J5U3RvcmVUb0Rp
c2soKTsKLSAgICB2b2lkIHBvcHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlzaygpOwotICAgIHZvaWQg
ZXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdDsKLSAgICB2b2lkIHJlZnJlc2hNZW1vcnlTdG9yZUZy
b21EaXNrKCk7Ci0gICAgdm9pZCBhc3luY1dyaXRlVGltZXJGaXJlZCgpOwotCi0gICAgV2ViUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiBtX21lbW9yeVN0b3JlOwotICAgIGNvbnN0IFN0cmlu
ZyBtX3N0b3JhZ2VEaXJlY3RvcnlQYXRoOwotICAgIFJ1bkxvb3A6OlRpbWVyPFJlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZT4gbV9hc3luY1dyaXRlVGltZXI7Ci0gICAgc3Rk
Ojp1bmlxdWVfcHRyPFdlYkNvcmU6OkZpbGVNb25pdG9yPiBtX2ZpbGVNb25pdG9yOwotICAgIFdh
bGxUaW1lIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWU7Ci0gICAgTW9ub3RvbmljVGltZSBt
X2xhc3RTdGF0aXN0aWNzV3JpdGVUaW1lOwotICAgIGJvb2wgbV9oYXNQZW5kaW5nV3JpdGUgeyBm
YWxzZSB9OwotfTsKLQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3Rv
cmFnZS9TdG9yYWdlTWFuYWdlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4Y2E2
Y2I1MjYyMWY3MjNiYTgwNDQxMDFlMGNkMDU5NGM5NGI5OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3MSArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU3RvcmFnZU1hbmFn
ZXIuaCIKLQotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlLmgiCi0jaW5jbHVkZSAiTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXBNZXNz
YWdlcy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyTWVzc2FnZXMuaCIKLSNpbmNsdWRlICJX
ZWJQcm9jZXNzUHJveHkuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5o
PgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5IYXNoLmg+Ci0jaW5jbHVkZSA8V2Vi
Q29yZS9TdG9yYWdlTWFwLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9UZXh0RW5jb2RpbmcuaD4KLSNp
bmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0
Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsK
LQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJl
YSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFy
ZWE+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhPiBjcmVhdGUoTG9jYWxT
dG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5zaWduZWQgcXVv
dGFJbkJ5dGVzKTsKLSAgICB+U3RvcmFnZUFyZWEoKTsKLQotICAgIGNvbnN0IFdlYkNvcmU6OlNl
Y3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3NlY3Vy
aXR5T3JpZ2luOyB9Ci0KLSAgICB2b2lkIGFkZExpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYsIHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCk7Ci0gICAgdm9pZCByZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5l
Y3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOwotCi0gICAgUmVmPFN0b3JhZ2VBcmVhPiBj
bG9uZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNl
Q29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBib29sJiBx
dW90YUV4Y2VwdGlvbik7Ci0gICAgdm9pZCByZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiogc291
cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLSAgICB2b2lkIGNsZWFyKElQQzo6Q29u
bmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwg
Y29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotCi0gICAgY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0
cmluZz4mIGl0ZW1zKCkgY29uc3Q7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgYm9vbCBpc1Nl
c3Npb25TdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlOyB9
Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgU3RvcmFnZUFyZWEoTG9jYWxTdG9yYWdlTmFtZXNw
YWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsK
LQotICAgIHZvaWQgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpIGNvbnN0Owot
Ci0gICAgdm9pZCBkaXNwYXRjaEV2ZW50cyhJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rp
b24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcm
IHVybFN0cmluZykgY29uc3Q7Ci0KLSAgICAvLyBXaWxsIGJlIG51bGwgaWYgdGhlIHN0b3JhZ2Ug
YXJlYSBiZWxvbmdzIHRvIGEgc2Vzc2lvbiBzdG9yYWdlIG5hbWVzcGFjZS4KLSAgICBMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UqIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlOwotICAgIG11dGFibGUgUmVm
UHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBtX2xvY2FsU3RvcmFnZURhdGFiYXNlOwotICAgIG11
dGFibGUgYm9vbCBtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlIHsgZmFsc2UgfTsKLQotICAg
IFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luOwotICAgIHVuc2lnbmVkIG1fcXVv
dGFJbkJ5dGVzOwotCi0gICAgUmVmUHRyPFN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKLSAgICBI
YXNoU2V0PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBtX2V2
ZW50TGlzdGVuZXJzOwotfTsKLQotY2xhc3MgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5h
bWVzcGFjZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gY3Jl
YXRlKFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3RvcmFnZU1hbmFnZXJJRCk7Ci0gICAgfkxv
Y2FsU3RvcmFnZU5hbWVzcGFjZSgpOwotCi0gICAgU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5h
Z2VyKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlTWFuYWdlcjsgfQotCi0gICAgUmVmPFN0b3Jh
Z2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKLSAg
ICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYShTdG9yYWdlQXJlYSopOwotCi0gICAgdm9pZCBj
bGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYp
OwotICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsKLQotcHJpdmF0ZToKLSAgICBleHBs
aWNpdCBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoU3RvcmFnZU1hbmFnZXIqLCB1aW50NjRfdCBzdG9y
YWdlTWFuYWdlcklEKTsKLQotICAgIFN0b3JhZ2VNYW5hZ2VyKiBtX3N0b3JhZ2VNYW5hZ2VyOwot
ICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlEOwotICAgIHVuc2lnbmVkIG1fcXVvdGFJ
bkJ5dGVzOwotCi0gICAgLy8gV2UgZG9uJ3QgaG9sZCBhbiBleHBsaWNpdCByZWZlcmVuY2UgdG8g
dGhlIFN0b3JhZ2VBcmVhczsgdGhleSBhcmUga2VwdCBhbGl2ZSBieSB0aGUgbV9zdG9yYWdlQXJl
YXNCeUNvbm5lY3Rpb24gbWFwIGluIFN0b3JhZ2VNYW5hZ2VyLgotICAgIEhhc2hNYXA8U2VjdXJp
dHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYSo+IG1fc3RvcmFnZUFyZWFNYXA7Ci19OwotCi1jbGFz
cyBTdG9yYWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogcHVibGlj
IFRocmVhZFNhZmVSZWZDb3VudGVkPFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gewot
cHVibGljOgotICAgIHN0YXRpYyBSZWY8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBj
cmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgVHJhbnNpZW50TG9j
YWxTdG9yYWdlTmFtZXNwYWNlKCkpOwotICAgIH0KLQotICAgIH5UcmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9y
Q3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pCi0g
ICAgewotICAgICAgICByZXR1cm4gKm1fc3RvcmFnZUFyZWFNYXAuZW5zdXJlKHNlY3VyaXR5T3Jp
Z2luLCBbdGhpcywgc2VjdXJpdHlPcmlnaW5dKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICByZXR1
cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwg
bV9xdW90YUluQnl0ZXMpOwotICAgICAgICB9KS5pdGVyYXRvci0+dmFsdWUuY29weVJlZigpOwot
ICAgIH0KLQotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25zdAot
ICAgIHsKLSAgICAgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKLQotICAg
ICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1
ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFzdG9yYWdlQXJlYS0+aXRlbXMoKS5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3Jp
Z2luKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9yaWdpbnM7Ci0gICAgfQotCi0g
ICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3Jp
Z2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi0gICAgewotICAgICAgICBmb3IgKGF1dG8mIHN0b3Jh
Z2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKHN0
b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpID09IHNlY3VyaXR5T3JpZ2luKQotICAgICAgICAg
ICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9p
ZCBjbGVhckFsbFN0b3JhZ2VBcmVhcygpCi0gICAgewotICAgICAgICBmb3IgKGF1dG8mIHN0b3Jh
Z2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkKLSAgICAgICAgICAgIHN0b3JhZ2VB
cmVhLT5jbGVhcigpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBleHBsaWNpdCBUcmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBjb25zdCB1bnNpZ25l
ZCBtX3F1b3RhSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKLQotICAgIEhhc2hNYXA8U2VjdXJp
dHlPcmlnaW5EYXRhLCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsK
LQotYXV0byBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmNyZWF0ZShMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRh
JiBzZWN1cml0eU9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKSAtPiBSZWY8U3RvcmFnZU1h
bmFnZXI6OlN0b3JhZ2VBcmVhPgotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFN0b3JhZ2VB
cmVhKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgc2VjdXJpdHlPcmlnaW4sIHF1b3RhSW5CeXRlcykp
OwotfQotCi1TdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OlN0b3JhZ2VBcmVhKExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSogbG9jYWxTdG9yYWdlTmFtZXNwYWNlLCBjb25zdCBTZWN1cml0eU9yaWdp
bkRhdGEmIHNlY3VyaXR5T3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi0gICAgOiBtX2xv
Y2FsU3RvcmFnZU5hbWVzcGFjZShsb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCi0gICAgLCBtX3NlY3Vy
aXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQotICAgICwgbV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5
dGVzKQotICAgICwgbV9zdG9yYWdlTWFwKFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRl
cykpCi17Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6flN0b3JhZ2VBcmVhKCkK
LXsKLSAgICBBU1NFUlQobV9ldmVudExpc3RlbmVycy5pc0VtcHR5KCkpOwotCi0gICAgaWYgKG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNs
b3NlKCk7Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCi0gICAgICAgIG1fbG9j
YWxTdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFnZUFyZWEodGhpcyk7Ci19Ci0KLXZv
aWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjphZGRMaXN0ZW5lcihJUEM6OkNvbm5lY3Rp
b24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKLXsKLSAgICBBU1NFUlQoIW1f
ZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCkpKTsKLSAgICBtX2V2ZW50TGlzdGVuZXJzLmFkZChzdGQ6Om1ha2VfcGFpcigmY29u
bmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3Jh
Z2VBcmVhOjpyZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2
NF90IHN0b3JhZ2VNYXBJRCkKLXsKLSAgICBBU1NFUlQoaXNTZXNzaW9uU3RvcmFnZSgpIHx8IG1f
ZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCkpKTsKLSAgICBtX2V2ZW50TGlzdGVuZXJzLnJlbW92ZShzdGQ6Om1ha2VfcGFpcigm
Y29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Ci19Ci0KLVJlZjxTdG9yYWdlTWFuYWdlcjo6U3Rv
cmFnZUFyZWE+IFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xvbmUoKSBjb25zdAotewot
ICAgIEFTU0VSVCghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpOwotCi0gICAgYXV0byBzdG9yYWdl
QXJlYSA9IFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0ciwgbV9zZWN1cml0eU9yaWdpbiwgbV9x
dW90YUluQnl0ZXMpOwotICAgIHN0b3JhZ2VBcmVhLT5tX3N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VN
YXA7Ci0KLSAgICByZXR1cm4gc3RvcmFnZUFyZWE7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6
OlN0b3JhZ2VBcmVhOjpzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwg
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0
cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2VwdGlv
bikKLXsKLSAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7Ci0KLSAgICBT
dHJpbmcgb2xkVmFsdWU7Ci0KLSAgICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXAt
PnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKTsKLSAgICBpZiAo
bmV3U3RvcmFnZU1hcCkKLSAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdl
TWFwKTsKLQotICAgIGlmIChxdW90YUV4Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
aWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJh
c2UtPnNldEl0ZW0oa2V5LCB2YWx1ZSk7Ci0KLSAgICBkaXNwYXRjaEV2ZW50cyhzb3VyY2VDb25u
ZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9sZFZhbHVlLCB2YWx1ZSwgdXJsU3Ry
aW5nKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OnJlbW92ZUl0ZW0o
SVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0g
ICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpOwotCi0gICAgU3RyaW5nIG9s
ZFZhbHVlOwotICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRl
bShrZXksIG9sZFZhbHVlKTsKLSAgICBpZiAobmV3U3RvcmFnZU1hcCkKLSAgICAgICAgbV9zdG9y
YWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKLQotICAgIGlmIChvbGRWYWx1ZS5pc051
bGwoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2Up
Ci0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnJlbW92ZUl0ZW0oa2V5KTsKLQotICAg
IGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtl
eSwgb2xkVmFsdWUsIFN0cmluZygpLCB1cmxTdHJpbmcpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9u
LCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykK
LXsKLSAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7Ci0KLSAgICBpZiAo
IW1fc3RvcmFnZU1hcC0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fc3RvcmFn
ZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0KLSAgICBpZiAobV9s
b2NhbFN0b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xl
YXIoKTsKLQotICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3Jh
Z2VBcmVhSUQsIFN0cmluZygpLCBTdHJpbmcoKSwgU3RyaW5nKCksIHVybFN0cmluZyk7Ci19Ci0K
LWNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFy
ZWE6Oml0ZW1zKCkgY29uc3QKLXsKLSAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVl
ZGVkKCk7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5pdGVtcygpOwotfQotCi12b2lkIFN0
b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoKQotewotICAgIG1fc3RvcmFnZU1hcCA9
IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0KLSAgICBpZiAobV9sb2NhbFN0
b3JhZ2VEYXRhYmFzZSkgewotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbG9zZSgp
OwotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAg
ICBmb3IgKGF1dG8gaXQgPSBtX2V2ZW50TGlzdGVuZXJzLmJlZ2luKCksIGVuZCA9IG1fZXZlbnRM
aXN0ZW5lcnMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgaXQtPmZpcnN0LT5zZW5k
KE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6Q2xlYXJDYWNoZSgpLCBpdC0+c2Vjb25kKTsKLX0K
LQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6Om9wZW5EYXRhYmFzZUFuZEltcG9y
dEl0ZW1zSWZOZWVkZWQoKSBjb25zdAotewotICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIG9wZW4gdGhlIGRhdGFiYXNlIGhlcmUg
ZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGltcG9ydGVkIG91ciBpdGVtcyB0byBlbnN1cmUgdGhhdCB0
aGUgZGF0YWJhc2UgaXMgb3BlbiBpZiB3ZSBuZWVkIHRvIHdyaXRlIHRvIGl0LgotICAgIGlmICgh
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSA9
IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjcmVhdGUobV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPnN0
b3JhZ2VNYW5hZ2VyKCktPm1fcXVldWUuY29weVJlZigpLCBtX2xvY2FsU3RvcmFnZU5hbWVzcGFj
ZS0+c3RvcmFnZU1hbmFnZXIoKS0+bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY29weVJl
ZigpLCBtX3NlY3VyaXR5T3JpZ2luKTsKLQotICAgIGlmIChtX2RpZEltcG9ydEl0ZW1zRnJvbURh
dGFiYXNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5p
bXBvcnRJdGVtcygqbV9zdG9yYWdlTWFwKTsKLSAgICBtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFi
YXNlID0gdHJ1ZTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmRpc3Bh
dGNoRXZlbnRzKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFs
dWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKSBjb25z
dAotewotICAgIGZvciAoSGFzaFNldDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4s
IHVpbnQ2NF90Pj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ldmVudExpc3RlbmVycy5iZWdpbigp
LCBlbmQgPSBtX2V2ZW50TGlzdGVuZXJzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAg
ICAgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCA9IGl0LT5maXJzdCA9PSBzb3VyY2VDb25uZWN0aW9u
ID8gc291cmNlU3RvcmFnZUFyZWFJRCA6IDA7Ci0KLSAgICAgICAgaXQtPmZpcnN0LT5zZW5kKE1l
c3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlzcGF0Y2hTdG9yYWdlRXZlbnQoc3RvcmFnZUFyZWFJ
RCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZyksIGl0LT5zZWNvbmQpOwotICAg
IH0KLX0KLQotUmVmPFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3Jh
Z2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZShTdG9yYWdlTWFuYWdlciog
c3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKLXsKLSAgICByZXR1
cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uoc3RvcmFnZU1hbmFnZXIsIHN0
b3JhZ2VOYW1lc3BhY2VJRCkpOwotfQotCi0vLyBGSVhNRTogVGhlIHF1b3RhIHZhbHVlIGlzIGNv
cGllZCBmcm9tIEdyb3VwU2V0dGluZ3MuY3BwLgotLy8gV2Ugc2hvdWxkIGludmVzdGlnYXRlIGEg
d2F5IHRvIHNoYXJlIGl0IHdpdGggV2ViQ29yZS4KLVN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2U6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZShTdG9yYWdlTWFuYWdlciogc3RvcmFn
ZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKLSAgICA6IG1fc3RvcmFnZU1h
bmFnZXIoc3RvcmFnZU1hbmFnZXIpCi0gICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdl
TmFtZXNwYWNlSUQpCi0gICAgLCBtX3F1b3RhSW5CeXRlcyg1ICogMTAyNCAqIDEwMjQpCi17Ci19
Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6On5Mb2NhbFN0b3JhZ2VO
YW1lc3BhY2UoKQotewotICAgIEFTU0VSVChtX3N0b3JhZ2VBcmVhTWFwLmlzRW1wdHkoKSk7Ci19
Ci0KLWF1dG8gU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Z2V0T3JDcmVh
dGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikgLT4gUmVm
PFN0b3JhZ2VBcmVhPgotewotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhTWFwLmFkZChz
ZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOwotICAgIGlmIChzbG90KQot
ICAgICAgICByZXR1cm4gKnNsb3Q7Ci0KLSAgICBhdXRvIHN0b3JhZ2VBcmVhID0gU3RvcmFnZUFy
ZWE6OmNyZWF0ZSh0aGlzLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMp
OwotICAgIHNsb3QgPSAmc3RvcmFnZUFyZWEuZ2V0KCk7Ci0KLSAgICByZXR1cm4gc3RvcmFnZUFy
ZWE7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6ZGlk
RGVzdHJveVN0b3JhZ2VBcmVhKFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSkKLXsKLSAgICBBU1NF
UlQobV9zdG9yYWdlQXJlYU1hcC5jb250YWlucyhzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4o
KSkpOwotCi0gICAgbV9zdG9yYWdlQXJlYU1hcC5yZW1vdmUoc3RvcmFnZUFyZWEtPnNlY3VyaXR5
T3JpZ2luKCkpOwotICAgIGlmICghbV9zdG9yYWdlQXJlYU1hcC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIEFTU0VSVChtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5h
bWVzcGFjZXMuY29udGFpbnMobV9zdG9yYWdlTmFtZXNwYWNlSUQpKTsKLSAgICBtX3N0b3JhZ2VN
YW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMucmVtb3ZlKG1fc3RvcmFnZU5hbWVzcGFj
ZUlEKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpj
bGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYg
c2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW5BbmRTdG9yYWdl
QXJlYSA6IG1fc3RvcmFnZUFyZWFNYXApIHsKLSAgICAgICAgaWYgKG9yaWdpbkFuZFN0b3JhZ2VB
cmVhLmtleSA9PSBzZWN1cml0eU9yaWdpbikKLSAgICAgICAgICAgIG9yaWdpbkFuZFN0b3JhZ2VB
cmVhLnZhbHVlLT5jbGVhcigpOwotICAgIH0KLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9j
YWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhckFsbFN0b3JhZ2VBcmVhcygpCi17Ci0gICAgZm9yIChh
dXRvKiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCi0gICAgICAgIHN0
b3JhZ2VBcmVhLT5jbGVhcigpOwotfQotCi1jbGFzcyBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlPiBjcmVhdGUodW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICB+U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UoKTsKLQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fc3Rv
cmFnZUFyZWFNYXAuaXNFbXB0eSgpOyB9Ci0KLSAgICBJUEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRD
b25uZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hbGxvd2VkQ29ubmVjdGlvbi5nZXQoKTsgfQot
ICAgIHZvaWQgc2V0QWxsb3dlZENvbm5lY3Rpb24oSVBDOjpDb25uZWN0aW9uKik7Ci0KLSAgICBS
ZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRh
JiYpOwotCi0gICAgdm9pZCBjbG9uZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZSk7Ci0KLSAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBv
cmlnaW5zKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+
IG9yaWdpbnM7Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3Rv
cmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmICghc3RvcmFnZUFyZWEtPml0
ZW1zKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG9yaWdpbnMuYXBwZW5kKHN0b3JhZ2VB
cmVhLT5zZWN1cml0eU9yaWdpbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcmln
aW5zOwotICAgIH0KLQotICAgIHZvaWQgY2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihj
b25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotICAgIHsKLSAgICAgICAg
Zm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKLSAg
ICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSA9PSBzZWN1cml0eU9y
aWdpbikKLSAgICAgICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKQotICAgIHsKLSAgICAgICAg
Zm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCi0gICAg
ICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgZXhw
bGljaXQgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLQot
ICAgIFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+IG1fYWxsb3dlZENvbm5lY3Rpb247Ci0gICAgdW5z
aWduZWQgbV9xdW90YUluQnl0ZXM7Ci0KLSAgICBIYXNoTWFwPFNlY3VyaXR5T3JpZ2luRGF0YSwg
UmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYU1hcDsKLX07Ci0KLVJlZjxTdG9yYWdl
TWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShxdW90YUluQnl0ZXMp
KTsKLX0KLQotU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi0gICAgOiBtX3F1b3RhSW5C
eXRlcyhxdW90YUluQnl0ZXMpCi17Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZTo6flNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKCkKLXsKLX0KLQotdm9pZCBTdG9y
YWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6OnNldEFsbG93ZWRDb25uZWN0aW9u
KElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24pCi17Ci0gICAgQVNTRVJUKCFhbGxv
d2VkQ29ubmVjdGlvbiB8fCAhbV9hbGxvd2VkQ29ubmVjdGlvbik7Ci0KLSAgICBtX2FsbG93ZWRD
b25uZWN0aW9uID0gYWxsb3dlZENvbm5lY3Rpb247Ci19Ci0KLWF1dG8gU3RvcmFnZU1hbmFnZXI6
OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5
T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKSAtPiBSZWY8U3RvcmFnZUFyZWE+Ci17Ci0gICAg
cmV0dXJuICptX3N0b3JhZ2VBcmVhTWFwLmVuc3VyZShzZWN1cml0eU9yaWdpbiwgW3RoaXMsIHNl
Y3VyaXR5T3JpZ2luXSgpIG11dGFibGUgewotICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6OmNy
ZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOwot
ICAgIH0pLml0ZXJhdG9yLT52YWx1ZS5jb3B5UmVmKCk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFn
ZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpjbG9uZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSkKLXsKLSAgICBBU1NFUlRfVU5VU0VEKG5l
d1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLCBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS5pc0Vt
cHR5KCkpOwotCi0gICAgZm9yIChhdXRvJiBwYWlyIDogbV9zdG9yYWdlQXJlYU1hcCkKLSAgICAg
ICAgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UubV9zdG9yYWdlQXJlYU1hcC5hZGQocGFpci5r
ZXksIHBhaXIudmFsdWUtPmNsb25lKCkpOwotfQotCi1SZWY8U3RvcmFnZU1hbmFnZXI+IFN0b3Jh
Z2VNYW5hZ2VyOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpCi17
Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZU1hbmFnZXIobG9jYWxTdG9yYWdlRGly
ZWN0b3J5KSk7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlTWFuYWdlcihjb25zdCBTdHJp
bmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKLSAgICA6IG1fcXVldWUoV29ya1F1ZXVlOjpjcmVh
dGUoImNvbS5hcHBsZS5XZWJLaXQuU3RvcmFnZU1hbmFnZXIiKSkKLSAgICAsIG1fbG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyKExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKG1f
cXVldWUuY29weVJlZigpLCBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpKQotewotICAgIC8vIE1ha2Ug
c3VyZSB0aGUgZW5jb2RpbmcgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIHN0YXJ0IGRpc3BhdGNo
aW5nIHRoaW5ncyB0byB0aGUgcXVldWUuCi0gICAgVVRGOEVuY29kaW5nKCk7Ci19Ci0KLVN0b3Jh
Z2VNYW5hZ2VyOjp+U3RvcmFnZU1hbmFnZXIoKQotewotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2Vy
OjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNl
SUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhp
cywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBzdG9yYWdlTmFtZXNwYWNlSUQsIHF1
b3RhSW5CeXRlc10oKSBtdXRhYmxlIHsKLSAgICAgICAgQVNTRVJUKCFtX3Nlc3Npb25TdG9yYWdl
TmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKLQotICAgICAgICBtX3Nl
c3Npb25TdG9yYWdlTmFtZXNwYWNlcy5zZXQoc3RvcmFnZU5hbWVzcGFjZUlELCBTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHF1b3RhSW5CeXRlcykpOwotICAgIH0pOwotfQotCi12b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlEKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90
ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3JhZ2VOYW1lc3BhY2VJRF0gewotICAgICAg
ICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMoc3RvcmFnZU5hbWVz
cGFjZUlEKSk7Ci0gICAgICAgIG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnJlbW92ZShzdG9y
YWdlTmFtZXNwYWNlSUQpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpzZXRB
bGxvd2VkU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VDb25uZWN0aW9uKHVpbnQ2NF90IHN0b3JhZ2VO
YW1lc3BhY2VJRCwgSVBDOjpDb25uZWN0aW9uKiBhbGxvd2VkQ29ubmVjdGlvbikKLXsKLSAgICBt
X3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBj
b25uZWN0aW9uID0gUmVmUHRyPElQQzo6Q29ubmVjdGlvbj4oYWxsb3dlZENvbm5lY3Rpb24pLCBz
dG9yYWdlTmFtZXNwYWNlSURdKCkgbXV0YWJsZSB7Ci0gICAgICAgIEFTU0VSVChtX3Nlc3Npb25T
dG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKLQotICAgICAg
ICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKS0+c2V0
QWxsb3dlZENvbm5lY3Rpb24oY29ubmVjdGlvbi5nZXQoKSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQg
U3RvcmFnZU1hbmFnZXI6OmNsb25lU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9yYWdlTmFtZXNwYWNlSUQpCi17Ci0gICAg
bV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwg
c3RvcmFnZU5hbWVzcGFjZUlELCBuZXdTdG9yYWdlTmFtZXNwYWNlSURdIHsKLSAgICAgICAgU2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UqIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0gICAgICAgIGlmICgh
c2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4g
Z2V0IGludG8gdGhpcyBzaXR1YXRpb24gaWYgc29tZW9uZSBjbG9zZXMgdGhlIG9yaWdpbmF0aW5n
IHBhZ2UgZnJvbSB3aXRoaW4gYQotICAgICAgICAgICAgLy8gY3JlYXRlTmV3UGFnZSBjYWxsYmFj
ay4gV2UgYmFpbCBmb3Igbm93LCBidXQgd2Ugc2hvdWxkIHJlYWxseSBmaW5kIGEgd2F5IHRvIGtl
ZXAgdGhlIHNlc3Npb24gc3RvcmFnZSBhbGl2ZQotICAgICAgICAgICAgLy8gc28gd2Ugd2UnbGwg
Y2xvbmUgdGhlIHNlc3Npb24gc3RvcmFnZSBjb3JyZWN0bHkuCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLQotICAgICAgICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogbmV3U2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQobmV3U3Rv
cmFnZU5hbWVzcGFjZUlEKTsKLSAgICAgICAgQVNTRVJUKG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKTsKLQotICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xvbmVUbygqbmV3U2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2Vy
Ojpwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVj
dGlvbiYgY29ubmVjdGlvbikKLXsKLSAgICBjb25uZWN0aW9uLmFkZFdvcmtRdWV1ZU1lc3NhZ2VS
ZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwg
bV9xdWV1ZS5nZXQoKSwgdGhpcyk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OnByb2Nlc3NE
aWRDbG9zZUNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJiBjb25u
ZWN0aW9uKQotewotICAgIGNvbm5lY3Rpb24ucmVtb3ZlV29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVy
KE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpKTsKLQotICAg
IG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGNvbm5lY3Rpb24gPSBSZWY8SVBDOjpDb25uZWN0aW9uPihjb25uZWN0aW9uKV0oKSBtdXRhYmxl
IHsKLSAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWlu
dDY0X3Q+PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZTsKLSAgICAgICAg
Zm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7Ci0g
ICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEua2V5LmZpcnN0ICE9IGNvbm5lY3Rpb24ucHRyKCkp
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHN0b3JhZ2VBcmVhLnZh
bHVlLT5yZW1vdmVMaXN0ZW5lcigqc3RvcmFnZUFyZWEua2V5LmZpcnN0LCBzdG9yYWdlQXJlYS5r
ZXkuc2Vjb25kKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1Rv
UmVtb3ZlLmFwcGVuZChzdG9yYWdlQXJlYS5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9y
IChhdXRvJiBwYWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUpCi0g
ICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUocGFpcik7Ci0gICAg
fSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldFNlc3Npb25TdG9yYWdlT3JpZ2lucyhG
dW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBj
b21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVj
dGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29t
cGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICBIYXNoU2V0PFNlY3VyaXR5T3Jp
Z2luRGF0YT4gb3JpZ2luczsKLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlc3Npb25TdG9y
YWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpIHsKLSAg
ICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPm9y
aWdpbnMoKSkKLSAgICAgICAgICAgICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOwotICAgICAgICB9
Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5zID0gV1RGTW92ZShv
cmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
KSBtdXRhYmxlIHsKLSAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2lu
cykpOwotICAgICAgICB9KTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVs
ZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFu
ZGxlcikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1h
a2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRs
ZXIpXSgpIG11dGFibGUgewotICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICBz
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsKLQotICAgICAg
ICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOwot
ICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZWxldGVTZXNzaW9uU3RvcmFnZUVu
dHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+
JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAg
VmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4gY29waWVkT3JpZ2luczsKLSAgICBj
b3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkob3JpZ2lucy5zaXplKCkpOwotCi0g
ICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQotICAgICAgICBjb3BpZWRPcmlnaW5zLnVu
Y2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5KCkpOwotCi0gICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29waWVkT3JpZ2lu
cyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShj
b21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgIGZvciAoYXV0byYgb3JpZ2lu
IDogY29waWVkT3JpZ2lucykgewotICAgICAgICAgICAgZm9yIChhdXRvJiBzZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAg
ICAgICAgICAgIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNo
aW5nT3JpZ2luKG9yaWdpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBSdW5Mb29wOjptYWluKCku
ZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOwotICAgIH0pOwotfQotCi12b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFz
aFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVy
KQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJl
ZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcild
KCkgbXV0YWJsZSB7Ci0gICAgICAgIEhhc2hTZXQ8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5z
OwotCi0gICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXItPm9yaWdpbnMoKSkKLSAgICAgICAgICAgIG9yaWdpbnMuYWRkKG9yaWdpbik7Ci0KLSAg
ICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5z
aWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAo
YXV0byYgb3JpZ2luIDogdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5vcmlnaW5zKCkp
Ci0gICAgICAgICAgICAgICAgb3JpZ2lucy5hZGQob3JpZ2luKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3JpZ2lucyA9IFdURk1vdmUob3JpZ2lucyks
IGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJs
ZSB7Ci0gICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbnMpKTsKLSAg
ICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldExvY2FsU3Rv
cmFnZU9yaWdpbkRldGFpbHMoRnVuY3Rpb248dm9pZCAoVmVjdG9yPExvY2FsU3RvcmFnZURhdGFi
YXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBsZXRpb25IYW5kbGVyKQotewotICAg
IG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJs
ZSB7Ci0gICAgICAgIGF1dG8gb3JpZ2luRGV0YWlscyA9IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyLT5vcmlnaW5EZXRhaWxzKCk7Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3Bh
dGNoKFtvcmlnaW5EZXRhaWxzID0gV1RGTW92ZShvcmlnaW5EZXRhaWxzKSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAg
ICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2luRGV0YWlscykpOwotICAgICAgICB9
KTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdl
RW50cmllc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikKLXsK
LSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRo
aXMpLCBjb3BpZWRPcmlnaW4gPSBzZWN1cml0eU9yaWdpbi5pc29sYXRlZENvcHkoKV0oKSBtdXRh
YmxlIHsKLSAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX2xvY2Fs
U3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICBsb2NhbFN0b3JhZ2VOYW1l
c3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29waWVkT3JpZ2luKTsKLQot
ICAgICAgICBmb3IgKGF1dG8mIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fdHJh
bnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgIHRyYW5z
aWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdp
bihjb3BpZWRPcmlnaW4pOwotCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
LT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29waWVkT3JpZ2luKTsKLSAgICB9KTsKLX0KLQot
dm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlT3JpZ2luc01vZGlmaWVkU2lu
Y2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lLCBGdW5jdGlvbjx2
b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Ro
aXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgdGltZSwgY29tcGxldGlvbkhhbmRs
ZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgYXV0
byBkZWxldGVkT3JpZ2lucyA9IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVE
YXRhYmFzZXNNb2RpZmllZFNpbmNlKHRpbWUpOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYg
b3JpZ2luIDogZGVsZXRlZE9yaWdpbnMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbG9jYWxT
dG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAg
ICAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRj
aGluZ09yaWdpbihvcmlnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiB0cmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UtPmNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRp
c3BhdGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKLSAgICB9KTsKLX0KLQotdm9pZCBT
dG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3Qg
VmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mIG9yaWdpbnMsIEZ1bmN0aW9uPHZv
aWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5E
YXRhPiBjb3BpZWRPcmlnaW5zOwotICAgIGNvcGllZE9yaWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBh
Y2l0eShvcmlnaW5zLnNpemUoKSk7Ci0KLSAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IG9yaWdpbnMp
Ci0gICAgICAgIGNvcGllZE9yaWdpbnMudW5jaGVja2VkQXBwZW5kKG9yaWdpbi5pc29sYXRlZENv
cHkoKSk7Ci0KLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1h
a2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW5zID0gV1RGTW92ZShjb3BpZWRPcmlnaW5zKSwgY29t
cGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsK
LSAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBjb3BpZWRPcmlnaW5zKSB7Ci0gICAgICAgICAg
ICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fbG9jYWxTdG9yYWdlTmFtZXNw
YWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNs
ZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3JpZ2luKTsKLQotICAgICAgICAgICAgZm9y
IChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgdHJhbnNpZW50TG9j
YWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdp
bik7Ci0KLSAgICAgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVE
YXRhYmFzZVdpdGhPcmlnaW4ob3JpZ2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJ1bkxvb3A6
Om1haW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7Ci0gICAgfSk7Ci19
Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNvbm5l
Y3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFn
ZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbkRhdGEpCi17
Ci0gICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4gY29ubmVj
dGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0KLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVCgo
SGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVm
UHRyPFN0b3JhZ2VBcmVhPj46OmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBh
aXIpKSk7Ci0KLSAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwg
dWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+Pjo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fc3Rv
cmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZChjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpciwg
bnVsbHB0cik7Ci0KLSAgICAvLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVj
a3MuCi0gICAgQVNTRVJUKHJlc3VsdC5pc05ld0VudHJ5KTsKLSAgICBBU1NFUlQoKEhhc2hNYXA8
dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+Pjo6aXNWYWxpZEtleShzdG9y
YWdlTmFtZXNwYWNlSUQpKSk7Ci0KLSAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3Rv
cmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VO
YW1lc3BhY2VJRCk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNo
ZWNrLgotICAgIEFTU0VSVChsb2NhbFN0b3JhZ2VOYW1lc3BhY2UpOwotCi0gICAgYXV0byBzdG9y
YWdlQXJlYSA9IGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShX
VEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOwotICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0ZW5l
cihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgcmVzdWx0Lml0ZXJhdG9yLT52YWx1
ZSA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVh
dGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1
aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJp
dHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW5EYXRhLCBTZWN1cml0eU9yaWdpbkRhdGEmJiBv
cmlnaW4pCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4K
LSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uaXNWYWxpZEtleSh7ICZjb25u
ZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSkpOwotCi0gICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgaGF2
ZSBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXMgY29ubmVjdGlvbi9vcmlnaW4gY29tYm8uCi0gICAg
Ly8gSWYgc28sIHVwZGF0ZSB0aGUgbWFwIHdpdGggdGhlIG5ldyBJRCwgb3RoZXJ3aXNlIGtlZXAg
b24gdHJ1Y2tpbmcuCi0gICAgZm9yIChhdXRvIGl0ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rp
b24uYmVnaW4oKSwgZW5kID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICBpZiAoaXQtPmtleS5maXJzdCAhPSAmY29ubmVjdGlvbikK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBSZWY8U3RvcmFnZUFyZWE+IGFyZWEgPSAq
aXQtPnZhbHVlOwotICAgICAgICBpZiAoIWFyZWEtPmlzU2Vzc2lvblN0b3JhZ2UoKSkKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoIW9yaWdpbi5zZWN1cml0eU9yaWdpbigpLT5p
c1NhbWVTY2hlbWVIb3N0UG9ydChhcmVhLT5zZWN1cml0eU9yaWdpbigpLnNlY3VyaXR5T3JpZ2lu
KCkuZ2V0KCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGFyZWEtPmFkZExpc3Rl
bmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0gICAgICAgIG1fc3RvcmFnZUFyZWFzQnlD
b25uZWN0aW9uLnJlbW92ZShpdCk7Ci0gICAgICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9u
LmFkZCh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSwgV1RGTW92ZShhcmVhKSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYXNCeUNv
bm5lY3Rpb24uYWRkKHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCB9LCBudWxscHRyKS5pdGVy
YXRvci0+dmFsdWU7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNo
ZWNrLgotICAgIEFTU0VSVCghc2xvdCk7Ci0KLSAgICBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UqIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlVHJhbnNp
ZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCwgV1RGTW92ZSh0b3BM
ZXZlbE9yaWdpbkRhdGEpKTsKLQotICAgIGF1dG8gc3RvcmFnZUFyZWEgPSB0cmFuc2llbnRMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92ZShvcmlnaW4p
KTsKLSAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
KTsKLQotICAgIHNsb3QgPSBXVEZNb3ZlKHN0b3JhZ2VBcmVhKTsKLX0KLQotdm9pZCBTdG9yYWdl
TWFuYWdlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0
aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwg
U2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW5EYXRhKQotewotICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKG1fc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSk7Ci0KLSAgICBT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Np
b25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKTsKLSAgICBpZiAoIXNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlKSB7Ci0gICAgICAgIC8vIFdlJ3JlIGdldHRpbmcgYW4gaW5j
b21pbmcgbWVzc2FnZSBmcm9tIHRoZSB3ZWIgcHJvY2VzcyB0aGF0J3MgZm9yIHNlc3Npb24gc3Rv
cmFnZSBmb3IgYSB3ZWIgcGFnZQotICAgICAgICAvLyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xv
c2VkLCBqdXN0IGlnbm9yZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
IH0pKTsKLQotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQo
eyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsK
LQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNT
RVJUKCFzbG90KTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hl
Y2suCi0gICAgQVNTRVJUKCZjb25uZWN0aW9uID09IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5h
bGxvd2VkQ29ubmVjdGlvbigpKTsKLQotICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBzZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5T3Jp
Z2luRGF0YSkpOwotICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9y
YWdlTWFwSUQpOwotCi0gICAgc2xvdCA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOwotfQotCi12b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5l
Y3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKLXsKLSAgICBzdGQ6OnBhaXI8UmVmUHRyPElQ
Qzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcigm
Y29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBi
ZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9u
LmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKTsKLQotICAgIGF1dG8g
aXQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5maW5kKGNvbm5lY3Rpb25BbmRTdG9yYWdl
TWFwSURQYWlyKTsKLSAgICBpZiAoaXQgPT0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5k
KCkpIHsKLSAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBiZWNhdXNl
IHRoZSBsYXN0IHBhZ2Ugd2FzIGNsb3NlZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGl0LT52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQot
ICAgIC8vIERvbid0IHJlbW92ZSBzZXNzaW9uIHN0b3JhZ2UgbWFwcy4gVGhlIHdlYiBwcm9jZXNz
IG1heSByZWNvbm5lY3QgYW5kIGV4cGVjdCB0aGUgZGF0YSB0byBzdGlsbCBiZSBhcm91bmQuCi0g
ICAgaWYgKGl0LT52YWx1ZS0+aXNTZXNzaW9uU3RvcmFnZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoY29ubmVjdGlvbkFuZFN0b3Jh
Z2VNYXBJRFBhaXIpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRWYWx1ZXMoSVBDOjpD
b25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0
b3JhZ2VNYXBTZWVkLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgdmFsdWVzKQotewotICAgIFN0
b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9y
YWdlTWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBh
IHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNs
b3NlZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFsdWVzID0g
c3RvcmFnZUFyZWEtPml0ZW1zKCk7Ci0gICAgY29ubmVjdGlvbi5zZW5kKE1lc3NhZ2VzOjpTdG9y
YWdlQXJlYU1hcDo6RGlkR2V0VmFsdWVzKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsK
LX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0SXRlbShJUEM6OkNvbm5lY3Rpb24mIGNvbm5l
Y3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJ
RCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJp
bmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKLXsKLSAgICBTdG9yYWdlQXJlYSog
c3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsK
LSAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0
b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIElnbm9y
ZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgcXVvdGFFcnJvcjsKLSAg
ICBzdG9yYWdlQXJlYS0+c2V0SXRlbSgmY29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwg
a2V5LCB2YWx1ZSwgdXJsU3RyaW5nLCBxdW90YUVycm9yKTsKLSAgICBjb25uZWN0aW9uLnNlbmQo
TWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRTZXRJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXks
IHF1b3RhRXJyb3IpLCBzdG9yYWdlTWFwSUQpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpy
ZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1h
cElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIFN0
b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9y
YWdlTWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBh
IHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNs
b3NlZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RvcmFnZUFy
ZWEtPnJlbW92ZUl0ZW0oJmNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgdXJs
U3RyaW5nKTsKLSAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpE
aWRSZW1vdmVJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXkpLCBzdG9yYWdlTWFwSUQpOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjbGVhcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0
X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIFN0b3Jh
Z2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdl
TWFwSUQpOwotICAgIGlmICghc3RvcmFnZUFyZWEpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHNl
c3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3Nl
ZC4gSWdub3JlIGl0LgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RvcmFnZUFyZWEt
PmNsZWFyKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1cmxTdHJpbmcpOwotICAg
IGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6OkRpZENsZWFyKHN0b3Jh
Z2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6YXBw
bGljYXRpb25XaWxsVGVybWluYXRlKCkKLXsKLSAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBob3Jl
OwotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCAmc2VtYXBob3JlXSB7Ci0gICAgICAgIFZl
Y3RvcjxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gY29ubmVj
dGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmU7Ci0gICAgICAgIGZvciAoYXV0byYgY29u
bmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7Ci0g
ICAgICAgICAgICBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyLnZhbHVlLT5yZW1vdmVMaXN0ZW5l
cigqY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkuZmlyc3QsIGNvbm5lY3Rpb25TdG9yYWdl
QXJlYVBhaXIua2V5LnNlY29uZCk7Ci0gICAgICAgICAgICBjb25uZWN0aW9uQW5kU3RvcmFnZU1h
cElEUGFpcnNUb1JlbW92ZS5hcHBlbmQoY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWly
IDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUpCi0gICAgICAgICAgICBt
X3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFp
cik7Ci0KLSAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOwotICAgIH0pOwotICAgIHNlbWFwaG9y
ZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKLX0KLQotU3RvcmFnZU1hbmFnZXI6OlN0b3Jh
Z2VBcmVhKiBTdG9yYWdlTWFuYWdlcjo6ZmluZFN0b3JhZ2VBcmVhKElQQzo6Q29ubmVjdGlvbiYg
Y29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKSBjb25zdAotewotICAgIHN0ZDo6cGFp
cjxJUEM6OkNvbm5lY3Rpb24qLCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBh
aXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICBpZiAoIW1fc3RvcmFnZUFyZWFz
QnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhc0J5Q29u
bmVjdGlvbi5nZXQoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOwotfQotCi1TdG9yYWdl
TWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBTdG9yYWdlTWFuYWdlcjo6Z2V0T3JDcmVh
dGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQotewot
ICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVz
cGFjZUlEKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvJiBzbG90ID0gbV9s
b2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmFkZChzdG9yYWdlTmFtZXNwYWNlSUQsIG51bGxwdHIpLml0
ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAoIXNsb3QpCi0gICAgICAgIHNsb3QgPSBMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2U6OmNyZWF0ZSh0aGlzLCBzdG9yYWdlTmFtZXNwYWNlSUQpOwotCi0gICAgcmV0
dXJuIHNsb3QuZ2V0KCk7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpUcmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UqIFN0b3JhZ2VNYW5hZ2VyOjpnZXRPckNyZWF0ZVRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luKQotewotICAgIGlmICghbV90cmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoeyBzdG9yYWdlTmFtZXNwYWNlSUQsIHRv
cExldmVsT3JpZ2luIH0pKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8mIHNs
b3QgPSBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMuYWRkKHsgc3RvcmFnZU5hbWVz
cGFjZUlELCBXVEZNb3ZlKHRvcExldmVsT3JpZ2luKSB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFs
dWU7Ci0gICAgaWYgKCFzbG90KQotICAgICAgICBzbG90ID0gVHJhbnNpZW50TG9jYWxTdG9yYWdl
TmFtZXNwYWNlOjpjcmVhdGUoKTsKLQotICAgIHJldHVybiBzbG90LmdldCgpOwotfQotCi19IC8v
IG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2Uv
U3RvcmFnZU1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmNjllYjcw
NzNhM2NhNWYzYjhlMjdkOTMzZDFiOGFlMjgxYTA5Yi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0
b3JhZ2VNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIkxv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlP
cmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhhc2guaD4KLSNp
bmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYv
RnVuY3Rpb24uaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9UaHJl
YWRTYWZlUmVmQ291bnRlZC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJpdHlPcmlnaW47Ci19Ci0KLW5hbWVzcGFj
ZSBXZWJLaXQgewotCi1jbGFzcyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI7Ci1jbGFzcyBX
ZWJQcm9jZXNzUHJveHk7Ci0KLWNsYXNzIFN0b3JhZ2VNYW5hZ2VyIDogcHVibGljIElQQzo6Q29u
bmVjdGlvbjo6V29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMg
UmVmPFN0b3JhZ2VNYW5hZ2VyPiBjcmVhdGUoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJl
Y3RvcnkpOwotICAgIH5TdG9yYWdlTWFuYWdlcigpOwotCi0gICAgdm9pZCBjcmVhdGVTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1
b3RhSW5CeXRlcyk7Ci0gICAgdm9pZCBkZXN0cm95U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWlu
dDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKTsKLSAgICB2b2lkIHNldEFsbG93ZWRTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZUNvbm5lY3Rpb24odWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBJUEM6
OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKTsKLSAgICB2b2lkIGNsb25lU2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdT
dG9yYWdlTmFtZXNwYWNlSUQpOwotCi0gICAgdm9pZCBwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9u
KFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYpOwotICAgIHZvaWQgcHJvY2Vzc0Rp
ZENsb3NlQ29ubmVjdGlvbihXZWJQcm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24mKTsKLSAg
ICB2b2lkIGFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZSgpOwotCi0gICAgdm9pZCBnZXRTZXNzaW9u
U3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZChIYXNoU2V0PFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YT4mJik+JiYgY29tcGxldGlvbkhhbmRsZXIpOwotICAgIHZvaWQgZGVsZXRlU2Vzc2lv
blN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7Ci0g
ICAgdm9pZCBkZWxldGVTZXNzaW9uU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3Rv
cjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBs
ZXRpb25IYW5kbGVyKTsKLQotICAgIHZvaWQgZ2V0TG9jYWxTdG9yYWdlT3JpZ2lucyhGdW5jdGlv
bjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0
aW9uSGFuZGxlcik7Ci0gICAgdm9pZCBkZWxldGVMb2NhbFN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2lu
KFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKLQotICAgIHZvaWQgZGVsZXRlTG9jYWxT
dG9yYWdlT3JpZ2luc01vZGlmaWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGlt
ZV9wb2ludCwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKLSAgICB2b2lk
IGRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5k
bGVyKTsKLQotICAgIHZvaWQgZ2V0TG9jYWxTdG9yYWdlT3JpZ2luRGV0YWlscyhGdW5jdGlvbjx2
b2lkKFZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+KT4m
JiBjb21wbGV0aW9uSGFuZGxlcik7Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgU3RvcmFnZU1h
bmFnZXIoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotCi0gICAgLy8gSVBD
OjpDb25uZWN0aW9uOjpXb3JrUXVldWVNZXNzYWdlUmVjZWl2ZXIuCi0gICAgdm9pZCBkaWRSZWNl
aXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImKSBvdmVycmlkZTsKLSAg
ICB2b2lkIGRpZFJlY2VpdmVTeW5jTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29k
ZXImLCBzdGQ6OnVuaXF1ZV9wdHI8SVBDOjpFbmNvZGVyPiYgcmVwbHlFbmNvZGVyKSBvdmVycmlk
ZTsKLQotICAgIC8vIE1lc3NhZ2UgaGFuZGxlcnMuCi0gICAgdm9pZCBjcmVhdGVMb2NhbFN0b3Jh
Z2VNYXAoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBz
dG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKLSAgICB2
b2lkIGNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50
NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6
U2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW5EYXRhLCBXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGEmJik7Ci0gICAgdm9pZCBjcmVhdGVTZXNzaW9uU3RvcmFnZU1hcChJUEM6OkNv
bm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3Bh
Y2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYpOwotICAgIHZvaWQgZGVzdHJveVN0
b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKTsKLQotICAg
IHZvaWQgZ2V0VmFsdWVzKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwg
dWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiB2YWx1ZXMp
OwotICAgIHZvaWQgc2V0SXRlbShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlQXJl
YUlELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYg
dXJsU3RyaW5nKTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uJiwgdWludDY0
X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBz
dG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5n
KTsKLSAgICB2b2lkIGNsZWFyKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJ
RCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQs
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLQotICAgIGNsYXNzIFN0b3JhZ2VBcmVhOwotICAg
IFN0b3JhZ2VBcmVhKiBmaW5kU3RvcmFnZUFyZWEoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qp
IGNvbnN0OwotCi0gICAgY2xhc3MgTG9jYWxTdG9yYWdlTmFtZXNwYWNlOwotICAgIExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSogZ2V0T3JDcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlEKTsKLQotICAgIGNsYXNzIFRyYW5zaWVudExvY2FsU3RvcmFnZU5h
bWVzcGFjZTsKLSAgICBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGdldE9yQ3JlYXRl
VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJ
RCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW4pOwotCi0gICAg
UmVmPFdvcmtRdWV1ZT4gbV9xdWV1ZTsKLQotICAgIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI+IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOwotICAgIEhhc2hNYXA8dWludDY0
X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+PiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFj
ZXM7Ci0KLSAgICBIYXNoTWFwPHN0ZDo6cGFpcjx1aW50NjRfdCwgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhPiwgUmVmUHRyPFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4+IG1fdHJh
bnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlczsKLQotICAgIGNsYXNzIFNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlOwotICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZT4+IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzOwotCi0gICAgSGFzaE1hcDxzdGQ6
OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VB
cmVhPj4gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb247Ci19OwotCi19IC8vIG5hbWVzcGFjZSBX
ZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFn
ZU1hbmFnZXIubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0
b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAy
NTc4OWY3NGNjMDgxYjA3NGI1ODg1MGQyYjdkN2JjNDE4MDQ5YzhhLi4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNCAr
MCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0jICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0jIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSMgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
LSMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotIyBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0j
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SCi0jIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0jIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLW1lc3NhZ2Vz
IC0+IFN0b3JhZ2VNYW5hZ2VyIHsKLSAgICBDcmVhdGVMb2NhbFN0b3JhZ2VNYXAodWludDY0X3Qg
c3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHN0cnVjdCBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5EYXRhKSBXYW50c0Nvbm5lY3Rpb24K
LSAgICBDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1hcElE
LCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGEgdG9wTGV2ZWxTZWN1cml0eU9yaWdpbkRhdGEsIHN0cnVjdCBXZWJDb3JlOjpTZWN1
cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5EYXRhKSBXYW50c0Nvbm5lY3Rpb24KLSAgICBD
cmVhdGVTZXNzaW9uU3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0
b3JhZ2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBzZWN1
cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgotICAgIERlc3Ryb3lTdG9yYWdlTWFwKHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCkgV2FudHNDb25uZWN0aW9uCi0KLSAgICBHZXRWYWx1ZXModWlu
dDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkgLT4gKEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+IHZhbHVlcykgV2FudHNDb25uZWN0aW9uCi0KLSAgICBTZXRJdGVtKHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0
X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHVybFN0
cmluZykgV2FudHNDb25uZWN0aW9uCi0gICAgUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFw
SUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVk
LCBTdHJpbmcga2V5LCBTdHJpbmcgdXJsU3RyaW5nKSBXYW50c0Nvbm5lY3Rpb24KLSAgICBDbGVh
cih1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVp
bnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcgdXJsU3RyaW5nKSBXYW50c0Nvbm5lY3Rpb24K
LX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL0xvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0
b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbQpkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggZmQ5MDllYTZiMjUwMzE5YjAxMzA2YzQzNmJkMGYxMzJjMGY4Mjg1
Ni4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJ
T1MubW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgot
Ci0jaWYgUExBVEZPUk0oSU9TKQotCi0jaW5jbHVkZSAiVmVyc2lvbkNoZWNrcy5oIgotCi1uYW1l
c3BhY2UgV2ViS2l0IHsKLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnBsYXRm
b3JtTWF5YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1faGFzRXhjbHVk
ZWRGcm9tQmFja3VwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2hhc0V4Y2x1ZGVkRnJvbUJh
Y2t1cCA9IHRydWU7Ci0KLSAgICBpZiAobGlua2VkT25PckFmdGVyKFNES1ZlcnNpb246OkZpcnN0
VG9FeGNsdWRlTG9jYWxTdG9yYWdlRnJvbUJhY2t1cCkpCi0gICAgICAgIFtbTlNVUkwgZmlsZVVS
TFdpdGhQYXRoOihOU1N0cmluZyAqKW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5XSBzZXRSZXNvdXJj
ZVZhbHVlOkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21CYWNrdXBLZXkgZXJyb3I6bmls
XTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9pb3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlSU9TLm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9p
b3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVjYmQyOGUyNDkyOTEzYTQzMjc2NGM5YmE5MzY1Mjc3
Yzk3NzIxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZUlPUy5tbQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNpbXBvcnQgIlJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIgotCi0jaWYgUExBVEZPUk0oSU9TKQotCi1uYW1lc3Bh
Y2UgV2ViS2l0IHsKLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2U6OmV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKLXsKLSAgICBbW05TVVJMIGZpbGVVUkxXaXRo
UGF0aDooTlNTdHJpbmcgKiltX3N0b3JhZ2VEaXJlY3RvcnlQYXRoXSBzZXRSZXNvdXJjZVZhbHVl
OkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21CYWNrdXBLZXkgZXJyb3I6bmlsXTsKLX0K
LQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0
b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
V2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTk4YTNiZDY4
OTBlNTNkOTFjMzkwNGM5OTc5ZTkxZGFlNDU1MDUxMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwCkBA
IC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAy
MDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlLmgiCisKKyNpbmNsdWRl
ICJMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVT
eXN0ZW0uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVN0YXRlbWVudC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvU1FMaXRlVHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5
T3JpZ2luLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9TdWRkZW5UZXJtaW5hdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworc3RhdGljIGNvbnN0IGF1dG8gZGF0YWJhc2VVcGRhdGVJbnRlcnZhbCA9IDFfczsKKwor
c3RhdGljIGNvbnN0IGludCBtYXhpbXVtSXRlbXNUb1VwZGF0ZSA9IDEwMDsKKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK1JlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gTG9jYWxTdG9yYWdlRGF0YWJh
c2U6OmNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyPiYmIHRyYWNrZXIsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlP
cmlnaW4pCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTG9jYWxTdG9yYWdlRGF0YWJhc2Uo
V1RGTW92ZShxdWV1ZSksIFdURk1vdmUodHJhY2tlciksIHNlY3VyaXR5T3JpZ2luKSk7Cit9CisK
K0xvY2FsU3RvcmFnZURhdGFiYXNlOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZShSZWY8V29ya1F1ZXVl
PiYmIHF1ZXVlLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmIHRyYWNrZXIsIGNv
bnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCisgICAgOiBtX3F1ZXVlKFdU
Rk1vdmUocXVldWUpKQorICAgICwgbV90cmFja2VyKFdURk1vdmUodHJhY2tlcikpCisgICAgLCBt
X3NlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQorICAgICwgbV9kYXRhYmFzZVBhdGgobV90
cmFja2VyLT5kYXRhYmFzZVBhdGgobV9zZWN1cml0eU9yaWdpbikpCisgICAgLCBtX2ZhaWxlZFRv
T3BlbkRhdGFiYXNlKGZhbHNlKQorICAgICwgbV9kaWRJbXBvcnRJdGVtcyhmYWxzZSkKKyAgICAs
IG1faXNDbG9zZWQoZmFsc2UpCisgICAgLCBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoZmFs
c2UpCisgICAgLCBtX3Nob3VsZENsZWFySXRlbXMoZmFsc2UpCit7Cit9CisKK0xvY2FsU3RvcmFn
ZURhdGFiYXNlOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2UoKQoreworICAgIEFTU0VSVChtX2lzQ2xv
c2VkKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6b3BlbkRhdGFiYXNlKERhdGFi
YXNlT3BlbmluZ1N0cmF0ZWd5IG9wZW5pbmdTdHJhdGVneSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0
YWJhc2UuaXNPcGVuKCkpOworICAgIEFTU0VSVCghbV9mYWlsZWRUb09wZW5EYXRhYmFzZSk7CisK
KyAgICBpZiAoIXRyeVRvT3BlbkRhdGFiYXNlKG9wZW5pbmdTdHJhdGVneSkpIHsKKyAgICAgICAg
bV9mYWlsZWRUb09wZW5EYXRhYmFzZSA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgbV90cmFja2VyLT5kaWRPcGVu
RGF0YWJhc2VXaXRoT3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pOworfQorCitib29sIExvY2FsU3Rv
cmFnZURhdGFiYXNlOjp0cnlUb09wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBv
cGVuaW5nU3RyYXRlZ3kpCit7CisgICAgaWYgKCFmaWxlRXhpc3RzKG1fZGF0YWJhc2VQYXRoKSAm
JiBvcGVuaW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhpc3RlbnQpCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBMT0df
RVJST1IoIkZpbGVuYW1lIGZvciBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIGlzIGVtcHR5IC0gY2Fu
bm90IG9wZW4gZm9yIHBlcnNpc3RlbnQgc3RvcmFnZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLm9wZW4obV9kYXRhYmFzZVBhdGgpKSB7Cisg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgZmlsZSAlcyBmb3IgbG9j
YWwgc3RvcmFnZSIsIG1fZGF0YWJhc2VQYXRoLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2luY2UgYSBXb3JrUXVldWUgaXNuJ3QgYm91bmQg
dG8gYSBzcGVjaWZpYyB0aHJlYWQsIHdlIGhhdmUgdG8gZGlzYWJsZSB0aHJlYWRpbmcgY2hlY2tz
CisgICAgLy8gZXZlbiB0aG91Z2ggd2UgbmV2ZXIgYWNjZXNzIHRoZSBkYXRhYmFzZSBmcm9tIGRp
ZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5LgorICAgIG1fZGF0YWJhc2UuZGlzYWJsZVRo
cmVhZGluZ0NoZWNrcygpOworCisgICAgaWYgKCFtaWdyYXRlSXRlbVRhYmxlSWZOZWVkZWQoKSkg
eworICAgICAgICAvLyBXZSBmYWlsZWQgdG8gbWlncmF0ZSB0aGUgaXRlbSB0YWJsZS4gSW4gb3Jk
ZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIG1pZ3JhdGUgdGhlIHRhYmxlIG92ZXIgYW5kIG92ZXIsCisg
ICAgICAgIC8vIGp1c3QgZGVsZXRlIGl0IGFuZCBzdGFydCBmcm9tIHNjcmF0Y2guCisgICAgICAg
IGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiRFJPUCBUQUJMRSBJdGVtVGFibGUiKSkK
KyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGRlbGV0ZSB0YWJsZSBJdGVtVGFibGUg
Zm9yIGxvY2FsIHN0b3JhZ2UiKTsKKyAgICB9CisKKyAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0
ZUNvbW1hbmQoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEl0ZW1UYWJsZSAoa2V5IFRFWFQg
VU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHZhbHVlIEJMT0IgTk9UIE5VTEwgT04gQ09ORkxJ
Q1QgRkFJTCkiKSkgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgdGFibGUg
SXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6
bWlncmF0ZUl0ZW1UYWJsZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoIW1fZGF0YWJhc2UudGFibGVF
eGlzdHMoIkl0ZW1UYWJsZSIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFNRTGl0ZVN0
YXRlbWVudCBxdWVyeShtX2RhdGFiYXNlLCAiU0VMRUNUIHZhbHVlIEZST00gSXRlbVRhYmxlIExJ
TUlUIDEiKTsKKworICAgIC8vIFRoaXMgcXVlcnkgaXNuJ3QgZXZlciBleGVjdXRlZCwgaXQncyBq
dXN0IHVzZWQgdG8gY2hlY2sgdGhlIGNvbHVtbiB0eXBlLgorICAgIGlmIChxdWVyeS5pc0NvbHVt
bkRlY2xhcmVkQXNCbG9iKDApKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENyZWF0
ZSBhIG5ldyB0YWJsZSB3aXRoIHRoZSByaWdodCB0eXBlLCBjb3B5IGFsbCB0aGUgZGF0YSBvdmVy
IHRvIGl0IGFuZCB0aGVuIHJlcGxhY2UgdGhlIG5ldyB0YWJsZSB3aXRoIHRoZSBvbGQgdGFibGUu
CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRzW10gPSB7CisgICAgICAgICJEUk9QIFRB
QkxFIElGIEVYSVNUUyBJdGVtVGFibGUyIiwKKyAgICAgICAgIkNSRUFURSBUQUJMRSBJdGVtVGFi
bGUyIChrZXkgVEVYVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgdmFsdWUgQkxPQiBOT1Qg
TlVMTCBPTiBDT05GTElDVCBGQUlMKSIsCisgICAgICAgICJJTlNFUlQgSU5UTyBJdGVtVGFibGUy
IFNFTEVDVCAqIGZyb20gSXRlbVRhYmxlIiwKKyAgICAgICAgIkRST1AgVEFCTEUgSXRlbVRhYmxl
IiwKKyAgICAgICAgIkFMVEVSIFRBQkxFIEl0ZW1UYWJsZTIgUkVOQU1FIFRPIEl0ZW1UYWJsZSIs
CisgICAgICAgIDAsCisgICAgfTsKKworICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9u
KG1fZGF0YWJhc2UsIGZhbHNlKTsKKyAgICB0cmFuc2FjdGlvbi5iZWdpbigpOworCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGNvbW1hbmRzW2ldOyArK2kpIHsKKyAgICAgICAgaWYgKG1fZGF0YWJh
c2UuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0pKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gbWlncmF0ZSB0YWJsZSBJdGVtVGFibGUgZm9y
IGxvY2FsIHN0b3JhZ2Ugd2hlbiBleGVjdXRpbmc6ICVzIiwgY29tbWFuZHNbaV0pOworICAgICAg
ICB0cmFuc2FjdGlvbi5yb2xsYmFjaygpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6aW1wb3J0SXRlbXMoU3RvcmFnZU1hcCYgc3RvcmFnZU1h
cCkKK3sKKyAgICBpZiAobV9kaWRJbXBvcnRJdGVtcykKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gRklYTUU6IElmIGl0IGNhbid0IGltcG9ydCwgdGhlbiB0aGUgZGVmYXVsdCBXZWJLaXQgYmVo
YXZpb3Igc2hvdWxkIGJlIHRoYXQgb2YgcHJpdmF0ZSBicm93c2luZywKKyAgICAvLyBub3Qgc2ls
ZW50bHkgaWdub3JpbmcgaXQuIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yNTg5NAorCisgICAgLy8gV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBldmVuIGlmIHdlIGRvbid0IGVu
ZCB1cCBpbXBvcnRpbmcgYW55IGl0ZW1zIGR1ZSB0byBmYWlsdXJlIGJlY2F1c2UKKyAgICAvLyB0
aGVyZSdzIHJlYWxseSBubyBnb29kIHdheSB0byByZWNvdmVyIG90aGVyIHRoYW4gbm90IGltcG9y
dGluZyBhbnl0aGluZy4KKyAgICBtX2RpZEltcG9ydEl0ZW1zID0gdHJ1ZTsKKworICAgIG9wZW5E
YXRhYmFzZShTa2lwSWZOb25FeGlzdGVudCk7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Blbigp
KQorICAgICAgICByZXR1cm47CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFz
ZSwgIlNFTEVDVCBrZXksIHZhbHVlIEZST00gSXRlbVRhYmxlIik7CisgICAgaWYgKHF1ZXJ5LnBy
ZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc2Vs
ZWN0IGl0ZW1zIGZyb20gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBpdGVtczsKKworICAg
IGludCByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAgd2hpbGUgKHJlc3VsdCA9PSBTUUxJVEVf
Uk9XKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBxdWVyeS5nZXRDb2x1bW5UZXh0KDApOworICAg
ICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMSk7CisgICAg
ICAgIGlmICgha2V5LmlzTnVsbCgpICYmICF2YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgIGl0
ZW1zLnNldChrZXksIHZhbHVlKTsKKyAgICAgICAgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOworICAg
IH0KKworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJFcnJvciByZWFkaW5nIGl0ZW1zIGZyb20gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdG9yYWdlTWFwLmltcG9ydEl0ZW1zKGl0
ZW1zKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6c2V0SXRlbShjb25zdCBTdHJp
bmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBpdGVtRGlkQ2hhbmdlKGtleSwg
dmFsdWUpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpyZW1vdmVJdGVtKGNvbnN0
IFN0cmluZyYga2V5KQoreworICAgIGl0ZW1EaWRDaGFuZ2Uoa2V5LCBTdHJpbmcoKSk7Cit9CisK
K3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNsZWFyKCkKK3sKKyAgICBtX2NoYW5nZWRJdGVt
cy5jbGVhcigpOworICAgIG1fc2hvdWxkQ2xlYXJJdGVtcyA9IHRydWU7CisKKyAgICBzY2hlZHVs
ZURhdGFiYXNlVXBkYXRlKCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNsb3Nl
KCkKK3sKKyAgICBBU1NFUlQoIW1faXNDbG9zZWQpOworICAgIG1faXNDbG9zZWQgPSB0cnVlOwor
CisgICAgaWYgKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSkgeworICAgICAgICB1cGRhdGVE
YXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMobV9jaGFuZ2VkSXRlbXMpOworICAgICAgICBtX2NoYW5n
ZWRJdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSA9IGRhdGFiYXNlSXNF
bXB0eSgpOworCisgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIG1fZGF0YWJh
c2UuY2xvc2UoKTsKKworICAgIGlmIChpc0VtcHR5KQorICAgICAgICBtX3RyYWNrZXItPmRlbGV0
ZURhdGFiYXNlV2l0aE9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKTsKK30KKwordm9pZCBMb2NhbFN0
b3JhZ2VEYXRhYmFzZTo6aXRlbURpZENoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKK3sKKyAgICBtX2NoYW5nZWRJdGVtcy5zZXQoa2V5LCB2YWx1ZSk7CisgICAg
c2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNl
OjpzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCkKK3sKKyAgICBpZiAobV9kaWRTY2hlZHVsZURhdGFi
YXNlVXBkYXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fZGlzYWJsZVN1ZGRlblRl
cm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UpCisgICAgICAgIG1fZGlzYWJsZVN1
ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5p
cXVlPFN1ZGRlblRlcm1pbmF0aW9uRGlzYWJsZXI+KCk7CisKKyAgICBtX2RpZFNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUgPSB0cnVlOworCisgICAgUmVmUHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBs
b2NhbFN0b3JhZ2VEYXRhYmFzZSh0aGlzKTsKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaEFmdGVyKGRh
dGFiYXNlVXBkYXRlSW50ZXJ2YWwsIFtsb2NhbFN0b3JhZ2VEYXRhYmFzZV0geworICAgICAgICBs
b2NhbFN0b3JhZ2VEYXRhYmFzZS0+dXBkYXRlRGF0YWJhc2UoKTsKKyAgICB9KTsKK30KKwordm9p
ZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0YWJhc2UoKQoreworICAgIGlmIChtX2lz
Q2xvc2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9kaWRTY2hlZHVsZURhdGFi
YXNlVXBkYXRlKTsKKyAgICBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUgPSBmYWxzZTsKKwor
ICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNoYW5nZWRJdGVtczsKKyAgICBpZiAobV9jaGFu
Z2VkSXRlbXMuc2l6ZSgpIDw9IG1heGltdW1JdGVtc1RvVXBkYXRlKSB7CisgICAgICAgIC8vIFRo
ZXJlIGFyZSBmZXcgZW5vdWdoIGNoYW5nZWQgaXRlbXMgdGhhdCB3ZSBjYW4ganVzdCBhbHdheXMg
d3JpdGUgYWxsIG9mIHRoZW0uCisgICAgICAgIG1fY2hhbmdlZEl0ZW1zLnN3YXAoY2hhbmdlZEl0
ZW1zKTsKKyAgICAgICAgdXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNoYW5nZWRJdGVt
cyk7CisgICAgICAgIG1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2Nh
bFN0b3JhZ2UgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbWF4aW11bUl0ZW1zVG9VcGRhdGU7ICsraSkgeworICAgICAgICAgICAgYXV0byBpdCA9
IG1fY2hhbmdlZEl0ZW1zLmJlZ2luKCk7CisgICAgICAgICAgICBjaGFuZ2VkSXRlbXMuYWRkKGl0
LT5rZXksIGl0LT52YWx1ZSk7CisKKyAgICAgICAgICAgIG1fY2hhbmdlZEl0ZW1zLnJlbW92ZShp
dCk7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlQoY2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBt
YXhpbXVtSXRlbXNUb1VwZGF0ZSk7CisKKyAgICAgICAgLy8gUmVzY2hlZHVsZSB0aGUgdXBkYXRl
IGZvciB0aGUgcmVtYWluaW5nIGl0ZW1zLgorICAgICAgICBzY2hlZHVsZURhdGFiYXNlVXBkYXRl
KCk7CisgICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMp
OworICAgIH0KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0YWJhc2VX
aXRoQ2hhbmdlZEl0ZW1zKGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBjaGFuZ2VkSXRl
bXMpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICBvcGVuRGF0YWJh
c2UoQ3JlYXRlSWZOb25FeGlzdGVudCk7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9zaG91bGRDbGVhckl0ZW1zKSB7CisgICAgICAg
IG1fc2hvdWxkQ2xlYXJJdGVtcyA9IGZhbHNlOworCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBj
bGVhclN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxlIik7CisgICAg
ICAgIGlmIChjbGVhclN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGNsZWFyIHN0YXRlbWVudCAtIGNhbm5v
dCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIik7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVzdWx0ID0gY2xlYXJTdGF0ZW1lbnQuc3RlcCgp
OworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBMT0df
RVJST1IoIkZhaWxlZCB0byBjbGVhciBhbGwgaXRlbXMgaW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0
YWJhc2UgLSAlaSIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgaW5zZXJ0U3RhdGVtZW50KG1fZGF0YWJhc2UsICJJ
TlNFUlQgSU5UTyBJdGVtVGFibGUgVkFMVUVTICg/LCA/KSIpOworICAgIGlmIChpbnNlcnRTdGF0
ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxl
ZCB0byBwcmVwYXJlIGluc2VydCBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3Rv
cmFnZSBkYXRhYmFzZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU1FMaXRlU3Rh
dGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxl
IFdIRVJFIGtleT0/Iik7CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FM
SVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgZGVsZXRlIHN0
YXRlbWVudCAtIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiht
X2RhdGFiYXNlKTsKKyAgICB0cmFuc2FjdGlvbi5iZWdpbigpOworCisgICAgZm9yIChhdXRvIGl0
ID0gY2hhbmdlZEl0ZW1zLmJlZ2luKCksIGVuZCA9IGNoYW5nZWRJdGVtcy5lbmQoKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgIC8vIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IHRoZSBrZXkv
dmFsdWUgcGFpciBzaG91bGQgYmUgZGVsZXRlZC4KKyAgICAgICAgU1FMaXRlU3RhdGVtZW50JiBz
dGF0ZW1lbnQgPSBpdC0+dmFsdWUuaXNOdWxsKCkgPyBkZWxldGVTdGF0ZW1lbnQgOiBpbnNlcnRT
dGF0ZW1lbnQ7CisKKyAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIGl0LT5rZXkpOworCisg
ICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhIGtleS92YWx1ZSBwYWlyLCBiaW5kIHRoZSB2
YWx1ZSBhcyB3ZWxsLgorICAgICAgICBpZiAoIWl0LT52YWx1ZS5pc051bGwoKSkKKyAgICAgICAg
ICAgIHN0YXRlbWVudC5iaW5kQmxvYigyLCBpdC0+dmFsdWUpOworCisgICAgICAgIGludCByZXN1
bHQgPSBzdGF0ZW1lbnQuc3RlcCgpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05F
KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byB1cGRhdGUgaXRlbSBpbiB0aGUg
bG9jYWwgc3RvcmFnZSBkYXRhYmFzZSAtICVpIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50LnJlc2V0KCk7CisgICAgfQorCisgICAg
dHJhbnNhY3Rpb24uY29tbWl0KCk7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmRh
dGFiYXNlSXNFbXB0eSgpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwg
IlNFTEVDVCBDT1VOVCgqKSBGUk9NIEl0ZW1UYWJsZSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJl
KCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNvdW50IG51
bWJlciBvZiByb3dzIGluIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKKyAg
ICBpZiAocmVzdWx0ICE9IFNRTElURV9ST1cpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJObyByZXN1
bHRzIHdoZW4gY291bnRpbmcgbnVtYmVyIG9mIHJvd3MgaW4gSXRlbVRhYmxlIGZvciBsb2NhbCBz
dG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIXF1
ZXJ5LmdldENvbHVtbkludCgwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFi
YXNlLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURh
dGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uOTk5MjAzMWY0NDhmYjNkOTE1ODAxODZkODg2MGExMmQ4NDg1
OTU2MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3Jh
Z2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0
ZURhdGFiYXNlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNp
bmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgor
I2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3Mg
U2VjdXJpdHlPcmlnaW47CitjbGFzcyBTdG9yYWdlTWFwOworY2xhc3MgU3VkZGVuVGVybWluYXRp
b25EaXNhYmxlcjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcjsKKworY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2UgOiBwdWJsaWMg
VGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlPiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4m
JiwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiwgY29uc3QgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhJik7CisgICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlKCk7CisKKyAgICAv
LyBXaWxsIGJsb2NrIHVudGlsIHRoZSBpbXBvcnQgaXMgY29tcGxldGUuCisgICAgdm9pZCBpbXBv
cnRJdGVtcyhXZWJDb3JlOjpTdG9yYWdlTWFwJik7CisKKyAgICB2b2lkIHNldEl0ZW0oY29uc3Qg
U3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpOworICAgIHZvaWQgcmVtb3ZlSXRlbShj
b25zdCBTdHJpbmcmIGtleSk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gV2lsbCBibG9j
ayB1bnRpbCBhbGwgcGVuZGluZyBjaGFuZ2VzIGhhdmUgYmVlbiB3cml0dGVuIHRvIGRpc2suCisg
ICAgdm9pZCBjbG9zZSgpOworCitwcml2YXRlOgorICAgIExvY2FsU3RvcmFnZURhdGFiYXNlKFJl
ZjxXb3JrUXVldWU+JiYsIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0
IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOworCisgICAgZW51bSBEYXRhYmFzZU9wZW5p
bmdTdHJhdGVneSB7CisgICAgICAgIENyZWF0ZUlmTm9uRXhpc3RlbnQsCisgICAgICAgIFNraXBJ
Zk5vbkV4aXN0ZW50CisgICAgfTsKKyAgICBib29sIHRyeVRvT3BlbkRhdGFiYXNlKERhdGFiYXNl
T3BlbmluZ1N0cmF0ZWd5KTsKKyAgICB2b2lkIG9wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdT
dHJhdGVneSk7CisKKyAgICBib29sIG1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgpOworCisgICAg
dm9pZCBpdGVtRGlkQ2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVl
KTsKKworICAgIHZvaWQgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOworICAgIHZvaWQgdXBkYXRl
RGF0YWJhc2UoKTsKKyAgICB2b2lkIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjb25z
dCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYpOworCisgICAgYm9vbCBkYXRhYmFzZUlzRW1wdHko
KTsKKworICAgIFJlZjxXb3JrUXVldWU+IG1fcXVldWU7CisgICAgUmVmPExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcj4gbV90cmFja2VyOworICAgIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0
YSBtX3NlY3VyaXR5T3JpZ2luOworCisgICAgU3RyaW5nIG1fZGF0YWJhc2VQYXRoOworICAgIFdl
YkNvcmU6OlNRTGl0ZURhdGFiYXNlIG1fZGF0YWJhc2U7CisgICAgYm9vbCBtX2ZhaWxlZFRvT3Bl
bkRhdGFiYXNlOworICAgIGJvb2wgbV9kaWRJbXBvcnRJdGVtczsKKyAgICBib29sIG1faXNDbG9z
ZWQ7CisKKyAgICBib29sIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZTsKKyAgICBib29sIG1f
c2hvdWxkQ2xlYXJJdGVtczsKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtX2NoYW5nZWRJ
dGVtczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTdWRkZW5UZXJtaW5hdGlvbkRp
c2FibGVyPiBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9y
YWdlOworfTsKKworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xOWIyMjlmNmI1Mzc0YTc3NDYzYWFmOWI0NjRjZTkz
NmEwNGFjYzJiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2Vi
U3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwCkBAIC0wLDAgKzEsMzg5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVt
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVGaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2lu
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL1RleHRFbmNvZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW5j
bHVkZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFt
ZXNwYWNlIFdlYktpdCB7CisKK1JlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNv
bnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQoreworICAgIHJldHVybiBhZG9wdFJl
ZigqbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcihXVEZNb3ZlKHF1ZXVlKSwgbG9jYWxT
dG9yYWdlRGlyZWN0b3J5KSk7Cit9CisKK0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6TG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0
cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQorICAgIDogbV9xdWV1ZShXVEZNb3ZlKHF1ZXVl
KSkKKyAgICAsIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KGxvY2FsU3RvcmFnZURpcmVjdG9yeS5p
c29sYXRlZENvcHkoKSkKK3sKKyAgICBBU1NFUlQoIW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5Lmlz
RW1wdHkoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIGlzIGluaXRpYWxpemVk
IGJlZm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0aGluZ3MgdG8gdGhlIHF1ZXVlLgorICAgIFVU
RjhFbmNvZGluZygpOworCisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+aW1wb3J0
T3JpZ2luSWRlbnRpZmllcnMoKTsKKyAgICB9KTsKK30KKworTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKCkKK3sKK30KKworU3RyaW5nIExv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VQYXRoKGNvbnN0IFNlY3VyaXR5T3Jp
Z2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pIGNvbnN0Cit7CisgICAgcmV0dXJuIGRhdGFiYXNlUGF0
aChzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIubG9jYWxzdG9yYWdlIik7
Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkaWRPcGVuRGF0YWJhc2VX
aXRoT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7Cisg
ICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbi5kYXRhYmFz
ZUlkZW50aWZpZXIoKSwgZGF0YWJhc2VQYXRoKHNlY3VyaXR5T3JpZ2luKSk7Cit9CisKK3ZvaWQg
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29u
c3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICByZW1vdmVEYXRh
YmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmRhdGFiYXNlSWRlbnRpZmll
cigpKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERh
dGFiYXNlcygpCit7CisgICAgbV9vcmlnaW5zLmNsZWFyKCk7CisKKyAgICBvcGVuVHJhY2tlckRh
dGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRh
YmFzZSwgIlNFTEVDVCBvcmlnaW4sIHBhdGggRlJPTSBPcmlnaW5zIik7CisgICAgaWYgKHN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aW50IHJlc3VsdDsKKyAgICB3aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNR
TElURV9ST1cpIHsKKyAgICAgICAgZGVsZXRlRmlsZShzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgx
KSk7CisKKyAgICAgICAgLy8gRklYTUU6IENhbGwgb3V0IHRvIHRoZSBjbGllbnQuCisgICAgfQor
CisgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKKworICAgIGlm
IChtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisKKyAg
ICBpZiAoIWRlbGV0ZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKSkgeworICAgICAgICAvLyBJ
biB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVsZXRlIHRoZSBkYXRhYmFz
ZSBmaWxlIChlLmcgc29tZSBvdGhlciBwcm9ncmFtCisgICAgICAgIC8vIGxpa2UgYSB2aXJ1cyBz
Y2FubmVyIGlzIGFjY2Vzc2luZyBpdCksIG1ha2Ugc3VyZSB0byByZW1vdmUgYWxsIGVudHJpZXMu
CisgICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOworICAgICAg
ICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZS
T00gT3JpZ2lucyIpOworICAgICAgICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSAhPSBT
UUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVs
ZXRpb24gb2YgYWxsIG9yaWdpbnMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7CisgICAgICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGFsbCBvcmlnaW5z
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVF
bXB0eURpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSk7Cit9CisKK3N0YXRpYyBzdGQ6
Om9wdGlvbmFsPHRpbWVfdD4gZmlsZUNyZWF0aW9uVGltZShjb25zdCBTdHJpbmcmIGZpbGVQYXRo
KQoreworICAgIHRpbWVfdCB0aW1lOworICAgIHJldHVybiBnZXRGaWxlQ3JlYXRpb25UaW1lKGZp
bGVQYXRoLCB0aW1lKSA/IHRpbWUgOiBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4oc3RkOjpudWxsb3B0
KTsKK30KKworc3RhdGljIHN0ZDo6b3B0aW9uYWw8dGltZV90PiBmaWxlTW9kaWZpY2F0aW9uVGlt
ZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAgIHRpbWVfdCB0aW1lOworICAgIGlmICgh
Z2V0RmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgsIHRpbWUpKQorICAgICAgICByZXR1cm4g
c3RkOjpudWxsb3B0OworCisgICAgcmV0dXJuIHRpbWU7Cit9CisKK1ZlY3RvcjxTZWN1cml0eU9y
aWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VzTW9k
aWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUpCit7
CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgaW1wb3J0T3JpZ2luSWRlbnRp
ZmllcnMoKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlOwor
CisgICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbiA6IG1fb3JpZ2lucykgeworICAgICAgICBT
dHJpbmcgZmlsZVBhdGggPSBwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmln
aW4pOworCisgICAgICAgIGF1dG8gbW9kaWZpY2F0aW9uVGltZSA9IGZpbGVNb2RpZmljYXRpb25U
aW1lKGZpbGVQYXRoKTsKKyAgICAgICAgaWYgKCFtb2RpZmljYXRpb25UaW1lKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG1vZGlmaWNhdGlvblRpbWUudmFsdWUoKSA+PSBz
dGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QodGltZSkpCisgICAgICAgICAgICBv
cmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlLmFwcGVuZChvcmlnaW4pOworICAgIH0KKworICAgIFZl
Y3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7CisgICAgZGVs
ZXRlZERhdGFiYXNlT3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG9yaWdpbklkZW50aWZp
ZXJzVG9EZWxldGUuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luSWRlbnRp
ZmllciA6IG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUpIHsKKyAgICAgICAgcmVtb3ZlRGF0YWJh
c2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKKworICAgICAgICBpZiAo
YXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlkZW50aWZpZXIo
b3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAgICBkZWxldGVkRGF0YWJhc2VPcmlnaW5zLnVu
Y2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZWREYXRhYmFzZU9yaWdp
bnM7Cit9CisKK1ZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlcjo6b3JpZ2lucygpIGNvbnN0Cit7CisgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0
YT4gb3JpZ2luczsKKyAgICBvcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9vcmlnaW5z
LnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA6IG1f
b3JpZ2lucykgeworICAgICAgICBpZiAoYXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6
OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAgICBv
cmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgqb3JpZ2luKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgcmV0dXJuIG9yaWdpbnM7Cit9
CisKK1ZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+IExv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2luRGV0YWlscygpCit7CisgICAgVmVjdG9y
PE9yaWdpbkRldGFpbHM+IHJlc3VsdDsKKyAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0
eShtX29yaWdpbnMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgU3RyaW5nJiBvcmlnaW4gOiBt
X29yaWdpbnMpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0
aE9yaWdpbklkZW50aWZpZXIob3JpZ2luKTsKKworICAgICAgICBPcmlnaW5EZXRhaWxzIGRldGFp
bHM7CisgICAgICAgIGRldGFpbHMub3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi5pc29sYXRlZENv
cHkoKTsKKyAgICAgICAgZGV0YWlscy5jcmVhdGlvblRpbWUgPSBmaWxlQ3JlYXRpb25UaW1lKGZp
bGVQYXRoKTsKKyAgICAgICAgZGV0YWlscy5tb2RpZmljYXRpb25UaW1lID0gZmlsZU1vZGlmaWNh
dGlvblRpbWUoZmlsZVBhdGgpOworICAgICAgICByZXN1bHQudW5jaGVja2VkQXBwZW5kKGRldGFp
bHMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZyBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVuYW1lKSBj
b25zdAoreworICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKG1fbG9jYWxTdG9yYWdlRGlyZWN0
b3J5KSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgTG9jYWxTdG9yYWdl
IGRhdGFiYXNlIHBhdGggJXMiLCBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIH0KKworI2lmIFBMQVRGT1JNKElPUykK
KyAgICBwbGF0Zm9ybU1heWJlRXhjbHVkZUZyb21CYWNrdXAoKTsKKyNlbmRpZgorCisgICAgcmV0
dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgZmls
ZW5hbWUpOworfQorCitTdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp0cmFja2Vy
RGF0YWJhc2VQYXRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZGF0YWJhc2VQYXRoKCJTdG9yYWdl
VHJhY2tlci5kYiIpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3Bl
blRyYWNrZXJEYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kp
Cit7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFN0cmluZyBkYXRhYmFzZVBhdGggPSB0cmFja2VyRGF0YWJhc2VQYXRoKCk7CisKKyAgICBpZiAo
IWZpbGVFeGlzdHMoZGF0YWJhc2VQYXRoKSAmJiBvcGVuaW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9u
RXhpc3RlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKGRh
dGFiYXNlUGF0aCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFz
ZVBhdGggJXMuIiwgZGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIC8vIFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0IGJvdW5kIHRvIGEgc3Bl
Y2lmaWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhyZWFkaW5nIGNoZWNrcworICAgIC8v
IGV2ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUgZGF0YWJhc2UgZnJvbSBkaWZmZXJlbnQg
dGhyZWFkcyBzaW11bHRhbmVvdXNseS4KKyAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJlYWRpbmdD
aGVja3MoKTsKKworICAgIGlmIChtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJPcmlnaW5zIikpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JF
QVRFIFRBQkxFIE9yaWdpbnMgKG9yaWdpbiBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNF
LCBwYXRoIFRFWFQpOyIpKQorICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgT3Jp
Z2lucyB0YWJsZS4iKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Omlt
cG9ydE9yaWdpbklkZW50aWZpZXJzKCkKK3sKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJ
Zk5vbkV4aXN0ZW50KTsKKworICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAg
IFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4gRlJP
TSBPcmlnaW5zIik7CisgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9P
SykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQu
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVzdWx0
OworCisgICAgICAgIHdoaWxlICgocmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMSVRF
X1JPVykKKyAgICAgICAgICAgIG1fb3JpZ2lucy5hZGQoc3RhdGVtZW50LmdldENvbHVtblRleHQo
MCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJh
c2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1cGRh
dGVUcmFja2VyRGF0YWJhc2VGcm9tTG9jYWxTdG9yYWdlRGF0YWJhc2VGaWxlcygpOworfQorCit2
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6dXBkYXRlVHJhY2tlckRhdGFiYXNlRnJv
bUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKQoreworICAgIFZlY3RvcjxTdHJpbmc+IHBhdGhz
ID0gbGlzdERpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgIioubG9jYWxzdG9yYWdl
Iik7CisKKyAgICBIYXNoU2V0PFN0cmluZz4gb3JpZ2lucyhtX29yaWdpbnMpOworICAgIEhhc2hT
ZXQ8U3RyaW5nPiBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXM7CisKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGhzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0
IFN0cmluZyYgcGF0aCA9IHBhdGhzW2ldOworCisgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgi
LmxvY2Fsc3RvcmFnZSIpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgU3RyaW5n
IGZpbGVuYW1lID0gcGF0aEdldEZpbGVOYW1lKHBhdGgpOworCisgICAgICAgIFN0cmluZyBvcmln
aW5JZGVudGlmaWVyID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0g
c3RybGVuKCIubG9jYWxzdG9yYWdlIikpOworCisgICAgICAgIGlmICghbV9vcmlnaW5zLmNvbnRh
aW5zKG9yaWdpbklkZW50aWZpZXIpKQorICAgICAgICAgICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2lu
SWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyLCBwYXRoKTsKKworICAgICAgICBvcmlnaW5zRnJv
bUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMuYWRkKG9yaWdpbklkZW50aWZpZXIpOworICAgIH0K
KworICAgIGZvciAoYXV0byBpdCA9IG9yaWdpbnMuYmVnaW4oKSwgZW5kID0gb3JpZ2lucy5lbmQo
KTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRp
ZmllciA9ICppdDsKKyAgICAgICAgaWYgKG9yaWdpbnMuY29udGFpbnMob3JpZ2luSWRlbnRpZmll
cikpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByZW1vdmVEYXRhYmFzZVdpdGhP
cmlnaW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOworICAgIH0KK30KKwordm9pZCBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIo
Y29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0
aCkKK3sKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKENyZWF0ZUlmTm9uRXhpc3RlbnQpOworICAg
IGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU1FMaXRl
U3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gT3JpZ2lucyBWQUxV
RVMgKD8sID8pIik7CisgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0
aGUgdHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmll
cik7CisgICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIGRhdGFiYXNlUGF0aCk7CisKKyAgICBpZiAo
c3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFi
bGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAnJXMnIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luSWRlbnRp
Zmllci51dGY4KCkuZGF0YSgpKTsKKworICAgIG1fb3JpZ2lucy5hZGQob3JpZ2luSWRlbnRpZmll
cik7CisKKyAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRzIHRoYXQgdGhlIG9yaWdpbiB3YXMgYWRk
ZWQuCit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVEYXRhYmFz
ZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcikKK3sK
KyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKyAgICBpZiAoIW1f
ZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBwYXRoID0g
cGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcik7Cisg
ICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTUUxpdGVTdGF0
ZW1lbnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIHdo
ZXJlIG9yaWdpbj0/Iik7CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FM
SVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24g
b2Ygb3JpZ2luICclcyciLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBkZWxldGVTdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2lu
SWRlbnRpZmllcik7CisgICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkg
eworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIG9yaWdp
biAnJXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUocGF0
aCk7CisKKyAgICBtX29yaWdpbnMucmVtb3ZlKG9yaWdpbklkZW50aWZpZXIpOworICAgIGlmICht
X29yaWdpbnMuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBubyBvcmlnaW5zIGxl
ZnQ7IGRlbGV0ZSB0aGUgdHJhY2tlciBkYXRhYmFzZS4KKyAgICAgICAgbV9kYXRhYmFzZS5jbG9z
ZSgpOworICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUodHJhY2tl
ckRhdGFiYXNlUGF0aCgpKTsKKyAgICAgICAgZGVsZXRlRW1wdHlEaXJlY3RvcnkobV9sb2NhbFN0
b3JhZ2VEaXJlY3RvcnkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUZWxsIGNsaWVudHMgdGhh
dCB0aGUgb3JpZ2luIHdhcyByZW1vdmVkLgorfQorCitTdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyOjpwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJp
bmcmIG9yaWdpbklkZW50aWZpZXIpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcGF0aFN0YXRl
bWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/
Iik7CisgICAgaWYgKHBhdGhTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIHNlbGVjdGlvbiBvZiBwYXRoIGZvciBv
cmlnaW4gJyVzJyIsIG9yaWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwYXRoU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9y
aWdpbklkZW50aWZpZXIpOworCisgICAgaW50IHJlc3VsdCA9IHBhdGhTdGF0ZW1lbnQuc3RlcCgp
OworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX1JPVykKKyAgICAgICAgcmV0dXJuIFN0cmluZygp
OworCisgICAgcmV0dXJuIHBhdGhTdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9X
ZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi43Y2ViMTkxNmQ5MzRlNTZmMWY0YTI0MTU1N2Q3MzE4MzRiZTc3ZmQxCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVEYXRhYmFzZS5oPgorI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8
d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K2NsYXNzIFNlY3VyaXR5T3JpZ2luOworc3RydWN0IFNlY3VyaXR5T3JpZ2luRGF0YTsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CisKK3N0cnVjdCBMb2NhbFN0b3JhZ2VEZXRhaWxzOworCitjbGFz
cyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50
ZWQ8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJl
ZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IGNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmLCBj
b25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7CisgICAgfkxvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcigpOworCisgICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGEmKSBjb25zdDsKKworICAgIHZvaWQgZGlkT3BlbkRhdGFiYXNl
V2l0aE9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lk
IGRlbGV0ZURhdGFiYXNlV2l0aE9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGEmKTsKKyAgICB2b2lkIGRlbGV0ZUFsbERhdGFiYXNlcygpOworCisgICAgLy8gUmV0dXJucyBh
IHZlY3RvciBvZiB0aGUgb3JpZ2lucyB3aG9zZSBkYXRhYmFzZXMgaGF2ZSBiZWVuIGRlbGV0ZWQu
CisgICAgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4gZGVsZXRlRGF0YWJhc2Vz
TW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50KTsKKwor
ICAgIFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25zdDsK
KworICAgIHN0cnVjdCBPcmlnaW5EZXRhaWxzIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbklkZW50
aWZpZXI7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8dGltZV90PiBjcmVhdGlvblRpbWU7CisgICAg
ICAgIHN0ZDo6b3B0aW9uYWw8dGltZV90PiBtb2RpZmljYXRpb25UaW1lOworICAgIH07CisgICAg
VmVjdG9yPE9yaWdpbkRldGFpbHM+IG9yaWdpbkRldGFpbHMoKTsKKworcHJpdmF0ZToKKyAgICBM
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIoUmVmPFdvcmtRdWV1ZT4mJiwgY29uc3QgU3RyaW5n
JiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworCisgICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25z
dCBTdHJpbmcmIGZpbGVuYW1lKSBjb25zdDsKKyAgICBTdHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0
aCgpIGNvbnN0OworCisgICAgZW51bSBEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSB7CisgICAgICAg
IENyZWF0ZUlmTm9uRXhpc3RlbnQsCisgICAgICAgIFNraXBJZk5vbkV4aXN0ZW50CisgICAgfTsK
KyAgICB2b2lkIG9wZW5UcmFja2VyRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOwor
CisgICAgdm9pZCBpbXBvcnRPcmlnaW5JZGVudGlmaWVycygpOworICAgIHZvaWQgdXBkYXRlVHJh
Y2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKTsKKworICAgIHZvaWQg
YWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50
aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRoKTsKKyAgICB2b2lkIHJlbW92ZURhdGFi
YXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyKTsK
KyAgICBTdHJpbmcgcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3Ry
aW5nJiBvcmlnaW5JZGVudGlmaWVyKTsKKworICAgIFJlZlB0cjxXb3JrUXVldWU+IG1fcXVldWU7
CisgICAgU3RyaW5nIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5OworCisgICAgV2ViQ29yZTo6U1FM
aXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKKyAgICBIYXNoU2V0PFN0cmluZz4gbV9vcmlnaW5zOwor
CisjaWYgUExBVEZPUk0oSU9TKQorICAgIHZvaWQgcGxhdGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFj
a3VwKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIGJvb2wgbV9oYXNFeGNsdWRlZEZyb21CYWNrdXAg
eyBmYWxzZSB9OworI2VuZGlmCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3Bw
IGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNjM4Y2E2Y2I1MjYyMWY3MjNiYTgwNDQxMDFlMGNkMDU5NGM5NGI5OQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFn
ZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsODcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEz
LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RvcmFnZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkxv
Y2FsU3RvcmFnZURhdGFiYXNlLmgiCisjaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXBNZXNzYWdlcy5oIgorI2luY2x1ZGUgIlN0
b3JhZ2VNYW5hZ2VyTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJXZWJQcm9jZXNzUHJveHkuaCIKKyNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U2VjdXJpdHlPcmlnaW5IYXNoLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9UZXh0RW5jb2RpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5j
bHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgorI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFw
aG9yZS5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK2NsYXNzIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYSA6IHB1YmxpYyBUaHJlYWRTYWZl
UmVmQ291bnRlZDxTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgUmVmPFN0b3JhZ2VBcmVhPiBjcmVhdGUoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29u
c3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB+U3Rv
cmFnZUFyZWEoKTsKKworICAgIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgc2Vj
dXJpdHlPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3NlY3VyaXR5T3JpZ2luOyB9CisKKyAgICB2
b2lkIGFkZExpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCk7
CisgICAgdm9pZCByZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9y
YWdlTWFwSUQpOworCisgICAgUmVmPFN0b3JhZ2VBcmVhPiBjbG9uZSgpIGNvbnN0OworCisgICAg
dm9pZCBzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qg
c291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2VwdGlvbik7CisgICAg
dm9pZCByZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0
X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYg
dXJsU3RyaW5nKTsKKyAgICB2b2lkIGNsZWFyKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVj
dGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiB1cmxTdHJp
bmcpOworCisgICAgY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIGl0ZW1zKCkgY29uc3Q7
CisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBpc1Nlc3Npb25TdG9yYWdlKCkgY29uc3Qg
eyByZXR1cm4gIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlOyB9CisKK3ByaXZhdGU6CisgICAgZXhw
bGljaXQgU3RvcmFnZUFyZWEoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlP
cmlnaW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKworICAgIHZvaWQgb3BlbkRhdGFi
YXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpIGNvbnN0OworCisgICAgdm9pZCBkaXNwYXRjaEV2
ZW50cyhJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBj
b25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykgY29uc3Q7CisK
KyAgICAvLyBXaWxsIGJlIG51bGwgaWYgdGhlIHN0b3JhZ2UgYXJlYSBiZWxvbmdzIHRvIGEgc2Vz
c2lvbiBzdG9yYWdlIG5hbWVzcGFjZS4KKyAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIG1fbG9j
YWxTdG9yYWdlTmFtZXNwYWNlOworICAgIG11dGFibGUgUmVmUHRyPExvY2FsU3RvcmFnZURhdGFi
YXNlPiBtX2xvY2FsU3RvcmFnZURhdGFiYXNlOworICAgIG11dGFibGUgYm9vbCBtX2RpZEltcG9y
dEl0ZW1zRnJvbURhdGFiYXNlIHsgZmFsc2UgfTsKKworICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBt
X3NlY3VyaXR5T3JpZ2luOworICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisgICAgUmVm
UHRyPFN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKKyAgICBIYXNoU2V0PHN0ZDo6cGFpcjxSZWZQ
dHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBtX2V2ZW50TGlzdGVuZXJzOworfTsKKwor
Y2xhc3MgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJl
YWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgUmVmPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlKFN0b3JhZ2VNYW5hZ2VyKiwg
dWludDY0X3Qgc3RvcmFnZU1hbmFnZXJJRCk7CisgICAgfkxvY2FsU3RvcmFnZU5hbWVzcGFjZSgp
OworCisgICAgU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4g
bV9zdG9yYWdlTWFuYWdlcjsgfQorCisgICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0
b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKKyAgICB2b2lkIGRpZERlc3Ryb3lTdG9y
YWdlQXJlYShTdG9yYWdlQXJlYSopOworCisgICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNo
aW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYpOworICAgIHZvaWQgY2xlYXJBbGxT
dG9yYWdlQXJlYXMoKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UoU3RvcmFnZU1hbmFnZXIqLCB1aW50NjRfdCBzdG9yYWdlTWFuYWdlcklEKTsKKworICAg
IFN0b3JhZ2VNYW5hZ2VyKiBtX3N0b3JhZ2VNYW5hZ2VyOworICAgIHVpbnQ2NF90IG1fc3RvcmFn
ZU5hbWVzcGFjZUlEOworICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisgICAgLy8gV2Ug
ZG9uJ3QgaG9sZCBhbiBleHBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIFN0b3JhZ2VBcmVhczsgdGhl
eSBhcmUga2VwdCBhbGl2ZSBieSB0aGUgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24gbWFwIGlu
IFN0b3JhZ2VNYW5hZ2VyLgorICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdl
QXJlYSo+IG1fc3RvcmFnZUFyZWFNYXA7Cit9OworCitjbGFzcyBTdG9yYWdlTWFuYWdlcjo6VHJh
bnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVk
PFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4geworcHVibGljOgorICAgIHN0YXRpYyBS
ZWY8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkp
OworICAgIH0KKworICAgIH5UcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQorICAgIHsK
KyAgICB9CisKKyAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2Vj
dXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pCisgICAgeworICAgICAgICByZXR1cm4g
Km1fc3RvcmFnZUFyZWFNYXAuZW5zdXJlKHNlY3VyaXR5T3JpZ2luLCBbdGhpcywgc2VjdXJpdHlP
cmlnaW5dKCkgbXV0YWJsZSB7CisgICAgICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0
ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOworICAg
ICAgICB9KS5pdGVyYXRvci0+dmFsdWUuY29weVJlZigpOworICAgIH0KKworICAgIFZlY3RvcjxT
ZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgVmVjdG9y
PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8m
IHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAg
aWYgKCFzdG9yYWdlQXJlYS0+aXRlbXMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgb3Jp
Z2lucy5hcHBlbmQoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICB9CisK
KyAgICAgICAgcmV0dXJuIG9yaWdpbnM7CisgICAgfQorCisgICAgdm9pZCBjbGVhclN0b3JhZ2VB
cmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmln
aW4pCisgICAgeworICAgICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJl
YU1hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9y
aWdpbigpID09IHNlY3VyaXR5T3JpZ2luKQorICAgICAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5j
bGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjbGVhckFsbFN0b3JhZ2VBcmVh
cygpCisgICAgeworICAgICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJl
YU1hcC52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
KQorICAgIHsKKyAgICB9CisKKyAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlcyA9IDUg
KiAxMDI0ICogMTAyNDsKKworICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8
U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VBcmVhTWFwOworfTsKKworYXV0byBTdG9yYWdlTWFuYWdl
cjo6U3RvcmFnZUFyZWE6OmNyZWF0ZShMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFn
ZU5hbWVzcGFjZSwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbiwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKSAtPiBSZWY8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPgor
eworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFN0b3JhZ2VBcmVhKGxvY2FsU3RvcmFnZU5hbWVz
cGFjZSwgc2VjdXJpdHlPcmlnaW4sIHF1b3RhSW5CeXRlcykpOworfQorCitTdG9yYWdlTWFuYWdl
cjo6U3RvcmFnZUFyZWE6OlN0b3JhZ2VBcmVhKExvY2FsU3RvcmFnZU5hbWVzcGFjZSogbG9jYWxT
dG9yYWdlTmFtZXNwYWNlLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2lu
LCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCisgICAgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZShs
b2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgLCBtX3NlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3Jp
Z2luKQorICAgICwgbV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQorICAgICwgbV9zdG9yYWdl
TWFwKFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcykpCit7Cit9CisKK1N0b3JhZ2VN
YW5hZ2VyOjpTdG9yYWdlQXJlYTo6flN0b3JhZ2VBcmVhKCkKK3sKKyAgICBBU1NFUlQobV9ldmVu
dExpc3RlbmVycy5pc0VtcHR5KCkpOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2Up
CisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNsb3NlKCk7CisKKyAgICBpZiAobV9s
b2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5k
aWREZXN0cm95U3RvcmFnZUFyZWEodGhpcyk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhOjphZGRMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2
NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAgICBBU1NFUlQoIW1fZXZlbnRMaXN0ZW5lcnMuY29udGFp
bnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2
ZW50TGlzdGVuZXJzLmFkZChzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
KSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpyZW1vdmVMaXN0ZW5l
cihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sK
KyAgICBBU1NFUlQoaXNTZXNzaW9uU3RvcmFnZSgpIHx8IG1fZXZlbnRMaXN0ZW5lcnMuY29udGFp
bnMoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2
ZW50TGlzdGVuZXJzLnJlbW92ZShzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKSk7Cit9CisKK1JlZjxTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IFN0b3JhZ2VNYW5h
Z2VyOjpTdG9yYWdlQXJlYTo6Y2xvbmUoKSBjb25zdAoreworICAgIEFTU0VSVCghbV9sb2NhbFN0
b3JhZ2VOYW1lc3BhY2UpOworCisgICAgYXV0byBzdG9yYWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpj
cmVhdGUobnVsbHB0ciwgbV9zZWN1cml0eU9yaWdpbiwgbV9xdW90YUluQnl0ZXMpOworICAgIHN0
b3JhZ2VBcmVhLT5tX3N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXA7CisKKyAgICByZXR1cm4gc3Rv
cmFnZUFyZWE7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpzZXRJdGVt
KElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFn
ZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0
cmluZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2VwdGlvbikKK3sKKyAgICBvcGVuRGF0YWJh
c2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAgICBTdHJpbmcgb2xkVmFsdWU7CisKKyAg
ICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwg
b2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKTsKKyAgICBpZiAobmV3U3RvcmFnZU1hcCkKKyAgICAg
ICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKKworICAgIGlmIChxdW90
YUV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0
YWJhc2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnNldEl0ZW0oa2V5LCB2YWx1
ZSk7CisKKyAgICBkaXNwYXRjaEV2ZW50cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBrZXksIG9sZFZhbHVlLCB2YWx1ZSwgdXJsU3RyaW5nKTsKK30KKwordm9pZCBTdG9y
YWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OnJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3Vy
Y2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCit7CisgICAgb3BlbkRhdGFiYXNlQW5kSW1w
b3J0SXRlbXNJZk5lZWRlZCgpOworCisgICAgU3RyaW5nIG9sZFZhbHVlOworICAgIGF1dG8gbmV3
U3RvcmFnZU1hcCA9IG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKKyAg
ICBpZiAobmV3U3RvcmFnZU1hcCkKKyAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdT
dG9yYWdlTWFwKTsKKworICAgIGlmIChvbGRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAgIG1fbG9jYWxTdG9y
YWdlRGF0YWJhc2UtPnJlbW92ZUl0ZW0oa2V5KTsKKworICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJj
ZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIFN0cmluZygp
LCB1cmxTdHJpbmcpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xl
YXIoSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9y
YWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBvcGVuRGF0YWJhc2VB
bmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAgICBpZiAoIW1fc3RvcmFnZU1hcC0+bGVuZ3Ro
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNy
ZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkK
KyAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xlYXIoKTsKKworICAgIGRpc3BhdGNo
RXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmluZygpLCBT
dHJpbmcoKSwgU3RyaW5nKCksIHVybFN0cmluZyk7Cit9CisKK2NvbnN0IEhhc2hNYXA8U3RyaW5n
LCBTdHJpbmc+JiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6Oml0ZW1zKCkgY29uc3QKK3sK
KyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4g
bV9zdG9yYWdlTWFwLT5pdGVtcygpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdl
QXJlYTo6Y2xlYXIoKQoreworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZSht
X3F1b3RhSW5CeXRlcyk7CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkgeworICAg
ICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbG9zZSgpOworICAgICAgICBtX2xvY2FsU3Rv
cmFnZURhdGFiYXNlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gaXQgPSBtX2V2
ZW50TGlzdGVuZXJzLmJlZ2luKCksIGVuZCA9IG1fZXZlbnRMaXN0ZW5lcnMuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkKKyAgICAgICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJl
YU1hcDo6Q2xlYXJDYWNoZSgpLCBpdC0+c2Vjb25kKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdl
cjo6U3RvcmFnZUFyZWE6Om9wZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25z
dAoreworICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgICAgIHJldHVybjsK
KworICAgIC8vIFdlIG9wZW4gdGhlIGRhdGFiYXNlIGhlcmUgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5
IGltcG9ydGVkIG91ciBpdGVtcyB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YWJhc2UgaXMgb3BlbiBp
ZiB3ZSBuZWVkIHRvIHdyaXRlIHRvIGl0LgorICAgIGlmICghbV9sb2NhbFN0b3JhZ2VEYXRhYmFz
ZSkKKyAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSA9IExvY2FsU3RvcmFnZURhdGFiYXNl
OjpjcmVhdGUobV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VNYW5hZ2VyKCktPm1fcXVl
dWUuY29weVJlZigpLCBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU1hbmFnZXIoKS0+
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY29weVJlZigpLCBtX3NlY3VyaXR5T3JpZ2lu
KTsKKworICAgIGlmIChtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5pbXBvcnRJdGVtcygqbV9zdG9yYWdl
TWFwKTsKKyAgICBtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlID0gdHJ1ZTsKK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmRpc3BhdGNoRXZlbnRzKElQQzo6Q29ubmVj
dGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3
VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKSBjb25zdAoreworICAgIGZvciAoSGFzaFNl
dDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj46OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV9ldmVudExpc3RlbmVycy5iZWdpbigpLCBlbmQgPSBtX2V2ZW50TGlzdGVu
ZXJzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdWludDY0X3Qgc3RvcmFnZUFy
ZWFJRCA9IGl0LT5maXJzdCA9PSBzb3VyY2VDb25uZWN0aW9uID8gc291cmNlU3RvcmFnZUFyZWFJ
RCA6IDA7CisKKyAgICAgICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1h
cDo6RGlzcGF0Y2hTdG9yYWdlRXZlbnQoc3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3
VmFsdWUsIHVybFN0cmluZyksIGl0LT5zZWNvbmQpOworICAgIH0KK30KKworUmVmPFN0b3JhZ2VN
YW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2U6OmNyZWF0ZShTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2
NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2Uoc3RvcmFnZU1hbmFnZXIsIHN0b3JhZ2VOYW1lc3BhY2VJRCkpOwor
fQorCisvLyBGSVhNRTogVGhlIHF1b3RhIHZhbHVlIGlzIGNvcGllZCBmcm9tIEdyb3VwU2V0dGlu
Z3MuY3BwLgorLy8gV2Ugc2hvdWxkIGludmVzdGlnYXRlIGEgd2F5IHRvIHNoYXJlIGl0IHdpdGgg
V2ViQ29yZS4KK1N0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OkxvY2FsU3Rv
cmFnZU5hbWVzcGFjZShTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0
b3JhZ2VOYW1lc3BhY2VJRCkKKyAgICA6IG1fc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU1hbmFnZXIp
CisgICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCisgICAgLCBt
X3F1b3RhSW5CeXRlcyg1ICogMTAyNCAqIDEwMjQpCit7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpM
b2NhbFN0b3JhZ2VOYW1lc3BhY2U6On5Mb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQoreworICAgIEFT
U0VSVChtX3N0b3JhZ2VBcmVhTWFwLmlzRW1wdHkoKSk7Cit9CisKK2F1dG8gU3RvcmFnZU1hbmFn
ZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0
eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikgLT4gUmVmPFN0b3JhZ2VBcmVhPgoreworICAg
IGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhTWFwLmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0
cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmIChzbG90KQorICAgICAgICByZXR1cm4gKnNsb3Q7
CisKKyAgICBhdXRvIHN0b3JhZ2VBcmVhID0gU3RvcmFnZUFyZWE6OmNyZWF0ZSh0aGlzLCBXVEZN
b3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOworICAgIHNsb3QgPSAmc3RvcmFn
ZUFyZWEuZ2V0KCk7CisKKyAgICByZXR1cm4gc3RvcmFnZUFyZWE7Cit9CisKK3ZvaWQgU3RvcmFn
ZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhKFN0
b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSkKK3sKKyAgICBBU1NFUlQobV9zdG9yYWdlQXJlYU1hcC5j
b250YWlucyhzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSkpOworCisgICAgbV9zdG9yYWdl
QXJlYU1hcC5yZW1vdmUoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgIGlmICgh
bV9zdG9yYWdlQXJlYU1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VS
VChtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMobV9z
dG9yYWdlTmFtZXNwYWNlSUQpKTsKKyAgICBtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFn
ZU5hbWVzcGFjZXMucmVtb3ZlKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKK30KKwordm9pZCBTdG9y
YWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhclN0b3JhZ2VBcmVhc01hdGNo
aW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7Cisg
ICAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW5BbmRTdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFN
YXApIHsKKyAgICAgICAgaWYgKG9yaWdpbkFuZFN0b3JhZ2VBcmVhLmtleSA9PSBzZWN1cml0eU9y
aWdpbikKKyAgICAgICAgICAgIG9yaWdpbkFuZFN0b3JhZ2VBcmVhLnZhbHVlLT5jbGVhcigpOwor
ICAgIH0KK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpj
bGVhckFsbFN0b3JhZ2VBcmVhcygpCit7CisgICAgZm9yIChhdXRvKiBzdG9yYWdlQXJlYSA6IG1f
c3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCisgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwor
fQorCitjbGFzcyBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJs
aWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUmVmPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUodW5zaWdu
ZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB+U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoKTsKKworICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgp
OyB9CisKKyAgICBJUEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV9hbGxvd2VkQ29ubmVjdGlvbi5nZXQoKTsgfQorICAgIHZvaWQgc2V0QWxsb3dlZENv
bm5lY3Rpb24oSVBDOjpDb25uZWN0aW9uKik7CisKKyAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9y
Q3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYpOworCisgICAgdm9pZCBjbG9u
ZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7
CisKKyAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3QKKyAgICB7
CisgICAgICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7CisKKyAgICAgICAg
Zm9yIChjb25zdCBhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkp
IHsKKyAgICAgICAgICAgIGlmICghc3RvcmFnZUFyZWEtPml0ZW1zKCkuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIG9yaWdpbnMuYXBwZW5kKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigp
KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcmlnaW5zOworICAgIH0KKworICAgIHZv
aWQgY2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRh
dGEmIHNlY3VyaXR5T3JpZ2luKQorICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJl
YSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChzdG9yYWdl
QXJlYS0+c2VjdXJpdHlPcmlnaW4oKSA9PSBzZWN1cml0eU9yaWdpbikKKyAgICAgICAgICAgICAg
ICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xl
YXJBbGxTdG9yYWdlQXJlYXMoKQorICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJl
YSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCisgICAgICAgICAgICBzdG9yYWdlQXJlYS0+
Y2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UodW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKworICAgIFJlZlB0cjxJUEM6OkNvbm5l
Y3Rpb24+IG1fYWxsb3dlZENvbm5lY3Rpb247CisgICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7
CisKKyAgICBIYXNoTWFwPFNlY3VyaXR5T3JpZ2luRGF0YSwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4g
bV9zdG9yYWdlQXJlYU1hcDsKK307CisKK1JlZjxTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3Jl
YXRlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShxdW90YUluQnl0ZXMpKTsKK30KKworU3RvcmFnZU1hbmFn
ZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1bnNp
Z25lZCBxdW90YUluQnl0ZXMpCisgICAgOiBtX3F1b3RhSW5CeXRlcyhxdW90YUluQnl0ZXMpCit7
Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6flNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlKCkKK3sKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2U6OnNldEFsbG93ZWRDb25uZWN0aW9uKElQQzo6Q29ubmVjdGlvbiogYWxs
b3dlZENvbm5lY3Rpb24pCit7CisgICAgQVNTRVJUKCFhbGxvd2VkQ29ubmVjdGlvbiB8fCAhbV9h
bGxvd2VkQ29ubmVjdGlvbik7CisKKyAgICBtX2FsbG93ZWRDb25uZWN0aW9uID0gYWxsb3dlZENv
bm5lY3Rpb247Cit9CisKK2F1dG8gU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlOjpnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5
T3JpZ2luKSAtPiBSZWY8U3RvcmFnZUFyZWE+Cit7CisgICAgcmV0dXJuICptX3N0b3JhZ2VBcmVh
TWFwLmVuc3VyZShzZWN1cml0eU9yaWdpbiwgW3RoaXMsIHNlY3VyaXR5T3JpZ2luXSgpIG11dGFi
bGUgeworICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZNb3Zl
KHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOworICAgIH0pLml0ZXJhdG9yLT52YWx1
ZS5jb3B5UmVmKCk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlOjpjbG9uZVRvKFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSkKK3sKKyAgICBBU1NFUlRfVU5VU0VEKG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNw
YWNlLCBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS5pc0VtcHR5KCkpOworCisgICAgZm9yIChh
dXRvJiBwYWlyIDogbV9zdG9yYWdlQXJlYU1hcCkKKyAgICAgICAgbmV3U2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UubV9zdG9yYWdlQXJlYU1hcC5hZGQocGFpci5rZXksIHBhaXIudmFsdWUtPmNsb25l
KCkpOworfQorCitSZWY8U3RvcmFnZU1hbmFnZXI+IFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGUoY29u
c3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpCit7CisgICAgcmV0dXJuIGFkb3B0UmVm
KCpuZXcgU3RvcmFnZU1hbmFnZXIobG9jYWxTdG9yYWdlRGlyZWN0b3J5KSk7Cit9CisKK1N0b3Jh
Z2VNYW5hZ2VyOjpTdG9yYWdlTWFuYWdlcihjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVj
dG9yeSkKKyAgICA6IG1fcXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQu
U3RvcmFnZU1hbmFnZXIiKSkKKyAgICAsIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKExv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6Y3JlYXRlKG1fcXVldWUuY29weVJlZigpLCBsb2Nh
bFN0b3JhZ2VEaXJlY3RvcnkpKQoreworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgaXMg
aW5pdGlhbGl6ZWQgYmVmb3JlIHdlIHN0YXJ0IGRpc3BhdGNoaW5nIHRoaW5ncyB0byB0aGUgcXVl
dWUuCisgICAgVVRGOEVuY29kaW5nKCk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjp+U3RvcmFnZU1h
bmFnZXIoKQoreworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5C
eXRlcykKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1h
a2VSZWYoKnRoaXMpLCBzdG9yYWdlTmFtZXNwYWNlSUQsIHF1b3RhSW5CeXRlc10oKSBtdXRhYmxl
IHsKKyAgICAgICAgQVNTRVJUKCFtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhz
dG9yYWdlTmFtZXNwYWNlSUQpKTsKKworICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNl
cy5zZXQoc3RvcmFnZU5hbWVzcGFjZUlELCBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRl
KHF1b3RhSW5CeXRlcykpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0
cm95U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQor
eworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigq
dGhpcyksIHN0b3JhZ2VOYW1lc3BhY2VJRF0geworICAgICAgICBBU1NFUlQobV9zZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZXMuY29udGFpbnMoc3RvcmFnZU5hbWVzcGFjZUlEKSk7CisgICAgICAgIG1f
c2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnJlbW92ZShzdG9yYWdlTmFtZXNwYWNlSUQpOworICAg
IH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpzZXRBbGxvd2VkU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2VDb25uZWN0aW9uKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgSVBDOjpDb25u
ZWN0aW9uKiBhbGxvd2VkQ29ubmVjdGlvbikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhp
cywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb25uZWN0aW9uID0gUmVmUHRyPElQ
Qzo6Q29ubmVjdGlvbj4oYWxsb3dlZENvbm5lY3Rpb24pLCBzdG9yYWdlTmFtZXNwYWNlSURdKCkg
bXV0YWJsZSB7CisgICAgICAgIEFTU0VSVChtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250
YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKKworICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKS0+c2V0QWxsb3dlZENvbm5lY3Rpb24oY29u
bmVjdGlvbi5nZXQoKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmNsb25l
U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1aW50
NjRfdCBuZXdTdG9yYWdlTmFtZXNwYWNlSUQpCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Ro
aXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlELCBu
ZXdTdG9yYWdlTmFtZXNwYWNlSURdIHsKKyAgICAgICAgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2Uq
IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0
KHN0b3JhZ2VOYW1lc3BhY2VJRCk7CisgICAgICAgIGlmICghc2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2UpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gZ2V0IGludG8gdGhpcyBzaXR1YXRp
b24gaWYgc29tZW9uZSBjbG9zZXMgdGhlIG9yaWdpbmF0aW5nIHBhZ2UgZnJvbSB3aXRoaW4gYQor
ICAgICAgICAgICAgLy8gY3JlYXRlTmV3UGFnZSBjYWxsYmFjay4gV2UgYmFpbCBmb3Igbm93LCBi
dXQgd2Ugc2hvdWxkIHJlYWxseSBmaW5kIGEgd2F5IHRvIGtlZXAgdGhlIHNlc3Npb24gc3RvcmFn
ZSBhbGl2ZQorICAgICAgICAgICAgLy8gc28gd2Ugd2UnbGwgY2xvbmUgdGhlIHNlc3Npb24gc3Rv
cmFnZSBjb3JyZWN0bHkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAg
ICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBt
X3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQobmV3U3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAg
ICAgICAgQVNTRVJUKG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlKTsKKworICAgICAgICBzZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xvbmVUbygqbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2Up
OworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpwcm9jZXNzV2lsbE9wZW5Db25u
ZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbikKK3sK
KyAgICBjb25uZWN0aW9uLmFkZFdvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3Rv
cmFnZU1hbmFnZXI6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9xdWV1ZS5nZXQoKSwgdGhpcyk7
Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OnByb2Nlc3NEaWRDbG9zZUNvbm5lY3Rpb24oV2Vi
UHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uKQoreworICAgIGNvbm5l
Y3Rpb24ucmVtb3ZlV29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlTWFu
YWdlcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpKTsKKworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0
aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbm5lY3Rpb24gPSBSZWY8SVBD
OjpDb25uZWN0aW9uPihjb25uZWN0aW9uKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgVmVjdG9yPHN0
ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBjb25uZWN0aW9uQW5k
U3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZTsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJl
YSA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoc3RvcmFn
ZUFyZWEua2V5LmZpcnN0ICE9IGNvbm5lY3Rpb24ucHRyKCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgICAgIHN0b3JhZ2VBcmVhLnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigq
c3RvcmFnZUFyZWEua2V5LmZpcnN0LCBzdG9yYWdlQXJlYS5rZXkuc2Vjb25kKTsKKyAgICAgICAg
ICAgIGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlLmFwcGVuZChzdG9yYWdl
QXJlYS5rZXkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY29ubmVj
dGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUpCisgICAgICAgICAgICBtX3N0b3JhZ2VB
cmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUocGFpcik7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFn
ZU1hbmFnZXI6OmdldFNlc3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sK
KyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRo
aXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11
dGFibGUgeworICAgICAgICBIYXNoU2V0PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKwor
ICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYg
b3JpZ2luIDogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPm9yaWdpbnMoKSkKKyAgICAgICAgICAg
ICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOworICAgICAgICB9CisKKyAgICAgICAgUnVuTG9vcDo6
bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5zID0gV1RGTW92ZShvcmlnaW5zKSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAg
ICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2lucykpOworICAgICAgICB9KTsKKyAg
ICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmln
aW5zKEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVl
LT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0
aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAg
ICAgICBmb3IgKGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZS0+Y2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsKKworICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlz
cGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOworICAgIH0pOworfQorCit2b2lkIFN0
b3JhZ2VNYW5hZ2VyOjpkZWxldGVTZXNzaW9uU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0
IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2
b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAgVmVjdG9yPFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YT4gY29waWVkT3JpZ2luczsKKyAgICBjb3BpZWRPcmlnaW5zLnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkob3JpZ2lucy5zaXplKCkpOworCisgICAgZm9yIChhdXRvJiBvcmlnaW4g
OiBvcmlnaW5zKQorICAgICAgICBjb3BpZWRPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZChvcmlnaW4u
aXNvbGF0ZWRDb3B5KCkpOworCisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3Rl
ZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29waWVkT3JpZ2lucyA9IFdURk1vdmUoY29waWVkT3Jp
Z2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkg
bXV0YWJsZSB7CisgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogY29waWVkT3JpZ2lucykgewor
ICAgICAgICAgICAgZm9yIChhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlc3Npb25TdG9y
YWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7Cisg
ICAgICAgIH0KKworICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShjb21w
bGV0aW9uSGFuZGxlcikpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRM
b2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIG1fcXVldWUtPmRp
c3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25I
YW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAg
IEhhc2hTZXQ8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zOworCisgICAgICAgIGZvciAoYXV0
byYgb3JpZ2luIDogbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPm9yaWdpbnMoKSkKKyAg
ICAgICAgICAgIG9yaWdpbnMuYWRkKG9yaWdpbik7CisKKyAgICAgICAgZm9yIChhdXRvJiB0cmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogdHJhbnNp
ZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5vcmlnaW5zKCkpCisgICAgICAgICAgICAgICAgb3Jp
Z2lucy5hZGQob3JpZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5k
aXNwYXRjaChbb3JpZ2lucyA9IFdURk1vdmUob3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0g
V1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgICAgICBjb21w
bGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbnMpKTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9
CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldExvY2FsU3RvcmFnZU9yaWdpbkRldGFpbHMoRnVu
Y3Rpb248dm9pZCAoVmVjdG9yPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0
YWlscz4pPiYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0
aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0g
V1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIGF1dG8gb3Jp
Z2luRGV0YWlscyA9IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5vcmlnaW5EZXRhaWxz
KCk7CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5EZXRhaWxzID0g
V1RGTW92ZShvcmlnaW5EZXRhaWxzKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBs
ZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVy
KFdURk1vdmUob3JpZ2luRGV0YWlscykpOworICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbihTZWN1
cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRj
aChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW4gPSBz
ZWN1cml0eU9yaWdpbi5pc29sYXRlZENvcHkoKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgZm9yIChh
dXRvJiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFs
dWVzKCkpCisgICAgICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFy
ZWFzTWF0Y2hpbmdPcmlnaW4oY29waWVkT3JpZ2luKTsKKworICAgICAgICBmb3IgKGF1dG8mIHRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb3BpZWRPcmlnaW4pOworCisg
ICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhP
cmlnaW4oY29waWVkT3JpZ2luKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6
ZGVsZXRlTG9jYWxTdG9yYWdlT3JpZ2luc01vZGlmaWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3Rl
bV9jbG9jazo6dGltZV9wb2ludCB0aW1lLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhh
bmRsZXIpCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKSwgdGltZSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRp
b25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgYXV0byBkZWxldGVkT3JpZ2lucyA9IG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZXNNb2RpZmllZFNpbmNl
KHRpbWUpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luIDogZGVsZXRlZE9yaWdp
bnMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9s
b2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIGxvY2FsU3Rv
cmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOwor
ICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAg
ICAgICAgICB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyQWxsU3RvcmFnZUFy
ZWFzKCk7CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFdURk1vdmUoY29tcGxl
dGlvbkhhbmRsZXIpKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRl
TG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YT4mIG9yaWdpbnMsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFu
ZGxlcikKK3sKKyAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBjb3BpZWRPcmlnaW5zOwor
ICAgIGNvcGllZE9yaWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5zLnNpemUoKSk7
CisKKyAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IG9yaWdpbnMpCisgICAgICAgIGNvcGllZE9yaWdp
bnMudW5jaGVja2VkQXBwZW5kKG9yaWdpbi5pc29sYXRlZENvcHkoKSk7CisKKyAgICBtX3F1ZXVl
LT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRP
cmlnaW5zID0gV1RGTW92ZShjb3BpZWRPcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZN
b3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgZm9yIChhdXRvJiBv
cmlnaW4gOiBjb3BpZWRPcmlnaW5zKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGxvY2FsU3Rv
cmFnZU5hbWVzcGFjZSA6IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAg
ICAgICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hp
bmdPcmlnaW4ob3JpZ2luKTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFs
dWVzKCkpCisgICAgICAgICAgICAgICAgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5j
bGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7CisKKyAgICAgICAgICAgIG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4ob3Jp
Z2luKTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChXVEZN
b3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFn
ZXI6OmNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBTZWN1cml0
eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbkRhdGEpCit7CisgICAgc3RkOjpwYWlyPFJlZlB0
cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBh
aXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91
bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVCgoSGFzaE1hcDxzdGQ6OnBhaXI8UmVm
UHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj46Omlz
VmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKSk7CisKKyAgICBIYXNoTWFw
PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3Rv
cmFnZUFyZWE+Pjo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9u
LmFkZChjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpciwgbnVsbHB0cik7CisKKyAgICAvLyBG
SVhNRTogVGhlc2Ugc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVja3MuCisgICAgQVNTRVJUKHJlc3Vs
dC5pc05ld0VudHJ5KTsKKyAgICBBU1NFUlQoKEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2U+Pjo6aXNWYWxpZEtleShzdG9yYWdlTmFtZXNwYWNlSUQpKSk7CisK
KyAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA9IGdldE9y
Q3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCk7CisKKyAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVChsb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UpOworCisgICAgYXV0byBzdG9yYWdlQXJlYSA9IGxvY2FsU3RvcmFn
ZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2lu
RGF0YSkpOworICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdl
TWFwSUQpOworCisgICAgcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZSA9IFdURk1vdmUoc3RvcmFnZUFy
ZWEpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3Jh
Z2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQs
IHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2
ZWxPcmlnaW5EYXRhLCBTZWN1cml0eU9yaWdpbkRhdGEmJiBvcmlnaW4pCit7CisgICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KKyAgICBBU1NFUlQobV9zdG9yYWdl
QXJlYXNCeUNvbm5lY3Rpb24uaXNWYWxpZEtleSh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQg
fSkpOworCisgICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBzZXNzaW9uIHN0b3JhZ2UgZm9y
IHRoaXMgY29ubmVjdGlvbi9vcmlnaW4gY29tYm8uCisgICAgLy8gSWYgc28sIHVwZGF0ZSB0aGUg
bWFwIHdpdGggdGhlIG5ldyBJRCwgb3RoZXJ3aXNlIGtlZXAgb24gdHJ1Y2tpbmcuCisgICAgZm9y
IChhdXRvIGl0ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYmVnaW4oKSwgZW5kID0gbV9z
dG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAg
ICBpZiAoaXQtPmtleS5maXJzdCAhPSAmY29ubmVjdGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBSZWY8U3RvcmFnZUFyZWE+IGFyZWEgPSAqaXQtPnZhbHVlOworICAgICAgICBp
ZiAoIWFyZWEtPmlzU2Vzc2lvblN0b3JhZ2UoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICBpZiAoIW9yaWdpbi5zZWN1cml0eU9yaWdpbigpLT5pc1NhbWVTY2hlbWVIb3N0UG9ydChh
cmVhLT5zZWN1cml0eU9yaWdpbigpLnNlY3VyaXR5T3JpZ2luKCkuZ2V0KCkpKQorICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIGFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCk7CisgICAgICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLnJlbW92ZShpdCk7
CisgICAgICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZCh7ICZjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQgfSwgV1RGTW92ZShhcmVhKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5l
Y3Rpb24sIHN0b3JhZ2VNYXBJRCB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisKKyAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVCghc2xv
dCk7CisKKyAgICBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIHRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNw
YWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCwgV1RGTW92ZSh0b3BMZXZlbE9yaWdpbkRhdGEpKTsKKwor
ICAgIGF1dG8gc3RvcmFnZUFyZWEgPSB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmdl
dE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92ZShvcmlnaW4pKTsKKyAgICBzdG9yYWdlQXJlYS0+
YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIHNsb3QgPSBXVEZN
b3ZlKHN0b3JhZ2VBcmVhKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlU2Vzc2lv
blN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdl
TWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYg
c2VjdXJpdHlPcmlnaW5EYXRhKQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1l
c3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFs
aWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSk7CisKKyAgICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZSogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5n
ZXQoc3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAgICBpZiAoIXNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
KSB7CisgICAgICAgIC8vIFdlJ3JlIGdldHRpbmcgYW4gaW5jb21pbmcgbWVzc2FnZSBmcm9tIHRo
ZSB3ZWIgcHJvY2VzcyB0aGF0J3MgZm9yIHNlc3Npb24gc3RvcmFnZSBmb3IgYSB3ZWIgcGFnZQor
ICAgICAgICAvLyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLCBqdXN0IGlnbm9yZSBpdC4K
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBh
IG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlz
VmFsaWRLZXkoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0pKTsKKworICAgIGF1dG8mIHNs
b3QgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQoeyAmY29ubmVjdGlvbiwgc3RvcmFn
ZU1hcElEIH0sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKworICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKCFzbG90KTsKKworICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKCZjb25u
ZWN0aW9uID09IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5hbGxvd2VkQ29ubmVjdGlvbigpKTsK
KworICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JD
cmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOworICAgIHN0b3Jh
Z2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworCisgICAgc2xv
dCA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0
cm95U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCkKK3sKKyAgICBzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2
NF90PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisg
ICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlv
bkFuZFN0b3JhZ2VNYXBJRFBhaXIpKTsKKworICAgIGF1dG8gaXQgPSBtX3N0b3JhZ2VBcmVhc0J5
Q29ubmVjdGlvbi5maW5kKGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKTsKKyAgICBpZiAo
aXQgPT0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZW5kKCkpIHsKKyAgICAgICAgLy8gVGhl
IGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBiZWNhdXNlIHRoZSBsYXN0IHBhZ2Ugd2FzIGNs
b3NlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGl0LT52YWx1ZS0+cmVtb3ZlTGlz
dGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIC8vIERvbid0IHJlbW92ZSBz
ZXNzaW9uIHN0b3JhZ2UgbWFwcy4gVGhlIHdlYiBwcm9jZXNzIG1heSByZWNvbm5lY3QgYW5kIGV4
cGVjdCB0aGUgZGF0YSB0byBzdGlsbCBiZSBhcm91bmQuCisgICAgaWYgKGl0LT52YWx1ZS0+aXNT
ZXNzaW9uU3RvcmFnZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N0b3JhZ2VBcmVhc0J5
Q29ubmVjdGlvbi5yZW1vdmUoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRWYWx1ZXMoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9u
LCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBIYXNoTWFw
PFN0cmluZywgU3RyaW5nPiYgdmFsdWVzKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJl
YSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICgh
c3RvcmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVh
IGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFsdWVzID0gc3RvcmFnZUFyZWEtPml0ZW1zKCk7
CisgICAgY29ubmVjdGlvbi5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkR2V0VmFs
dWVzKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKK30KKwordm9pZCBTdG9yYWdlTWFu
YWdlcjo6c2V0SXRlbShJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1h
cFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJp
bmcmIHVybFN0cmluZykKK3sKKyAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBmaW5kU3Rv
cmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKyAgICBpZiAoIXN0b3JhZ2VBcmVh
KSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdl
IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGJvb2wgcXVvdGFFcnJvcjsKKyAgICBzdG9yYWdlQXJlYS0+c2V0SXRl
bSgmY29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCB2YWx1ZSwgdXJsU3RyaW5n
LCBxdW90YUVycm9yKTsKKyAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVh
TWFwOjpEaWRTZXRJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXksIHF1b3RhRXJyb3IpLCBzdG9yYWdl
TWFwSUQpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpyZW1vdmVJdGVtKElQQzo6Q29ubmVj
dGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VT
dG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJl
YSA9IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICgh
c3RvcmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVh
IGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RvcmFnZUFyZWEtPnJlbW92ZUl0ZW0oJmNvbm5l
Y3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgdXJsU3RyaW5nKTsKKyAgICBjb25uZWN0
aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRSZW1vdmVJdGVtKHN0b3JhZ2VN
YXBTZWVkLCBrZXkpLCBzdG9yYWdlTWFwSUQpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpj
bGVhcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwg
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNv
bnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9
IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICghc3Rv
cmFnZUFyZWEpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZv
ciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgc3RvcmFnZUFyZWEtPmNsZWFyKCZjb25uZWN0aW9uLCBz
b3VyY2VTdG9yYWdlQXJlYUlELCB1cmxTdHJpbmcpOworICAgIGNvbm5lY3Rpb24uc2VuZChNZXNz
YWdlczo6U3RvcmFnZUFyZWFNYXA6OkRpZENsZWFyKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1h
cElEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6YXBwbGljYXRpb25XaWxsVGVybWluYXRl
KCkKK3sKKyAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIG1fcXVldWUtPmRpc3Bh
dGNoKFt0aGlzLCAmc2VtYXBob3JlXSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8UmVmUHRy
PElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBh
aXJzVG9SZW1vdmU7CisgICAgICAgIGZvciAoYXV0byYgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFp
ciA6IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBjb25uZWN0aW9u
U3RvcmFnZUFyZWFQYWlyLnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqY29ubmVjdGlvblN0b3JhZ2VB
cmVhUGFpci5rZXkuZmlyc3QsIGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5LnNlY29uZCk7
CisgICAgICAgICAgICBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZS5hcHBl
bmQoY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkpOworICAgICAgICB9CisKKyAgICAgICAg
Zm9yIChhdXRvJiBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyIDogY29ubmVjdGlvbkFuZFN0b3Jh
Z2VNYXBJRFBhaXJzVG9SZW1vdmUpCisgICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVj
dGlvbi5yZW1vdmUoY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpcik7CisKKyAgICAgICAgc2VtYXBo
b3JlLnNpZ25hbCgpOworICAgIH0pOworICAgIHNlbWFwaG9yZS53YWl0KFdhbGxUaW1lOjppbmZp
bml0eSgpKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhKiBTdG9yYWdlTWFuYWdl
cjo6ZmluZFN0b3JhZ2VBcmVhKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qg
c3RvcmFnZU1hcElEKSBjb25zdAoreworICAgIHN0ZDo6cGFpcjxJUEM6OkNvbm5lY3Rpb24qLCB1
aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCk7CisKKyAgICBpZiAoIW1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRL
ZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKQorICAgICAgICByZXR1cm4gbnVsbHB0
cjsKKworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5nZXQoY29ubmVjdGlv
bkFuZFN0b3JhZ2VNYXBJRFBhaXIpOworfQorCitTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdl
TmFtZXNwYWNlKiBTdG9yYWdlTWFuYWdlcjo6Z2V0T3JDcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQoreworICAgIGlmICghbV9sb2NhbFN0b3Jh
Z2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICBhdXRvJiBzbG90ID0gbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2Vz
LmFkZChzdG9yYWdlTmFtZXNwYWNlSUQsIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICBp
ZiAoIXNsb3QpCisgICAgICAgIHNsb3QgPSBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZSh0
aGlzLCBzdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAgcmV0dXJuIHNsb3QuZ2V0KCk7Cit9CisK
K1N0b3JhZ2VNYW5hZ2VyOjpUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIFN0b3JhZ2VN
YW5hZ2VyOjpnZXRPckNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRf
dCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmIHRvcExl
dmVsT3JpZ2luKQoreworICAgIGlmICghbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Vz
LmlzVmFsaWRLZXkoeyBzdG9yYWdlTmFtZXNwYWNlSUQsIHRvcExldmVsT3JpZ2luIH0pKQorICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGF1dG8mIHNsb3QgPSBtX3RyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZXMuYWRkKHsgc3RvcmFnZU5hbWVzcGFjZUlELCBXVEZNb3ZlKHRvcExl
dmVsT3JpZ2luKSB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKCFzbG90KQor
ICAgICAgICBzbG90ID0gVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjcmVhdGUoKTsK
KworICAgIHJldHVybiBzbG90LmdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFn
ZXIuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5hMWY2OWViNzA3M2EzY2E1ZjNiOGUyN2Q5MzNkMWI4YWUyODFhMDliCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9y
YWdlTWFuYWdlci5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEz
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNl
CisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luSGFzaC5oPgorI2luY2x1ZGUgPGNocm9ubz4K
KyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVk
Lmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CitjbGFzcyBTZWN1cml0eU9yaWdpbjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2Ns
YXNzIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjsKK2NsYXNzIFdlYlByb2Nlc3NQcm94eTsK
KworY2xhc3MgU3RvcmFnZU1hbmFnZXIgOiBwdWJsaWMgSVBDOjpDb25uZWN0aW9uOjpXb3JrUXVl
dWVNZXNzYWdlUmVjZWl2ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBSZWY8U3RvcmFnZU1hbmFn
ZXI+IGNyZWF0ZShjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7CisgICAgflN0
b3JhZ2VNYW5hZ2VyKCk7CisKKyAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
KHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAg
ICB2b2lkIGRlc3Ryb3lTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFt
ZXNwYWNlSUQpOworICAgIHZvaWQgc2V0QWxsb3dlZFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlQ29u
bmVjdGlvbih1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIElQQzo6Q29ubmVjdGlvbiogYWxs
b3dlZENvbm5lY3Rpb24pOworICAgIHZvaWQgY2xvbmVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1
aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVpbnQ2NF90IG5ld1N0b3JhZ2VOYW1lc3BhY2VJ
RCk7CisKKyAgICB2b2lkIHByb2Nlc3NXaWxsT3BlbkNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5
JiwgSVBDOjpDb25uZWN0aW9uJik7CisgICAgdm9pZCBwcm9jZXNzRGlkQ2xvc2VDb25uZWN0aW9u
KFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYpOworICAgIHZvaWQgYXBwbGljYXRp
b25XaWxsVGVybWluYXRlKCk7CisKKyAgICB2b2lkIGdldFNlc3Npb25TdG9yYWdlT3JpZ2lucyhG
dW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBj
b21wbGV0aW9uSGFuZGxlcik7CisgICAgdm9pZCBkZWxldGVTZXNzaW9uU3RvcmFnZU9yaWdpbnMo
RnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICB2b2lkIGRlbGV0ZVNl
c3Npb25TdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOwor
CisgICAgdm9pZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAg
ICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW4oV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJiYpOworCisgICAgdm9pZCBkZWxldGVMb2NhbFN0b3JhZ2VPcmlnaW5zTW9k
aWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50LCBGdW5jdGlv
bjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOworICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9y
YWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
RGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOworCisgICAgdm9p
ZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5EZXRhaWxzKEZ1bmN0aW9uPHZvaWQoVmVjdG9yPExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBsZXRpb25IYW5k
bGVyKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBTdG9yYWdlTWFuYWdlcihjb25zdCBTdHJp
bmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7CisKKyAgICAvLyBJUEM6OkNvbm5lY3Rpb246Oldv
cmtRdWV1ZU1lc3NhZ2VSZWNlaXZlci4KKyAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6
Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYpIG92ZXJyaWRlOworICAgIHZvaWQgZGlkUmVjZWl2
ZVN5bmNNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYsIHN0ZDo6dW5pcXVl
X3B0cjxJUEM6OkVuY29kZXI+JiByZXBseUVuY29kZXIpIG92ZXJyaWRlOworCisgICAgLy8gTWVz
c2FnZSBoYW5kbGVycy4KKyAgICB2b2lkIGNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNvbm5l
Y3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJ
RCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYpOworICAgIHZvaWQgY3JlYXRlVHJhbnNp
ZW50TG9jYWxTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJ
RCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGEmJiB0b3BMZXZlbE9yaWdpbkRhdGEsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsK
KyAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2
NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGEmJik7CisgICAgdm9pZCBkZXN0cm95U3RvcmFnZU1hcChJUEM6OkNv
bm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOworCisgICAgdm9pZCBnZXRWYWx1ZXMo
SVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIHZhbHVlcyk7CisgICAgdm9pZCBzZXRJ
dGVtKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHNv
dXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcm
IGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAg
IHZvaWQgcmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQs
IHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBj
b25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgY2xl
YXIoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3Vy
Y2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiB1
cmxTdHJpbmcpOworCisgICAgY2xhc3MgU3RvcmFnZUFyZWE7CisgICAgU3RvcmFnZUFyZWEqIGZp
bmRTdG9yYWdlQXJlYShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCkgY29uc3Q7CisKKyAgICBj
bGFzcyBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U7CisgICAgTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBn
ZXRPckNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNl
SUQpOworCisgICAgY2xhc3MgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOworICAgIFRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSogZ2V0T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1
cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9yaWdpbik7CisKKyAgICBSZWY8V29ya1F1ZXVlPiBt
X3F1ZXVlOworCisgICAgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gbV9sb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI7CisgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPExvY2Fs
U3RvcmFnZU5hbWVzcGFjZT4+IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlczsKKworICAgIEhhc2hN
YXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+LCBSZWZQ
dHI8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlPj4gbV90cmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2VzOworCisgICAgY2xhc3MgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U7CisgICAg
SGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPj4gbV9zZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZXM7CisKKyAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQdHI8SVBD
OjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VB
cmVhc0J5Q29ubmVjdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNz
YWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFn
ZXIubWVzc2FnZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjU3ODlmNzRjYzA4MWIwNzRiNTg4NTBkMmI3ZDdi
YzQxODA0OWM4YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dl
YlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4KQEAgLTAsMCArMSwzNCBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittZXNzYWdlcyAtPiBTdG9yYWdl
TWFuYWdlciB7CisgICAgQ3JlYXRlTG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJ
RCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2FudHNDb25uZWN0aW9uCisgICAgQ3JlYXRl
VHJhbnNpZW50TG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qg
c3RvcmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHRv
cExldmVsU2VjdXJpdHlPcmlnaW5EYXRhLCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5E
YXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2FudHNDb25uZWN0aW9uCisgICAgQ3JlYXRlU2Vzc2lv
blN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5E
YXRhKSBXYW50c0Nvbm5lY3Rpb24KKyAgICBEZXN0cm95U3RvcmFnZU1hcCh1aW50NjRfdCBzdG9y
YWdlTWFwSUQpIFdhbnRzQ29ubmVjdGlvbgorCisgICAgR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpIC0+IChIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiB2YWx1ZXMpIFdhbnRzQ29ubmVjdGlvbgorCisgICAgU2V0SXRlbSh1aW50NjRfdCBzdG9y
YWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VN
YXBTZWVkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIFN0cmluZyB1cmxTdHJpbmcpIFdhbnRz
Q29ubmVjdGlvbgorICAgIFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRf
dCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtl
eSwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCisgICAgQ2xlYXIodWludDY0X3Qg
c3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9y
YWdlTWFwU2VlZCwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCit9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXJJT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdl
L2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0KbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmQ5MDll
YTZiMjUwMzE5YjAxMzA2YzQzNmJkMGYxMzJjMGY4Mjg1NgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlcklPUy5tbQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgorCisjaWYg
UExBVEZPUk0oSU9TKQorCisjaW5jbHVkZSAiVmVyc2lvbkNoZWNrcy5oIgorCituYW1lc3BhY2Ug
V2ViS2l0IHsKKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnBsYXRmb3JtTWF5
YmVFeGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0Cit7CisgICAgaWYgKG1faGFzRXhjbHVkZWRGcm9t
QmFja3VwKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2hhc0V4Y2x1ZGVkRnJvbUJhY2t1cCA9
IHRydWU7CisKKyAgICBpZiAobGlua2VkT25PckFmdGVyKFNES1ZlcnNpb246OkZpcnN0VG9FeGNs
dWRlTG9jYWxTdG9yYWdlRnJvbUJhY2t1cCkpCisgICAgICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQ
YXRoOihOU1N0cmluZyAqKW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5XSBzZXRSZXNvdXJjZVZhbHVl
OkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21CYWNrdXBLZXkgZXJyb3I6bmlsXTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9VSVByb2Nlc3MvaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZUlPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWI1Y2JkMjhlMjQ5MjkxM2E0
MzI3NjRjOWJhOTM2NTI3N2M5NzcyMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1Mu
bW0KQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2lt
cG9ydCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgiCisKKyNpZiBQ
TEFURk9STShJT1MpCisKK25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdAorewor
ICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0cmluZyAqKW1fc3RvcmFnZURpcmVjdG9y
eVBhdGhdIHNldFJlc291cmNlVmFsdWU6QFlFUyBmb3JLZXk6TlNVUkxJc0V4Y2x1ZGVkRnJvbUJh
Y2t1cEtleSBlcnJvcjpuaWxdOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJLaXQv
V2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggYWVjOGQzN2FmZDg2YjViMDRk
YTQ3MDZlY2NlZjRlMmNhNGE3MTY3OS4uOTg5NTY2Yjg1ZWYyMzk5MzcyY2M3ZmNjOTQxY2JmODU4
MDNjZDM4MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYktpdC54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCkBAIC0xMDc5LDYgKzEwNzksOSBAQAogCQk1MUUzNTIwMjE4MEY1RDFFMDBFNTNCRTkg
LyogRGF0YWJhc2VQcm9jZXNzTWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNTFFMzUyMDExODBGNUQxRTAwRTUzQkU5IC8qIERhdGFiYXNlUHJvY2Vz
c01hYy5tbSAqLzsgfTsKIAkJNTFFMzUyMDkxODBGNUQ2QjAwRTUzQkU5IC8qIERhdGFiYXNlU2Vy
dmljZUVudHJ5UG9pbnQubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA1MUUzNTIwODE4MEY1RDZCMDBFNTNCRTkgLyogRGF0YWJhc2VTZXJ2aWNlRW50cnlQ
b2ludC5tbSAqLzsgfTsKIAkJNTFFMzk5MDYxRDZGNTRDNzAwOUM4ODMxIC8qIFVJR2FtZXBhZFBy
b3ZpZGVyQ29jb2EubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA1MUUzOTkwNTFENkY1NEM1MDA5Qzg4MzEgLyogVUlHYW1lcGFkUHJvdmlkZXJDb2NvYS5t
bSAqLzsgfTsKKwkJNTFFNkMxNjAxRjI5MzU2MDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDUxRTZDMTVGMUYyOTM1NTEwMEZEMzQzNyAvKiBSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gKi87IH07CisJCTUxRTZDMTYzMUYy
OTM1RDgwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFFNkMx
NjIxRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZS5jcHAgKi87IH07CisJCTUxRTZDMTY0MUYyOTM1REQwMEZEMzQzNyAvKiBSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUxRTZDMTYxMUYyOTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCAqLzsgfTsKIAkJNTFFOEI2OEUxRTcx
Mjg3NzAwMUI3MTMyIC8qIFdlYlVSTFNjaGVtZVRhc2suY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFFOEI2OEQxRTcxMjg3MzAwMUI3MTMyIC8qIFdl
YlVSTFNjaGVtZVRhc2suY3BwICovOyB9OwogCQk1MUU5NDk5NzFENzYyMTEzMDBFQzlFQjkgLyog
VUlHYW1lcGFkUHJvdmlkZXJJT1MubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA1MUU5NDk5NjFENzYxQ0M3MDBFQzlFQjkgLyogVUlHYW1lcGFkUHJvdmlk
ZXJJT1MubW0gKi87IH07CiAJCTUxRUZDMUNGMTUyNEU2MjUwMEM5QTkzOCAvKiBXS0J1bmRsZURP
TVdpbmRvd0V4dGVuc2lvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNTFGQTJENTQxNTIxMTE4NjAwQzFCQTBCIC8qIFdLQnVuZGxlRE9NV2luZG93RXh0
ZW5zaW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
QEAgLTEzMjUsNyArMTMyOCw2IEBACiAJCTgzMTA0MjhDMUJENkI2NkYwMEE3MTVFNCAvKiBOZXR3
b3JrQ2FjaGVTdWJyZXNvdXJjZXNFbnRyeS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA4MzEwNDI4QTFCRDZCNjZGMDBBNzE1RTQgLyogTmV0d29ya0Nh
Y2hlU3VicmVzb3VyY2VzRW50cnkuY3BwICovOyB9OwogCQk4MzFFRUJCRDFCRDg1QzQzMDBCQjY0
QzMgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzFFRUJCQjFCRDg1QzQzMDBCQjY0QzMgLyogTmV0
d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmggKi87IH07CiAJCTgzMUVFQkJFMUJEODVDNDMwMEJC
NjRDMyAvKiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMxRUVCQkMxQkQ4NUM0MzAwQkI2NEMzIC8q
IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5jcHAgKi87IH07Ci0JCTgzMjQzNTVDMUYxNzE0
NjcwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1Mu
bW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzI0MzU1
QjFGMTcxNDYxMDAzNUFBM0EgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlSU9TLm1tICovOyB9OwogCQk4MzJBRTI1MjFCRTJFOENEMDBGQUFFMTAgLyogTmV0d29ya0Nh
Y2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gODMyQUUyNTAxQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNo
ZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuaCAqLzsgfTsKIAkJODMyQUUyNTMxQkUyRThDRDAwRkFB
RTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMyQUUyNTExQkUyRThDRDAwRkFB
RTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwICovOyB9OwogCQk4
MzJFRDE4QjFFMkZFMTU3MDA2QkE2NEEgLyogUGVyQWN0aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxl
ci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzJF
RDE4OTFFMkZFMTNCMDA2QkE2NEEgLyogUGVyQWN0aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5j
cHAgKi87IH07CkBAIC0xMzM5LDggKzEzNDEsNiBAQAogCQk4MzcyREIyODFBNjc1NjI4MDBDNjk3
QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzNzJEQjI2MUE2NzU2MjgwMEM2OTdDNSAv
KiBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuY3BwICovOyB9OwogCQk4MzcyREIyOTFB
Njc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzcyREIyNzFBNjc1NjI4
MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggKi87IH07CiAJCTgz
NzJEQjJGMUE2NzdENEEwMEM2OTdDNSAvKiBXS0RpYWdub3N0aWNMb2dnaW5nUmVzdWx0VHlwZS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM3MkRCMkUx
QTY3N0Q0QTAwQzY5N0M1IC8qIFdLRGlhZ25vc3RpY0xvZ2dpbmdSZXN1bHRUeXBlLmggKi87IHNl
dHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKLQkJODM4NTBDMEMxRjE2
QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Mzg1MEMw
QTFGMTZCQTZDMDBDMTVFNTIgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlLmNwcCAqLzsgfTsKLQkJODM4NTBDMEQxRjE2QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gODM4NTBDMEIxRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovOyB9OwogCQk4Mzg5MUI2MzFBNjhC
MzQyMDAzMEYzODYgLyogQVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzODkxQjYyMUE2OEIzNDIwMDMwRjM4
NiAvKiBBUElEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oICovOyB9OwogCQk4Mzg5MUI2OTFBNjhC
RUJDMDAzMEYzODYgLyogX1dLRGlhZ25vc3RpY0xvZ2dpbmdEZWxlZ2F0ZS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM4OTFCNjgxQTY4QkVCQzAwMzBG
Mzg2IC8qIF9XS0RpYWdub3N0aWNMb2dnaW5nRGVsZWdhdGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRU
UklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4Mzg5MUI2QzFBNjhDMzBCMDAzMEYzODYg
LyogRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDgzODkxQjZBMUE2OEMzMEIwMDMwRjM4NiAvKiBEaWFnbm9zdGlj
TG9nZ2luZ0NsaWVudC5oICovOyB9OwpAQCAtMzM0Miw2ICszMzQyLDkgQEAKIAkJNTFFMzUyMDcx
ODBGNUQ2MTAwRTUzQkU5IC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9IEluZm8ucGxpc3Q7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTUxRTM1MjA4MTgwRjVENkIwMEU1M0JFOSAv
KiBEYXRhYmFzZVNlcnZpY2VFbnRyeVBvaW50Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBwYXRoID0gRGF0YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbTsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJNTFFMzk5MDUxRDZGNTRDNTAwOUM4ODMxIC8qIFVJR2FtZXBhZFBy
b3ZpZGVyQ29jb2EubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBV
SUdhbWVwYWRQcm92aWRlckNvY29hLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk1
MUU2QzE1RjFGMjkzNTUxMDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlSU9TLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBuYW1lID0gUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tOyBwYXRoID0gaW9zL1Jlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJNTFFNkMxNjExRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTFFNkMxNjIx
RjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MUU4QjY4RDFFNzEy
ODczMDAxQjcxMzIgLyogV2ViVVJMU2NoZW1lVGFzay5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBXZWJVUkxTY2hlbWVUYXNrLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNTFFOTQ5OTYxRDc2MUNDNzAwRUM5RUI5IC8qIFVJR2FtZXBhZFByb3ZpZGVy
SU9TLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gVUlHYW1lcGFk
UHJvdmlkZXJJT1MubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTUxRjA2MEREMTY1
NDMxNzUwMEYzMjgxQiAvKiBXZWJSZXNvdXJjZUxvYWRlck1lc3NhZ2VSZWNlaXZlci5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBXZWJSZXNvdXJjZUxvYWRlck1lc3NhZ2VSZWNlaXZlci5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0zNjE0LDcgKzM2MTcsNiBAQAogCQk4MzEwNDI4
QTFCRDZCNjZGMDBBNzE1RTQgLyogTmV0d29ya0NhY2hlU3VicmVzb3VyY2VzRW50cnkuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlU3VicmVzb3Vy
Y2VzRW50cnkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzFFRUJCQjFCRDg1
QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzFFRUJCQzFCRDg1QzQzMDBCQjY0QzMgLyogTmV0
d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07Ci0JCTgzMjQzNTVCMUYxNzE0NjEwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5vYmpjcHA7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJ
T1MubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzMkFFMjUwMUJFMkU4Q0QwMEZB
QUUxMCAvKiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODMyQUUyNTExQkUyRThDRDAwRkFBRTEw
IC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdl
ci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzMkVEMTg5MUUyRkUxM0IwMDZC
QTY0QSAvKiBQZXJBY3Rpdml0eVN0YXRlQ1BVVXNhZ2VTYW1wbGVyLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBlckFjdGl2aXR5U3RhdGVDUFVVc2FnZVNhbXBsZXIu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMzYyOCw4ICszNjMwLDYgQEAKIAkJ
ODM3MkRCMjYxQTY3NTYyODAwQzY5N0M1IC8qIFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVu
dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJQYWdlRGlhZ25v
c3RpY0xvZ2dpbmdDbGllbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4Mzcy
REIyNzFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2lu
Z0NsaWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzcyREIyRTFBNjc3RDRB
MDBDNjk3QzUgLyogV0tEaWFnbm9zdGljTG9nZ2luZ1Jlc3VsdFR5cGUuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gV0tEaWFnbm9zdGljTG9nZ2luZ1Jlc3VsdFR5cGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJODM4NTBDMEExRjE2QkE2QzAwQzE1RTUyIC8qIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk4Mzg1MEMwQjFGMTZCQTZD
MDBDMTVFNTIgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4Mzg5MUI2MjFB
NjhCMzQyMDAzMEYzODYgLyogQVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODM4OTFCNjgxQTY4QkVCQzAwMzBGMzg2IC8qIF9X
S0RpYWdub3N0aWNMb2dnaW5nRGVsZWdhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gX1dLRGlhZ25vc3RpY0xvZ2dpbmdEZWxlZ2F0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk4Mzg5MUI2QTFBNjhDMzBCMDAzMEYzODYgLyogRGlhZ25vc3RpY0xvZ2dpbmdD
bGllbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRGlhZ25vc3RpY0xvZ2dp
bmdDbGllbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTQ2NzksNyArNDY3OSw3
IEBACiAJCQluYW1lID0gRGVwcmVjYXRlZDsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJ
CX07Ci0JCTFBNDRCOTU4MTZCNzNGOEMwMEI3QkJEOCAvKiBTdG9yYWdlICovID0geworCQkxQTQ0
Qjk1ODE2QjczRjhDMDBCN0JCRDggLyogV2ViU3RvcmFnZSAqLyA9IHsKIAkJCWlzYSA9IFBCWEdy
b3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJNTEyMEM4MkQxRTU0RTIwNDAwMjVCMjUwIC8qIGlv
cyAqLywKQEAgLTQ2ODcsMTMgKzQ2ODcsMTEgQEAKIAkJCQkxQTFEOEJBMDE3MzFBMzYzMDAxNDFE
QTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2UuaCAqLywKIAkJCQkxQThDNzI4QTE3Mzg0NzdDMDAw
QTY1NTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcCAqLywKIAkJCQkxQThDNzI4
QjE3Mzg0NzdDMDAwQTY1NTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmggKi8sCi0J
CQkJODM4NTBDMEExRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZS5jcHAgKi8sCi0JCQkJODM4NTBDMEIxRjE2QkE2QzAwQzE1RTUyIC8qIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovLAogCQkJCTFBNDRCOTU5
MTZCNzNGOUYwMEI3QkJEOCAvKiBTdG9yYWdlTWFuYWdlci5jcHAgKi8sCiAJCQkJMUE0NEI5NUEx
NkI3M0Y5RjAwQjdCQkQ4IC8qIFN0b3JhZ2VNYW5hZ2VyLmggKi8sCiAJCQkJMUFCMzFBOTMxNkJD
NjVBQjAwRjZEQkM5IC8qIFN0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluICovLAogCQkJKTsKLQkJ
CXBhdGggPSBTdG9yYWdlOworCQkJcGF0aCA9IFdlYlN0b3JhZ2U7CiAJCQlzb3VyY2VUcmVlID0g
Ijxncm91cD4iOwogCQl9OwogCQkxQTQ4MzJDMDFBOTY1QTMzMDA4QjRERkUgLyogQ29jb2EgKi8g
PSB7CkBAIC00ODYxLDcgKzQ4NTksNyBAQAogCQkJcGF0aCA9IGNnOwogCQkJc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsKIAkJfTsKLQkJMUFBQzREREUxNkIxQ0JGNjAwOTQyNUUzIC8qIFN0b3JhZ2Ug
Ki8gPSB7CisJCTFBQUM0RERFMTZCMUNCRjYwMDk0MjVFMyAvKiBXZWJTdG9yYWdlICovID0gewog
CQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQkxQUQzMzA2QzE2QjFEOTkx
MDA0RjYwRTcgLyogU3RvcmFnZUFyZWFJbXBsLmNwcCAqLywKQEAgLTQ4NzQsNyArNDg3Miw3IEBA
CiAJCQkJMUE1MkMwRjUxQTM4Q0RDNzAwMTYxNjBBIC8qIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlci5jcHAgKi8sCiAJCQkJMUE1MkMwRjYxQTM4Q0RDNzAwMTYxNjBBIC8qIFdlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlci5oICovLAogCQkJKTsKLQkJCXBhdGggPSBTdG9yYWdlOworCQkJcGF0
aCA9IFdlYlN0b3JhZ2U7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OwogCQkxQUFE
REY0QjEwRDgyQUYwMDBEM0Q2M0QgLyogU2hhcmVkICovID0gewpAQCAtNTQwMiw2ICs1NDAwLDcg
QEAKIAkJCQk4NkY5NTM2MjE4RkY1NTBCMDAxREIyRUYgLyogUHJvY2Vzc0Fzc2VydGlvbklPUy5t
bSAqLywKIAkJCQkwRjBDMzY1NzE4QzA1MUJBMDBGNjA3RDcgLyogUmVtb3RlTGF5ZXJUcmVlSG9z
dElPUy5tbSAqLywKIAkJCQkwRjBDMzY1QjE4QzA1Q0ExMDBGNjA3RDcgLyogUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3JQcm94eUlPUy5tbSAqLywKKwkJCQk1MUU2QzE1RjFGMjkzNTUxMDBGRDM0
MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovLAog
CQkJCTJEQUYwNkQ0MThCRDFBNDcwMDgxQ0VCMSAvKiBTbWFydE1hZ25pZmljYXRpb25Db250cm9s
bGVyLmggKi8sCiAJCQkJMkRBRjA2RDgxOEJEMjNCQTAwODFDRUIxIC8qIFNtYXJ0TWFnbmlmaWNh
dGlvbkNvbnRyb2xsZXIubWVzc2FnZXMuaW4gKi8sCiAJCQkJMkRBRjA2RDUxOEJEMUE0NzAwODFD
RUIxIC8qIFNtYXJ0TWFnbmlmaWNhdGlvbkNvbnRyb2xsZXIubW0gKi8sCkBAIC02MDAwLDcgKzU5
OTksNiBAQAogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQk1MTIwQzgz
MDFFNTRFMjY1MDAyNUIyNTAgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VySU9TLm1tICov
LAotCQkJCTgzMjQzNTVCMUYxNzE0NjEwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gKi8sCiAJCQkpOwogCQkJcGF0aCA9IGlvczsKIAkJCXNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC02NTM5LDEwICs2NTM3LDEwIEBACiAJCQkJMzEwOTk5
NzQxNDZDOEFBODAwMjlERUI5IC8qIE5vdGlmaWNhdGlvbnMgKFVzZXIpICovLAogCQkJCTFBNkZC
N0FBMTFFNjRCNDkwMERCMTM3MSAvKiBQbHVnaW5zICovLAogCQkJCTBGNTk0NzhDMTg3QjNCMkEw
MDQzNzg1NyAvKiBTY3JvbGxpbmcgKi8sCi0JCQkJMUFBQzREREUxNkIxQ0JGNjAwOTQyNUUzIC8q
IFN0b3JhZ2UgKi8sCiAJCQkJMUFBRjA4QUExOTI2OTMwQjAwQjYzOTBDIC8qIFVzZXJDb250ZW50
ICovLAogCQkJCUJDMDMyRDVEMTBGNDM3MjIwMDU4QzE1QSAvKiBXZWJDb3JlU3VwcG9ydCAqLywK
IAkJCQlCQzAzMkQ1RTEwRjQzNzJCMDA1OEMxNUEgLyogV2ViUGFnZSAqLywKKwkJCQkxQUFDNERE
RTE2QjFDQkY2MDA5NDI1RTMgLyogV2ViU3RvcmFnZSAqLywKIAkJCQlCQ0U5QzBDRjE0ODU5NjVE
MDBFMzNENjEgLyogV2ViQ29ubmVjdGlvblRvVUlQcm9jZXNzLmNwcCAqLywKIAkJCQlCQ0U5QzBE
MDE0ODU5NjVEMDBFMzNENjEgLyogV2ViQ29ubmVjdGlvblRvVUlQcm9jZXNzLmggKi8sCiAJCQkJ
QkMxMTFBRTMxMTJGNUMyNjAwMzM3QkFCIC8qIFdlYlByb2Nlc3MuY3BwICovLApAQCAtNjY4OSw4
ICs2Njg3LDggQEAKIAkJCQkzMUEyRUM0MDE0ODk5NzM3MDA4MTBENzEgLyogTm90aWZpY2F0aW9u
cyAqLywKIAkJCQkxQUVGQ0MwNTExRDAxRjM0MDA4MjE5RDMgLyogUGx1Z2lucyAqLywKIAkJCQkw
RjU5NDc5MzE4N0IzQjRDMDA0Mzc4NTcgLyogU2Nyb2xsaW5nICovLAotCQkJCTFBNDRCOTU4MTZC
NzNGOEMwMEI3QkJEOCAvKiBTdG9yYWdlICovLAogCQkJCTFBQUYwODlFMTkyNjgxQUMwMEI2Mzkw
QyAvKiBVc2VyQ29udGVudCAqLywKKwkJCQkxQTQ0Qjk1ODE2QjczRjhDMDBCN0JCRDggLyogV2Vi
U3RvcmFnZSAqLywKIAkJCQkxQTUzQzJBMzFBMzI1NjkxMDA0RThDNzAgLyogV2Vic2l0ZURhdGEg
Ki8sCiAJCQkJN0NEMTAyRDkxODY2NzcwNjAwRUQ0MjlEIC8qIEF1dG9Db3JyZWN0aW9uQ2FsbGJh
Y2suaCAqLywKIAkJCQk0NkEyQjYwNjFFNTY3NUEyMDBDM0RFREEgLyogQmFja2dyb3VuZFByb2Nl
c3NSZXNwb25zaXZlbmVzc1RpbWVyLmNwcCAqLywKQEAgLTY3MjQsNiArNjcyMiw4IEBACiAJCQkJ
QTU1QkE4MUIxQkEyNUIxRTAwN0NEMzNEIC8qIFJlbW90ZVdlYkluc3BlY3RvclByb3h5LmNwcCAq
LywKIAkJCQlBNTVCQTgxOTFCQTI1QjFFMDA3Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVjdG9yUHJv
eHkuaCAqLywKIAkJCQlBNTVCQTgxQTFCQTI1QjFFMDA3Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVj
dG9yUHJveHkubWVzc2FnZXMuaW4gKi8sCisJCQkJNTFFNkMxNjIxRjI5MzVDRDAwRkQzNDM3IC8q
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8sCisJCQkJNTFF
NkMxNjExRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZS5oICovLAogCQkJCUJDMTExQjA4MTEyRjVFM0MwMDMzN0JBQiAvKiBSZXNwb25zaXZl
bmVzc1RpbWVyLmNwcCAqLywKIAkJCQkxQTMwMDY2QzExMTBGNEY3MDAzMTkzN0MgLyogUmVzcG9u
c2l2ZW5lc3NUaW1lci5oICovLAogCQkJCTUxQTRENUE4MTZDQUM0RkYwMDBFNjE1RSAvKiBTdGF0
aXN0aWNzUmVxdWVzdC5jcHAgKi8sCkBAIC04NTMyLDcgKzg1MzIsNiBAQAogCQkJCUE1NUJBODE3
MUJBMjNFMTIwMDdDRDMzRCAvKiBSZW1vdGVXZWJJbnNwZWN0b3JVSS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJNkJFOTY5Q0QxRTU0RTA1NDAwOEI3NDgzIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3ND
bGFzc2lmaWVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk2QkU5NjlDQjFFNTRENENGMDA4Qjc0ODMg
LyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc0NsYXNzaWZpZXJDb2NvYS5oIGluIEhlYWRlcnMgKi8s
Ci0JCQkJODM4NTBDMEQxRjE2QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMUEzMDA2NkUxMTEwRjRGNzAw
MzE5MzdDIC8qIFJlc3BvbnNpdmVuZXNzVGltZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTQxMDQ4
MkNFMURERDMyNEYwMEYwMDZEMCAvKiBSVENOZXR3b3JrLmggaW4gSGVhZGVycyAqLywKIAkJCQlC
QzJEMDIxNzEyQUM0MUNCMDBFNzMyQTMgLyogU2FtZURvY3VtZW50TmF2aWdhdGlvblR5cGUuaCBp
biBIZWFkZXJzICovLApAQCAtODk1Nyw2ICs4OTU2LDcgQEAKIAkJCQkxQUJDM0RGQzE4OTlGNTFD
MDA0RjA2MjYgLyogV0tOYXZpZ2F0aW9uRGVsZWdhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTFB
QTIwRDUxMThBRDUwRTAwMDVEMUVENCAvKiBXS05hdmlnYXRpb25EZWxlZ2F0ZVByaXZhdGUuaCBp
biBIZWFkZXJzICovLAogCQkJCTFBQkMzREYxMTg5OUM2QjYwMDRGMDYyNiAvKiBXS05hdmlnYXRp
b25JbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNTFFNkMxNjQxRjI5MzVERDAwRkQzNDM3
IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMUFDQzg3QkExOTgxQzM0MTAwM0QxQUY0IC8qIFdLTmF2aWdhdGlvblByaXZhdGUu
aCBpbiBIZWFkZXJzICovLAogCQkJCTJEM0E2NUUzMUE3QzNBOTMwMENBQzYzNyAvKiBXS05hdmln
YXRpb25SZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBMUIwRUI2MThBNDI0OTUwMDM4NDgxQSAv
KiBXS05hdmlnYXRpb25SZXNwb25zZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0xMDEwMiw4ICsxMDEw
Miw2IEBACiAJCQkJMUJCQkU0QTAxOUI2NkM1MzAwNkI3RDgxIC8qIFJlbW90ZVdlYkluc3BlY3Rv
clVJTWVzc2FnZVJlY2VpdmVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTZCRTk2OUM3MUU1NEQ0
QjYwMDhCNzQ4MyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzQ2xhc3NpZmllci5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQk2QkU5NjlDQTFFNTRENENGMDA4Qjc0ODMgLyogUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc0NsYXNzaWZpZXJDb2NvYS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQk4Mzg1MEMwQzFG
MTZCQTkwMDBDMTVFNTIgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTgzMjQzNTVDMUYxNzE0NjcwMDM1QUEzQSAvKiBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLywK
IAkJCQlCQzExMUIwOTExMkY1RTNDMDAzMzdCQUIgLyogUmVzcG9uc2l2ZW5lc3NUaW1lci5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk0MTA0ODJDRDFEREQzMjRDMDBGMDA2RDAgLyogUlRDTmV0d29y
ay5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxQUFCNEFBQTEyOTZGMTU0MDAyMzk1MkYgLyogU2Fu
ZGJveEV4dGVuc2lvbk1hYy5tbSBpbiBTb3VyY2VzICovLApAQCAtMTAzMTUsNiArMTAzMTMsNyBA
QAogCQkJCUJDOTYzRDZFMTEzREQxQTUwMDU3NEJFMiAvKiBXZWJQYWdlTWFjLm1tIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQzBDRTcyQTAxMjQ3RTcxRDAwQkMwRUM0IC8qIFdlYlBhZ2VNZXNzYWdlUmVj
ZWl2ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkQ1QzlEMDUxOUM4MUQ4RjAwQjNDNUMxIC8q
IFdlYlBhZ2VPdmVybGF5LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTUxRTZDMTYwMUYyOTM1NjAw
MEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0g
aW4gU291cmNlcyAqLywKIAkJCQlCQzExMUIwRjExMkY1RTRGMDAzMzdCQUIgLyogV2ViUGFnZVBy
b3h5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBQzAyNzNGMTk2NjIyRDYwMEMxMkI3NSAvKiBX
ZWJQYWdlUHJveHlDb2NvYS5tbSBpbiBTb3VyY2VzICovLAogCQkJCTJEQTk0NEFGMTg4NEU5QkEw
MEVEODZEQiAvKiBXZWJQYWdlUHJveHlJT1MubW0gaW4gU291cmNlcyAqLywKQEAgLTEwNTI3LDYg
KzEwNTI2LDcgQEAKIAkJCQkyRDNBNjVFMjFBN0MzQTkzMDBDQUM2MzcgLyogV0tOYXZpZ2F0aW9u
UmVmLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBMUIwRUI1MThBNDI0OTUwMDM4NDgxQSAvKiBX
S05hdmlnYXRpb25SZXNwb25zZS5tbSBpbiBTb3VyY2VzICovLAogCQkJCTJEM0E2NURFMUE3QzNB
N0QwMENBQzYzNyAvKiBXS05hdmlnYXRpb25SZXNwb25zZVJlZi5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQk1MUU2QzE2MzFGMjkzNUQ4MDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTMxOEJFMTc3MTQ3NDNFNjAw
MEE4RkJCMiAvKiBXS05vdGlmaWNhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzMThCRTE3
NTE0NzQzREQ3MDBBOEZCQjIgLyogV0tOb3RpZmljYXRpb25NYW5hZ2VyLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTMxQTJFQzc3MTQ4RDY2MkUwMDgxMEQ3MSAvKiBXS05vdGlmaWNhdGlvblBlcm1p
c3Npb25SZXF1ZXN0LmNwcCBpbiBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGJlODUwN2EzMTMyNjQyZGJkYzBmMThhNjk5ZDFlN2NmM2JhNDg2MWQuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcAorKysgL2Rldi9udWxsCkBA
IC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgotCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXAuaCIKLSNp
bmNsdWRlIDxXZWJDb3JlL0RvY3VtZW50Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2NoZW1lUmVnaXN0
cnkuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUg
PFdlYkNvcmUvU2V0dGluZ3MuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1zdGF0aWMgdWludDY0X3QgZ2VuZXJhdGVTdG9yYWdlQXJlYUlEKCkK
LXsKLSAgICBzdGF0aWMgdWludDY0X3Qgc3RvcmFnZUFyZWFJRDsKLSAgICByZXR1cm4gKytzdG9y
YWdlQXJlYUlEOwotfQotCi1SZWY8U3RvcmFnZUFyZWFJbXBsPiBTdG9yYWdlQXJlYUltcGw6OmNy
ZWF0ZShSZWY8U3RvcmFnZUFyZWFNYXA+JiYgc3RvcmFnZUFyZWFNYXApCi17Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWFJbXBsKFdURk1vdmUoc3RvcmFnZUFyZWFNYXApKSk7
Ci19Ci0KLVN0b3JhZ2VBcmVhSW1wbDo6U3RvcmFnZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1h
cD4mJiBzdG9yYWdlQXJlYU1hcCkKLSAgICA6IG1fc3RvcmFnZUFyZWFJRChnZW5lcmF0ZVN0b3Jh
Z2VBcmVhSUQoKSkKLSAgICAsIG1fc3RvcmFnZUFyZWFNYXAoV1RGTW92ZShzdG9yYWdlQXJlYU1h
cCkpCi17Ci19Ci0KLVN0b3JhZ2VBcmVhSW1wbDo6flN0b3JhZ2VBcmVhSW1wbCgpCi17Ci19Ci0K
LXVuc2lnbmVkIFN0b3JhZ2VBcmVhSW1wbDo6bGVuZ3RoKCkKLXsKLSAgICByZXR1cm4gbV9zdG9y
YWdlQXJlYU1hcC0+bGVuZ3RoKCk7Ci19Ci0KLVN0cmluZyBTdG9yYWdlQXJlYUltcGw6OmtleSh1
bnNpZ25lZCBpbmRleCkKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+a2V5KGluZGV4
KTsKLX0KLQotU3RyaW5nIFN0b3JhZ2VBcmVhSW1wbDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkK
LXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+aXRlbShrZXkpOwotfQotCi12b2lkIFN0
b3JhZ2VBcmVhSW1wbDo6c2V0SXRlbShGcmFtZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYg
a2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKLXsKLSAgICBB
U1NFUlQoIXZhbHVlLmlzTnVsbCgpKTsKLQotICAgIG1fc3RvcmFnZUFyZWFNYXAtPnNldEl0ZW0o
c291cmNlRnJhbWUsIHRoaXMsIGtleSwgdmFsdWUsIHF1b3RhRXhjZXB0aW9uKTsKLX0KLQotdm9p
ZCBTdG9yYWdlQXJlYUltcGw6OnJlbW92ZUl0ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBT
dHJpbmcmIGtleSkKLXsKLSAgICBtX3N0b3JhZ2VBcmVhTWFwLT5yZW1vdmVJdGVtKHNvdXJjZUZy
YW1lLCB0aGlzLCBrZXkpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhSW1wbDo6Y2xlYXIoRnJhbWUq
IHNvdXJjZUZyYW1lKQotewotICAgIG1fc3RvcmFnZUFyZWFNYXAtPmNsZWFyKHNvdXJjZUZyYW1l
LCB0aGlzKTsKLX0KLQotYm9vbCBTdG9yYWdlQXJlYUltcGw6OmNvbnRhaW5zKGNvbnN0IFN0cmlu
ZyYga2V5KQotewotICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5jb250YWlucyhrZXkpOwot
fQotCi1ib29sIFN0b3JhZ2VBcmVhSW1wbDo6Y2FuQWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUp
Ci17Ci0gICAgcmV0dXJuIGZyYW1lICYmIGZyYW1lLT5wYWdlKCk7Ci19Ci0KLVN0b3JhZ2VUeXBl
IFN0b3JhZ2VBcmVhSW1wbDo6c3RvcmFnZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBtX3N0
b3JhZ2VBcmVhTWFwLT5zdG9yYWdlVHlwZSgpOwotfQotCi1zaXplX3QgU3RvcmFnZUFyZWFJbXBs
OjptZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBT
dG9yYWdlQXJlYUltcGw6OmluY3JlbWVudEFjY2Vzc0NvdW50KCkKLXsKLSAgICAvLyBTdG9yYWdl
IGFjY2VzcyBpcyBoYW5kbGVkIGluIHRoZSBVSSBwcm9jZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcg
dG8gZG8gaGVyZS4KLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmRlY3JlbWVudEFjY2Vzc0Nv
dW50KCkKLXsKLSAgICAvLyBTdG9yYWdlIGFjY2VzcyBpcyBoYW5kbGVkIGluIHRoZSBVSSBwcm9j
ZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS4KLX0KLQotdm9pZCBTdG9yYWdlQXJl
YUltcGw6OmNsb3NlRGF0YWJhc2VJZklkbGUoKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQg
dGhpcy4KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLX0KLQotV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhIFN0b3JhZ2VBcmVhSW1wbDo6c2VjdXJpdHlPcmlnaW4oKSBjb25zdAotewotICAg
IHJldHVybiBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbiht
X3N0b3JhZ2VBcmVhTWFwLT5zZWN1cml0eU9yaWdpbigpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9y
YWdlQXJlYUltcGwuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VB
cmVhSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE0N2M4ZDgzOGU4ZmJk
YzVkNDdiZjc4Y2Y3NmUxOWEwMTk4YjMyLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VB
cmVhSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
Zm5kZWYgU3RvcmFnZUFyZWFJbXBsX2gKLSNkZWZpbmUgU3RvcmFnZUFyZWFJbXBsX2gKLQotI2lu
Y2x1ZGUgIk1lc3NhZ2VSZWNlaXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEu
aD4KLSNpbmNsdWRlIDx3dGYvSGFzaENvdW50ZWRTZXQuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBTZWN1cml0eU9yaWdpbjsKLX0KLQot
bmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwOwotCi1jbGFzcyBTdG9y
YWdlQXJlYUltcGwgZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZUFyZWEgewotcHVibGlj
OgotICAgIHN0YXRpYyBSZWY8U3RvcmFnZUFyZWFJbXBsPiBjcmVhdGUoUmVmPFN0b3JhZ2VBcmVh
TWFwPiYmKTsKLSAgICB2aXJ0dWFsIH5TdG9yYWdlQXJlYUltcGwoKTsKLQotICAgIHVpbnQ2NF90
IHN0b3JhZ2VBcmVhSUQoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VBcmVhSUQ7IH0KLQotcHJp
dmF0ZToKLSAgICBTdG9yYWdlQXJlYUltcGwoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKLQotICAg
IC8vIFdlYkNvcmU6OlN0b3JhZ2VBcmVhLgotICAgIHVuc2lnbmVkIGxlbmd0aCgpIG92ZXJyaWRl
OwotICAgIFN0cmluZyBrZXkodW5zaWduZWQgaW5kZXgpIG92ZXJyaWRlOwotICAgIFN0cmluZyBp
dGVtKGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldEl0ZW0oV2ViQ29y
ZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRpb24pIG92ZXJyaWRlOwotICAgIHZvaWQgcmVtb3ZlSXRl
bShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlk
ZTsKLSAgICB2b2lkIGNsZWFyKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSkgb3ZlcnJpZGU7
Ci0gICAgYm9vbCBjb250YWlucyhjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0gICAgYm9v
bCBjYW5BY2Nlc3NTdG9yYWdlKFdlYkNvcmU6OkZyYW1lKikgb3ZlcnJpZGU7Ci0gICAgV2ViQ29y
ZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICBzaXplX3Qg
bWVtb3J5Qnl0ZXNVc2VkQnlDYWNoZSgpIG92ZXJyaWRlOwotICAgIHZvaWQgaW5jcmVtZW50QWNj
ZXNzQ291bnQoKSBvdmVycmlkZTsKLSAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkgb3ZlcnJpZGU7Ci0gICAgV2Vi
Q29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luKCkgY29uc3Qgb3ZlcnJpZGU7
Ci0KLSAgICB1aW50NjRfdCBtX3N0b3JhZ2VBcmVhSUQ7Ci0gICAgUmVmPFN0b3JhZ2VBcmVhTWFw
PiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRp
ZiAvLyBTdG9yYWdlQXJlYUltcGxfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9j
ZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCBhMjY1MGQxYjNlYmZjNzI4YzI3NWVlMDEwYmZlYTNhMjY4YjBiODg2Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VB
cmVhTWFwLmgiCi0KLSNpbmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKLSNpbmNsdWRlICJTdG9y
YWdlQXJlYU1hcE1lc3NhZ2VzLmgiCi0jaW5jbHVkZSAiU3RvcmFnZU1hbmFnZXJNZXNzYWdlcy5o
IgotI2luY2x1ZGUgIlN0b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCi0jaW5jbHVkZSAiV2ViUGFnZS5o
IgotI2luY2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCi0jaW5jbHVkZSAiV2ViUHJvY2Vzcy5o
IgotI2luY2x1ZGUgPFdlYkNvcmUvRE9NV2luZG93Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9Eb2N1
bWVudC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvTWFpbkZyYW1lLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9QYWdlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZS5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oPgotI2luY2x1ZGUgPFdl
YkNvcmUvU3RvcmFnZU1hcC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZVR5cGUuaD4KLQot
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdGF0aWMg
dWludDY0X3QgZ2VuZXJhdGVTdG9yYWdlTWFwSUQoKQotewotICAgIHN0YXRpYyB1aW50NjRfdCBz
dG9yYWdlTWFwSUQ7Ci0gICAgcmV0dXJuICsrc3RvcmFnZU1hcElEOwotfQotCi1SZWY8U3RvcmFn
ZUFyZWFNYXA+IFN0b3JhZ2VBcmVhTWFwOjpjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0
b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9y
aWdpbikKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYU1hcChzdG9yYWdl
TmFtZXNwYWNlLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkpOwotfQotCi1TdG9yYWdlQXJlYU1h
cDo6U3RvcmFnZUFyZWFNYXAoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2Us
IFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKLSAgICA6IG1f
c3RvcmFnZU5hbWVzcGFjZSgqc3RvcmFnZU5hbWVzcGFjZSkKLSAgICAsIG1fc3RvcmFnZU1hcElE
KGdlbmVyYXRlU3RvcmFnZU1hcElEKCkpCi0gICAgLCBtX3N0b3JhZ2VUeXBlKHN0b3JhZ2VOYW1l
c3BhY2UtPnN0b3JhZ2VUeXBlKCkpCi0gICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdl
TmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSkKLSAgICAsIG1fcXVvdGFJbkJ5dGVzKHN0
b3JhZ2VOYW1lc3BhY2UtPnF1b3RhSW5CeXRlcygpKQotICAgICwgbV9zZWN1cml0eU9yaWdpbihX
VEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkKLSAgICAsIG1fY3VycmVudFNlZWQoMCkKLSAgICAsIG1f
aGFzUGVuZGluZ0NsZWFyKGZhbHNlKQotICAgICwgbV9oYXNQZW5kaW5nR2V0VmFsdWVzKGZhbHNl
KQotewotICAgIHN3aXRjaCAobV9zdG9yYWdlVHlwZSkgewotICAgIGNhc2UgU3RvcmFnZVR5cGU6
OkxvY2FsOgotICAgIGNhc2UgU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2FsOgotICAgICAgICBp
ZiAoU2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2luID0gc3RvcmFnZU5hbWVzcGFjZS0+dG9w
TGV2ZWxPcmlnaW4oKSkKLSAgICAgICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVu
dFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVh
dGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0b3JhZ2VOYW1lc3Bh
Y2UtPnN0b3JhZ2VOYW1lc3BhY2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0
eU9yaWdpbigqdG9wTGV2ZWxPcmlnaW4pLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0
eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSksIDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5k
KE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlTG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFn
ZU1hcElELCBzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlP
cmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpLCAwKTsKLQot
ICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU3RvcmFnZVR5cGU6OlNlc3Npb246Ci0gICAgICAg
IFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQo
TWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVTZXNzaW9uU3RvcmFnZU1hcChtX3N0b3Jh
Z2VNYXBJRCwgc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5
T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKSwgMCk7Ci0g
ICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWw6Ci0g
ICAgICAgIC8vIFRoZSBVSSBwcm9jZXNzIGlzIG5vdCBpbnZvbHZlZCBmb3IgRXBoZW1lcmFsTG9j
YWwgc3RvcmFnZXMuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBXZWJQcm9jZXNzOjpz
aW5nbGV0b24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpt
ZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fc3RvcmFnZU1hcElELCAqdGhpcyk7Ci19Ci0KLVN0b3Jh
Z2VBcmVhTWFwOjp+U3RvcmFnZUFyZWFNYXAoKQotewotICAgIGlmIChtX3N0b3JhZ2VUeXBlICE9
IFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCkgewotICAgICAgICBXZWJQcm9jZXNzOjpzaW5n
bGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdl
TWFuYWdlcjo6RGVzdHJveVN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQpLCAwKTsKLSAgICAgICAg
V2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpT
dG9yYWdlQXJlYU1hcDo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3JhZ2VNYXBJRCk7Ci0g
ICAgfQotCi0gICAgbV9zdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFnZUFyZWFNYXAo
KnRoaXMpOwotfQotCi11bnNpZ25lZCBTdG9yYWdlQXJlYU1hcDo6bGVuZ3RoKCkKLXsKLSAgICBs
b2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgp
OwotfQotCi1TdHJpbmcgU3RvcmFnZUFyZWFNYXA6OmtleSh1bnNpZ25lZCBpbmRleCkKLXsKLSAg
ICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShp
bmRleCk7Ci19Ci0KLVN0cmluZyBTdG9yYWdlQXJlYU1hcDo6aXRlbShjb25zdCBTdHJpbmcmIGtl
eSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VN
YXAtPmdldEl0ZW0oa2V5KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6c2V0SXRlbShGcmFt
ZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQotewotICAg
IGxvYWRWYWx1ZXNJZk5lZWRlZCgpOwotCi0gICAgQVNTRVJUKG1fc3RvcmFnZU1hcC0+aGFzT25l
UmVmKCkpOwotCi0gICAgU3RyaW5nIG9sZFZhbHVlOwotICAgIHF1b3RhRXhjZXB0aW9uID0gZmFs
c2U7Ci0gICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90
YUV4Y2VwdGlvbik7Ci0gICAgaWYgKHF1b3RhRXhjZXB0aW9uKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBpZiAob2xkVmFsdWUgPT0gdmFsdWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcGVu
ZGluZ1ZhbHVlQ2hhbmdlcy5hZGQoa2V5KTsKLQotICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigp
LnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2Vy
OjpTZXRJdGVtKG1fc3RvcmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCksIG1f
Y3VycmVudFNlZWQsIGtleSwgdmFsdWUsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSks
IDApOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpyZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1l
KiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcm
IGtleSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLSAgICBBU1NFUlQobV9zdG9yYWdl
TWFwLT5oYXNPbmVSZWYoKSk7Ci0KLSAgICBTdHJpbmcgb2xkVmFsdWU7Ci0gICAgbV9zdG9yYWdl
TWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOwotCi0gICAgaWYgKG9sZFZhbHVlLmlzTnVs
bCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuYWRkKGtl
eSk7Ci0KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlv
bigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6UmVtb3ZlSXRlbShtX3N0b3JhZ2VN
YXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBrZXksIHNv
dXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOwotfQotCi12b2lkIFN0b3JhZ2VBcmVh
TWFwOjpjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCog
c291cmNlQXJlYSkKLXsKLSAgICByZXNldFZhbHVlcygpOwotCi0gICAgbV9oYXNQZW5kaW5nQ2xl
YXIgPSB0cnVlOwotICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3Rh
SW5CeXRlcyk7Ci0gICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5l
Y3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkNsZWFyKG1fc3RvcmFnZU1h
cElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQsIHNvdXJjZUZy
YW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOwotfQotCi1ib29sIFN0b3JhZ2VBcmVhTWFwOjpj
b250YWlucyhjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsK
LQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmNvbnRhaW5zKGtleSk7Ci19Ci0KLXZvaWQgU3Rv
cmFnZUFyZWFNYXA6OnJlc2V0VmFsdWVzKCkKLXsKLSAgICBtX3N0b3JhZ2VNYXAgPSBudWxscHRy
OwotCi0gICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNsZWFyKCk7Ci0gICAgbV9oYXNQZW5kaW5n
Q2xlYXIgPSBmYWxzZTsKLSAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBmYWxzZTsKLSAgICBt
X2N1cnJlbnRTZWVkKys7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmxvYWRWYWx1ZXNJZk5l
ZWRlZCgpCi17Ci0gICAgaWYgKG1fc3RvcmFnZU1hcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzOwotICAgIC8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCB1c2UgYSBzcGVjaWFsIHNlbmRTeW5jIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBkb24ndCB3
YW50IHRvIHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgd2hpbGUgd2FpdGluZyBmb3IgYSByZXBs
eS4KLSAgICAvLyAoVGhpcyBmbGFnIGRvZXMgbm90IHlldCBleGlzdCkuIFNpbmNlIGxvYWRWYWx1
ZXNJZk5lZWRlZCgpIGVuZHMgdXAgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIEphdmFTY3JpcHQg
Y29kZSwgcHJvY2Vzc2luZyBpbmNvbWluZyBzeW5jaHJvbm91cyBtZXNzYWdlcwotICAgIC8vIGNv
dWxkIGxlYWQgdG8gd2VpcmQgcmVlbnRyZW5jeSBidWdzIG90aGVyd2lzZS4KLSAgICBXZWJQcm9j
ZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kU3luYyhNZXNz
YWdlczo6U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVlcyhtX3N0b3JhZ2VNYXBJRCwgbV9jdXJyZW50
U2VlZCksIE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6R2V0VmFsdWVzOjpSZXBseSh2YWx1ZXMp
LCAwKTsKLQotICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5C
eXRlcyk7Ci0gICAgbV9zdG9yYWdlTWFwLT5pbXBvcnRJdGVtcyh2YWx1ZXMpOwotCi0gICAgLy8g
V2Ugd2FudCB0byBpZ25vcmUgYWxsIGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRoZSBEaWRHZXRWYWx1
ZXMgbWVzc2FnZS4KLSAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSB0cnVlOwotfQotCi12b2lk
IFN0b3JhZ2VBcmVhTWFwOjpkaWRHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCi17
Ci0gICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIEFTU0VSVChtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpOwotICAgIG1faGFzUGVuZGlu
Z0dldFZhbHVlcyA9IGZhbHNlOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRTZXRJdGVt
KHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgYm9vbCBxdW90YUVy
cm9yKQotewotICAgIGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtl
eSkpOwotCi0gICAgaWYgKHF1b3RhRXJyb3IpIHsKLSAgICAgICAgcmVzZXRWYWx1ZXMoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUo
a2V5KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBz
dG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgaWYgKG1fY3VycmVudFNl
ZWQgIT0gc3RvcmFnZU1hcFNlZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX3Bl
bmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSk7Ci0gICAgbV9wZW5kaW5nVmFsdWVDaGFu
Z2VzLnJlbW92ZShrZXkpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRDbGVhcih1aW50
NjRfdCBzdG9yYWdlTWFwU2VlZCkKLXsKLSAgICBpZiAobV9jdXJyZW50U2VlZCAhPSBzdG9yYWdl
TWFwU2VlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKG1faGFzUGVuZGluZ0NsZWFy
KTsKLSAgICBtX2hhc1BlbmRpbmdDbGVhciA9IGZhbHNlOwotfQotCi1ib29sIFN0b3JhZ2VBcmVh
TWFwOjpzaG91bGRBcHBseUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtleSkgY29uc3QKLXsK
LSAgICAvLyBXZSBoYXZlIG5vdCB5ZXQgbG9hZGVkIGFueXRoaW5nIGZyb20gdGhpcyBzdG9yYWdl
IG1hcC4KLSAgICBpZiAoIW1fc3RvcmFnZU1hcCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gQ2hlY2sgaWYgdGhpcyBzdG9yYWdlIGFyZWEgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9y
IHRoZSBzdG9yYWdlIG1hbmFnZXIgdG8gdXBkYXRlIHRoZSBnaXZlbiBrZXkuCi0gICAgLy8gSWYg
dGhhdCBpcyB0aGUgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyBtYWRl
IGJ5IG90aGVyIHN0b3JhZ2UgYXJlYXMsIHNpbmNlCi0gICAgLy8gb3VyIGNoYW5nZSB3YXMgbWFk
ZSBsYXN0LgotICAgIGlmIChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFn
ZUFyZWFNYXA6OmFwcGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5l
d1ZhbHVlKQotewotICAgIEFTU0VSVCghbV9zdG9yYWdlTWFwIHx8IG1fc3RvcmFnZU1hcC0+aGFz
T25lUmVmKCkpOwotCi0gICAgLy8gVGhlcmUncyBhIGNsZWFyIHBlbmRpbmcgb3IgZ2V0VmFsdWVz
IHBlbmRpbmcgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyB1bnRpbCB3ZSBnZXQg
dGhlIGNvcnJlc3BvbmRpbmcgRGlkQ2xlYXIvRGlkR2V0VmFsdWVzIG1lc3NhZ2VzLgotICAgIGlm
IChtX2hhc1BlbmRpbmdDbGVhciB8fCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGlmICgha2V5KSB7Ci0gICAgICAgIC8vIEEgbnVsbCBrZXkgbWVhbnMgY2xl
YXIuCi0gICAgICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1
b3RhSW5CeXRlcyk7Ci0KLSAgICAgICAgLy8gQW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgbG9j
YWxseSBhZnRlciB0aGUgY2xlYXIgbXVzdCBzdGlsbCBiZSBrZXB0IGFyb3VuZCBpbiB0aGUgbmV3
IG1hcC4KLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmJlZ2lu
KCkua2V5cygpLCBlbmQgPSBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuZW5kKCkua2V5cygpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZyYga2V5ID0gKml0OwotCi0g
ICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsKLSAg
ICAgICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNoYW5nZSBt
dXN0IGhhdmUgYmVlbiBhIHBlbmRpbmcgcmVtb3ZlLCBpZ25vcmUgaXQuCi0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1
ZTsKLSAgICAgICAgICAgIG5ld1N0b3JhZ2VNYXAtPnNldEl0ZW1JZ25vcmluZ1F1b3RhKGtleSwg
b2xkVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShu
ZXdTdG9yYWdlTWFwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghc2hvdWxk
QXBwbHlDaGFuZ2VGb3JLZXkoa2V5KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFuZXdW
YWx1ZSkgewotICAgICAgICAvLyBBIG51bGwgbmV3IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGl0ZW0g
c2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICAgICAgbV9z
dG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgbV9zdG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90YShrZXksIG5ld1Zh
bHVlKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTdG9yYWdlRXZlbnQodWlu
dDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3Ry
aW5nKQotewotICAgIGlmICghc291cmNlU3RvcmFnZUFyZWFJRCkgewotICAgICAgICAvLyBUaGlz
IHN0b3JhZ2UgZXZlbnQgb3JpZ2luYXRlcyBmcm9tIGFub3RoZXIgcHJvY2VzcyBzbyB3ZSBuZWVk
IHRvIGFwcGx5IHRoZSBjaGFuZ2UgdG8gb3VyIHN0b3JhZ2UgYXJlYSBtYXAuCi0gICAgICAgIGFw
cGx5Q2hhbmdlKGtleSwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIGlmIChzdG9yYWdlVHlwZSgp
ID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQotICAgICAgICBkaXNwYXRjaFNlc3Npb25TdG9yYWdl
RXZlbnQoc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0
cmluZyk7Ci0gICAgZWxzZQotICAgICAgICBkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHNvdXJj
ZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcpOwotfQot
Ci12b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhckNhY2hlKCkKLXsKLSAgICByZXNldFZhbHVlcygp
OwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQo
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0
cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJs
U3RyaW5nKQotewotICAgIEFTU0VSVChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNz
aW9uKTsKLQotICAgIC8vIE5hbWVzcGFjZSBJRHMgZm9yIHNlc3Npb24gc3RvcmFnZSBuYW1lc3Bh
Y2VzIGFyZSBlcXVpdmFsZW50IHRvIHdlYiBwYWdlIElEcwotICAgIC8vIHNvIHdlIGNhbiBnZXQg
dGhlIHJpZ2h0IHBhZ2UgaGVyZS4KLSAgICBXZWJQYWdlKiB3ZWJQYWdlID0gV2ViUHJvY2Vzczo6
c2luZ2xldG9uKCkud2ViUGFnZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0gICAgaWYgKCF3ZWJQ
YWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVz
OwotCi0gICAgUGFnZSogcGFnZSA9IHdlYlBhZ2UtPmNvcmVQYWdlKCk7Ci0gICAgZm9yIChGcmFt
ZSogZnJhbWUgPSAmcGFnZS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVl
KCkudHJhdmVyc2VOZXh0KCkpIHsKLSAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUt
PmRvY3VtZW50KCk7Ci0gICAgICAgIGlmICghZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCkuZXF1
YWwobV9zZWN1cml0eU9yaWdpbi5wdHIoKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5vcHRpb25hbFNl
c3Npb25TdG9yYWdlKCk7Ci0gICAgICAgIGlmICghc3RvcmFnZSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIFN0b3JhZ2VBcmVhSW1wbCYgc3RvcmFnZUFyZWEgPSBzdGF0aWNfY2Fz
dDxTdG9yYWdlQXJlYUltcGwmPihzdG9yYWdlLT5hcmVhKCkpOwotICAgICAgICBpZiAoc3RvcmFn
ZUFyZWEuc3RvcmFnZUFyZWFJRCgpID09IHNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKLSAgICAgICAg
ICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8g
YmUgZGlzcGF0Y2hlZC4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZnJhbWVzLmFwcGVuZChmcmFtZSk7Ci0gICAgfQotCi0gICAgU3RvcmFnZUV2ZW50RGlzcGF0
Y2hlcjo6ZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50c1RvRnJhbWVzKCpwYWdlLCBmcmFtZXMs
IGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcsIFNlY3VyaXR5T3JpZ2luRGF0YTo6
ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKTsKLX0KLQotdm9pZCBTdG9yYWdl
QXJlYU1hcDo6ZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3Qg
U3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgQVNTRVJU
KGlzTG9jYWxTdG9yYWdlKHN0b3JhZ2VUeXBlKCkpKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8RnJh
bWU+PiBmcmFtZXM7Ci0KLSAgICBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9ICpXZWJQcm9jZXNzOjpz
aW5nbGV0b24oKS53ZWJQYWdlR3JvdXAobV9zdG9yYWdlTmFtZXNwYWNlSUQpLT5jb3JlUGFnZUdy
b3VwKCk7Ci0gICAgY29uc3QgSGFzaFNldDxQYWdlKj4mIHBhZ2VzID0gcGFnZUdyb3VwLnBhZ2Vz
KCk7Ci0gICAgZm9yIChIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwYWdlcy5i
ZWdpbigpLCBlbmQgPSBwYWdlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGZv
ciAoRnJhbWUqIGZyYW1lID0gJigqaXQpLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJh
bWUtPnRyZWUoKS50cmF2ZXJzZU5leHQoKSkgewotICAgICAgICAgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIWRvY3VtZW50LT5zZWN1
cml0eU9yaWdpbigpLmVxdWFsKG1fc2VjdXJpdHlPcmlnaW4ucHRyKCkpKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQt
PmRvbVdpbmRvdygpLT5vcHRpb25hbExvY2FsU3RvcmFnZSgpOwotICAgICAgICAgICAgaWYgKCFz
dG9yYWdlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTdG9yYWdl
QXJlYUltcGwmIHN0b3JhZ2VBcmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFyZWFJbXBsJj4oc3Rv
cmFnZS0+YXJlYSgpKTsKLSAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS5zdG9yYWdlQXJlYUlE
KCkgPT0gc291cmNlU3RvcmFnZUFyZWFJRCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMg
dGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4K
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
ZnJhbWVzLmFwcGVuZChmcmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdG9yYWdlRXZl
bnREaXNwYXRjaGVyOjpkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50c1RvRnJhbWVzKHBhZ2VHcm91
cCwgZnJhbWVzLCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9y
aWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSk7Ci19Ci0KLX0g
Ly8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTQz
ZTgwNzdmMGRlNDU4YjEwNjk3ZDk5NmYxY2U2NmFiNzFjYzguLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3Jh
Z2UvU3RvcmFnZUFyZWFNYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2lmbmRlZiBTdG9yYWdlQXJlYU1hcF9oCi0jZGVmaW5lIFN0b3JhZ2VBcmVhTWFw
X2gKLQotI2luY2x1ZGUgIk1lc3NhZ2VSZWNlaXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU2Vj
dXJpdHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+Ci0jaW5jbHVk
ZSA8d3RmL0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaENvdW50ZWRTZXQuaD4KLSNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJpdHlPcmlnaW47Ci1jbGFzcyBTdG9yYWdlTWFwOwot
fQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgU3RvcmFnZUFyZWFJbXBsOwotY2xhc3Mg
U3RvcmFnZU5hbWVzcGFjZUltcGw7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwIDogcHVibGljIFJl
ZkNvdW50ZWQ8U3RvcmFnZUFyZWFNYXA+LCBwcml2YXRlIElQQzo6TWVzc2FnZVJlY2VpdmVyIHsK
LXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhTWFwPiBjcmVhdGUoU3RvcmFnZU5h
bWVzcGFjZUltcGwqLCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYpOwotICAgIH5TdG9y
YWdlQXJlYU1hcCgpOwotCi0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBj
b25zdCB7IHJldHVybiBtX3N0b3JhZ2VUeXBlOyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKTsK
LSAgICBTdHJpbmcga2V5KHVuc2lnbmVkIGluZGV4KTsKLSAgICBTdHJpbmcgaXRlbShjb25zdCBT
dHJpbmcmIGtleSk7Ci0gICAgdm9pZCBzZXRJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFt
ZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRpb24pOwotICAgIHZvaWQgcmVtb3ZlSXRl
bShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJl
YSwgY29uc3QgU3RyaW5nJiBrZXkpOwotICAgIHZvaWQgY2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNv
dXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEpOwotICAgIGJvb2wgY29udGFp
bnMoY29uc3QgU3RyaW5nJiBrZXkpOwotCi0gICAgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmln
aW4mIHNlY3VyaXR5T3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbi5nZXQo
KTsgfQotCi1wcml2YXRlOgotICAgIFN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBs
KiwgUmVmPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiYmKTsKLQotICAgIC8vIElQQzo6TWVzc2Fn
ZVJlY2VpdmVyCi0gICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJ
UEM6OkRlY29kZXImKSBvdmVycmlkZTsKLQotICAgIHZvaWQgZGlkR2V0VmFsdWVzKHVpbnQ2NF90
IHN0b3JhZ2VNYXBTZWVkKTsKLSAgICB2b2lkIGRpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1h
cFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBib29sIHF1b3RhRXJyb3IpOwotICAgIHZvaWQgZGlk
UmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkpOwot
ICAgIHZvaWQgZGlkQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpOwotCi0gICAgdm9pZCBk
aXNwYXRjaFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBT
dHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1
ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotICAgIHZvaWQgY2xlYXJDYWNoZSgpOwotCi0g
ICAgdm9pZCByZXNldFZhbHVlcygpOwotICAgIHZvaWQgbG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0K
LSAgICBib29sIHNob3VsZEFwcGx5Q2hhbmdlRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBjb25z
dDsKLSAgICB2b2lkIGFwcGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcm
IG5ld1ZhbHVlKTsKLQotICAgIHZvaWQgZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2
NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcm
IG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmlu
Zyk7Ci0gICAgdm9pZCBkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBj
b25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0KLSAgICBS
ZWY8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG1fc3RvcmFnZU5hbWVzcGFjZTsKLQotICAgIHVpbnQ2
NF90IG1fc3RvcmFnZU1hcElEOwotCi0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdl
VHlwZTsKLSAgICB1aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKLSAgICB1bnNpZ25lZCBt
X3F1b3RhSW5CeXRlczsKLSAgICBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fc2VjdXJp
dHlPcmlnaW47Ci0KLSAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFw
OwotCi0gICAgdWludDY0X3QgbV9jdXJyZW50U2VlZDsKLSAgICBib29sIG1faGFzUGVuZGluZ0Ns
ZWFyOwotICAgIGJvb2wgbV9oYXNQZW5kaW5nR2V0VmFsdWVzOwotICAgIEhhc2hDb3VudGVkU2V0
PFN0cmluZz4gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0Ci0KLSNlbmRpZiAvLyBTdG9yYWdlQXJlYU1hcF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbiBiL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU5MDRmMTZiZWMxNDJiMTBiNDgwMGQxMDY0
NTAwOTMzODMwMGQ1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3Nh
Z2VzLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIw
MTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jCi0jIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycgQU5ECi0jIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0jIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IKLSMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIyBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUgotIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotCi1tZXNzYWdlcyAtPiBTdG9yYWdlQXJlYU1hcCB7Ci0gICAg
RGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQotICAgIERpZFNldEl0ZW0odWlu
dDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXksIGJvb2wgcXVvdGFFeGNlcHRpb24pCi0g
ICAgRGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtleSkKLSAg
ICBEaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKLQotICAgIERpc3BhdGNoU3RvcmFn
ZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmluZyBrZXksIFN0cmluZyBv
bGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlLCBTdHJpbmcgdXJsU3RyaW5nKQotICAgIENsZWFyQ2Fj
aGUoKQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3Rv
cmFnZU5hbWVzcGFjZUltcGwuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2Uv
U3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAy
YWJiYzVjMjFjMTgxMDg4ZmY1ODYwNDVmMDI3MTllMDI0MjY4NzI1Li4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9T
dG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0
OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
U3RvcmFnZU5hbWVzcGFjZUltcGwuaCIKLQotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgot
I2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCi0jaW5jbHVkZSAiV2ViUGFnZS5oIgotI2luY2x1
ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCi0jaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgotI2luY2x1
ZGUgPFdlYkNvcmUvRnJhbWUuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BhZ2VHcm91cC5oPgotI2lu
Y2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NldHRp
bmdzLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlVHlwZS5oPgotCi11c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVJlZlB0cjxTdG9yYWdlTmFtZXNw
YWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpTZXNz
aW9uLCBpZGVudGlmaWVyLCBudWxscHRyLCBxdW90YUluQnl0ZXMpKTsKLX0KLQotUmVmUHRyPFN0
b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlRXBoZW1lcmFs
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3Rh
SW5CeXRlcykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBs
KFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCwgaWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJ
bkJ5dGVzKSk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVz
cGFjZUltcGw6OmNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVy
LCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9y
YWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6TG9jYWwsIGlkZW50aWZpZXIsIG51bGxwdHIs
IHF1b3RhSW5CeXRlcykpOwotfQotCi1SZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3Jh
Z2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWlu
dDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2lu
LCB1aW50NjRfdCBxdW90YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9y
YWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6VHJhbnNpZW50TG9jYWwsIGlkZW50aWZpZXIs
ICZ0b3BMZXZlbE9yaWdpbiwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0KLVN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpTdG9yYWdlTmFtZXNwYWNlSW1wbChXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlw
ZSwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiog
dG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLSAgICA6IG1fc3RvcmFnZVR5
cGUoc3RvcmFnZVR5cGUpCi0gICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNw
YWNlSUQpCi0gICAgLCBtX3RvcExldmVsT3JpZ2luKHRvcExldmVsT3JpZ2luKQotICAgICwgbV9x
dW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQotewotfQotCi1TdG9yYWdlTmFtZXNwYWNlSW1wbDo6
flN0b3JhZ2VOYW1lc3BhY2VJbXBsKCkKLXsKLX0KLQotdm9pZCBTdG9yYWdlTmFtZXNwYWNlSW1w
bDo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VBcmVhTWFwJiBtYXApCi17Ci0gICAg
bV9zdG9yYWdlQXJlYU1hcHMucmVtb3ZlKFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5
T3JpZ2luKG1hcC5zZWN1cml0eU9yaWdpbigpKSk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdlQXJlYT4g
U3RvcmFnZU5hbWVzcGFjZUltcGw6OnN0b3JhZ2VBcmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0
YSYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgaWYgKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5
cGU6OkVwaGVtZXJhbExvY2FsKQotICAgICAgICByZXR1cm4gZXBoZW1lcmFsTG9jYWxTdG9yYWdl
QXJlYShzZWN1cml0eU9yaWdpbik7Ci0KLSAgICBSZWZQdHI8U3RvcmFnZUFyZWFNYXA+IG1hcDsK
LQotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhTWFwcy5hZGQoc2VjdXJpdHlPcmlnaW4s
IG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAoIXNsb3QpIHsKLSAgICAgICAgbWFw
ID0gU3RvcmFnZUFyZWFNYXA6OmNyZWF0ZSh0aGlzLCBzZWN1cml0eU9yaWdpbi5zZWN1cml0eU9y
aWdpbigpKTsKLSAgICAgICAgc2xvdCA9IG1hcC5nZXQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAg
bWFwID0gc2xvdDsKLQotICAgIHJldHVybiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShtYXAucmVs
ZWFzZU5vbk51bGwoKSk7Ci19Ci0KLWNsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVy
YWxTdG9yYWdlQXJlYSBmaW5hbCA6IHB1YmxpYyBTdG9yYWdlQXJlYSB7Ci1wdWJsaWM6Ci0gICAg
c3RhdGljIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4gY3JlYXRlKGNvbnN0IFNlY3VyaXR5T3Jp
Z2luRGF0YSYgb3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi0gICAgewotICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYShvcmlnaW4sIHF1b3RhSW5C
eXRlcykpOwotICAgIH0KLQotICAgIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4gY29weSgpCi0g
ICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYSgq
dGhpcykpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBFcGhlbWVyYWxTdG9yYWdlQXJlYShjb25z
dCBTZWN1cml0eU9yaWdpbkRhdGEmIG9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotICAg
ICAgICA6IG1fc2VjdXJpdHlPcmlnaW5EYXRhKG9yaWdpbikKLSAgICAgICAgLCBtX3N0b3JhZ2VN
YXAoU3RvcmFnZU1hcDo6Y3JlYXRlKHF1b3RhSW5CeXRlcykpCi0gICAgewotICAgIH0KLQotICAg
IEVwaGVtZXJhbFN0b3JhZ2VBcmVhKEVwaGVtZXJhbFN0b3JhZ2VBcmVhJiBvdGhlcikKLSAgICAg
ICAgOiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvdGhlci5tX3NlY3VyaXR5T3JpZ2luRGF0YSkKLSAg
ICAgICAgLCBtX3N0b3JhZ2VNYXAob3RoZXIubV9zdG9yYWdlTWFwKQotICAgIHsKLSAgICB9Ci0K
LSAgICAvLyBXZWJDb3JlOjpTdG9yYWdlQXJlYS4KLSAgICB1bnNpZ25lZCBsZW5ndGgoKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+bGVuZ3RoKCk7Ci0gICAgfQotCi0gICAg
U3RyaW5nIGtleSh1bnNpZ25lZCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3N0b3Jh
Z2VNYXAtPmtleShpbmRleCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5n
JiBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7
Ci0gICAgfQotCi0gICAgdm9pZCBzZXRJdGVtKEZyYW1lKiwgY29uc3QgU3RyaW5nJiBrZXksIGNv
bnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAg
U3RyaW5nIG9sZFZhbHVlOwotICAgICAgICBpZiAoYXV0byBuZXdNYXAgPSBtX3N0b3JhZ2VNYXAt
PnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKSkKLSAgICAgICAg
ICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3TWFwKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJl
bW92ZUl0ZW0oRnJhbWUqLCBjb25zdCBTdHJpbmcmIGtleSkKLSAgICB7Ci0gICAgICAgIFN0cmlu
ZyBvbGRWYWx1ZTsKLSAgICAgICAgaWYgKGF1dG8gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5yZW1v
dmVJdGVtKGtleSwgb2xkVmFsdWUpKQotICAgICAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92
ZShuZXdNYXApOwotICAgIH0KLQotICAgIHZvaWQgY2xlYXIoRnJhbWUqKQotICAgIHsKLSAgICAg
ICAgaWYgKCFtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3N0b3JhZ2VNYXAtPnF1
b3RhKCkpOwotICAgIH0KLQotICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCi0g
ICAgewotICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5jb250YWlucyhrZXkpOwotICAgIH0K
LQotICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAg
ICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2UoKTsKLSAgICB9Ci0KLSAgICBTdG9yYWdlVHlw
ZSBzdG9yYWdlVHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gU3RvcmFnZVR5cGU6
OkVwaGVtZXJhbExvY2FsOwotICAgIH0KLQotICAgIHNpemVfdCBtZW1vcnlCeXRlc1VzZWRCeUNh
Y2hlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVt
ZW50QWNjZXNzQ291bnQoKSB7IH0KLSAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgeyB9
Ci0gICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkgeyB9Ci0KLSAgICBTZWN1cml0eU9yaWdp
bkRhdGEgc2VjdXJpdHlPcmlnaW4oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc2Vj
dXJpdHlPcmlnaW5EYXRhOwotICAgIH0KLQotICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3Vy
aXR5T3JpZ2luRGF0YTsKLSAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwotfTsK
LQotUmVmUHRyPFN0b3JhZ2VBcmVhPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZXBoZW1lcmFsTG9j
YWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQot
ewotICAgIGF1dG8mIHNsb3QgPSBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzLmFkZChzZWN1
cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOwotICAgIGlmICghc2xvdCkKLSAg
ICAgICAgc2xvdCA9IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYTo6
Y3JlYXRlKHNlY3VyaXR5T3JpZ2luLCBtX3F1b3RhSW5CeXRlcyk7Ci0KLSAgICByZXR1cm4gc2xv
dC5nZXQoKTsKLX0KLQotUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpjb3B5KFBhZ2UqIG5ld1BhZ2UpCi17Ci0gICAgQVNTRVJUKG1fc3RvcmFnZU5hbWVzcGFj
ZUlEKTsKLQotICAgIGlmIChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQot
ICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJv
bUNvcmVQYWdlKG5ld1BhZ2UpLT5wYWdlSUQoKSwgbV9xdW90YUluQnl0ZXMpOwotCi0gICAgQVNT
RVJUKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsKTsKLSAgICBS
ZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG5ld05hbWVzcGFjZSA9IGFkb3B0UmVmKG5ldyBT
dG9yYWdlTmFtZXNwYWNlSW1wbChtX3N0b3JhZ2VUeXBlLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRCwg
bV90b3BMZXZlbE9yaWdpbi5nZXQoKSwgbV9xdW90YUluQnl0ZXMpKTsKLQotICAgIGZvciAoYXV0
byYgaXRlciA6IG1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXMpCi0gICAgICAgIG5ld05hbWVz
cGFjZS0+bV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhcy5zZXQoaXRlci5rZXksIGl0ZXIudmFs
dWUtPmNvcHkoKSk7Ci0KLSAgICByZXR1cm4gbmV3TmFtZXNwYWNlOwotfQotCi19IC8vIG5hbWVz
cGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFn
ZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBm
MTNhMjJkY2JkMjFiNjc0MGU0NTIzN2Y0ZGZhZDgzMTI1NjcyOWUzLi4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9T
dG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFdlYkNvcmUv
U2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhh
c2guaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9TdG9yYWdlTWFwLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTmFtZXNwYWNlLmg+Ci0j
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0
b3JhZ2VBcmVhTWFwOwotY2xhc3MgV2ViUGFnZTsKLQotY2xhc3MgU3RvcmFnZU5hbWVzcGFjZUlt
cGwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZSB7Ci1wdWJsaWM6Ci0gICAgc3Rh
dGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBz
dGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVFcGhlbWVyYWxMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVz
KTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVMb2NhbFN0
b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVz
KTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVUcmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpOwotCi0g
ICAgdmlydHVhbCB+U3RvcmFnZU5hbWVzcGFjZUltcGwoKTsKLQotICAgIFdlYkNvcmU6OlN0b3Jh
Z2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlVHlwZTsgfQotICAg
IHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZU5h
bWVzcGFjZUlEOyB9Ci0gICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2lu
KCkgY29uc3QgeyByZXR1cm4gbV90b3BMZXZlbE9yaWdpbi5nZXQoKTsgfQotICAgIHVuc2lnbmVk
IHF1b3RhSW5CeXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcXVvdGFJbkJ5dGVzOyB9Ci0KLSAgICB2
b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYU1hcChTdG9yYWdlQXJlYU1hcCYpOwotCi1wcml2YXRl
OgotICAgIGV4cGxpY2l0IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFdlYkNvcmU6OlN0b3JhZ2VUeXBl
LCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luKiB0
b3BMZXZlbE9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLQotICAgIFJlZlB0cjxXZWJD
b3JlOjpTdG9yYWdlQXJlYT4gc3RvcmFnZUFyZWEoY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmln
aW5EYXRhJikgb3ZlcnJpZGU7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+
IGNvcHkoV2ViQ29yZTo6UGFnZSopIG92ZXJyaWRlOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OlN0
b3JhZ2VBcmVhPiBlcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhKGNvbnN0IFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YSYpOwotCi0gICAgY29uc3QgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9zdG9y
YWdlVHlwZTsKLSAgICBjb25zdCB1aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKLQotICAg
IC8vIE9ubHkgdXNlZCBmb3IgdHJhbnNpZW50IGxvY2FsIHN0b3JhZ2UgbmFtZXNwYWNlcy4KLSAg
ICBjb25zdCBSZWZQdHI8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fdG9wTGV2ZWxPcmlnaW47
Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKLQotICAgIEhhc2hNYXA8V2Vi
Q29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYU1hcCo+IG1fc3RvcmFnZUFyZWFN
YXBzOwotCi0gICAgY2xhc3MgRXBoZW1lcmFsU3RvcmFnZUFyZWE7Ci0gICAgSGFzaE1hcDxXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGEsIFJlZlB0cjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4+IG1f
ZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9X
ZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBhMzc1OGViODc0Mjg4ZmZkODk2NjJkMDI1ZTE1OGQ2NmEwNzBjNTcwLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAKKysrIC9kZXYvbnVs
bApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgiCi0KLSNpbmNsdWRlICJT
dG9yYWdlTmFtZXNwYWNlSW1wbC5oIgotI2luY2x1ZGUgIldlYlBhZ2UuaCIKLSNpbmNsdWRlIDx3
dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ryb3llZC5oPgotCi11c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLXN0YXRpYyBIYXNoTWFw
PHVpbnQ2NF90LCBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIqPiYgc3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVycygpCi17Ci0gICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEhhc2hNYXA8dWludDY0
X3QsIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcio+PiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXJzOwotCi0gICAgcmV0dXJuIHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnM7Ci19Ci0KLVJlZlB0
cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRl
cjo6Z2V0T3JDcmVhdGUodWludDY0X3QgaWRlbnRpZmllcikKLXsKLSAgICBhdXRvJiBzbG90ID0g
c3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpLmFkZChpZGVudGlmaWVyLCBudWxscHRyKS5pdGVy
YXRvci0+dmFsdWU7Ci0gICAgaWYgKHNsb3QpCi0gICAgICAgIHJldHVybiBzbG90OwotCi0gICAg
UmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcj4gc3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyID0gYWRvcHRSZWYobmV3IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcihpZGVudGlmaWVy
KSk7Ci0gICAgc2xvdCA9IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5nZXQoKTsKLQotICAgIHJl
dHVybiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI7Ci19Ci0KLVdlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcjo6V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIp
Ci0gICAgOiBtX2lkZW50aWZpZXIoaWRlbnRpZmllcikKLXsKLX0KLQotV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyOjp+V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCkKLXsKLSAgICBBU1NF
UlQoc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpLmNvbnRhaW5zKG1faWRlbnRpZmllcikpOwot
Ci0gICAgc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpLnJlbW92ZShtX2lkZW50aWZpZXIpOwot
fQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShQYWdlJiBwYWdlLCB1bnNp
Z25lZCBxdW90YSkKLXsKLSAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYlBhZ2U6OmZyb21Db3JlUGFnZSgmcGFnZSktPnBhZ2VJ
RCgpLCBxdW90YSk7Ci19Ci0KLVJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJT
dG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVz
cGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBxdW90YSkKLXsKLSAgICByZXR1cm4gU3RvcmFnZU5h
bWVzcGFjZUltcGw6OmNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJQYWdl
Ojpmcm9tQ29yZVBhZ2UoJnBhZ2UpLT5wYWdlSUQoKSwgcXVvdGEpOwotfQotCi1SZWZQdHI8V2Vi
Q29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVh
dGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGEpCi17Ci0gICAgcmV0dXJuIFN0
b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UobV9pZGVudGlm
aWVyLCBxdW90YSk7Ci19Ci0KLVJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJT
dG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZShXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiYgdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1
b3RhKQotewotICAgIHJldHVybiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKG1faWRlbnRpZmllciwgdG9wTGV2ZWxPcmlnaW4sIHF1b3Rh
KTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2Uv
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
U3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggYTRjMjE0MjRiZjI2ZTM0MTAxMDg4YmMwMjgyYjQzMTIyNmE2NDlhNi4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaAorKysgL2Rl
di9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgV2ViU3Rv
cmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKLSNkZWZpbmUgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyX2gKLQotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmg+Ci0K
LW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIg
ZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyIHsKLXB1Ymxp
YzoKLSAgICBzdGF0aWMgUmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcj4gZ2V0T3JD
cmVhdGUodWludDY0X3QgaWRlbnRpZmllcik7Ci0gICAgdmlydHVhbCB+V2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIpOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6
OlN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6
OlBhZ2UmLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0
b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJD
b3JlOjpQYWdlJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3Jl
OjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQg
cXVvdGEpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBj
cmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6U2VjdXJpdHlPcmln
aW4mLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7Ci0KLSAgICBjb25zdCB1aW50NjRfdCBtX2lk
ZW50aWZpZXI7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3Rv
cmFnZUFyZWFJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VBcmVhSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYmU4NTA3YTMxMzI2NDJkYmRjMGYxOGE2OTlk
MWU3Y2YzYmE0ODYxZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgi
CisKKyNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcC5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1l
bnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdl
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TY2hlbWVSZWdpc3RyeS5oPgorI2luY2x1ZGUgPFdlYkNv
cmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZXR0aW5ncy5oPgor
Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0YXRp
YyB1aW50NjRfdCBnZW5lcmF0ZVN0b3JhZ2VBcmVhSUQoKQoreworICAgIHN0YXRpYyB1aW50NjRf
dCBzdG9yYWdlQXJlYUlEOworICAgIHJldHVybiArK3N0b3JhZ2VBcmVhSUQ7Cit9CisKK1JlZjxT
dG9yYWdlQXJlYUltcGw+IFN0b3JhZ2VBcmVhSW1wbDo6Y3JlYXRlKFJlZjxTdG9yYWdlQXJlYU1h
cD4mJiBzdG9yYWdlQXJlYU1hcCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdl
QXJlYUltcGwoV1RGTW92ZShzdG9yYWdlQXJlYU1hcCkpKTsKK30KKworU3RvcmFnZUFyZWFJbXBs
OjpTdG9yYWdlQXJlYUltcGwoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmIHN0b3JhZ2VBcmVhTWFwKQor
ICAgIDogbV9zdG9yYWdlQXJlYUlEKGdlbmVyYXRlU3RvcmFnZUFyZWFJRCgpKQorICAgICwgbV9z
dG9yYWdlQXJlYU1hcChXVEZNb3ZlKHN0b3JhZ2VBcmVhTWFwKSkKK3sKK30KKworU3RvcmFnZUFy
ZWFJbXBsOjp+U3RvcmFnZUFyZWFJbXBsKCkKK3sKK30KKwordW5zaWduZWQgU3RvcmFnZUFyZWFJ
bXBsOjpsZW5ndGgoKQoreworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5sZW5ndGgoKTsK
K30KKworU3RyaW5nIFN0b3JhZ2VBcmVhSW1wbDo6a2V5KHVuc2lnbmVkIGluZGV4KQoreworICAg
IHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5rZXkoaW5kZXgpOworfQorCitTdHJpbmcgU3RvcmFn
ZUFyZWFJbXBsOjppdGVtKGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIHJldHVybiBtX3N0b3Jh
Z2VBcmVhTWFwLT5pdGVtKGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFJbXBsOjpzZXRJdGVt
KEZyYW1lKiBzb3VyY2VGcmFtZSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQoreworICAgIEFTU0VSVCghdmFsdWUuaXNOdWxsKCkp
OworCisgICAgbV9zdG9yYWdlQXJlYU1hcC0+c2V0SXRlbShzb3VyY2VGcmFtZSwgdGhpcywga2V5
LCB2YWx1ZSwgcXVvdGFFeGNlcHRpb24pOworfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6cmVt
b3ZlSXRlbShGcmFtZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIG1f
c3RvcmFnZUFyZWFNYXAtPnJlbW92ZUl0ZW0oc291cmNlRnJhbWUsIHRoaXMsIGtleSk7Cit9CisK
K3ZvaWQgU3RvcmFnZUFyZWFJbXBsOjpjbGVhcihGcmFtZSogc291cmNlRnJhbWUpCit7CisgICAg
bV9zdG9yYWdlQXJlYU1hcC0+Y2xlYXIoc291cmNlRnJhbWUsIHRoaXMpOworfQorCitib29sIFN0
b3JhZ2VBcmVhSW1wbDo6Y29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgcmV0dXJu
IG1fc3RvcmFnZUFyZWFNYXAtPmNvbnRhaW5zKGtleSk7Cit9CisKK2Jvb2wgU3RvcmFnZUFyZWFJ
bXBsOjpjYW5BY2Nlc3NTdG9yYWdlKEZyYW1lKiBmcmFtZSkKK3sKKyAgICByZXR1cm4gZnJhbWUg
JiYgZnJhbWUtPnBhZ2UoKTsKK30KKworU3RvcmFnZVR5cGUgU3RvcmFnZUFyZWFJbXBsOjpzdG9y
YWdlVHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAtPnN0b3JhZ2VU
eXBlKCk7Cit9CisKK3NpemVfdCBTdG9yYWdlQXJlYUltcGw6Om1lbW9yeUJ5dGVzVXNlZEJ5Q2Fj
aGUoKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6aW5jcmVt
ZW50QWNjZXNzQ291bnQoKQoreworICAgIC8vIFN0b3JhZ2UgYWNjZXNzIGlzIGhhbmRsZWQgaW4g
dGhlIFVJIHByb2Nlc3MsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlLgorfQorCit2b2lk
IFN0b3JhZ2VBcmVhSW1wbDo6ZGVjcmVtZW50QWNjZXNzQ291bnQoKQoreworICAgIC8vIFN0b3Jh
Z2UgYWNjZXNzIGlzIGhhbmRsZWQgaW4gdGhlIFVJIHByb2Nlc3MsIHNvIHRoZXJlJ3Mgbm90aGlu
ZyB0byBkbyBoZXJlLgorfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6Y2xvc2VEYXRhYmFzZUlm
SWRsZSgpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCB0aGlzLgorICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworfQorCitXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgU3RvcmFnZUFyZWFJ
bXBsOjpzZWN1cml0eU9yaWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc3RvcmFnZUFyZWFNYXAtPnNlY3Vy
aXR5T3JpZ2luKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZGRhNDdjOGQ4MzhlOGZiZGM1ZDQ3YmY3OGNmNzZlMTlhMDE5OGIzMgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVh
SW1wbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFN0b3JhZ2VBcmVh
SW1wbF9oCisjZGVmaW5lIFN0b3JhZ2VBcmVhSW1wbF9oCisKKyNpbmNsdWRlICJNZXNzYWdlUmVj
ZWl2ZXIuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hDb3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworY2xhc3MgU2VjdXJpdHlPcmlnaW47Cit9CisKK25hbWVzcGFjZSBXZWJLaXQg
eworCitjbGFzcyBTdG9yYWdlQXJlYU1hcDsKKworY2xhc3MgU3RvcmFnZUFyZWFJbXBsIGZpbmFs
IDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VBcmVhIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVm
PFN0b3JhZ2VBcmVhSW1wbD4gY3JlYXRlKFJlZjxTdG9yYWdlQXJlYU1hcD4mJik7CisgICAgdmly
dHVhbCB+U3RvcmFnZUFyZWFJbXBsKCk7CisKKyAgICB1aW50NjRfdCBzdG9yYWdlQXJlYUlEKCkg
Y29uc3QgeyByZXR1cm4gbV9zdG9yYWdlQXJlYUlEOyB9CisKK3ByaXZhdGU6CisgICAgU3RvcmFn
ZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJik7CisKKyAgICAvLyBXZWJDb3JlOjpTdG9y
YWdlQXJlYS4KKyAgICB1bnNpZ25lZCBsZW5ndGgoKSBvdmVycmlkZTsKKyAgICBTdHJpbmcga2V5
KHVuc2lnbmVkIGluZGV4KSBvdmVycmlkZTsKKyAgICBTdHJpbmcgaXRlbShjb25zdCBTdHJpbmcm
IGtleSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VG
cmFtZSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3Rh
RXhjZXB0aW9uKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbW92ZUl0ZW0oV2ViQ29yZTo6RnJhbWUq
IHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVh
cihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUpIG92ZXJyaWRlOworICAgIGJvb2wgY29udGFp
bnMoY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFn
ZShXZWJDb3JlOjpGcmFtZSopIG92ZXJyaWRlOworICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0
b3JhZ2VUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc2l6ZV90IG1lbW9yeUJ5dGVzVXNlZEJ5
Q2FjaGUoKSBvdmVycmlkZTsKKyAgICB2b2lkIGluY3JlbWVudEFjY2Vzc0NvdW50KCkgb3ZlcnJp
ZGU7CisgICAgdm9pZCBkZWNyZW1lbnRBY2Nlc3NDb3VudCgpIG92ZXJyaWRlOworICAgIHZvaWQg
Y2xvc2VEYXRhYmFzZUlmSWRsZSgpIG92ZXJyaWRlOworICAgIFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YSBzZWN1cml0eU9yaWdpbigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdWludDY0X3Qg
bV9zdG9yYWdlQXJlYUlEOworICAgIFJlZjxTdG9yYWdlQXJlYU1hcD4gbV9zdG9yYWdlQXJlYU1h
cDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gU3RvcmFnZUFyZWFJ
bXBsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VBcmVhTWFwLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VBcmVhTWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMjY1MGQxYjNlYmZjNzI4YzI3NWVlMDEwYmZl
YTNhMjY4YjBiODg2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCisK
KyNpbmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKKyNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcE1l
c3NhZ2VzLmgiCisjaW5jbHVkZSAiU3RvcmFnZU1hbmFnZXJNZXNzYWdlcy5oIgorI2luY2x1ZGUg
IlN0b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUg
IldlYlBhZ2VHcm91cFByb3h5LmgiCisjaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgorI2luY2x1ZGUg
PFdlYkNvcmUvRE9NV2luZG93Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9Eb2N1bWVudC5oPgorI2lu
Y2x1ZGUgPFdlYkNvcmUvTWFpbkZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdlLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5
T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZS5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFn
ZU1hcC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZVR5cGUuaD4KKwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgdWludDY0X3QgZ2Vu
ZXJhdGVTdG9yYWdlTWFwSUQoKQoreworICAgIHN0YXRpYyB1aW50NjRfdCBzdG9yYWdlTWFwSUQ7
CisgICAgcmV0dXJuICsrc3RvcmFnZU1hcElEOworfQorCitSZWY8U3RvcmFnZUFyZWFNYXA+IFN0
b3JhZ2VBcmVhTWFwOjpjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3Bh
Y2UsIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKK3sKKyAg
ICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYU1hcChzdG9yYWdlTmFtZXNwYWNlLCBX
VEZNb3ZlKHNlY3VyaXR5T3JpZ2luKSkpOworfQorCitTdG9yYWdlQXJlYU1hcDo6U3RvcmFnZUFy
ZWFNYXAoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKKyAgICA6IG1fc3RvcmFnZU5hbWVz
cGFjZSgqc3RvcmFnZU5hbWVzcGFjZSkKKyAgICAsIG1fc3RvcmFnZU1hcElEKGdlbmVyYXRlU3Rv
cmFnZU1hcElEKCkpCisgICAgLCBtX3N0b3JhZ2VUeXBlKHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3Jh
Z2VUeXBlKCkpCisgICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlLT5z
dG9yYWdlTmFtZXNwYWNlSUQoKSkKKyAgICAsIG1fcXVvdGFJbkJ5dGVzKHN0b3JhZ2VOYW1lc3Bh
Y2UtPnF1b3RhSW5CeXRlcygpKQorICAgICwgbV9zZWN1cml0eU9yaWdpbihXVEZNb3ZlKHNlY3Vy
aXR5T3JpZ2luKSkKKyAgICAsIG1fY3VycmVudFNlZWQoMCkKKyAgICAsIG1faGFzUGVuZGluZ0Ns
ZWFyKGZhbHNlKQorICAgICwgbV9oYXNQZW5kaW5nR2V0VmFsdWVzKGZhbHNlKQoreworICAgIHN3
aXRjaCAobV9zdG9yYWdlVHlwZSkgeworICAgIGNhc2UgU3RvcmFnZVR5cGU6OkxvY2FsOgorICAg
IGNhc2UgU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2FsOgorICAgICAgICBpZiAoU2VjdXJpdHlP
cmlnaW4qIHRvcExldmVsT3JpZ2luID0gc3RvcmFnZU5hbWVzcGFjZS0+dG9wTGV2ZWxPcmlnaW4o
KSkKKyAgICAgICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25u
ZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVUcmFuc2llbnRM
b2NhbFN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VO
YW1lc3BhY2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbigqdG9w
TGV2ZWxPcmlnaW4pLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3Nl
Y3VyaXR5T3JpZ2luKSksIDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBXZWJQcm9jZXNz
OjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpT
dG9yYWdlTWFuYWdlcjo6Q3JlYXRlTG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElELCBzdG9y
YWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpm
cm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpLCAwKTsKKworICAgICAgICBicmVh
azsKKworICAgIGNhc2UgU3RvcmFnZVR5cGU6OlNlc3Npb246CisgICAgICAgIFdlYlByb2Nlc3M6
OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0
b3JhZ2VNYW5hZ2VyOjpDcmVhdGVTZXNzaW9uU3RvcmFnZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3Rv
cmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6
ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKSwgMCk7CisgICAgICAgIGJyZWFr
OworCisgICAgY2FzZSBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWw6CisgICAgICAgIC8vIFRo
ZSBVSSBwcm9jZXNzIGlzIG5vdCBpbnZvbHZlZCBmb3IgRXBoZW1lcmFsTG9jYWwgc3RvcmFnZXMu
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5h
ZGRNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjptZXNzYWdlUmVjZWl2
ZXJOYW1lKCksIG1fc3RvcmFnZU1hcElELCAqdGhpcyk7Cit9CisKK1N0b3JhZ2VBcmVhTWFwOjp+
U3RvcmFnZUFyZWFNYXAoKQoreworICAgIGlmIChtX3N0b3JhZ2VUeXBlICE9IFN0b3JhZ2VUeXBl
OjpFcGhlbWVyYWxMb2NhbCkgeworICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJl
bnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6RGVz
dHJveVN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQpLCAwKTsKKyAgICAgICAgV2ViUHJvY2Vzczo6
c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1h
cDo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3JhZ2VNYXBJRCk7CisgICAgfQorCisgICAg
bV9zdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFnZUFyZWFNYXAoKnRoaXMpOworfQor
Cit1bnNpZ25lZCBTdG9yYWdlQXJlYU1hcDo6bGVuZ3RoKCkKK3sKKyAgICBsb2FkVmFsdWVzSWZO
ZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpOworfQorCitTdHJp
bmcgU3RvcmFnZUFyZWFNYXA6OmtleSh1bnNpZ25lZCBpbmRleCkKK3sKKyAgICBsb2FkVmFsdWVz
SWZOZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRleCk7Cit9CisK
K1N0cmluZyBTdG9yYWdlQXJlYU1hcDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBs
b2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0o
a2V5KTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6c2V0SXRlbShGcmFtZSogc291cmNlRnJh
bWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0
IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQoreworICAgIGxvYWRWYWx1ZXNJ
Zk5lZWRlZCgpOworCisgICAgQVNTRVJUKG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOworCisg
ICAgU3RyaW5nIG9sZFZhbHVlOworICAgIHF1b3RhRXhjZXB0aW9uID0gZmFsc2U7CisgICAgbV9z
dG9yYWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbik7
CisgICAgaWYgKHF1b3RhRXhjZXB0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAob2xk
VmFsdWUgPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcGVuZGluZ1ZhbHVlQ2hh
bmdlcy5hZGQoa2V5KTsKKworICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nl
c3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpTZXRJdGVtKG1f
c3RvcmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQs
IGtleSwgdmFsdWUsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOworfQorCit2
b2lkIFN0b3JhZ2VBcmVhTWFwOjpyZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFt
ZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAg
ICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKyAgICBBU1NFUlQobV9zdG9yYWdlTWFwLT5oYXNPbmVS
ZWYoKSk7CisKKyAgICBTdHJpbmcgb2xkVmFsdWU7CisgICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJ
dGVtKGtleSwgb2xkVmFsdWUpOworCisgICAgaWYgKG9sZFZhbHVlLmlzTnVsbCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuYWRkKGtleSk7CisKKyAgICBX
ZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1l
c3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6UmVtb3ZlSXRlbShtX3N0b3JhZ2VNYXBJRCwgc291cmNl
QXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBrZXksIHNvdXJjZUZyYW1lLT5k
b2N1bWVudCgpLT51cmwoKSksIDApOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhcihX
ZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSkK
K3sKKyAgICByZXNldFZhbHVlcygpOworCisgICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSB0cnVlOwor
ICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Cisg
ICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2Vu
ZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkNsZWFyKG1fc3RvcmFnZU1hcElELCBzb3VyY2VB
cmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQsIHNvdXJjZUZyYW1lLT5kb2N1bWVu
dCgpLT51cmwoKSksIDApOworfQorCitib29sIFN0b3JhZ2VBcmVhTWFwOjpjb250YWlucyhjb25z
dCBTdHJpbmcmIGtleSkKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIHJldHVy
biBtX3N0b3JhZ2VNYXAtPmNvbnRhaW5zKGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6
OnJlc2V0VmFsdWVzKCkKK3sKKyAgICBtX3N0b3JhZ2VNYXAgPSBudWxscHRyOworCisgICAgbV9w
ZW5kaW5nVmFsdWVDaGFuZ2VzLmNsZWFyKCk7CisgICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxz
ZTsKKyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRTZWVk
Kys7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmxvYWRWYWx1ZXNJZk5lZWRlZCgpCit7Cisg
ICAgaWYgKG1fc3RvcmFnZU1hcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSGFzaE1hcDxTdHJp
bmcsIFN0cmluZz4gdmFsdWVzOworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgYSBzcGVj
aWFsIHNlbmRTeW5jIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHByb2Nl
c3MgaW5jb21pbmcgbWVzc2FnZXMgd2hpbGUgd2FpdGluZyBmb3IgYSByZXBseS4KKyAgICAvLyAo
VGhpcyBmbGFnIGRvZXMgbm90IHlldCBleGlzdCkuIFNpbmNlIGxvYWRWYWx1ZXNJZk5lZWRlZCgp
IGVuZHMgdXAgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIEphdmFTY3JpcHQgY29kZSwgcHJvY2Vz
c2luZyBpbmNvbWluZyBzeW5jaHJvbm91cyBtZXNzYWdlcworICAgIC8vIGNvdWxkIGxlYWQgdG8g
d2VpcmQgcmVlbnRyZW5jeSBidWdzIG90aGVyd2lzZS4KKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0
b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kU3luYyhNZXNzYWdlczo6U3RvcmFn
ZU1hbmFnZXI6OkdldFZhbHVlcyhtX3N0b3JhZ2VNYXBJRCwgbV9jdXJyZW50U2VlZCksIE1lc3Nh
Z2VzOjpTdG9yYWdlTWFuYWdlcjo6R2V0VmFsdWVzOjpSZXBseSh2YWx1ZXMpLCAwKTsKKworICAg
IG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7CisgICAg
bV9zdG9yYWdlTWFwLT5pbXBvcnRJdGVtcyh2YWx1ZXMpOworCisgICAgLy8gV2Ugd2FudCB0byBp
Z25vcmUgYWxsIGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRoZSBEaWRHZXRWYWx1ZXMgbWVzc2FnZS4K
KyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSB0cnVlOworfQorCit2b2lkIFN0b3JhZ2VBcmVh
TWFwOjpkaWRHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCit7CisgICAgaWYgKG1f
Y3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEFT
U0VSVChtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpOworICAgIG1faGFzUGVuZGluZ0dldFZhbHVlcyA9
IGZhbHNlOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRTZXRJdGVtKHVpbnQ2NF90IHN0
b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgYm9vbCBxdW90YUVycm9yKQoreworICAg
IGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQorICAgICAgICByZXR1cm47CisK
KyAgICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpOworCisgICAg
aWYgKHF1b3RhRXJyb3IpIHsKKyAgICAgICAgcmVzZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUoa2V5KTsKK30KKwor
dm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFn
ZU1hcFNlZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX3BlbmRpbmdWYWx1ZUNo
YW5nZXMuY29udGFpbnMoa2V5KSk7CisgICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLnJlbW92ZShr
ZXkpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRDbGVhcih1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCkKK3sKKyAgICBpZiAobV9jdXJyZW50U2VlZCAhPSBzdG9yYWdlTWFwU2VlZCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1faGFzUGVuZGluZ0NsZWFyKTsKKyAgICBtX2hh
c1BlbmRpbmdDbGVhciA9IGZhbHNlOworfQorCitib29sIFN0b3JhZ2VBcmVhTWFwOjpzaG91bGRB
cHBseUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtleSkgY29uc3QKK3sKKyAgICAvLyBXZSBo
YXZlIG5vdCB5ZXQgbG9hZGVkIGFueXRoaW5nIGZyb20gdGhpcyBzdG9yYWdlIG1hcC4KKyAgICBp
ZiAoIW1fc3RvcmFnZU1hcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2sg
aWYgdGhpcyBzdG9yYWdlIGFyZWEgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZSBzdG9yYWdl
IG1hbmFnZXIgdG8gdXBkYXRlIHRoZSBnaXZlbiBrZXkuCisgICAgLy8gSWYgdGhhdCBpcyB0aGUg
Y2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyBtYWRlIGJ5IG90aGVyIHN0
b3JhZ2UgYXJlYXMsIHNpbmNlCisgICAgLy8gb3VyIGNoYW5nZSB3YXMgbWFkZSBsYXN0LgorICAg
IGlmIChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmFw
cGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKQorewor
ICAgIEFTU0VSVCghbV9zdG9yYWdlTWFwIHx8IG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOwor
CisgICAgLy8gVGhlcmUncyBhIGNsZWFyIHBlbmRpbmcgb3IgZ2V0VmFsdWVzIHBlbmRpbmcgd2Ug
ZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyB1bnRpbCB3ZSBnZXQgdGhlIGNvcnJlc3Bv
bmRpbmcgRGlkQ2xlYXIvRGlkR2V0VmFsdWVzIG1lc3NhZ2VzLgorICAgIGlmIChtX2hhc1BlbmRp
bmdDbGVhciB8fCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICgha2V5KSB7CisgICAgICAgIC8vIEEgbnVsbCBrZXkgbWVhbnMgY2xlYXIuCisgICAgICAg
IGF1dG8gbmV3U3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7
CisKKyAgICAgICAgLy8gQW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgbG9jYWxseSBhZnRlciB0
aGUgY2xlYXIgbXVzdCBzdGlsbCBiZSBrZXB0IGFyb3VuZCBpbiB0aGUgbmV3IG1hcC4KKyAgICAg
ICAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmJlZ2luKCkua2V5cygpLCBl
bmQgPSBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuZW5kKCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQp
IHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZyYga2V5ID0gKml0OworCisgICAgICAgICAgICBT
dHJpbmcgdmFsdWUgPSBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsKKyAgICAgICAgICAgIGlm
ICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNoYW5nZSBtdXN0IGhhdmUgYmVl
biBhIHBlbmRpbmcgcmVtb3ZlLCBpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKKyAgICAgICAg
ICAgIG5ld1N0b3JhZ2VNYXAtPnNldEl0ZW1JZ25vcmluZ1F1b3RhKGtleSwgb2xkVmFsdWUpOwor
ICAgICAgICB9CisKKyAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFw
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2hvdWxkQXBwbHlDaGFuZ2VG
b3JLZXkoa2V5KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFuZXdWYWx1ZSkgeworICAg
ICAgICAvLyBBIG51bGwgbmV3IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGl0ZW0gc2hvdWxkIGJlIHJl
bW92ZWQuCisgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKKyAgICAgICAgbV9zdG9yYWdlTWFwLT5y
ZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
bV9zdG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90YShrZXksIG5ld1ZhbHVlKTsKK30KKwor
dm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNl
U3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUs
IGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAg
IGlmICghc291cmNlU3RvcmFnZUFyZWFJRCkgeworICAgICAgICAvLyBUaGlzIHN0b3JhZ2UgZXZl
bnQgb3JpZ2luYXRlcyBmcm9tIGFub3RoZXIgcHJvY2VzcyBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRo
ZSBjaGFuZ2UgdG8gb3VyIHN0b3JhZ2UgYXJlYSBtYXAuCisgICAgICAgIGFwcGx5Q2hhbmdlKGtl
eSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIGlmIChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VU
eXBlOjpTZXNzaW9uKQorICAgICAgICBkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQoc291cmNl
U3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZyk7CisgICAg
ZWxzZQorICAgICAgICBkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHNvdXJjZVN0b3JhZ2VBcmVh
SUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcpOworfQorCit2b2lkIFN0b3Jh
Z2VBcmVhTWFwOjpjbGVhckNhY2hlKCkKK3sKKyAgICByZXNldFZhbHVlcygpOworfQorCit2b2lk
IFN0b3JhZ2VBcmVhTWFwOjpkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQodWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFs
dWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQorewor
ICAgIEFTU0VSVChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKTsKKworICAg
IC8vIE5hbWVzcGFjZSBJRHMgZm9yIHNlc3Npb24gc3RvcmFnZSBuYW1lc3BhY2VzIGFyZSBlcXVp
dmFsZW50IHRvIHdlYiBwYWdlIElEcworICAgIC8vIHNvIHdlIGNhbiBnZXQgdGhlIHJpZ2h0IHBh
Z2UgaGVyZS4KKyAgICBXZWJQYWdlKiB3ZWJQYWdlID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCku
d2ViUGFnZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7CisgICAgaWYgKCF3ZWJQYWdlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVzOworCisgICAgUGFn
ZSogcGFnZSA9IHdlYlBhZ2UtPmNvcmVQYWdlKCk7CisgICAgZm9yIChGcmFtZSogZnJhbWUgPSAm
cGFnZS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCkudHJhdmVyc2VO
ZXh0KCkpIHsKKyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7
CisgICAgICAgIGlmICghZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCkuZXF1YWwobV9zZWN1cml0
eU9yaWdpbi5wdHIoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdG9yYWdl
KiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5vcHRpb25hbFNlc3Npb25TdG9yYWdl
KCk7CisgICAgICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIFN0b3JhZ2VBcmVhSW1wbCYgc3RvcmFnZUFyZWEgPSBzdGF0aWNfY2FzdDxTdG9yYWdlQXJl
YUltcGwmPihzdG9yYWdlLT5hcmVhKCkpOworICAgICAgICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFn
ZUFyZWFJRCgpID09IHNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMg
aXMgdGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hl
ZC4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVzLmFw
cGVuZChmcmFtZSk7CisgICAgfQorCisgICAgU3RvcmFnZUV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0
Y2hTZXNzaW9uU3RvcmFnZUV2ZW50c1RvRnJhbWVzKCpwYWdlLCBmcmFtZXMsIGtleSwgb2xkVmFs
dWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcsIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5
T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlz
cGF0Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25z
dCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdW
YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCit7CisgICAgQVNTRVJUKGlzTG9jYWxTdG9y
YWdlKHN0b3JhZ2VUeXBlKCkpKTsKKworICAgIFZlY3RvcjxSZWZQdHI8RnJhbWU+PiBmcmFtZXM7
CisKKyAgICBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9ICpXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53
ZWJQYWdlR3JvdXAobV9zdG9yYWdlTmFtZXNwYWNlSUQpLT5jb3JlUGFnZUdyb3VwKCk7CisgICAg
Y29uc3QgSGFzaFNldDxQYWdlKj4mIHBhZ2VzID0gcGFnZUdyb3VwLnBhZ2VzKCk7CisgICAgZm9y
IChIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwYWdlcy5iZWdpbigpLCBlbmQg
PSBwYWdlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGZvciAoRnJhbWUqIGZy
YW1lID0gJigqaXQpLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS50
cmF2ZXJzZU5leHQoKSkgeworICAgICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUt
PmRvY3VtZW50KCk7CisgICAgICAgICAgICBpZiAoIWRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigp
LmVxdWFsKG1fc2VjdXJpdHlPcmlnaW4ucHRyKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygp
LT5vcHRpb25hbExvY2FsU3RvcmFnZSgpOworICAgICAgICAgICAgaWYgKCFzdG9yYWdlKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBTdG9yYWdlQXJlYUltcGwmIHN0
b3JhZ2VBcmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFyZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgp
KTsKKyAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS5zdG9yYWdlQXJlYUlEKCkgPT0gc291cmNl
U3RvcmFnZUFyZWFJRCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2Ug
YXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWVzLmFwcGVu
ZChmcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdG9yYWdlRXZlbnREaXNwYXRjaGVy
OjpkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50c1RvRnJhbWVzKHBhZ2VHcm91cCwgZnJhbWVzLCBr
ZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZy
b21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2Uv
U3RvcmFnZUFyZWFNYXAuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VBcmVhTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjllNDNlODA3N2YwZGU0NThiMTA2OTdkOTk2ZjFj
ZTY2YWI3MWNjOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFN0b3JhZ2VBcmVhTWFwX2gKKyNkZWZpbmUgU3RvcmFnZUFyZWFNYXBfaAorCisj
aW5jbHVkZSAiTWVzc2FnZVJlY2VpdmVyLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9y
aWdpbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEuaD4KKyNpbmNsdWRlIDx3dGYv
Rm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CitjbGFzcyBTZWN1cml0eU9yaWdpbjsKK2NsYXNzIFN0b3JhZ2VNYXA7Cit9CisKK25h
bWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBTdG9yYWdlQXJlYUltcGw7CitjbGFzcyBTdG9yYWdl
TmFtZXNwYWNlSW1wbDsKKworY2xhc3MgU3RvcmFnZUFyZWFNYXAgOiBwdWJsaWMgUmVmQ291bnRl
ZDxTdG9yYWdlQXJlYU1hcD4sIHByaXZhdGUgSVBDOjpNZXNzYWdlUmVjZWl2ZXIgeworcHVibGlj
OgorICAgIHN0YXRpYyBSZWY8U3RvcmFnZUFyZWFNYXA+IGNyZWF0ZShTdG9yYWdlTmFtZXNwYWNl
SW1wbCosIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJik7CisgICAgflN0b3JhZ2VBcmVh
TWFwKCk7CisKKyAgICBXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSgpIGNvbnN0IHsg
cmV0dXJuIG1fc3RvcmFnZVR5cGU7IH0KKworICAgIHVuc2lnbmVkIGxlbmd0aCgpOworICAgIFN0
cmluZyBrZXkodW5zaWduZWQgaW5kZXgpOworICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmluZyYg
a2V5KTsKKyAgICB2b2lkIHNldEl0ZW0oV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9y
YWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcm
IHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbik7CisgICAgdm9pZCByZW1vdmVJdGVtKFdlYkNv
cmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25z
dCBTdHJpbmcmIGtleSk7CisgICAgdm9pZCBjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJh
bWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSk7CisgICAgYm9vbCBjb250YWlucyhjb25z
dCBTdHJpbmcmIGtleSk7CisKKyAgICBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiYgc2Vj
dXJpdHlPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3NlY3VyaXR5T3JpZ2luLmdldCgpOyB9CisK
K3ByaXZhdGU6CisgICAgU3RvcmFnZUFyZWFNYXAoU3RvcmFnZU5hbWVzcGFjZUltcGwqLCBSZWY8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYpOworCisgICAgLy8gSVBDOjpNZXNzYWdlUmVjZWl2
ZXIKKyAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQQzo6RGVj
b2RlciYpIG92ZXJyaWRlOworCisgICAgdm9pZCBkaWRHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQpOworICAgIHZvaWQgZGlkU2V0SXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwg
Y29uc3QgU3RyaW5nJiBrZXksIGJvb2wgcXVvdGFFcnJvcik7CisgICAgdm9pZCBkaWRSZW1vdmVJ
dGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSk7CisgICAgdm9p
ZCBkaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCk7CisKKyAgICB2b2lkIGRpc3BhdGNo
U3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYg
a2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZyk7CisgICAgdm9pZCBjbGVhckNhY2hlKCk7CisKKyAgICB2b2lk
IHJlc2V0VmFsdWVzKCk7CisgICAgdm9pZCBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIGJv
b2wgc2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIGNvbnN0OworICAg
IHZvaWQgYXBwbHlDaGFuZ2UoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgbmV3VmFs
dWUpOworCisgICAgdm9pZCBkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQodWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFs
dWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAg
ICB2b2lkIGRpc3BhdGNoTG9jYWxTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFy
ZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0
cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKworICAgIFJlZjxTdG9y
YWdlTmFtZXNwYWNlSW1wbD4gbV9zdG9yYWdlTmFtZXNwYWNlOworCisgICAgdWludDY0X3QgbV9z
dG9yYWdlTWFwSUQ7CisKKyAgICBXZWJDb3JlOjpTdG9yYWdlVHlwZSBtX3N0b3JhZ2VUeXBlOwor
ICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlEOworICAgIHVuc2lnbmVkIG1fcXVvdGFJ
bkJ5dGVzOworICAgIFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4gbV9zZWN1cml0eU9yaWdp
bjsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTWFwPiBtX3N0b3JhZ2VNYXA7CisKKyAg
ICB1aW50NjRfdCBtX2N1cnJlbnRTZWVkOworICAgIGJvb2wgbV9oYXNQZW5kaW5nQ2xlYXI7Cisg
ICAgYm9vbCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXM7CisgICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5n
PiBtX3BlbmRpbmdWYWx1ZUNoYW5nZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKwor
I2VuZGlmIC8vIFN0b3JhZ2VBcmVhTWFwX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4KbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uYjE1OTA0ZjE2YmVjMTQyYjEwYjQ4MDBkMTA2NDUwMDkzMzgzMDBkNQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VB
cmVhTWFwLm1lc3NhZ2VzLmluCkBAIC0wLDAgKzEsMzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEz
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
IEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKworbWVzc2FnZXMgLT4gU3RvcmFnZUFyZWFNYXAgeworICAgIERp
ZEdldFZhbHVlcyh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKKyAgICBEaWRTZXRJdGVtKHVpbnQ2
NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBib29sIHF1b3RhRXhjZXB0aW9uKQorICAg
IERpZFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXkpCisgICAg
RGlkQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCisKKyAgICBEaXNwYXRjaFN0b3JhZ2VF
dmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBTdHJpbmcga2V5LCBTdHJpbmcgb2xk
VmFsdWUsIFN0cmluZyBuZXdWYWx1ZSwgU3RyaW5nIHVybFN0cmluZykKKyAgICBDbGVhckNhY2hl
KCkKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9y
YWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yYWJiYzVjMjFjMTgxMDg4
ZmY1ODYwNDVmMDI3MTllMDI0MjY4NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwCkBAIC0wLDAg
KzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiU3RvcmFnZU5hbWVzcGFjZUltcGwuaCIKKworI2luY2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5o
IgorI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2lu
Y2x1ZGUgIldlYlBhZ2VHcm91cFByb3h5LmgiCisjaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgorI2lu
Y2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BhZ2VHcm91cC5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1Nl
dHRpbmdzLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlVHlwZS5oPgorCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1JlZlB0cjxTdG9yYWdlTmFt
ZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAg
ICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpT
ZXNzaW9uLCBpZGVudGlmaWVyLCBudWxscHRyLCBxdW90YUluQnl0ZXMpKTsKK30KKworUmVmUHRy
PFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlRXBoZW1l
cmFsTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1
b3RhSW5CeXRlcykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsKFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCwgaWRlbnRpZmllciwgbnVsbHB0ciwgcXVv
dGFJbkJ5dGVzKSk7Cit9CisKK1JlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5h
bWVzcGFjZUltcGw6OmNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlm
aWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBT
dG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6TG9jYWwsIGlkZW50aWZpZXIsIG51bGxw
dHIsIHF1b3RhSW5CeXRlcykpOworfQorCitSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0
b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
dWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3Jp
Z2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBT
dG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6VHJhbnNpZW50TG9jYWwsIGlkZW50aWZp
ZXIsICZ0b3BMZXZlbE9yaWdpbiwgcXVvdGFJbkJ5dGVzKSk7Cit9CisKK1N0b3JhZ2VOYW1lc3Bh
Y2VJbXBsOjpTdG9yYWdlTmFtZXNwYWNlSW1wbChXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdl
VHlwZSwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
biogdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKKyAgICA6IG1fc3RvcmFn
ZVR5cGUoc3RvcmFnZVR5cGUpCisgICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFt
ZXNwYWNlSUQpCisgICAgLCBtX3RvcExldmVsT3JpZ2luKHRvcExldmVsT3JpZ2luKQorICAgICwg
bV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQoreworfQorCitTdG9yYWdlTmFtZXNwYWNlSW1w
bDo6flN0b3JhZ2VOYW1lc3BhY2VJbXBsKCkKK3sKK30KKwordm9pZCBTdG9yYWdlTmFtZXNwYWNl
SW1wbDo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VBcmVhTWFwJiBtYXApCit7Cisg
ICAgbV9zdG9yYWdlQXJlYU1hcHMucmVtb3ZlKFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3Vy
aXR5T3JpZ2luKG1hcC5zZWN1cml0eU9yaWdpbigpKSk7Cit9CisKK1JlZlB0cjxTdG9yYWdlQXJl
YT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OnN0b3JhZ2VBcmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2lu
RGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgaWYgKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFn
ZVR5cGU6OkVwaGVtZXJhbExvY2FsKQorICAgICAgICByZXR1cm4gZXBoZW1lcmFsTG9jYWxTdG9y
YWdlQXJlYShzZWN1cml0eU9yaWdpbik7CisKKyAgICBSZWZQdHI8U3RvcmFnZUFyZWFNYXA+IG1h
cDsKKworICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhTWFwcy5hZGQoc2VjdXJpdHlPcmln
aW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoIXNsb3QpIHsKKyAgICAgICAg
bWFwID0gU3RvcmFnZUFyZWFNYXA6OmNyZWF0ZSh0aGlzLCBzZWN1cml0eU9yaWdpbi5zZWN1cml0
eU9yaWdpbigpKTsKKyAgICAgICAgc2xvdCA9IG1hcC5nZXQoKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgbWFwID0gc2xvdDsKKworICAgIHJldHVybiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShtYXAu
cmVsZWFzZU5vbk51bGwoKSk7Cit9CisKK2NsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhl
bWVyYWxTdG9yYWdlQXJlYSBmaW5hbCA6IHB1YmxpYyBTdG9yYWdlQXJlYSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4gY3JlYXRlKGNvbnN0IFNlY3VyaXR5
T3JpZ2luRGF0YSYgb3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCisgICAgeworICAgICAg
ICByZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYShvcmlnaW4sIHF1b3Rh
SW5CeXRlcykpOworICAgIH0KKworICAgIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4gY29weSgp
CisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9yYWdlQXJl
YSgqdGhpcykpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBFcGhlbWVyYWxTdG9yYWdlQXJlYShj
b25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIG9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQor
ICAgICAgICA6IG1fc2VjdXJpdHlPcmlnaW5EYXRhKG9yaWdpbikKKyAgICAgICAgLCBtX3N0b3Jh
Z2VNYXAoU3RvcmFnZU1hcDo6Y3JlYXRlKHF1b3RhSW5CeXRlcykpCisgICAgeworICAgIH0KKwor
ICAgIEVwaGVtZXJhbFN0b3JhZ2VBcmVhKEVwaGVtZXJhbFN0b3JhZ2VBcmVhJiBvdGhlcikKKyAg
ICAgICAgOiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvdGhlci5tX3NlY3VyaXR5T3JpZ2luRGF0YSkK
KyAgICAgICAgLCBtX3N0b3JhZ2VNYXAob3RoZXIubV9zdG9yYWdlTWFwKQorICAgIHsKKyAgICB9
CisKKyAgICAvLyBXZWJDb3JlOjpTdG9yYWdlQXJlYS4KKyAgICB1bnNpZ25lZCBsZW5ndGgoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+bGVuZ3RoKCk7CisgICAgfQorCisg
ICAgU3RyaW5nIGtleSh1bnNpZ25lZCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3N0
b3JhZ2VNYXAtPmtleShpbmRleCk7CisgICAgfQorCisgICAgU3RyaW5nIGl0ZW0oY29uc3QgU3Ry
aW5nJiBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtl
eSk7CisgICAgfQorCisgICAgdm9pZCBzZXRJdGVtKEZyYW1lKiwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQorICAgIHsKKyAgICAg
ICAgU3RyaW5nIG9sZFZhbHVlOworICAgICAgICBpZiAoYXV0byBuZXdNYXAgPSBtX3N0b3JhZ2VN
YXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKSkKKyAgICAg
ICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3TWFwKTsKKyAgICB9CisKKyAgICB2b2lk
IHJlbW92ZUl0ZW0oRnJhbWUqLCBjb25zdCBTdHJpbmcmIGtleSkKKyAgICB7CisgICAgICAgIFN0
cmluZyBvbGRWYWx1ZTsKKyAgICAgICAgaWYgKGF1dG8gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5y
ZW1vdmVJdGVtKGtleSwgb2xkVmFsdWUpKQorICAgICAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RG
TW92ZShuZXdNYXApOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoRnJhbWUqKQorICAgIHsKKyAg
ICAgICAgaWYgKCFtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3N0b3JhZ2VNYXAt
PnF1b3RhKCkpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkp
CisgICAgeworICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5jb250YWlucyhrZXkpOworICAg
IH0KKworICAgIGJvb2wgY2FuQWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCisgICAgeworICAg
ICAgICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2UoKTsKKyAgICB9CisKKyAgICBTdG9yYWdl
VHlwZSBzdG9yYWdlVHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gU3RvcmFnZVR5
cGU6OkVwaGVtZXJhbExvY2FsOworICAgIH0KKworICAgIHNpemVfdCBtZW1vcnlCeXRlc1VzZWRC
eUNhY2hlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZvaWQgaW5j
cmVtZW50QWNjZXNzQ291bnQoKSB7IH0KKyAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkg
eyB9CisgICAgdm9pZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkgeyB9CisKKyAgICBTZWN1cml0eU9y
aWdpbkRhdGEgc2VjdXJpdHlPcmlnaW4oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
c2VjdXJpdHlPcmlnaW5EYXRhOworICAgIH0KKworICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3Nl
Y3VyaXR5T3JpZ2luRGF0YTsKKyAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwor
fTsKKworUmVmUHRyPFN0b3JhZ2VBcmVhPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZXBoZW1lcmFs
TG9jYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2lu
KQoreworICAgIGF1dG8mIHNsb3QgPSBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzLmFkZChz
ZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmICghc2xvdCkK
KyAgICAgICAgc2xvdCA9IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJl
YTo6Y3JlYXRlKHNlY3VyaXR5T3JpZ2luLCBtX3F1b3RhSW5CeXRlcyk7CisKKyAgICByZXR1cm4g
c2xvdC5nZXQoKTsKK30KKworUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsOjpjb3B5KFBhZ2UqIG5ld1BhZ2UpCit7CisgICAgQVNTRVJUKG1fc3RvcmFnZU5hbWVz
cGFjZUlEKTsKKworICAgIGlmIChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9u
KQorICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6
ZnJvbUNvcmVQYWdlKG5ld1BhZ2UpLT5wYWdlSUQoKSwgbV9xdW90YUluQnl0ZXMpOworCisgICAg
QVNTRVJUKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsKTsKKyAg
ICBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IG5ld05hbWVzcGFjZSA9IGFkb3B0UmVmKG5l
dyBTdG9yYWdlTmFtZXNwYWNlSW1wbChtX3N0b3JhZ2VUeXBlLCBtX3N0b3JhZ2VOYW1lc3BhY2VJ
RCwgbV90b3BMZXZlbE9yaWdpbi5nZXQoKSwgbV9xdW90YUluQnl0ZXMpKTsKKworICAgIGZvciAo
YXV0byYgaXRlciA6IG1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXMpCisgICAgICAgIG5ld05h
bWVzcGFjZS0+bV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhcy5zZXQoaXRlci5rZXksIGl0ZXIu
dmFsdWUtPmNvcHkoKSk7CisKKyAgICByZXR1cm4gbmV3TmFtZXNwYWNlOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJT
dG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYxM2EyMmRjYmQy
MWI2NzQwZTQ1MjM3ZjRkZmFkODMxMjU2NzI5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oCkBAIC0w
LDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8
V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5
T3JpZ2luSGFzaC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL1N0b3JhZ2VNYXAuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VOYW1lc3Bh
Y2UuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
Y2xhc3MgU3RvcmFnZUFyZWFNYXA7CitjbGFzcyBXZWJQYWdlOworCitjbGFzcyBTdG9yYWdlTmFt
ZXNwYWNlSW1wbCA6IHB1YmxpYyBXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlIHsKK3B1YmxpYzoK
KyAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMp
OworICAgIHN0YXRpYyBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0ZUVwaGVtZXJh
bExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90
YUluQnl0ZXMpOworICAgIHN0YXRpYyBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0
ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90
YUluQnl0ZXMpOworICAgIHN0YXRpYyBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0
ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCBXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbiYgdG9wTGV2ZWxPcmlnaW4sIHVpbnQ2NF90IHF1b3RhSW5CeXRl
cyk7CisKKyAgICB2aXJ0dWFsIH5TdG9yYWdlTmFtZXNwYWNlSW1wbCgpOworCisgICAgV2ViQ29y
ZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VUeXBl
OyB9CisgICAgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9z
dG9yYWdlTmFtZXNwYWNlSUQ7IH0KKyAgICBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2
ZWxPcmlnaW4oKSBjb25zdCB7IHJldHVybiBtX3RvcExldmVsT3JpZ2luLmdldCgpOyB9CisgICAg
dW5zaWduZWQgcXVvdGFJbkJ5dGVzKCkgY29uc3QgeyByZXR1cm4gbV9xdW90YUluQnl0ZXM7IH0K
KworICAgIHZvaWQgZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VBcmVhTWFwJik7CisK
K3ByaXZhdGU6CisgICAgZXhwbGljaXQgU3RvcmFnZU5hbWVzcGFjZUltcGwoV2ViQ29yZTo6U3Rv
cmFnZVR5cGUsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW4qIHRvcExldmVsT3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOworCisgICAgUmVm
UHRyPFdlYkNvcmU6OlN0b3JhZ2VBcmVhPiBzdG9yYWdlQXJlYShjb25zdCBXZWJDb3JlOjpTZWN1
cml0eU9yaWdpbkRhdGEmKSBvdmVycmlkZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5h
bWVzcGFjZT4gY29weShXZWJDb3JlOjpQYWdlKikgb3ZlcnJpZGU7CisKKyAgICBSZWZQdHI8V2Vi
Q29yZTo6U3RvcmFnZUFyZWE+IGVwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWEoY29uc3QgV2ViQ29y
ZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7CisKKyAgICBjb25zdCBXZWJDb3JlOjpTdG9yYWdlVHlw
ZSBtX3N0b3JhZ2VUeXBlOworICAgIGNvbnN0IHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlE
OworCisgICAgLy8gT25seSB1c2VkIGZvciB0cmFuc2llbnQgbG9jYWwgc3RvcmFnZSBuYW1lc3Bh
Y2VzLgorICAgIGNvbnN0IFJlZlB0cjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4gbV90b3BMZXZl
bE9yaWdpbjsKKworICAgIGNvbnN0IHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisgICAgSGFz
aE1hcDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEsIFN0b3JhZ2VBcmVhTWFwKj4gbV9zdG9y
YWdlQXJlYU1hcHM7CisKKyAgICBjbGFzcyBFcGhlbWVyYWxTdG9yYWdlQXJlYTsKKyAgICBIYXNo
TWFwPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSwgUmVmUHRyPEVwaGVtZXJhbFN0b3JhZ2VB
cmVhPj4gbV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhczsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2Uv
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTM3NThlYjg3NDI4OGZmZDg5NjYyZDAyNWUxNThkNjZhMDcwYzU3MAotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlci5jcHAKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NC0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oIgor
CisjaW5jbHVkZSAiU3RvcmFnZU5hbWVzcGFjZUltcGwuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgi
CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTmV2ZXJEZXN0cm95ZWQu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitz
dGF0aWMgSGFzaE1hcDx1aW50NjRfdCwgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKj4mIHN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKQoreworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxI
YXNoTWFwPHVpbnQ2NF90LCBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIqPj4gc3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVyczsKKworICAgIHJldHVybiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJz
OworfQorCitSZWZQdHI8V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyPiBXZWJTdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXI6OmdldE9yQ3JlYXRlKHVpbnQ2NF90IGlkZW50aWZpZXIpCit7CisgICAg
YXV0byYgc2xvdCA9IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKS5hZGQoaWRlbnRpZmllciwg
bnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmIChzbG90KQorICAgICAgICByZXR1cm4g
c2xvdDsKKworICAgIFJlZlB0cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI+IHN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlciA9IGFkb3B0UmVmKG5ldyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXIoaWRlbnRpZmllcikpOworICAgIHNsb3QgPSBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuZ2V0
KCk7CisKKyAgICByZXR1cm4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOworfQorCitXZWJTdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXI6OldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcih1aW50NjRf
dCBpZGVudGlmaWVyKQorICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCit7Cit9CisKK1dl
YlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6fldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcigp
Cit7CisgICAgQVNTRVJUKHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKS5jb250YWlucyhtX2lk
ZW50aWZpZXIpKTsKKworICAgIHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKS5yZW1vdmUobV9p
ZGVudGlmaWVyKTsKK30KKworUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IFdlYlN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoUGFn
ZSYgcGFnZSwgdW5zaWduZWQgcXVvdGEpCit7CisgICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2Uo
JnBhZ2UpLT5wYWdlSUQoKSwgcXVvdGEpOworfQorCitSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5h
bWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVFcGhlbWVyYWxMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UoUGFnZSYgcGFnZSwgdW5zaWduZWQgcXVvdGEpCit7CisgICAgcmV0
dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKCZwYWdlKS0+cGFnZUlEKCksIHF1b3RhKTsKK30K
KworUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcjo6Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVuc2lnbmVkIHF1b3RhKQorewor
ICAgIHJldHVybiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNw
YWNlKG1faWRlbnRpZmllciwgcXVvdGEpOworfQorCitSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5h
bWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVUcmFuc2llbnRMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2lu
LCB1bnNpZ25lZCBxdW90YSkKK3sKKyAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNy
ZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZShtX2lkZW50aWZpZXIsIHRvcExldmVs
T3JpZ2luLCBxdW90YSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uYTRjMjE0MjRiZjI2ZTM0MTAxMDg4YmMwMjgyYjQzMTIyNmE2NDlhNgotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTQtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKKyNkZWZpbmUgV2ViU3Rv
cmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKKworI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJTdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXIgZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlcj4gZ2V0T3JDcmVhdGUodWludDY0X3QgaWRlbnRpZmllcik7CisgICAgdmlydHVh
bCB+V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGlj
aXQgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIpOworCisg
ICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZVNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlKFdlYkNvcmU6OlBhZ2UmLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7CisgICAg
UmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZUVwaGVtZXJhbExvY2FsU3Rv
cmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdlJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOwor
ICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UodW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOworICAgIFJlZlB0cjxXZWJDb3JlOjpT
dG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2Vi
Q29yZTo6U2VjdXJpdHlPcmlnaW4mLCB1bnNpZ25lZCBxdW90YSkgb3ZlcnJpZGU7CisKKyAgICBj
b25zdCB1aW50NjRfdCBtX2lkZW50aWZpZXI7Cit9OworCit9CisKKyNlbmRpZiAvLyBXZWJTdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316478</attachid>
            <date>2017-07-26 14:12:20 -0700</date>
            <delta_ts>2017-07-26 14:36:34 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174871-20170726141219.patch</filename>
            <type>text/plain</type>
            <size>319161</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5OTYwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZkMDA4NjNkMWFmZjRkZDFm
YmZhMzAxNzNiYjEwODFkOWVhYzVlYjQuLjM4MDMyYjM4Y2VlOWNjY2UxOTljZDQ0OTY2ZDVlMzk4
MjQ0MzU5YzcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDMgQEAKIDIwMTctMDctMjYgIEJyYWR5IEVp
ZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCisgICAgICAgIFJlbmFtZSB7V2ViL1VJfVByb2Nl
c3MvU3RvcmFnZSB0byB7V2ViL1VJfVByb2Nlc3MvV2ViU3RvcmFnZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDg3MQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBzdGFuZGFyZCB0aGVzZSBkaXJl
Y3RvcmllcyBoZWxwIGltcGxlbWVudCBpcyB0aGUgIldlYiBTdG9yYWdlIiBzdGFuZGFyZC4KKyAg
ICAgICAgIlN0b3JhZ2UiIGlzIHRvbyBnZW5lcmFsIG9mIGEgd29yZCB0aGF0IHdlIGhhdmUgcGxh
bnMgdG8gc3RhcnQgdXNpbmcgaW4gb3RoZXIgY29udGV4dHMgc29vbi4KKworICAgICAgICAqIENN
YWtlTGlzdHMudHh0OgorICAgICAgICAqIFBsYXRmb3JtR1RLLmNtYWtlOgorICAgICAgICAqIFBs
YXRmb3JtTWFjLmNtYWtlOgorICAgICAgICAqIFBsYXRmb3JtV1BFLmNtYWtlOgorICAgICAgICAq
IFdlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorCisgICAgICAgICogVUlQcm9jZXNz
L1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHA6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZS5jcHAuCisgICAgICAgICogVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
aC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5j
cHA6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3Rv
cmFnZURhdGFiYXNlLmNwcC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZS5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3Rv
cmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5oLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9y
YWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAu
CisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlci5oLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdl
L1N0b3JhZ2VNYW5hZ2VyLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJTdG9y
YWdlL1N0b3JhZ2VNYW5hZ2VyLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vz
cy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmguCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3Jh
Z2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW46IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluLgorICAgICAgICAq
IFVJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1Mu
bW06IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0uCisgICAgICAgICogVUlQcm9jZXNzL2lvcy9S
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW06IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0uCisKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0
b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAuCisgICAgICAgICogV2ViUHJvY2Vz
cy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmguCisgICAgICAgICogV2ViUHJv
Y2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcC4KKyAgICAgICAgKiBX
ZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuaDogUmVuYW1lZCBmcm9tIFNvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmguCisgICAgICAgICog
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluOiBSZW5hbWVk
IGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVz
c2FnZXMuaW4uCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3Bh
Y2VJbXBsLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3Jh
Z2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmguCisgICAgICAgICogV2ViUHJv
Y2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHA6IFJlbmFtZWQg
ZnJvbSBTb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNl
UHJvdmlkZXIuY3BwLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXIuaDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oLgorCisyMDE3LTA3LTI2ICBC
cmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4KKwogICAgICAgICBSZW1vdmUgREFUQUJB
U0VfUFJPQ0VTUyBidWlsZCBmbGFnLgogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTc0ODY4CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ01ha2VM
aXN0cy50eHQgYi9Tb3VyY2UvV2ViS2l0L0NNYWtlTGlzdHMudHh0CmluZGV4IDEyM2Y0YmZhODEz
ZjAzZDFkNzMwNTUxZDcwNGVlYTVmMjFkNmI2YjYuLjQ0NWZkMTY0MGQ1YTU3MDhjNTU3MDlkOTBl
YzhjYzI5ODhjMDgxZTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQK
KysrIGIvU291cmNlL1dlYktpdC9DTWFrZUxpc3RzLnR4dApAQCAtNDQsOCArNDQsOCBAQCBzZXQo
V2ViS2l0Ml9JTkNMVURFX0RJUkVDVE9SSUVTCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1VJUHJvY2Vz
cy9OZXR3b3JrL0N1c3RvbVByb3RvY29scyIKICAgICAiJHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNz
L05vdGlmaWNhdGlvbnMiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1VJUHJvY2Vzcy9QbHVnaW5zIgot
ICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3MvU3RvcmFnZSIKICAgICAiJHtXRUJLSVQyX0RJ
Un0vVUlQcm9jZXNzL1VzZXJDb250ZW50IgorICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3Mv
V2ViU3RvcmFnZSIKICAgICAiJHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL1dlYnNpdGVEYXRhIgog
ICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQ
cm9jZXNzL0FwcGxlUGF5IgpAQCAtNzMsMTAgKzczLDEwIEBAIHNldChXZWJLaXQyX0lOQ0xVREVf
RElSRUNUT1JJRVMKICAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9QbHVnaW5zIgogICAg
ICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1BsdWdpbnMvTmV0c2NhcGUiCiAgICAgIiR7V0VC
S0lUMl9ESVJ9L1dlYlByb2Nlc3MvUmVzb3VyY2VDYWNoZSIKLSAgICAiJHtXRUJLSVQyX0RJUn0v
V2ViUHJvY2Vzcy9TdG9yYWdlIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1VzZXJD
b250ZW50IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0Igog
ICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dlYlBhZ2UiCisgICAgIiR7V0VCS0lUMl9E
SVJ9L1dlYlByb2Nlc3MvV2ViU3RvcmFnZSIKICAgICAiJHtERVJJVkVEX1NPVVJDRVNfV0VCS0lU
Ml9ESVJ9IgogICAgICIke0RFUklWRURfU09VUkNFU19XRUJLSVQyX0RJUn0vaW5jbHVkZSIKICAg
ICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9XZWJLaXRMaWJyYXJpZXMiCkBAIC0yODQsNiArMjg0LDcg
QEAgc2V0KFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmNw
cAogICAgIFVJUHJvY2Vzcy9Qcm9jZXNzVGhyb3R0bGVyLmNwcAogICAgIFVJUHJvY2Vzcy9SZW1v
dGVXZWJJbnNwZWN0b3JQcm94eS5jcHAKKyAgICBVSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcAogICAgIFVJUHJvY2Vzcy9SZXNwb25zaXZlbmVzc1Rp
bWVyLmNwcAogICAgIFVJUHJvY2Vzcy9TdGF0aXN0aWNzUmVxdWVzdC5jcHAKICAgICBVSVByb2Nl
c3MvVGV4dENoZWNrZXJDb21wbGV0aW9uLmNwcApAQCAtNDI5LDEzICs0MzAsMTIgQEAgc2V0KFdl
YktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9QbHVnaW5zL1BsdWdpblByb2Nlc3NNYW5hZ2Vy
LmNwcAogICAgIFVJUHJvY2Vzcy9QbHVnaW5zL1BsdWdpblByb2Nlc3NQcm94eS5jcHAKIAotICAg
IFVJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcAotICAgIFVJUHJvY2Vz
cy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAKLSAgICBVSVByb2Nlc3Mv
U3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwCi0KICAg
ICBVSVByb2Nlc3MvVXNlckNvbnRlbnQvV2ViU2NyaXB0TWVzc2FnZUhhbmRsZXIuY3BwCiAgICAg
VUlQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250ZW50Q29udHJvbGxlclByb3h5LmNwcAog
CisgICAgVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwCisgICAg
VUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcAorCiAg
ICAgVUlQcm9jZXNzL1dlYnNpdGVEYXRhL1dlYnNpdGVEYXRhUmVjb3JkLmNwcAogICAgIFVJUHJv
Y2Vzcy9XZWJzaXRlRGF0YS9XZWJzaXRlRGF0YVN0b3JlLmNwcAogCkBAIC01MjcsMTEgKzUyNyw2
IEBAIHNldChXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1BsdWdpbnMvTmV0c2NhcGUv
TmV0c2NhcGVQbHVnaW5Ob25lLmNwcAogICAgIFdlYlByb2Nlc3MvUGx1Z2lucy9OZXRzY2FwZS9O
ZXRzY2FwZVBsdWdpblN0cmVhbS5jcHAKIAotICAgIFdlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdl
QXJlYUltcGwuY3BwCi0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcAot
ICAgIFdlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5jcHAKLSAgICBXZWJQ
cm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcAotCiAgICAgV2Vi
UHJvY2Vzcy9Vc2VyQ29udGVudC9XZWJVc2VyQ29udGVudENvbnRyb2xsZXIuY3BwCiAKICAgICBX
ZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1Nlc3Npb25TdGF0ZUNvbnZlcnNpb24uY3BwCkBAIC01
NzYsNiArNTcxLDExIEBAIHNldChXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1dlYlBh
Z2UvV2ViVVJMU2NoZW1lSGFuZGxlclByb3h5LmNwcAogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9X
ZWJVUkxTY2hlbWVUYXNrUHJveHkuY3BwCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlVuZG9T
dGVwLmNwcAorCisgICAgV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAK
KyAgICBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCisgICAgV2ViUHJv
Y2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcAorICAgIFdlYlByb2Nlc3Mv
V2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCiApCiAKIHNldChXZWJL
aXQyX01FU1NBR0VTX0lOX0ZJTEVTCkBAIC02MzEsMTAgKzYzMSwxMCBAQCBzZXQoV2ViS2l0Ml9N
RVNTQUdFU19JTl9GSUxFUwogCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvUGx1Z2luUHJvY2Vzc1By
b3h5Lm1lc3NhZ2VzLmluCiAKLSAgICBVSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5t
ZXNzYWdlcy5pbgotCiAgICAgVUlQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250ZW50Q29u
dHJvbGxlclByb3h5Lm1lc3NhZ2VzLmluCiAKKyAgICBVSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9y
YWdlTWFuYWdlci5tZXNzYWdlcy5pbgorCiAgICAgV2ViUHJvY2Vzcy9XZWJQcm9jZXNzLm1lc3Nh
Z2VzLmluCiAKICAgICBXZWJQcm9jZXNzL0F1dG9tYXRpb24vV2ViQXV0b21hdGlvblNlc3Npb25Q
cm94eS5tZXNzYWdlcy5pbgpAQCAtNjYxLDggKzY2MSw2IEBAIHNldChXZWJLaXQyX01FU1NBR0VT
X0lOX0ZJTEVTCiAgICAgV2ViUHJvY2Vzcy9QbHVnaW5zL1BsdWdpblByb2Nlc3NDb25uZWN0aW9u
TWFuYWdlci5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvUGx1Z2lucy9QbHVnaW5Qcm94eS5t
ZXNzYWdlcy5pbgogCi0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3Nh
Z2VzLmluCi0KICAgICBXZWJQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVzZXJDb250ZW50Q29udHJv
bGxlci5tZXNzYWdlcy5pbgogCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL0RyYXdpbmdBcmVhLm1l
c3NhZ2VzLmluCkBAIC02NzMsNiArNjcxLDggQEAgc2V0KFdlYktpdDJfTUVTU0FHRVNfSU5fRklM
RVMKICAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViSW5zcGVjdG9ySW50ZXJydXB0RGlzcGF0Y2hl
ci5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJJbnNwZWN0b3JVSS5tZXNz
YWdlcy5pbgogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCisKKyAg
ICBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4KICkKIAog
c2V0KFdlYlByb2Nlc3NfTElCUkFSSUVTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1BsYXRm
b3JtR1RLLmNtYWtlIGIvU291cmNlL1dlYktpdC9QbGF0Zm9ybUdUSy5jbWFrZQppbmRleCA0ZGNm
ZDYyZDYyZDhlN2M2OTdhZGUyYTliNDUwYmQwYjRlM2NiZGJhLi5lZTI4ODNiMjgzNWUyZGM3MzNi
OGEyYTY0NGQ3ZGY2MzNjNGJhYTFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1BsYXRmb3Jt
R1RLLmNtYWtlCisrKyBiL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1HVEsuY21ha2UKQEAgLTIwMSw3
ICsyMDEsNyBAQCBsaXN0KEFQUEVORCBXZWJLaXQyX1NPVVJDRVMKICAgICBVSVByb2Nlc3MvUGx1
Z2lucy91bml4L1BsdWdpbkluZm9TdG9yZVVuaXguY3BwCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMv
dW5peC9QbHVnaW5Qcm9jZXNzUHJveHlVbml4LmNwcAogCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2Uv
U3RvcmFnZU1hbmFnZXIuY3BwCisgICAgVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFn
ZXIuY3BwCiAKICAgICBVSVByb2Nlc3MvV2Vic2l0ZURhdGEvdW5peC9XZWJzaXRlRGF0YVN0b3Jl
VW5peC5jcHAKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybU1hYy5jbWFrZSBi
L1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMuY21ha2UKaW5kZXggNjM1OGZhZjg5YWVlZjg2Nzcx
YWU3OWE0NDliNTljYjJmOWUyNTVjYS4uYTQxMTFmM2NmMzY5OTI1ZTZiOTdiNWRmZGI1MGUwY2Jk
ZDZkMmE2MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybU1hYy5jbWFrZQorKysg
Yi9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtTWFjLmNtYWtlCkBAIC0yNzgsNyArMjc4LDcgQEAgbGlz
dChBUFBFTkQgV2ViS2l0Ml9TT1VSQ0VTCiAgICAgVUlQcm9jZXNzL1Njcm9sbGluZy9SZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvclByb3h5LmNwcAogICAgIFVJUHJvY2Vzcy9TY3JvbGxpbmcvUmVt
b3RlU2Nyb2xsaW5nVHJlZS5jcHAKIAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5h
Z2VyLmNwcAorICAgIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcAogCiAg
ICAgVUlQcm9jZXNzL1dlYnNpdGVEYXRhL0NvY29hL1dlYnNpdGVEYXRhU3RvcmVDb2NvYS5tbQog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtV1BFLmNtYWtlIGIvU291cmNlL1dl
YktpdC9QbGF0Zm9ybVdQRS5jbWFrZQppbmRleCA1YzZiOWZlNjRlYmMxYzVhZTkwMGJjYWMyNDhh
M2ZlY2MzNjRlYTVlLi5mNmVlNjc0ZmQ4ZTlmNGIxMGNhNzJhNWJiOTMyNWRiZGUwMjIxMjRhIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtV1BFLmNtYWtlCisrKyBiL1NvdXJjZS9X
ZWJLaXQvUGxhdGZvcm1XUEUuY21ha2UKQEAgLTE5OCw3ICsxOTgsNyBAQCBsaXN0KEFQUEVORCBX
ZWJLaXQyX1NPVVJDRVMKICAgICBVSVByb2Nlc3MvUGx1Z2lucy91bml4L1BsdWdpbkluZm9TdG9y
ZVVuaXguY3BwCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvdW5peC9QbHVnaW5Qcm9jZXNzUHJveHlV
bml4LmNwcAogCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwCisgICAg
VUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwCiAKICAgICBVSVByb2Nlc3Mv
V2Vic2l0ZURhdGEvdW5peC9XZWJzaXRlRGF0YVN0b3JlVW5peC5jcHAKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDMwNDUyNTc3Nzg4ZTliMDM4MzEx
MGZmMGU1NDI3YThkOTk2ZTUwYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKQEAgLTAs
MCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgiCisKKyNpbmNsdWRlICJM
b2dnaW5nLmgiCisjaW5jbHVkZSAiV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlLmgiCisj
aW5jbHVkZSA8V2ViQ29yZS9GaWxlTW9uaXRvci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5
c3RlbS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvS2V5ZWRDb2RpbmcuaD4KKyNpbmNsdWRlIDxXZWJD
b3JlL1NoYXJlZEJ1ZmZlci5oPgorI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CisjaW5jbHVkZSA8
d3RmL1dvcmtRdWV1ZS5oPgorI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5o
PgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY29uc3RleHByIFNlY29uZHMgbWluaW11bVdyaXRl
SW50ZXJ2YWwgeyA1X21pbiB9OworCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGlj
IGJvb2wgaGFzRmlsZUNoYW5nZWRTaW5jZShjb25zdCBTdHJpbmcmIHBhdGgsIFdhbGxUaW1lIHNp
bmNlKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworICAgIHRpbWVfdCBtb2Rp
ZmljYXRpb25UaW1lOworICAgIGlmICghZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUocGF0aCwgbW9k
aWZpY2F0aW9uVGltZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIFdhbGxU
aW1lOjpmcm9tUmF3U2Vjb25kcyhtb2RpZmljYXRpb25UaW1lKSA+IHNpbmNlOworfQorCitzdGF0
aWMgc3RkOjp1bmlxdWVfcHRyPEtleWVkRGVjb2Rlcj4gY3JlYXRlRGVjb2RlckZvckZpbGUoY29u
c3QgU3RyaW5nJiBwYXRoKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworICAg
IGF1dG8gaGFuZGxlID0gb3BlbkFuZExvY2tGaWxlKHBhdGgsIE9wZW5Gb3JSZWFkKTsKKyAgICBp
ZiAoaGFuZGxlID09IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGUpCisgICAgICAgIHJldHVybiBu
dWxscHRyOworCisgICAgbG9uZyBsb25nIGZpbGVTaXplID0gMDsKKyAgICBpZiAoIWdldEZpbGVT
aXplKGhhbmRsZSwgZmlsZVNpemUpKSB7CisgICAgICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5k
bGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgYnl0ZXNU
b1JlYWQ7CisgICAgaWYgKCFXVEY6OmNvbnZlcnRTYWZlbHkoZmlsZVNpemUsIGJ5dGVzVG9SZWFk
KSkgeworICAgICAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKKyAgICAgICAgcmV0dXJu
IG51bGxwdHI7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlcihieXRlc1RvUmVhZCk7
CisgICAgc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gcmVhZEZyb21GaWxlKGhhbmRsZSwgYnVmZmVy
LmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7CisKKyAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxl
KTsKKworICAgIGlmICh0b3RhbEJ5dGVzUmVhZCAhPSBieXRlc1RvUmVhZCkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gS2V5ZWREZWNvZGVyOjpkZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlci5kYXRhKCkpLCBidWZmZXIuc2l6ZSgpKTsK
K30KKworUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0
b3JlJiBzdG9yZSwgY29uc3QgU3RyaW5nJiBzdG9yYWdlRGlyZWN0b3J5UGF0aCkKKyAgICA6IG1f
bWVtb3J5U3RvcmUoc3RvcmUpCisgICAgLCBtX3N0b3JhZ2VEaXJlY3RvcnlQYXRoKHN0b3JhZ2VE
aXJlY3RvcnlQYXRoKQorICAgICwgbV9hc3luY1dyaXRlVGltZXIoUnVuTG9vcDo6bWFpbigpLCB0
aGlzLCAmUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjphc3luY1dyaXRl
VGltZXJGaXJlZCkKK3sKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2U6OmluaXRpYWxpemUoKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkp
OworICAgIHBvcHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlzaygpOworICAgIHN0YXJ0TW9uaXRvcmlu
Z0Rpc2soKTsKK30KKworUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjp+
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlKCkKK3sKKyAgICBmaW5pc2hB
bGxQZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKTsKKyAgICBBU1NFUlQoIW1faGFzUGVuZGluZ1dy
aXRlKTsKK30KKworU3RyaW5nIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZTo6c3RvcmFnZURpcmVjdG9yeVBhdGgoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0b3JhZ2VE
aXJlY3RvcnlQYXRoLmlzb2xhdGVkQ29weSgpOworfQorCitTdHJpbmcgUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpyZXNvdXJjZUxvZ0ZpbGVQYXRoKCkgY29uc3QKK3sK
KyAgICBTdHJpbmcgc3RvcmFnZVBhdGggPSBzdG9yYWdlRGlyZWN0b3J5UGF0aCgpOworICAgIGlm
IChzdG9yYWdlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOwor
CisgICAgcmV0dXJuIHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChzdG9yYWdlUGF0aCwgImZ1bGxf
YnJvd3Npbmdfc2Vzc2lvbl9yZXNvdXJjZUxvZy5wbGlzdCIpOworfQorCit2b2lkIFJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RhcnRNb25pdG9yaW5nRGlzaygpCit7
CisgICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgaWYgKG1fZmlsZU1vbml0b3Ip
CisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyByZXNvdXJjZUxvZ1BhdGggPSByZXNvdXJj
ZUxvZ0ZpbGVQYXRoKCk7CisgICAgaWYgKHJlc291cmNlTG9nUGF0aC5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fZmlsZU1vbml0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpbGVN
b25pdG9yPihyZXNvdXJjZUxvZ1BhdGgsIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCks
IFt0aGlzXSAoRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgQVNT
RVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAg
ICBjYXNlIEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6TW9kaWZpY2F0aW9uOgorICAgICAg
ICAgICAgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZTo6UmVtb3ZhbDoKKyAgICAg
ICAgICAgIG1fbWVtb3J5U3RvcmUuY2xlYXJJbk1lbW9yeSgpOworICAgICAgICAgICAgbV9maWxl
TW9uaXRvciA9IG51bGxwdHI7CisgICAgICAgICAgICBtb25pdG9yRGlyZWN0b3J5Rm9yTmV3U3Rh
dGlzdGljcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwor
dm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6Om1vbml0b3JEaXJl
Y3RvcnlGb3JOZXdTdGF0aXN0aWNzKCkKK3sKKyAgICBTdHJpbmcgc3RvcmFnZVBhdGggPSBzdG9y
YWdlRGlyZWN0b3J5UGF0aCgpOworICAgIEFTU0VSVCghc3RvcmFnZVBhdGguaXNFbXB0eSgpKTsK
KworICAgIGlmICghZmlsZUV4aXN0cyhzdG9yYWdlUGF0aCkpIHsKKyAgICAgICAgaWYgKCFtYWtl
QWxsRGlyZWN0b3JpZXMoc3RvcmFnZVBhdGgpKSB7CisgICAgICAgICAgICBSRUxFQVNFX0xPR19F
UlJPUihSZXNvdXJjZUxvYWRTdGF0aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlOiBGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSBwYXRoICVzIiwgc3RvcmFn
ZVBhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBtX2ZpbGVNb25pdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxGaWxlTW9uaXRvcj4o
c3RvcmFnZVBhdGgsIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCksIFt0aGlzXSAoRmls
ZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgQVNTRVJUKCFSdW5Mb29w
Ojppc01haW4oKSk7CisgICAgICAgIGlmICh0eXBlID09IEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdl
VHlwZTo6UmVtb3ZhbCkgeworICAgICAgICAgICAgLy8gRGlyZWN0b3J5IHdhcyByZW1vdmVkIQor
ICAgICAgICAgICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzb3VyY2VMb2dQYXRoID0gcmVzb3VyY2VM
b2dGaWxlUGF0aCgpOworICAgICAgICBBU1NFUlQoIXJlc291cmNlTG9nUGF0aC5pc0VtcHR5KCkp
OworCisgICAgICAgIGlmICghZmlsZUV4aXN0cyhyZXNvdXJjZUxvZ1BhdGgpKQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOworCisgICAgICAg
IHJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCk7CisgICAgICAgIHN0YXJ0TW9uaXRvcmluZ0Rp
c2soKTsKKyAgICB9KTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2U6OnN0b3BNb25pdG9yaW5nRGlzaygpCit7CisgICAgQVNTRVJUKCFSdW5Mb29wOjpp
c01haW4oKSk7CisgICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7Cit9CisKKy8vIFRoaXMgaXMg
Y2FsbGVkIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBvbiBkaXNrLgordm9pZCBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCkK
K3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIFN0cmluZyBmaWxlUGF0
aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKKyAgICBpZiAoZmlsZVBhdGguaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBzb21ldGltZXMgc2VlIGZpbGUgY2hhbmdlZCBl
dmVudHMgZnJvbSBiZWZvcmUgb3VyIGxvYWQgY29tcGxldGVkICh3ZSBzdGFydAorICAgIC8vIHJl
YWRpbmcgYXQgdGhlIGZpcnN0IGNoYW5nZSBldmVudCwgYnV0IHdlIG1pZ2h0IHJlY2VpdmUgYSBz
ZXJpZXMgb2YgZXZlbnRzIHJlbGF0ZWQKKyAgICAvLyB0byB0aGUgc2FtZSBmaWxlIG9wZXJhdGlv
bikuIENhdGNoIHRoaXMgY2FzZSB0byBhdm9pZCByZWFkaW5nIG92ZXJseSBvZnRlbi4KKyAgICBp
ZiAoIWhhc0ZpbGVDaGFuZ2VkU2luY2UoZmlsZVBhdGgsIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3lu
Y1RpbWUpKQorICAgICAgICByZXR1cm47CisKKyAgICBXYWxsVGltZSByZWFkVGltZSA9IFdhbGxU
aW1lOjpub3coKTsKKworICAgIGF1dG8gZGVjb2RlciA9IGNyZWF0ZURlY29kZXJGb3JGaWxlKGZp
bGVQYXRoKTsKKyAgICBpZiAoIWRlY29kZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1fbWVt
b3J5U3RvcmUubWVyZ2VXaXRoRGF0YUZyb21EZWNvZGVyKCpkZWNvZGVyKTsKKyAgICBtX2xhc3RT
dGF0aXN0aWNzRmlsZVN5bmNUaW1lID0gcmVhZFRpbWU7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpwb3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2so
KQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgU3RyaW5nIGZpbGVQ
YXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOworICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5KCkg
fHwgIWZpbGVFeGlzdHMoZmlsZVBhdGgpKSB7CisgICAgICAgIG1fbWVtb3J5U3RvcmUuZ3JhbmRm
YXRoZXJFeGlzdGluZ1dlYnNpdGVEYXRhKCk7CisgICAgICAgIG1vbml0b3JEaXJlY3RvcnlGb3JO
ZXdTdGF0aXN0aWNzKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWhhc0Zp
bGVDaGFuZ2VkU2luY2UoZmlsZVBhdGgsIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUpKSB7
CisgICAgICAgIC8vIE5vIG5lZWQgdG8gZ3JhbmRmYXRoZXIgaW4gdGhpcyBjYXNlLgorICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgV2FsbFRpbWUgcmVhZFRpbWUgPSBXYWxsVGltZTo6bm93
KCk7CisKKyAgICBhdXRvIGRlY29kZXIgPSBjcmVhdGVEZWNvZGVyRm9yRmlsZShmaWxlUGF0aCk7
CisgICAgaWYgKCFkZWNvZGVyKSB7CisgICAgICAgIG1fbWVtb3J5U3RvcmUuZ3JhbmRmYXRoZXJF
eGlzdGluZ1dlYnNpdGVEYXRhKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NF
UlRfV0lUSF9NRVNTQUdFKG1fbWVtb3J5U3RvcmUuaXNFbXB0eSgpLCAiVGhpcyBpcyB0aGUgaW5p
dGlhbCBpbXBvcnQgc28gdGhlIHN0b3JlIHNob3VsZCBiZSBlbXB0eSIpOworICAgIG1fbWVtb3J5
U3RvcmUubWVyZ2VXaXRoRGF0YUZyb21EZWNvZGVyKCpkZWNvZGVyKTsKKworICAgIG1fbGFzdFN0
YXRpc3RpY3NGaWxlU3luY1RpbWUgPSByZWFkVGltZTsKKworICAgIG1fbWVtb3J5U3RvcmUubG9n
VGVzdGluZ0V2ZW50KEFTQ0lJTGl0ZXJhbCgiUG9wdWxhdGVkV2l0aG91dEdyYW5kZmF0aGVyaW5n
IikpOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6
YXN5bmNXcml0ZVRpbWVyRmlyZWQoKQoreworICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7
CisgICAgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKS5kaXNwYXRjaChbdGhpc10gKCkg
bXV0YWJsZSB7CisgICAgICAgIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKKyAgICB9KTsKK30K
Kwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OndyaXRlTWVt
b3J5U3RvcmVUb0Rpc2soKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisg
ICAgbV9oYXNQZW5kaW5nV3JpdGUgPSBmYWxzZTsKKyAgICBzdG9wTW9uaXRvcmluZ0Rpc2soKTsK
KworICAgIGF1dG8gZW5jb2RlciA9IG1fbWVtb3J5U3RvcmUuY3JlYXRlRW5jb2RlckZyb21EYXRh
KCk7CisgICAgYXV0byByYXdEYXRhID0gZW5jb2Rlci0+ZmluaXNoRW5jb2RpbmcoKTsKKyAgICBp
ZiAoIXJhd0RhdGEpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gc3RvcmFnZVBhdGggPSBz
dG9yYWdlRGlyZWN0b3J5UGF0aCgpOworICAgIGlmICghc3RvcmFnZVBhdGguaXNFbXB0eSgpKSB7
CisgICAgICAgIG1ha2VBbGxEaXJlY3RvcmllcyhzdG9yYWdlUGF0aCk7CisgICAgICAgIGV4Y2x1
ZGVGcm9tQmFja3VwKCk7CisgICAgfQorCisgICAgYXV0byBoYW5kbGUgPSBvcGVuQW5kTG9ja0Zp
bGUocmVzb3VyY2VMb2dGaWxlUGF0aCgpLCBPcGVuRm9yV3JpdGUpOworICAgIGlmIChoYW5kbGUg
PT0gaW52YWxpZFBsYXRmb3JtRmlsZUhhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50
NjRfdCB3cml0dGVuQnl0ZXMgPSB3cml0ZVRvRmlsZShoYW5kbGUsIHJhd0RhdGEtPmRhdGEoKSwg
cmF3RGF0YS0+c2l6ZSgpKTsKKyAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKKworICAg
IGlmICh3cml0dGVuQnl0ZXMgIT0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmF3RGF0YS0+c2l6ZSgp
KSkKKyAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVzb3VyY2VMb2FkU3RhdGlzdGljcywgIlJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTogV2Ugb25seSB3cm90ZSAlZCBv
dXQgb2YgJXp1IGJ5dGVzIHRvIGRpc2siLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4od3JpdHRlbkJ5
dGVzKSwgcmF3RGF0YS0+c2l6ZSgpKTsKKworICAgIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1Rp
bWUgPSBXYWxsVGltZTo6bm93KCk7CisgICAgbV9sYXN0U3RhdGlzdGljc1dyaXRlVGltZSA9IE1v
bm90b25pY1RpbWU6Om5vdygpOworCisgICAgc3RhcnRNb25pdG9yaW5nRGlzaygpOworfQorCit2
b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6c2NoZWR1bGVPcldy
aXRlTWVtb3J5U3RvcmUoRm9yY2VJbW1lZGlhdGVXcml0ZSBmb3JjZUltbWVkaWF0ZVdyaXRlKQor
eworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworCisgICAgYXV0byB0aW1lU2luY2VM
YXN0V3JpdGUgPSBNb25vdG9uaWNUaW1lOjpub3coKSAtIG1fbGFzdFN0YXRpc3RpY3NXcml0ZVRp
bWU7CisgICAgaWYgKGZvcmNlSW1tZWRpYXRlV3JpdGUgIT0gRm9yY2VJbW1lZGlhdGVXcml0ZTo6
WWVzICYmIHRpbWVTaW5jZUxhc3RXcml0ZSA8IG1pbmltdW1Xcml0ZUludGVydmFsKSB7CisgICAg
ICAgIGlmICghbV9oYXNQZW5kaW5nV3JpdGUpIHsKKyAgICAgICAgICAgIG1faGFzUGVuZGluZ1dy
aXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIFNlY29uZHMgZGVsYXkgPSBtaW5pbXVtV3JpdGVJbnRl
cnZhbCAtIHRpbWVTaW5jZUxhc3RXcml0ZSArIDFfczsKKyAgICAgICAgICAgIFJ1bkxvb3A6Om1h
aW4oKS5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBkZWxh
eV0geworICAgICAgICAgICAgICAgIG1fYXN5bmNXcml0ZVRpbWVyLnN0YXJ0T25lU2hvdChkZWxh
eSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6Y2xlYXIoKQoreworICAgIEFTU0VSVCghUnVuTG9v
cDo6aXNNYWluKCkpOworICAgIFN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgo
KTsKKyAgICBpZiAoZmlsZVBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBz
dG9wTW9uaXRvcmluZ0Rpc2soKTsKKworICAgIGlmICghZGVsZXRlRmlsZShmaWxlUGF0aCkpCisg
ICAgICAgIFJFTEVBU0VfTE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3MsICJSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6IFVuYWJsZSB0byBkZWxldGUgc3RhdGlz
dGljcyBmaWxlOiAlcyIsIGZpbGVQYXRoLnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIFJlc291
cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZmluaXNoQWxsUGVuZGluZ1dvcmtT
eW5jaHJvbm91c2x5KCkKK3sKKyAgICBtX2FzeW5jV3JpdGVUaW1lci5zdG9wKCk7CisKKyAgICBC
aW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIC8vIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyB3
b3JrIGluIG91ciBxdWV1ZSBpcyBmaW5pc2hlZCBiZWZvcmUgd2UgdGVybWluYXRlLgorICAgIG1f
bWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCkuZGlzcGF0Y2goWyZzZW1hcGhvcmUsIHRoaXNd
IHsKKyAgICAgICAgLy8gV3JpdGUgZmluYWwgZmlsZSBzdGF0ZSB0byBkaXNrLgorICAgICAgICBp
ZiAobV9oYXNQZW5kaW5nV3JpdGUpCisgICAgICAgICAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNr
KCk7CisgICAgICAgIHNlbWFwaG9yZS5zaWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUu
d2FpdChXYWxsVGltZTo6aW5maW5pdHkoKSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlOjpyZWYoKQoreworICAgIG1fbWVtb3J5U3RvcmUucmVmKCk7
Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpkZXJl
ZigpCit7CisgICAgbV9tZW1vcnlTdG9yZS5kZXJlZigpOworfQorCisjaWYgIVBMQVRGT1JNKElP
UykKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpleGNsdWRl
RnJvbUJhY2t1cCgpIGNvbnN0Cit7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM1ZDJlZDRiYzY5
M2JhMWVhMjE5NDJlNDAzY2QxMzZkNGU3NjcyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
aApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRl
IDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9Nb25vdG9uaWNUaW1lLmg+CisjaW5jbHVk
ZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNsdWRlIDx3dGYvV2FsbFRpbWUuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgRmlsZU1v
bml0b3I7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzU3RvcmU7CisKK2NsYXNzIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZSB7CitwdWJsaWM6CisgICAgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlKFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9yZSYsIGNvbnN0IFN0cmluZyYgc3Rv
cmFnZURpcmVjdG9yeVBhdGgpOworICAgIH5SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2UoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworICAgIHZvaWQgY2xlYXIoKTsK
KworICAgIHZvaWQgZmluaXNoQWxsUGVuZGluZ1dvcmtTeW5jaHJvbm91c2x5KCk7CisKKyAgICB2
b2lkIHJlZigpOworICAgIHZvaWQgZGVyZWYoKTsKKworICAgIGVudW0gY2xhc3MgRm9yY2VJbW1l
ZGlhdGVXcml0ZSB7CisgICAgICAgIE5vLAorICAgICAgICBZZXMsCisgICAgfTsKKyAgICB2b2lk
IHNjaGVkdWxlT3JXcml0ZU1lbW9yeVN0b3JlKEZvcmNlSW1tZWRpYXRlV3JpdGUpOworCitwcml2
YXRlOgorICAgIFN0cmluZyBzdG9yYWdlRGlyZWN0b3J5UGF0aCgpIGNvbnN0OworICAgIFN0cmlu
ZyByZXNvdXJjZUxvZ0ZpbGVQYXRoKCkgY29uc3Q7CisKKyAgICB2b2lkIHN0YXJ0TW9uaXRvcmlu
Z0Rpc2soKTsKKyAgICB2b2lkIHN0b3BNb25pdG9yaW5nRGlzaygpOworICAgIHZvaWQgbW9uaXRv
ckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKTsKKworICAgIHZvaWQgd3JpdGVNZW1vcnlTdG9y
ZVRvRGlzaygpOworICAgIHZvaWQgcG9wdWxhdGVNZW1vcnlTdG9yZUZyb21EaXNrKCk7CisgICAg
dm9pZCBleGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0OworICAgIHZvaWQgcmVmcmVzaE1lbW9yeVN0
b3JlRnJvbURpc2soKTsKKyAgICB2b2lkIGFzeW5jV3JpdGVUaW1lckZpcmVkKCk7CisKKyAgICBX
ZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUmIG1fbWVtb3J5U3RvcmU7CisgICAgY29uc3Qg
U3RyaW5nIG1fc3RvcmFnZURpcmVjdG9yeVBhdGg7CisgICAgUnVuTG9vcDo6VGltZXI8UmVzb3Vy
Y2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlPiBtX2FzeW5jV3JpdGVUaW1lcjsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6RmlsZU1vbml0b3I+IG1fZmlsZU1vbml0b3I7Cisg
ICAgV2FsbFRpbWUgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZTsKKyAgICBNb25vdG9uaWNU
aW1lIG1fbGFzdFN0YXRpc3RpY3NXcml0ZVRpbWU7CisgICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0
ZSB7IGZhbHNlIH07Cit9OworCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vz
cy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9j
ZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCA1OThhM2JkNjg5MGU1M2Q5MWMzOTA0Yzk5NzllOTFkYWU0NTUwNTExLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwCisrKyAvZGV2L251bGwK
QEAgLTEsMzY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAs
IDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2UuaCIKLQotI2luY2x1
ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRmls
ZVN5c3RlbS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlU3RhdGVtZW50Lmg+Ci0jaW5jbHVk
ZSA8V2ViQ29yZS9TUUxpdGVUcmFuc2FjdGlvbi5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJp
dHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VNYXAuaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1N1ZGRlblRlcm1pbmF0aW9uLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgotI2lu
Y2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOwotCi1zdGF0aWMgY29uc3QgYXV0byBkYXRhYmFzZVVwZGF0ZUludGVydmFsID0gMV9zOwot
Ci1zdGF0aWMgY29uc3QgaW50IG1heGltdW1JdGVtc1RvVXBkYXRlID0gMTAwOwotCi1uYW1lc3Bh
Y2UgV2ViS2l0IHsKLQotUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlPiBMb2NhbFN0b3JhZ2VEYXRh
YmFzZTo6Y3JlYXRlKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIFJlZjxMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXI+JiYgdHJhY2tlciwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0
eU9yaWdpbikKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VEYXRhYmFz
ZShXVEZNb3ZlKHF1ZXVlKSwgV1RGTW92ZSh0cmFja2VyKSwgc2VjdXJpdHlPcmlnaW4pKTsKLX0K
LQotTG9jYWxTdG9yYWdlRGF0YWJhc2U6OkxvY2FsU3RvcmFnZURhdGFiYXNlKFJlZjxXb3JrUXVl
dWU+JiYgcXVldWUsIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYgdHJhY2tlciwg
Y29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKLSAgICA6IG1fcXVldWUo
V1RGTW92ZShxdWV1ZSkpCi0gICAgLCBtX3RyYWNrZXIoV1RGTW92ZSh0cmFja2VyKSkKLSAgICAs
IG1fc2VjdXJpdHlPcmlnaW4oc2VjdXJpdHlPcmlnaW4pCi0gICAgLCBtX2RhdGFiYXNlUGF0aCht
X3RyYWNrZXItPmRhdGFiYXNlUGF0aChtX3NlY3VyaXR5T3JpZ2luKSkKLSAgICAsIG1fZmFpbGVk
VG9PcGVuRGF0YWJhc2UoZmFsc2UpCi0gICAgLCBtX2RpZEltcG9ydEl0ZW1zKGZhbHNlKQotICAg
ICwgbV9pc0Nsb3NlZChmYWxzZSkKLSAgICAsIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZShm
YWxzZSkKLSAgICAsIG1fc2hvdWxkQ2xlYXJJdGVtcyhmYWxzZSkKLXsKLX0KLQotTG9jYWxTdG9y
YWdlRGF0YWJhc2U6On5Mb2NhbFN0b3JhZ2VEYXRhYmFzZSgpCi17Ci0gICAgQVNTRVJUKG1faXND
bG9zZWQpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpvcGVuRGF0YWJhc2UoRGF0
YWJhc2VPcGVuaW5nU3RyYXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQotewotICAgIEFTU0VSVCghbV9k
YXRhYmFzZS5pc09wZW4oKSk7Ci0gICAgQVNTRVJUKCFtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlKTsK
LQotICAgIGlmICghdHJ5VG9PcGVuRGF0YWJhc2Uob3BlbmluZ1N0cmF0ZWd5KSkgewotICAgICAg
ICBtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICBtX3RyYWNrZXItPmRpZE9w
ZW5EYXRhYmFzZVdpdGhPcmlnaW4obV9zZWN1cml0eU9yaWdpbik7Ci19Ci0KLWJvb2wgTG9jYWxT
dG9yYWdlRGF0YWJhc2U6OnRyeVRvT3BlbkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5
IG9wZW5pbmdTdHJhdGVneSkKLXsKLSAgICBpZiAoIWZpbGVFeGlzdHMobV9kYXRhYmFzZVBhdGgp
ICYmIG9wZW5pbmdTdHJhdGVneSA9PSBTa2lwSWZOb25FeGlzdGVudCkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBpZiAobV9kYXRhYmFzZVBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAgIExP
R19FUlJPUigiRmlsZW5hbWUgZm9yIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgaXMgZW1wdHkgLSBj
YW5ub3Qgb3BlbiBmb3IgcGVyc2lzdGVudCBzdG9yYWdlIik7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNlUGF0aCkpIHsK
LSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBmaWxlICVzIGZvciBs
b2NhbCBzdG9yYWdlIiwgbV9kYXRhYmFzZVBhdGgudXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBTaW5jZSBhIFdvcmtRdWV1ZSBpc24ndCBib3Vu
ZCB0byBhIHNwZWNpZmljIHRocmVhZCwgd2UgaGF2ZSB0byBkaXNhYmxlIHRocmVhZGluZyBjaGVj
a3MKLSAgICAvLyBldmVuIHRob3VnaCB3ZSBuZXZlciBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZyb20g
ZGlmZmVyZW50IHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCi0gICAgbV9kYXRhYmFzZS5kaXNhYmxl
VGhyZWFkaW5nQ2hlY2tzKCk7Ci0KLSAgICBpZiAoIW1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgp
KSB7Ci0gICAgICAgIC8vIFdlIGZhaWxlZCB0byBtaWdyYXRlIHRoZSBpdGVtIHRhYmxlLiBJbiBv
cmRlciB0byBhdm9pZCB0cnlpbmcgdG8gbWlncmF0ZSB0aGUgdGFibGUgb3ZlciBhbmQgb3ZlciwK
LSAgICAgICAgLy8ganVzdCBkZWxldGUgaXQgYW5kIHN0YXJ0IGZyb20gc2NyYXRjaC4KLSAgICAg
ICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJEUk9QIFRBQkxFIEl0ZW1UYWJsZSIp
KQotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZGVsZXRlIHRhYmxlIEl0ZW1UYWJs
ZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAgIH0KLQotICAgIGlmICghbV9kYXRhYmFzZS5leGVj
dXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgSXRlbVRhYmxlIChrZXkgVEVY
VCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgdmFsdWUgQkxPQiBOT1QgTlVMTCBPTiBDT05G
TElDVCBGQUlMKSIpKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0YWJs
ZSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIExvY2FsU3RvcmFnZURhdGFiYXNl
OjptaWdyYXRlSXRlbVRhYmxlSWZOZWVkZWQoKQotewotICAgIGlmICghbV9kYXRhYmFzZS50YWJs
ZUV4aXN0cygiSXRlbVRhYmxlIikpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgU1FMaXRl
U3RhdGVtZW50IHF1ZXJ5KG1fZGF0YWJhc2UsICJTRUxFQ1QgdmFsdWUgRlJPTSBJdGVtVGFibGUg
TElNSVQgMSIpOwotCi0gICAgLy8gVGhpcyBxdWVyeSBpc24ndCBldmVyIGV4ZWN1dGVkLCBpdCdz
IGp1c3QgdXNlZCB0byBjaGVjayB0aGUgY29sdW1uIHR5cGUuCi0gICAgaWYgKHF1ZXJ5LmlzQ29s
dW1uRGVjbGFyZWRBc0Jsb2IoMCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQ3Jl
YXRlIGEgbmV3IHRhYmxlIHdpdGggdGhlIHJpZ2h0IHR5cGUsIGNvcHkgYWxsIHRoZSBkYXRhIG92
ZXIgdG8gaXQgYW5kIHRoZW4gcmVwbGFjZSB0aGUgbmV3IHRhYmxlIHdpdGggdGhlIG9sZCB0YWJs
ZS4KLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKLSAgICAgICAgIkRST1Ag
VEFCTEUgSUYgRVhJU1RTIEl0ZW1UYWJsZTIiLAotICAgICAgICAiQ1JFQVRFIFRBQkxFIEl0ZW1U
YWJsZTIgKGtleSBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCB2YWx1ZSBCTE9CIE5P
VCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpIiwKLSAgICAgICAgIklOU0VSVCBJTlRPIEl0ZW1UYWJs
ZTIgU0VMRUNUICogZnJvbSBJdGVtVGFibGUiLAotICAgICAgICAiRFJPUCBUQUJMRSBJdGVtVGFi
bGUiLAotICAgICAgICAiQUxURVIgVEFCTEUgSXRlbVRhYmxlMiBSRU5BTUUgVE8gSXRlbVRhYmxl
IiwKLSAgICAgICAgMCwKLSAgICB9OwotCi0gICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rp
b24obV9kYXRhYmFzZSwgZmFsc2UpOwotICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7Ci0KLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgY29tbWFuZHNbaV07ICsraSkgewotICAgICAgICBpZiAobV9kYXRh
YmFzZS5leGVjdXRlQ29tbWFuZChjb21tYW5kc1tpXSkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBtaWdyYXRlIHRhYmxlIEl0ZW1UYWJsZSBm
b3IgbG9jYWwgc3RvcmFnZSB3aGVuIGV4ZWN1dGluZzogJXMiLCBjb21tYW5kc1tpXSk7Ci0gICAg
ICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjppbXBvcnRJdGVtcyhTdG9yYWdlTWFwJiBzdG9yYWdl
TWFwKQotewotICAgIGlmIChtX2RpZEltcG9ydEl0ZW1zKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBGSVhNRTogSWYgaXQgY2FuJ3QgaW1wb3J0LCB0aGVuIHRoZSBkZWZhdWx0IFdlYktpdCBi
ZWhhdmlvciBzaG91bGQgYmUgdGhhdCBvZiBwcml2YXRlIGJyb3dzaW5nLAotICAgIC8vIG5vdCBz
aWxlbnRseSBpZ25vcmluZyBpdC4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTI1ODk0Ci0KLSAgICAvLyBXZSBzZXQgdGhpcyB0byB0cnVlIGV2ZW4gaWYgd2UgZG9uJ3Qg
ZW5kIHVwIGltcG9ydGluZyBhbnkgaXRlbXMgZHVlIHRvIGZhaWx1cmUgYmVjYXVzZQotICAgIC8v
IHRoZXJlJ3MgcmVhbGx5IG5vIGdvb2Qgd2F5IHRvIHJlY292ZXIgb3RoZXIgdGhhbiBub3QgaW1w
b3J0aW5nIGFueXRoaW5nLgotICAgIG1fZGlkSW1wb3J0SXRlbXMgPSB0cnVlOwotCi0gICAgb3Bl
bkRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RhdGFi
YXNlLCAiU0VMRUNUIGtleSwgdmFsdWUgRlJPTSBJdGVtVGFibGUiKTsKLSAgICBpZiAocXVlcnku
cHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBz
ZWxlY3QgaXRlbXMgZnJvbSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW1zOwotCi0g
ICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKLSAgICB3aGlsZSAocmVzdWx0ID09IFNRTElU
RV9ST1cpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHF1ZXJ5LmdldENvbHVtblRleHQoMCk7Ci0g
ICAgICAgIFN0cmluZyB2YWx1ZSA9IHF1ZXJ5LmdldENvbHVtbkJsb2JBc1N0cmluZygxKTsKLSAg
ICAgICAgaWYgKCFrZXkuaXNOdWxsKCkgJiYgIXZhbHVlLmlzTnVsbCgpKQotICAgICAgICAgICAg
aXRlbXMuc2V0KGtleSwgdmFsdWUpOwotICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7Ci0g
ICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICBMT0dfRVJS
T1IoIkVycm9yIHJlYWRpbmcgaXRlbXMgZnJvbSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2Ui
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0b3JhZ2VNYXAuaW1wb3J0SXRlbXMo
aXRlbXMpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpzZXRJdGVtKGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQotewotICAgIGl0ZW1EaWRDaGFuZ2Uoa2V5
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnJlbW92ZUl0ZW0oY29u
c3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgaXRlbURpZENoYW5nZShrZXksIFN0cmluZygpKTsKLX0K
LQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6Y2xlYXIoKQotewotICAgIG1fY2hhbmdlZEl0
ZW1zLmNsZWFyKCk7Ci0gICAgbV9zaG91bGRDbGVhckl0ZW1zID0gdHJ1ZTsKLQotICAgIHNjaGVk
dWxlRGF0YWJhc2VVcGRhdGUoKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6Y2xv
c2UoKQotewotICAgIEFTU0VSVCghbV9pc0Nsb3NlZCk7Ci0gICAgbV9pc0Nsb3NlZCA9IHRydWU7
Ci0KLSAgICBpZiAobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKSB7Ci0gICAgICAgIHVwZGF0
ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhtX2NoYW5nZWRJdGVtcyk7Ci0gICAgICAgIG1fY2hh
bmdlZEl0ZW1zLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0VtcHR5ID0gZGF0YWJhc2VJ
c0VtcHR5KCk7Ci0KLSAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgbV9kYXRh
YmFzZS5jbG9zZSgpOwotCi0gICAgaWYgKGlzRW1wdHkpCi0gICAgICAgIG1fdHJhY2tlci0+ZGVs
ZXRlRGF0YWJhc2VXaXRoT3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pOwotfQotCi12b2lkIExvY2Fs
U3RvcmFnZURhdGFiYXNlOjppdGVtRGlkQ2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBT
dHJpbmcmIHZhbHVlKQotewotICAgIG1fY2hhbmdlZEl0ZW1zLnNldChrZXksIHZhbHVlKTsKLSAg
ICBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJh
c2U6OnNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoKQotewotICAgIGlmIChtX2RpZFNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9kaXNhYmxlU3VkZGVu
VGVybWluYXRpb25XaGlsZVdyaXRpbmdUb0xvY2FsU3RvcmFnZSkKLSAgICAgICAgbV9kaXNhYmxl
U3VkZGVuVGVybWluYXRpb25XaGlsZVdyaXRpbmdUb0xvY2FsU3RvcmFnZSA9IHN0ZDo6bWFrZV91
bmlxdWU8U3VkZGVuVGVybWluYXRpb25EaXNhYmxlcj4oKTsKLQotICAgIG1fZGlkU2NoZWR1bGVE
YXRhYmFzZVVwZGF0ZSA9IHRydWU7Ci0KLSAgICBSZWZQdHI8TG9jYWxTdG9yYWdlRGF0YWJhc2U+
IGxvY2FsU3RvcmFnZURhdGFiYXNlKHRoaXMpOwotICAgIG1fcXVldWUtPmRpc3BhdGNoQWZ0ZXIo
ZGF0YWJhc2VVcGRhdGVJbnRlcnZhbCwgW2xvY2FsU3RvcmFnZURhdGFiYXNlXSB7Ci0gICAgICAg
IGxvY2FsU3RvcmFnZURhdGFiYXNlLT51cGRhdGVEYXRhYmFzZSgpOwotICAgIH0pOwotfQotCi12
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjp1cGRhdGVEYXRhYmFzZSgpCi17Ci0gICAgaWYgKG1f
aXNDbG9zZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX2RpZFNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUpOwotICAgIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSA9IGZhbHNlOwot
Ci0gICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY2hhbmdlZEl0ZW1zOwotICAgIGlmIChtX2No
YW5nZWRJdGVtcy5zaXplKCkgPD0gbWF4aW11bUl0ZW1zVG9VcGRhdGUpIHsKLSAgICAgICAgLy8g
VGhlcmUgYXJlIGZldyBlbm91Z2ggY2hhbmdlZCBpdGVtcyB0aGF0IHdlIGNhbiBqdXN0IGFsd2F5
cyB3cml0ZSBhbGwgb2YgdGhlbS4KLSAgICAgICAgbV9jaGFuZ2VkSXRlbXMuc3dhcChjaGFuZ2Vk
SXRlbXMpOwotICAgICAgICB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMoY2hhbmdlZEl0
ZW1zKTsKLSAgICAgICAgbV9kaXNhYmxlU3VkZGVuVGVybWluYXRpb25XaGlsZVdyaXRpbmdUb0xv
Y2FsU3RvcmFnZSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBtYXhpbXVtSXRlbXNUb1VwZGF0ZTsgKytpKSB7Ci0gICAgICAgICAgICBhdXRvIGl0
ID0gbV9jaGFuZ2VkSXRlbXMuYmVnaW4oKTsKLSAgICAgICAgICAgIGNoYW5nZWRJdGVtcy5hZGQo
aXQtPmtleSwgaXQtPnZhbHVlKTsKLQotICAgICAgICAgICAgbV9jaGFuZ2VkSXRlbXMucmVtb3Zl
KGl0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTU0VSVChjaGFuZ2VkSXRlbXMuc2l6ZSgpIDw9
IG1heGltdW1JdGVtc1RvVXBkYXRlKTsKLQotICAgICAgICAvLyBSZXNjaGVkdWxlIHRoZSB1cGRh
dGUgZm9yIHRoZSByZW1haW5pbmcgaXRlbXMuCi0gICAgICAgIHNjaGVkdWxlRGF0YWJhc2VVcGRh
dGUoKTsKLSAgICAgICAgdXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNoYW5nZWRJdGVt
cyk7Ci0gICAgfQotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjp1cGRhdGVEYXRhYmFz
ZVdpdGhDaGFuZ2VkSXRlbXMoY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIGNoYW5nZWRJ
dGVtcykKLXsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIG9wZW5EYXRh
YmFzZShDcmVhdGVJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3Nob3VsZENsZWFySXRlbXMpIHsKLSAgICAg
ICAgbV9zaG91bGRDbGVhckl0ZW1zID0gZmFsc2U7Ci0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50
IGNsZWFyU3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBJdGVtVGFibGUiKTsKLSAg
ICAgICAgaWYgKGNsZWFyU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgY2xlYXIgc3RhdGVtZW50IC0gY2Fu
bm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UiKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXN1bHQgPSBjbGVhclN0YXRlbWVudC5zdGVw
KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgICAgIExP
R19FUlJPUigiRmFpbGVkIHRvIGNsZWFyIGFsbCBpdGVtcyBpbiB0aGUgbG9jYWwgc3RvcmFnZSBk
YXRhYmFzZSAtICVpIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIFNRTGl0ZVN0YXRlbWVudCBpbnNlcnRTdGF0ZW1lbnQobV9kYXRhYmFzZSwg
IklOU0VSVCBJTlRPIEl0ZW1UYWJsZSBWQUxVRVMgKD8sID8pIik7Ci0gICAgaWYgKGluc2VydFN0
YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFp
bGVkIHRvIHByZXBhcmUgaW5zZXJ0IHN0YXRlbWVudCAtIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBz
dG9yYWdlIGRhdGFiYXNlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTUUxpdGVT
dGF0ZW1lbnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBJdGVtVGFi
bGUgV0hFUkUga2V5PT8iKTsKLSAgICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSAhPSBT
UUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBkZWxldGUg
c3RhdGVtZW50IC0gY2Fubm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UiKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9u
KG1fZGF0YWJhc2UpOwotICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7Ci0KLSAgICBmb3IgKGF1dG8g
aXQgPSBjaGFuZ2VkSXRlbXMuYmVnaW4oKSwgZW5kID0gY2hhbmdlZEl0ZW1zLmVuZCgpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gQSBudWxsIHZhbHVlIG1lYW5zIHRoYXQgdGhlIGtl
eS92YWx1ZSBwYWlyIHNob3VsZCBiZSBkZWxldGVkLgotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQm
IHN0YXRlbWVudCA9IGl0LT52YWx1ZS5pc051bGwoKSA/IGRlbGV0ZVN0YXRlbWVudCA6IGluc2Vy
dFN0YXRlbWVudDsKLQotICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgaXQtPmtleSk7Ci0K
LSAgICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0aW5nIGEga2V5L3ZhbHVlIHBhaXIsIGJpbmQgdGhl
IHZhbHVlIGFzIHdlbGwuCi0gICAgICAgIGlmICghaXQtPnZhbHVlLmlzTnVsbCgpKQotICAgICAg
ICAgICAgc3RhdGVtZW50LmJpbmRCbG9iKDIsIGl0LT52YWx1ZSk7Ci0KLSAgICAgICAgaW50IHJl
c3VsdCA9IHN0YXRlbWVudC5zdGVwKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RP
TkUpIHsKLSAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHVwZGF0ZSBpdGVtIGluIHRo
ZSBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIC0gJWkiLCByZXN1bHQpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZW1lbnQucmVzZXQoKTsKLSAgICB9Ci0KLSAg
ICB0cmFuc2FjdGlvbi5jb21taXQoKTsKLX0KLQotYm9vbCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6
ZGF0YWJhc2VJc0VtcHR5KCkKLXsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RhdGFiYXNl
LCAiU0VMRUNUIENPVU5UKCopIEZST00gSXRlbVRhYmxlIik7Ci0gICAgaWYgKHF1ZXJ5LnByZXBh
cmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY291bnQg
bnVtYmVyIG9mIHJvd3MgaW4gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOwot
ICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX1JPVykgewotICAgICAgICBMT0dfRVJST1IoIk5vIHJl
c3VsdHMgd2hlbiBjb3VudGluZyBudW1iZXIgb2Ygcm93cyBpbiBJdGVtVGFibGUgZm9yIGxvY2Fs
IHN0b3JhZ2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiAh
cXVlcnkuZ2V0Q29sdW1uSW50KDApOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJh
c2UuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJh
c2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5MjAzMWY0NDhmYjNkOTE1ODAx
ODZkODg2MGExMmQ4NDg1OTU2Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURh
dGFiYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZURh
dGFiYXNlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KLSNpbmNs
dWRlIDx3dGYvRm9yd2FyZC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8
d3RmL1JlZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgotI2lu
Y2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2Vj
dXJpdHlPcmlnaW47Ci1jbGFzcyBTdG9yYWdlTWFwOwotY2xhc3MgU3VkZGVuVGVybWluYXRpb25E
aXNhYmxlcjsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcjsKLQotY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2UgOiBwdWJsaWMgVGhy
ZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IHsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlPiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiwg
UmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJik7Ci0gICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlKCk7Ci0KLSAgICAvLyBX
aWxsIGJsb2NrIHVudGlsIHRoZSBpbXBvcnQgaXMgY29tcGxldGUuCi0gICAgdm9pZCBpbXBvcnRJ
dGVtcyhXZWJDb3JlOjpTdG9yYWdlTWFwJik7Ci0KLSAgICB2b2lkIHNldEl0ZW0oY29uc3QgU3Ry
aW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpOwotICAgIHZvaWQgcmVtb3ZlSXRlbShjb25z
dCBTdHJpbmcmIGtleSk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLy8gV2lsbCBibG9jayB1
bnRpbCBhbGwgcGVuZGluZyBjaGFuZ2VzIGhhdmUgYmVlbiB3cml0dGVuIHRvIGRpc2suCi0gICAg
dm9pZCBjbG9zZSgpOwotCi1wcml2YXRlOgotICAgIExvY2FsU3RvcmFnZURhdGFiYXNlKFJlZjxX
b3JrUXVldWU+JiYsIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0IFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOwotCi0gICAgZW51bSBEYXRhYmFzZU9wZW5pbmdT
dHJhdGVneSB7Ci0gICAgICAgIENyZWF0ZUlmTm9uRXhpc3RlbnQsCi0gICAgICAgIFNraXBJZk5v
bkV4aXN0ZW50Ci0gICAgfTsKLSAgICBib29sIHRyeVRvT3BlbkRhdGFiYXNlKERhdGFiYXNlT3Bl
bmluZ1N0cmF0ZWd5KTsKLSAgICB2b2lkIG9wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJh
dGVneSk7Ci0KLSAgICBib29sIG1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgpOwotCi0gICAgdm9p
ZCBpdGVtRGlkQ2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsK
LQotICAgIHZvaWQgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOwotICAgIHZvaWQgdXBkYXRlRGF0
YWJhc2UoKTsKLSAgICB2b2lkIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjb25zdCBI
YXNoTWFwPFN0cmluZywgU3RyaW5nPiYpOwotCi0gICAgYm9vbCBkYXRhYmFzZUlzRW1wdHkoKTsK
LQotICAgIFJlZjxXb3JrUXVldWU+IG1fcXVldWU7Ci0gICAgUmVmPExvY2FsU3RvcmFnZURhdGFi
YXNlVHJhY2tlcj4gbV90cmFja2VyOwotICAgIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBt
X3NlY3VyaXR5T3JpZ2luOwotCi0gICAgU3RyaW5nIG1fZGF0YWJhc2VQYXRoOwotICAgIFdlYkNv
cmU6OlNRTGl0ZURhdGFiYXNlIG1fZGF0YWJhc2U7Ci0gICAgYm9vbCBtX2ZhaWxlZFRvT3BlbkRh
dGFiYXNlOwotICAgIGJvb2wgbV9kaWRJbXBvcnRJdGVtczsKLSAgICBib29sIG1faXNDbG9zZWQ7
Ci0KLSAgICBib29sIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZTsKLSAgICBib29sIG1fc2hv
dWxkQ2xlYXJJdGVtczsKLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtX2NoYW5nZWRJdGVt
czsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTdWRkZW5UZXJtaW5hdGlvbkRpc2Fi
bGVyPiBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdl
OwotfTsKLQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcCBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliMjI5ZjZiNTM3NGE3NzQ2M2Fh
ZjliNDY0Y2U5MzZhMDRhY2MyYi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXIuaCIKLQotI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgotI2lu
Y2x1ZGUgPFdlYkNvcmUvU1FMaXRlRmlsZVN5c3RlbS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU1FM
aXRlU3RhdGVtZW50Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbi5oPgotI2lu
Y2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9U
ZXh0RW5jb2RpbmcuaD4KLSNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgotI2luY2x1ZGUgPHd0
Zi9SdW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90
ZXh0L0NTdHJpbmcuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBX
ZWJLaXQgewotCi1SZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiBMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI6OmNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBjb25zdCBTdHJp
bmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBM
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIoV1RGTW92ZShxdWV1ZSksIGxvY2FsU3RvcmFnZURp
cmVjdG9yeSkpOwotfQotCi1Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OkxvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcihSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBjb25zdCBTdHJpbmcmIGxv
Y2FsU3RvcmFnZURpcmVjdG9yeSkKLSAgICA6IG1fcXVldWUoV1RGTW92ZShxdWV1ZSkpCi0gICAg
LCBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeShsb2NhbFN0b3JhZ2VEaXJlY3RvcnkuaXNvbGF0ZWRD
b3B5KCkpCi17Ci0gICAgQVNTRVJUKCFtX2xvY2FsU3RvcmFnZURpcmVjdG9yeS5pc0VtcHR5KCkp
OwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBlbmNvZGluZyBpcyBpbml0aWFsaXplZCBiZWZvcmUg
d2Ugc3RhcnQgZGlzcGF0Y2hpbmcgdGhpbmdzIHRvIHRoZSBxdWV1ZS4KLSAgICBVVEY4RW5jb2Rp
bmcoKTsKLQotICAgIG1fcXVldWUtPmRpc3BhdGNoKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigq
dGhpcyldKCkgbXV0YWJsZSB7Ci0gICAgICAgIHByb3RlY3RlZFRoaXMtPmltcG9ydE9yaWdpbklk
ZW50aWZpZXJzKCk7Ci0gICAgfSk7Ci19Ci0KLUxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6
fkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcigpCi17Ci19Ci0KLVN0cmluZyBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEm
IHNlY3VyaXR5T3JpZ2luKSBjb25zdAotewotICAgIHJldHVybiBkYXRhYmFzZVBhdGgoc2VjdXJp
dHlPcmlnaW4uZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmxvY2Fsc3RvcmFnZSIpOwotfQotCi12
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdp
bihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIGFkZERh
dGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoc2VjdXJpdHlPcmlnaW4uZGF0YWJhc2VJZGVudGlm
aWVyKCksIGRhdGFiYXNlUGF0aChzZWN1cml0eU9yaWdpbikpOwotfQotCi12b2lkIExvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VXaXRoT3JpZ2luKGNvbnN0IFNlY3Vy
aXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAgcmVtb3ZlRGF0YWJhc2VXaXRo
T3JpZ2luSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSk7Ci19
Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVBbGxEYXRhYmFzZXMo
KQotewotICAgIG1fb3JpZ2lucy5jbGVhcigpOwotCi0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShT
a2lwSWZOb25FeGlzdGVudCk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJT
RUxFQ1Qgb3JpZ2luLCBwYXRoIEZST00gT3JpZ2lucyIpOwotICAgIGlmIChzdGF0ZW1lbnQucHJl
cGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVw
YXJlIHN0YXRlbWVudC4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCByZXN1
bHQ7Ci0gICAgd2hpbGUgKChyZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpKSA9PSBTUUxJVEVfUk9X
KSB7Ci0gICAgICAgIGRlbGV0ZUZpbGUoc3RhdGVtZW50LmdldENvbHVtblRleHQoMSkpOwotCi0g
ICAgICAgIC8vIEZJWE1FOiBDYWxsIG91dCB0byB0aGUgY2xpZW50LgotICAgIH0KLQotICAgIGlm
IChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJl
YWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7Ci0KLSAgICBpZiAobV9kYXRh
YmFzZS5pc09wZW4oKSkKLSAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOwotCi0gICAgaWYgKCFk
ZWxldGVGaWxlKHRyYWNrZXJEYXRhYmFzZVBhdGgoKSkpIHsKLSAgICAgICAgLy8gSW4gdGhlIGNh
c2Ugd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZSAo
ZS5nIHNvbWUgb3RoZXIgcHJvZ3JhbQotICAgICAgICAvLyBsaWtlIGEgdmlydXMgc2Nhbm5lciBp
cyBhY2Nlc3NpbmcgaXQpLCBtYWtlIHN1cmUgdG8gcmVtb3ZlIGFsbCBlbnRyaWVzLgotICAgICAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKLSAgICAgICAgaWYgKCFt
X2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFNRTGl0
ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIE9yaWdp
bnMiKTsKLSAgICAgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09L
KSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9m
IGFsbCBvcmlnaW5zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICAgICAgTE9H
X0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBhbGwgb3JpZ2lucyIpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlRW1wdHlEaXJl
Y3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOwotfQotCi1zdGF0aWMgc3RkOjpvcHRpb25h
bDx0aW1lX3Q+IGZpbGVDcmVhdGlvblRpbWUoY29uc3QgU3RyaW5nJiBmaWxlUGF0aCkKLXsKLSAg
ICB0aW1lX3QgdGltZTsKLSAgICByZXR1cm4gZ2V0RmlsZUNyZWF0aW9uVGltZShmaWxlUGF0aCwg
dGltZSkgPyB0aW1lIDogc3RkOjpvcHRpb25hbDx0aW1lX3Q+KHN0ZDo6bnVsbG9wdCk7Ci19Ci0K
LXN0YXRpYyBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gZmlsZU1vZGlmaWNhdGlvblRpbWUoY29uc3Qg
U3RyaW5nJiBmaWxlUGF0aCkKLXsKLSAgICB0aW1lX3QgdGltZTsKLSAgICBpZiAoIWdldEZpbGVN
b2RpZmljYXRpb25UaW1lKGZpbGVQYXRoLCB0aW1lKSkKLSAgICAgICAgcmV0dXJuIHN0ZDo6bnVs
bG9wdDsKLQotICAgIHJldHVybiB0aW1lOwotfQotCi1WZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRh
PiBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlc01vZGlmaWVkU2lu
Y2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lKQotewotICAgIEFT
U0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIGltcG9ydE9yaWdpbklkZW50aWZpZXJzKCk7
Ci0gICAgVmVjdG9yPFN0cmluZz4gb3JpZ2luSWRlbnRpZmllcnNUb0RlbGV0ZTsKLQotICAgIGZv
ciAoY29uc3QgU3RyaW5nJiBvcmlnaW4gOiBtX29yaWdpbnMpIHsKLSAgICAgICAgU3RyaW5nIGZp
bGVQYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luKTsKLQot
ICAgICAgICBhdXRvIG1vZGlmaWNhdGlvblRpbWUgPSBmaWxlTW9kaWZpY2F0aW9uVGltZShmaWxl
UGF0aCk7Ci0gICAgICAgIGlmICghbW9kaWZpY2F0aW9uVGltZSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIGlmIChtb2RpZmljYXRpb25UaW1lLnZhbHVlKCkgPj0gc3RkOjpjaHJv
bm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KHRpbWUpKQotICAgICAgICAgICAgb3JpZ2luSWRl
bnRpZmllcnNUb0RlbGV0ZS5hcHBlbmQob3JpZ2luKTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8U2Vj
dXJpdHlPcmlnaW5EYXRhPiBkZWxldGVkRGF0YWJhc2VPcmlnaW5zOwotICAgIGRlbGV0ZWREYXRh
YmFzZU9yaWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5JZGVudGlmaWVyc1RvRGVs
ZXRlLnNpemUoKSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIG9yaWdpbklkZW50aWZpZXIgOiBv
cmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlKSB7Ci0gICAgICAgIHJlbW92ZURhdGFiYXNlV2l0aE9y
aWdpbklkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcik7Ci0KLSAgICAgICAgaWYgKGF1dG8gb3Jp
Z2luID0gU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tRGF0YWJhc2VJZGVudGlmaWVyKG9yaWdpbklk
ZW50aWZpZXIpKQotICAgICAgICAgICAgZGVsZXRlZERhdGFiYXNlT3JpZ2lucy51bmNoZWNrZWRB
cHBlbmQoKm9yaWdpbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgIH0KLQotICAgIHJldHVybiBkZWxldGVkRGF0YWJhc2VPcmlnaW5zOwotfQot
Ci1WZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6
Om9yaWdpbnMoKSBjb25zdAotewotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdp
bnM7Ci0gICAgb3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fb3JpZ2lucy5zaXplKCkp
OwotCi0gICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIgOiBtX29yaWdpbnMp
IHsKLSAgICAgICAgaWYgKGF1dG8gb3JpZ2luID0gU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tRGF0
YWJhc2VJZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpKQotICAgICAgICAgICAgb3JpZ2lucy51
bmNoZWNrZWRBcHBlbmQoKm9yaWdpbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLQotICAgIHJldHVybiBvcmlnaW5zOwotfQotCi1WZWN0
b3I8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpPcmlnaW5EZXRhaWxzPiBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbkRldGFpbHMoKQotewotICAgIFZlY3RvcjxPcmlnaW5E
ZXRhaWxzPiByZXN1bHQ7Ci0gICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9vcmln
aW5zLnNpemUoKSk7Ci0KLSAgICBmb3IgKGNvbnN0IFN0cmluZyYgb3JpZ2luIDogbV9vcmlnaW5z
KSB7Ci0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IHBhdGhGb3JEYXRhYmFzZVdpdGhPcmlnaW5J
ZGVudGlmaWVyKG9yaWdpbik7Ci0KLSAgICAgICAgT3JpZ2luRGV0YWlscyBkZXRhaWxzOwotICAg
ICAgICBkZXRhaWxzLm9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4uaXNvbGF0ZWRDb3B5KCk7Ci0g
ICAgICAgIGRldGFpbHMuY3JlYXRpb25UaW1lID0gZmlsZUNyZWF0aW9uVGltZShmaWxlUGF0aCk7
Ci0gICAgICAgIGRldGFpbHMubW9kaWZpY2F0aW9uVGltZSA9IGZpbGVNb2RpZmljYXRpb25UaW1l
KGZpbGVQYXRoKTsKLSAgICAgICAgcmVzdWx0LnVuY2hlY2tlZEFwcGVuZChkZXRhaWxzKTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1TdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyOjpkYXRhYmFzZVBhdGgoY29uc3QgU3RyaW5nJiBmaWxlbmFtZSkgY29uc3QKLXsK
LSAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSkpIHsK
LSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIExvY2FsU3RvcmFnZSBkYXRhYmFz
ZSBwYXRoICVzIiwgbV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkudXRmOCgpLmRhdGEoKSk7Ci0gICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKLSAgICB9Ci0KLSNpZiBQTEFURk9STShJT1MpCi0gICAgcGxh
dGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFja3VwKCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBwYXRo
QnlBcHBlbmRpbmdDb21wb25lbnQobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnksIGZpbGVuYW1lKTsK
LX0KLQotU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6dHJhY2tlckRhdGFiYXNl
UGF0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRhdGFiYXNlUGF0aCgiU3RvcmFnZVRyYWNrZXIu
ZGIiKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2Vy
RGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQotewotICAg
IGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcg
ZGF0YWJhc2VQYXRoID0gdHJhY2tlckRhdGFiYXNlUGF0aCgpOwotCi0gICAgaWYgKCFmaWxlRXhp
c3RzKGRhdGFiYXNlUGF0aCkgJiYgb3BlbmluZ1N0cmF0ZWd5ID09IFNraXBJZk5vbkV4aXN0ZW50
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIW1fZGF0YWJhc2Uub3BlbihkYXRhYmFzZVBh
dGgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2VQYXRoICVz
LiIsIGRhdGFiYXNlUGF0aC5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBTaW5jZSBhIFdvcmtRdWV1ZSBpc24ndCBib3VuZCB0byBhIHNwZWNpZmljIHRo
cmVhZCwgd2UgaGF2ZSB0byBkaXNhYmxlIHRocmVhZGluZyBjaGVja3MKLSAgICAvLyBldmVuIHRo
b3VnaCB3ZSBuZXZlciBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZyb20gZGlmZmVyZW50IHRocmVhZHMg
c2ltdWx0YW5lb3VzbHkuCi0gICAgbV9kYXRhYmFzZS5kaXNhYmxlVGhyZWFkaW5nQ2hlY2tzKCk7
Ci0KLSAgICBpZiAobV9kYXRhYmFzZS50YWJsZUV4aXN0cygiT3JpZ2lucyIpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJM
RSBPcmlnaW5zIChvcmlnaW4gVEVYVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgcGF0aCBU
RVhUKTsiKSkKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIE9yaWdpbnMgdGFi
bGUuIik7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjppbXBvcnRPcmln
aW5JZGVudGlmaWVycygpCi17Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShTa2lwSWZOb25FeGlz
dGVudCk7Ci0KLSAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICBTUUxpdGVT
dGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1Qgb3JpZ2luIEZST00gT3JpZ2lu
cyIpOwotICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAg
ICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlc3VsdDsKLQotICAg
ICAgICB3aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTElURV9ST1cpCi0g
ICAgICAgICAgICBtX29yaWdpbnMuYWRkKHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApKTsKLQot
ICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7Ci0gICAgICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byByZWFkIGluIGFsbCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlLiIpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdXBkYXRlVHJhY2tl
ckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKTsKLX0KLQotdm9pZCBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnVwZGF0ZVRyYWNrZXJEYXRhYmFzZUZyb21Mb2NhbFN0
b3JhZ2VEYXRhYmFzZUZpbGVzKCkKLXsKLSAgICBWZWN0b3I8U3RyaW5nPiBwYXRocyA9IGxpc3RE
aXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnksICIqLmxvY2Fsc3RvcmFnZSIpOwotCi0g
ICAgSGFzaFNldDxTdHJpbmc+IG9yaWdpbnMobV9vcmlnaW5zKTsKLSAgICBIYXNoU2V0PFN0cmlu
Zz4gb3JpZ2luc0Zyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVzOwotCi0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBwYXRocy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBTdHJpbmcm
IHBhdGggPSBwYXRoc1tpXTsKLQotICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi5sb2NhbHN0
b3JhZ2UiKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFN0cmluZyBmaWxlbmFt
ZSA9IHBhdGhHZXRGaWxlTmFtZShwYXRoKTsKLQotICAgICAgICBTdHJpbmcgb3JpZ2luSWRlbnRp
ZmllciA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIHN0cmxlbigi
LmxvY2Fsc3RvcmFnZSIpKTsKLQotICAgICAgICBpZiAoIW1fb3JpZ2lucy5jb250YWlucyhvcmln
aW5JZGVudGlmaWVyKSkKLSAgICAgICAgICAgIGFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZp
ZXIob3JpZ2luSWRlbnRpZmllciwgcGF0aCk7Ci0KLSAgICAgICAgb3JpZ2luc0Zyb21Mb2NhbFN0
b3JhZ2VEYXRhYmFzZUZpbGVzLmFkZChvcmlnaW5JZGVudGlmaWVyKTsKLSAgICB9Ci0KLSAgICBm
b3IgKGF1dG8gaXQgPSBvcmlnaW5zLmJlZ2luKCksIGVuZCA9IG9yaWdpbnMuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIgPSAq
aXQ7Ci0gICAgICAgIGlmIChvcmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2luSWRl
bnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0
cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZVBhdGgpCi17Ci0g
ICAgb3BlblRyYWNrZXJEYXRhYmFzZShDcmVhdGVJZk5vbkV4aXN0ZW50KTsKLSAgICBpZiAoIW1f
ZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNRTGl0ZVN0YXRlbWVu
dCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIE9yaWdpbnMgVkFMVUVTICg/LCA/
KSIpOwotICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3JpZ2luICclcycgaW4gdGhlIHRyYWNr
ZXIiLCBvcmlnaW5JZGVudGlmaWVyLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOwotICAg
IHN0YXRlbWVudC5iaW5kVGV4dCgyLCBkYXRhYmFzZVBhdGgpOwotCi0gICAgaWYgKHN0YXRlbWVu
dC5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVz
dGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIudXRm
OCgpLmRhdGEoKSk7Ci0KLSAgICBtX29yaWdpbnMuYWRkKG9yaWdpbklkZW50aWZpZXIpOwotCi0g
ICAgLy8gRklYTUU6IFRlbGwgY2xpZW50cyB0aGF0IHRoZSBvcmlnaW4gd2FzIGFkZGVkLgotfQot
Ci12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlRGF0YWJhc2VXaXRoT3Jp
Z2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIpCi17Ci0gICAgb3Bl
blRyYWNrZXJEYXRhYmFzZShTa2lwSWZOb25FeGlzdGVudCk7Ci0gICAgaWYgKCFtX2RhdGFiYXNl
LmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgcGF0aCA9IHBhdGhGb3JE
YXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOwotICAgIGlmIChw
YXRoLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IGRl
bGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyB3aGVyZSBvcmln
aW49PyIpOwotICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykg
ewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdp
biAnJXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgZGVsZXRlU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZp
ZXIpOwotICAgIGlmICghZGVsZXRlU3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKLSAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBvcmlnaW4gJyVzJyIs
IG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHBhdGgpOwotCi0g
ICAgbV9vcmlnaW5zLnJlbW92ZShvcmlnaW5JZGVudGlmaWVyKTsKLSAgICBpZiAobV9vcmlnaW5z
LmlzRW1wdHkoKSkgewotICAgICAgICAvLyBUaGVyZSBhcmUgbm8gb3JpZ2lucyBsZWZ0OyBkZWxl
dGUgdGhlIHRyYWNrZXIgZGF0YWJhc2UuCi0gICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKLSAg
ICAgICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHRyYWNrZXJEYXRhYmFz
ZVBhdGgoKSk7Ci0gICAgICAgIGRlbGV0ZUVtcHR5RGlyZWN0b3J5KG1fbG9jYWxTdG9yYWdlRGly
ZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRzIHRoYXQgdGhlIG9y
aWdpbiB3YXMgcmVtb3ZlZC4KLX0KLQotU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cjo6cGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmln
aW5JZGVudGlmaWVyKQotewotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAg
cmV0dXJuIFN0cmluZygpOwotCi0gICAgU1FMaXRlU3RhdGVtZW50IHBhdGhTdGF0ZW1lbnQobV9k
YXRhYmFzZSwgIlNFTEVDVCBwYXRoIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOwotICAg
IGlmIChwYXRoU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9H
X0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBzZWxlY3Rpb24gb2YgcGF0aCBmb3Igb3JpZ2luICcl
cyciLCBvcmlnaW5JZGVudGlmaWVyLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7Ci0gICAgfQotCi0gICAgcGF0aFN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW5JZGVu
dGlmaWVyKTsKLQotICAgIGludCByZXN1bHQgPSBwYXRoU3RhdGVtZW50LnN0ZXAoKTsKLSAgICBp
ZiAocmVzdWx0ICE9IFNRTElURV9ST1cpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAg
IHJldHVybiBwYXRoU3RhdGVtZW50LmdldENvbHVtblRleHQoMCk7Ci19Ci0KLX0gLy8gbmFtZXNw
YWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9M
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0
b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDdjZWIxOTE2ZDkzNGU1NmYxZjRhMjQxNTU3ZDczMTgzNGJlNzdmZDEuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaAorKysgL2Rldi9u
dWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0K
LSNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hT
ZXQuaD4KLSNpbmNsdWRlIDx3dGYvT3B0aW9uYWwuaD4KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
Ci0jaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+Ci0jaW5jbHVkZSA8d3RmL1dv
cmtRdWV1ZS5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9XVEZTdHJpbmcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJp
dHlPcmlnaW47Ci1zdHJ1Y3QgU2VjdXJpdHlPcmlnaW5EYXRhOwotfQotCi1uYW1lc3BhY2UgV2Vi
S2l0IHsKLQotc3RydWN0IExvY2FsU3RvcmFnZURldGFpbHM7Ci0KLWNsYXNzIExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlciA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcj4gY3JlYXRlKFJlZjxXb3JrUXVldWU+JiYsIGNvbnN0IFN0cmluZyYg
bG9jYWxTdG9yYWdlRGlyZWN0b3J5KTsKLSAgICB+TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
KCk7Ci0KLSAgICBTdHJpbmcgZGF0YWJhc2VQYXRoKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YSYpIGNvbnN0OwotCi0gICAgdm9pZCBkaWRPcGVuRGF0YWJhc2VXaXRoT3JpZ2luKGNv
bnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOwotICAgIHZvaWQgZGVsZXRlRGF0YWJh
c2VXaXRoT3JpZ2luKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpOwotICAgIHZv
aWQgZGVsZXRlQWxsRGF0YWJhc2VzKCk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgdmVjdG9yIG9mIHRo
ZSBvcmlnaW5zIHdob3NlIGRhdGFiYXNlcyBoYXZlIGJlZW4gZGVsZXRlZC4KLSAgICBWZWN0b3I8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiBkZWxldGVEYXRhYmFzZXNNb2RpZmllZFNpbmNl
KHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQpOwotCi0gICAgVmVjdG9yPFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2lucygpIGNvbnN0OwotCi0gICAgc3RydWN0
IE9yaWdpbkRldGFpbHMgewotICAgICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllcjsKLSAgICAg
ICAgc3RkOjpvcHRpb25hbDx0aW1lX3Q+IGNyZWF0aW9uVGltZTsKLSAgICAgICAgc3RkOjpvcHRp
b25hbDx0aW1lX3Q+IG1vZGlmaWNhdGlvblRpbWU7Ci0gICAgfTsKLSAgICBWZWN0b3I8T3JpZ2lu
RGV0YWlscz4gb3JpZ2luRGV0YWlscygpOwotCi1wcml2YXRlOgotICAgIExvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcihSZWY8V29ya1F1ZXVlPiYmLCBjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFn
ZURpcmVjdG9yeSk7Ci0KLSAgICBTdHJpbmcgZGF0YWJhc2VQYXRoKGNvbnN0IFN0cmluZyYgZmls
ZW5hbWUpIGNvbnN0OwotICAgIFN0cmluZyB0cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3Q7Ci0K
LSAgICBlbnVtIERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5IHsKLSAgICAgICAgQ3JlYXRlSWZOb25F
eGlzdGVudCwKLSAgICAgICAgU2tpcElmTm9uRXhpc3RlbnQKLSAgICB9OwotICAgIHZvaWQgb3Bl
blRyYWNrZXJEYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSk7Ci0KLSAgICB2b2lkIGlt
cG9ydE9yaWdpbklkZW50aWZpZXJzKCk7Ci0gICAgdm9pZCB1cGRhdGVUcmFja2VyRGF0YWJhc2VG
cm9tTG9jYWxTdG9yYWdlRGF0YWJhc2VGaWxlcygpOwotCi0gICAgdm9pZCBhZGREYXRhYmFzZVdp
dGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3Qg
U3RyaW5nJiBkYXRhYmFzZVBhdGgpOwotICAgIHZvaWQgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2lu
SWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIpOwotICAgIFN0cmluZyBw
YXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklk
ZW50aWZpZXIpOwotCi0gICAgUmVmUHRyPFdvcmtRdWV1ZT4gbV9xdWV1ZTsKLSAgICBTdHJpbmcg
bV9sb2NhbFN0b3JhZ2VEaXJlY3Rvcnk7Ci0KLSAgICBXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZSBt
X2RhdGFiYXNlOwotICAgIEhhc2hTZXQ8U3RyaW5nPiBtX29yaWdpbnM7Ci0KLSNpZiBQTEFURk9S
TShJT1MpCi0gICAgdm9pZCBwbGF0Zm9ybU1heWJlRXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdDsK
LQotICAgIG11dGFibGUgYm9vbCBtX2hhc0V4Y2x1ZGVkRnJvbUJhY2t1cCB7IGZhbHNlIH07Ci0j
ZW5kaWYKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBkMzA0NTI1Nzc3ODhlOWIwMzgzMTEwZmYwZTU0MjdhOGQ5OTZlNTBiLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9j
ZXNzL1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcAor
KysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
Ci0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZS5oIgotCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgIldlYlJlc291cmNlTG9hZFN0
YXRpc3RpY3NTdG9yZS5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRmlsZU1vbml0b3IuaD4KLSNpbmNs
dWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0tleWVkQ29kaW5n
Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx3dGYvUnVu
TG9vcC5oPgotI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KLSNpbmNsdWRlIDx3dGYvdGhyZWFk
cy9CaW5hcnlTZW1hcGhvcmUuaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNvbnN0ZXhwciBT
ZWNvbmRzIG1pbmltdW1Xcml0ZUludGVydmFsIHsgNV9taW4gfTsKLQotdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Ci0KLXN0YXRpYyBib29sIGhhc0ZpbGVDaGFuZ2VkU2luY2UoY29uc3QgU3RyaW5n
JiBwYXRoLCBXYWxsVGltZSBzaW5jZSkKLXsKLSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigp
KTsKLSAgICB0aW1lX3QgbW9kaWZpY2F0aW9uVGltZTsKLSAgICBpZiAoIWdldEZpbGVNb2RpZmlj
YXRpb25UaW1lKHBhdGgsIG1vZGlmaWNhdGlvblRpbWUpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIHJldHVybiBXYWxsVGltZTo6ZnJvbVJhd1NlY29uZHMobW9kaWZpY2F0aW9uVGltZSkg
PiBzaW5jZTsKLX0KLQotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxLZXllZERlY29kZXI+IGNyZWF0
ZURlY29kZXJGb3JGaWxlKGNvbnN0IFN0cmluZyYgcGF0aCkKLXsKLSAgICBBU1NFUlQoIVJ1bkxv
b3A6OmlzTWFpbigpKTsKLSAgICBhdXRvIGhhbmRsZSA9IG9wZW5BbmRMb2NrRmlsZShwYXRoLCBP
cGVuRm9yUmVhZCk7Ci0gICAgaWYgKGhhbmRsZSA9PSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxl
KQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGxvbmcgbG9uZyBmaWxlU2l6ZSA9IDA7
Ci0gICAgaWYgKCFnZXRGaWxlU2l6ZShoYW5kbGUsIGZpbGVTaXplKSkgewotICAgICAgICB1bmxv
Y2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQot
Ci0gICAgc2l6ZV90IGJ5dGVzVG9SZWFkOwotICAgIGlmICghV1RGOjpjb252ZXJ0U2FmZWx5KGZp
bGVTaXplLCBieXRlc1RvUmVhZCkpIHsKLSAgICAgICAgdW5sb2NrQW5kQ2xvc2VGaWxlKGhhbmRs
ZSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIFZlY3RvcjxjaGFyPiBi
dWZmZXIoYnl0ZXNUb1JlYWQpOwotICAgIHNpemVfdCB0b3RhbEJ5dGVzUmVhZCA9IHJlYWRGcm9t
RmlsZShoYW5kbGUsIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOwotCi0gICAgdW5sb2Nr
QW5kQ2xvc2VGaWxlKGhhbmRsZSk7Ci0KLSAgICBpZiAodG90YWxCeXRlc1JlYWQgIT0gYnl0ZXNU
b1JlYWQpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgcmV0dXJuIEtleWVkRGVjb2Rl
cjo6ZGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIuZGF0YSgp
KSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KLVJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZTo6UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlKFdlYlJlc291
cmNlTG9hZFN0YXRpc3RpY3NTdG9yZSYgc3RvcmUsIGNvbnN0IFN0cmluZyYgc3RvcmFnZURpcmVj
dG9yeVBhdGgpCi0gICAgOiBtX21lbW9yeVN0b3JlKHN0b3JlKQotICAgICwgbV9zdG9yYWdlRGly
ZWN0b3J5UGF0aChzdG9yYWdlRGlyZWN0b3J5UGF0aCkKLSAgICAsIG1fYXN5bmNXcml0ZVRpbWVy
KFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZTo6YXN5bmNXcml0ZVRpbWVyRmlyZWQpCi17Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjppbml0aWFsaXplKCkKLXsKLSAgICBBU1NFUlQo
IVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBwb3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKTsK
LSAgICBzdGFydE1vbml0b3JpbmdEaXNrKCk7Ci19Ci0KLVJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZTo6flJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZSgpCi17Ci0gICAgZmluaXNoQWxsUGVuZGluZ1dvcmtTeW5jaHJvbm91c2x5KCk7Ci0gICAgQVNT
RVJUKCFtX2hhc1BlbmRpbmdXcml0ZSk7Ci19Ci0KLVN0cmluZyBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnN0b3JhZ2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9zdG9yYWdlRGlyZWN0b3J5UGF0aC5pc29sYXRlZENvcHkoKTsKLX0KLQotU3Ry
aW5nIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6cmVzb3VyY2VMb2dG
aWxlUGF0aCgpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHN0b3JhZ2VQYXRoID0gc3RvcmFnZURpcmVj
dG9yeVBhdGgoKTsKLSAgICBpZiAoc3RvcmFnZVBhdGguaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gZW1wdHlTdHJpbmcoKTsKLQotICAgIHJldHVybiBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQo
c3RvcmFnZVBhdGgsICJmdWxsX2Jyb3dzaW5nX3Nlc3Npb25fcmVzb3VyY2VMb2cucGxpc3QiKTsK
LX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnN0YXJ0
TW9uaXRvcmluZ0Rpc2soKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAg
IGlmIChtX2ZpbGVNb25pdG9yKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgcmVzb3Vy
Y2VMb2dQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOwotICAgIGlmIChyZXNvdXJjZUxvZ1Bh
dGguaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2ZpbGVNb25pdG9yID0gc3Rk
OjptYWtlX3VuaXF1ZTxGaWxlTW9uaXRvcj4ocmVzb3VyY2VMb2dQYXRoLCBtX21lbW9yeVN0b3Jl
LnN0YXRpc3RpY3NRdWV1ZSgpLCBbdGhpc10gKEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZSB0
eXBlKSB7Ci0gICAgICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgICAgICBzd2l0
Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGU6Ok1v
ZGlmaWNhdGlvbjoKLSAgICAgICAgICAgIHJlZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5
cGU6OlJlbW92YWw6Ci0gICAgICAgICAgICBtX21lbW9yeVN0b3JlLmNsZWFySW5NZW1vcnkoKTsK
LSAgICAgICAgICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOwotICAgICAgICAgICAgbW9uaXRv
ckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgfSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlOjptb25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygpCi17Ci0gICAgU3RyaW5n
IHN0b3JhZ2VQYXRoID0gc3RvcmFnZURpcmVjdG9yeVBhdGgoKTsKLSAgICBBU1NFUlQoIXN0b3Jh
Z2VQYXRoLmlzRW1wdHkoKSk7Ci0KLSAgICBpZiAoIWZpbGVFeGlzdHMoc3RvcmFnZVBhdGgpKSB7
Ci0gICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHN0b3JhZ2VQYXRoKSkgewotICAgICAg
ICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVzb3VyY2VMb2FkU3RhdGlzdGljcywgIlJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTogRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3Rv
cnkgcGF0aCAlcyIsIHN0b3JhZ2VQYXRoLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9maWxlTW9uaXRvciA9IHN0ZDo6bWFrZV91
bmlxdWU8RmlsZU1vbml0b3I+KHN0b3JhZ2VQYXRoLCBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NR
dWV1ZSgpLCBbdGhpc10gKEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZSB0eXBlKSB7Ci0gICAg
ICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgICAgICBpZiAodHlwZSA9PSBGaWxl
TW9uaXRvcjo6RmlsZUNoYW5nZVR5cGU6OlJlbW92YWwpIHsKLSAgICAgICAgICAgIC8vIERpcmVj
dG9yeSB3YXMgcmVtb3ZlZCEKLSAgICAgICAgICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlc291cmNl
TG9nUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICAgICAgQVNTRVJUKCFyZXNvdXJj
ZUxvZ1BhdGguaXNFbXB0eSgpKTsKLQotICAgICAgICBpZiAoIWZpbGVFeGlzdHMocmVzb3VyY2VM
b2dQYXRoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBtX2ZpbGVNb25pdG9yID0g
bnVsbHB0cjsKLQotICAgICAgICByZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlzaygpOwotICAgICAg
ICBzdGFydE1vbml0b3JpbmdEaXNrKCk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpzdG9wTW9uaXRvcmluZ0Rpc2soKQotewotICAg
IEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRy
OwotfQotCi0vLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgb24gZGlzay4K
LXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpyZWZyZXNoTWVt
b3J5U3RvcmVGcm9tRGlzaygpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0K
LSAgICBTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7Ci0gICAgaWYgKGZp
bGVQYXRoLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2Ugc29tZXRpbWVz
IHNlZSBmaWxlIGNoYW5nZWQgZXZlbnRzIGZyb20gYmVmb3JlIG91ciBsb2FkIGNvbXBsZXRlZCAo
d2Ugc3RhcnQKLSAgICAvLyByZWFkaW5nIGF0IHRoZSBmaXJzdCBjaGFuZ2UgZXZlbnQsIGJ1dCB3
ZSBtaWdodCByZWNlaXZlIGEgc2VyaWVzIG9mIGV2ZW50cyByZWxhdGVkCi0gICAgLy8gdG8gdGhl
IHNhbWUgZmlsZSBvcGVyYXRpb24pLiBDYXRjaCB0aGlzIGNhc2UgdG8gYXZvaWQgcmVhZGluZyBv
dmVybHkgb2Z0ZW4uCi0gICAgaWYgKCFoYXNGaWxlQ2hhbmdlZFNpbmNlKGZpbGVQYXRoLCBtX2xh
c3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgV2FsbFRp
bWUgcmVhZFRpbWUgPSBXYWxsVGltZTo6bm93KCk7Ci0KLSAgICBhdXRvIGRlY29kZXIgPSBjcmVh
dGVEZWNvZGVyRm9yRmlsZShmaWxlUGF0aCk7Ci0gICAgaWYgKCFkZWNvZGVyKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBtX21lbW9yeVN0b3JlLm1lcmdlV2l0aERhdGFGcm9tRGVjb2RlcigqZGVj
b2Rlcik7Ci0gICAgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSA9IHJlYWRUaW1lOwotfQot
Ci12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6cG9wdWxhdGVN
ZW1vcnlTdG9yZUZyb21EaXNrKCkKLXsKLSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsK
LQotICAgIFN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBpZiAo
ZmlsZVBhdGguaXNFbXB0eSgpIHx8ICFmaWxlRXhpc3RzKGZpbGVQYXRoKSkgewotICAgICAgICBt
X21lbW9yeVN0b3JlLmdyYW5kZmF0aGVyRXhpc3RpbmdXZWJzaXRlRGF0YSgpOwotICAgICAgICBt
b25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlzdGljcygpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKCFoYXNGaWxlQ2hhbmdlZFNpbmNlKGZpbGVQYXRoLCBtX2xhc3RTdGF0aXN0
aWNzRmlsZVN5bmNUaW1lKSkgewotICAgICAgICAvLyBObyBuZWVkIHRvIGdyYW5kZmF0aGVyIGlu
IHRoaXMgY2FzZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFdhbGxUaW1lIHJlYWRU
aW1lID0gV2FsbFRpbWU6Om5vdygpOwotCi0gICAgYXV0byBkZWNvZGVyID0gY3JlYXRlRGVjb2Rl
ckZvckZpbGUoZmlsZVBhdGgpOwotICAgIGlmICghZGVjb2RlcikgewotICAgICAgICBtX21lbW9y
eVN0b3JlLmdyYW5kZmF0aGVyRXhpc3RpbmdXZWJzaXRlRGF0YSgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX21lbW9yeVN0b3JlLmlzRW1wdHko
KSwgIlRoaXMgaXMgdGhlIGluaXRpYWwgaW1wb3J0IHNvIHRoZSBzdG9yZSBzaG91bGQgYmUgZW1w
dHkiKTsKLSAgICBtX21lbW9yeVN0b3JlLm1lcmdlV2l0aERhdGFGcm9tRGVjb2RlcigqZGVjb2Rl
cik7Ci0KLSAgICBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lID0gcmVhZFRpbWU7Ci0KLSAg
ICBtX21lbW9yeVN0b3JlLmxvZ1Rlc3RpbmdFdmVudChBU0NJSUxpdGVyYWwoIlBvcHVsYXRlZFdp
dGhvdXRHcmFuZGZhdGhlcmluZyIpKTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6OmFzeW5jV3JpdGVUaW1lckZpcmVkKCkKLXsKLSAgICBBU1NFUlQo
UnVuTG9vcDo6aXNNYWluKCkpOwotICAgIG1fbWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCku
ZGlzcGF0Y2goW3RoaXNdICgpIG11dGFibGUgewotICAgICAgICB3cml0ZU1lbW9yeVN0b3JlVG9E
aXNrKCk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlOjp3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCkKLXsKLSAgICBBU1NFUlQoIVJ1bkxv
b3A6OmlzTWFpbigpKTsKLQotICAgIG1faGFzUGVuZGluZ1dyaXRlID0gZmFsc2U7Ci0gICAgc3Rv
cE1vbml0b3JpbmdEaXNrKCk7Ci0KLSAgICBhdXRvIGVuY29kZXIgPSBtX21lbW9yeVN0b3JlLmNy
ZWF0ZUVuY29kZXJGcm9tRGF0YSgpOwotICAgIGF1dG8gcmF3RGF0YSA9IGVuY29kZXItPmZpbmlz
aEVuY29kaW5nKCk7Ci0gICAgaWYgKCFyYXdEYXRhKQotICAgICAgICByZXR1cm47Ci0KLSAgICBh
dXRvIHN0b3JhZ2VQYXRoID0gc3RvcmFnZURpcmVjdG9yeVBhdGgoKTsKLSAgICBpZiAoIXN0b3Jh
Z2VQYXRoLmlzRW1wdHkoKSkgewotICAgICAgICBtYWtlQWxsRGlyZWN0b3JpZXMoc3RvcmFnZVBh
dGgpOwotICAgICAgICBleGNsdWRlRnJvbUJhY2t1cCgpOwotICAgIH0KLQotICAgIGF1dG8gaGFu
ZGxlID0gb3BlbkFuZExvY2tGaWxlKHJlc291cmNlTG9nRmlsZVBhdGgoKSwgT3BlbkZvcldyaXRl
KTsKLSAgICBpZiAoaGFuZGxlID09IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGUpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGludDY0X3Qgd3JpdHRlbkJ5dGVzID0gd3JpdGVUb0ZpbGUoaGFuZGxl
LCByYXdEYXRhLT5kYXRhKCksIHJhd0RhdGEtPnNpemUoKSk7Ci0gICAgdW5sb2NrQW5kQ2xvc2VG
aWxlKGhhbmRsZSk7Ci0KLSAgICBpZiAod3JpdHRlbkJ5dGVzICE9IHN0YXRpY19jYXN0PGludDY0
X3Q+KHJhd0RhdGEtPnNpemUoKSkpCi0gICAgICAgIFJFTEVBU0VfTE9HX0VSUk9SKFJlc291cmNl
TG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
IFdlIG9ubHkgd3JvdGUgJWQgb3V0IG9mICV6dSBieXRlcyB0byBkaXNrIiwgc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KHdyaXR0ZW5CeXRlcyksIHJhd0RhdGEtPnNpemUoKSk7Ci0KLSAgICBtX2xhc3RT
dGF0aXN0aWNzRmlsZVN5bmNUaW1lID0gV2FsbFRpbWU6Om5vdygpOwotICAgIG1fbGFzdFN0YXRp
c3RpY3NXcml0ZVRpbWUgPSBNb25vdG9uaWNUaW1lOjpub3coKTsKLQotICAgIHN0YXJ0TW9uaXRv
cmluZ0Rpc2soKTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2U6OnNjaGVkdWxlT3JXcml0ZU1lbW9yeVN0b3JlKEZvcmNlSW1tZWRpYXRlV3JpdGUgZm9y
Y2VJbW1lZGlhdGVXcml0ZSkKLXsKLSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLQot
ICAgIGF1dG8gdGltZVNpbmNlTGFzdFdyaXRlID0gTW9ub3RvbmljVGltZTo6bm93KCkgLSBtX2xh
c3RTdGF0aXN0aWNzV3JpdGVUaW1lOwotICAgIGlmIChmb3JjZUltbWVkaWF0ZVdyaXRlICE9IEZv
cmNlSW1tZWRpYXRlV3JpdGU6OlllcyAmJiB0aW1lU2luY2VMYXN0V3JpdGUgPCBtaW5pbXVtV3Jp
dGVJbnRlcnZhbCkgewotICAgICAgICBpZiAoIW1faGFzUGVuZGluZ1dyaXRlKSB7Ci0gICAgICAg
ICAgICBtX2hhc1BlbmRpbmdXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICBTZWNvbmRzIGRlbGF5
ID0gbWluaW11bVdyaXRlSW50ZXJ2YWwgLSB0aW1lU2luY2VMYXN0V3JpdGUgKyAxX3M7Ci0gICAg
ICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKSwgZGVsYXldIHsKLSAgICAgICAgICAgICAgICBtX2FzeW5jV3JpdGVUaW1l
ci5zdGFydE9uZVNob3QoZGVsYXkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKLX0KLQot
dm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmNsZWFyKCkKLXsK
LSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBTdHJpbmcgZmlsZVBhdGggPSBy
ZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7Ci0gICAgaWYgKGZpbGVQYXRoLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgc3RvcE1vbml0b3JpbmdEaXNrKCk7Ci0KLSAgICBpZiAoIWRlbGV0
ZUZpbGUoZmlsZVBhdGgpKQotICAgICAgICBSRUxFQVNFX0xPR19FUlJPUihSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOiBVbmFi
bGUgdG8gZGVsZXRlIHN0YXRpc3RpY3MgZmlsZTogJXMiLCBmaWxlUGF0aC51dGY4KCkuZGF0YSgp
KTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmZp
bmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgpCi17Ci0gICAgbV9hc3luY1dyaXRlVGlt
ZXIuc3RvcCgpOwotCi0gICAgQmluYXJ5U2VtYXBob3JlIHNlbWFwaG9yZTsKLSAgICAvLyBNYWtl
IHN1cmUgYW55IHBlbmRpbmcgd29yayBpbiBvdXIgcXVldWUgaXMgZmluaXNoZWQgYmVmb3JlIHdl
IHRlcm1pbmF0ZS4KLSAgICBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLmRpc3BhdGNo
KFsmc2VtYXBob3JlLCB0aGlzXSB7Ci0gICAgICAgIC8vIFdyaXRlIGZpbmFsIGZpbGUgc3RhdGUg
dG8gZGlzay4KLSAgICAgICAgaWYgKG1faGFzUGVuZGluZ1dyaXRlKQotICAgICAgICAgICAgd3Jp
dGVNZW1vcnlTdG9yZVRvRGlzaygpOwotICAgICAgICBzZW1hcGhvcmUuc2lnbmFsKCk7Ci0gICAg
fSk7Ci0gICAgc2VtYXBob3JlLndhaXQoV2FsbFRpbWU6OmluZmluaXR5KCkpOwotfQotCi12b2lk
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6cmVmKCkKLXsKLSAgICBt
X21lbW9yeVN0b3JlLnJlZigpOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZTo6ZGVyZWYoKQotewotICAgIG1fbWVtb3J5U3RvcmUuZGVyZWYoKTsKLX0K
LQotI2lmICFQTEFURk9STShJT1MpCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZTo6ZXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdAotewotfQotI2VuZGlmCi0KLX0g
Ly8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
U3RvcmFnZS9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBiL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDJlZDRiYzY5M2Jh
MWVhMjE5NDJlNDAzY2QxMzZkNGU3NjcyNWMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9SZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHd0Zi9Gb3J3
YXJkLmg+Ci0jaW5jbHVkZSA8d3RmL01vbm90b25pY1RpbWUuaD4KLSNpbmNsdWRlIDx3dGYvUnVu
TG9vcC5oPgotI2luY2x1ZGUgPHd0Zi9XYWxsVGltZS5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBGaWxlTW9uaXRvcjsKLX0K
LQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NT
dG9yZTsKLQotY2xhc3MgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlIHsK
LXB1YmxpYzoKLSAgICBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoV2Vi
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1N0b3JlJiwgY29uc3QgU3RyaW5nJiBzdG9yYWdlRGlyZWN0
b3J5UGF0aCk7Ci0gICAgflJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZSgp
OwotCi0gICAgdm9pZCBpbml0aWFsaXplKCk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgdm9p
ZCBmaW5pc2hBbGxQZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKTsKLQotICAgIHZvaWQgcmVmKCk7
Ci0gICAgdm9pZCBkZXJlZigpOwotCi0gICAgZW51bSBjbGFzcyBGb3JjZUltbWVkaWF0ZVdyaXRl
IHsKLSAgICAgICAgTm8sCi0gICAgICAgIFllcywKLSAgICB9OwotICAgIHZvaWQgc2NoZWR1bGVP
cldyaXRlTWVtb3J5U3RvcmUoRm9yY2VJbW1lZGlhdGVXcml0ZSk7Ci0KLXByaXZhdGU6Ci0gICAg
U3RyaW5nIHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCkgY29uc3Q7Ci0gICAgU3RyaW5nIHJlc291cmNl
TG9nRmlsZVBhdGgoKSBjb25zdDsKLQotICAgIHZvaWQgc3RhcnRNb25pdG9yaW5nRGlzaygpOwot
ICAgIHZvaWQgc3RvcE1vbml0b3JpbmdEaXNrKCk7Ci0gICAgdm9pZCBtb25pdG9yRGlyZWN0b3J5
Rm9yTmV3U3RhdGlzdGljcygpOwotCi0gICAgdm9pZCB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7
Ci0gICAgdm9pZCBwb3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKTsKLSAgICB2b2lkIGV4Y2x1
ZGVGcm9tQmFja3VwKCkgY29uc3Q7Ci0gICAgdm9pZCByZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlz
aygpOwotICAgIHZvaWQgYXN5bmNXcml0ZVRpbWVyRmlyZWQoKTsKLQotICAgIFdlYlJlc291cmNl
TG9hZFN0YXRpc3RpY3NTdG9yZSYgbV9tZW1vcnlTdG9yZTsKLSAgICBjb25zdCBTdHJpbmcgbV9z
dG9yYWdlRGlyZWN0b3J5UGF0aDsKLSAgICBSdW5Mb29wOjpUaW1lcjxSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U+IG1fYXN5bmNXcml0ZVRpbWVyOwotICAgIHN0ZDo6dW5p
cXVlX3B0cjxXZWJDb3JlOjpGaWxlTW9uaXRvcj4gbV9maWxlTW9uaXRvcjsKLSAgICBXYWxsVGlt
ZSBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lOwotICAgIE1vbm90b25pY1RpbWUgbV9sYXN0
U3RhdGlzdGljc1dyaXRlVGltZTsKLSAgICBib29sIG1faGFzUGVuZGluZ1dyaXRlIHsgZmFsc2Ug
fTsKLX07Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2Uv
U3RvcmFnZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9y
YWdlTWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGNhNmNiNTI2
MjFmNzIzYmE4MDQ0MTAxZTBjZDA1OTRjOTRiOTkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9y
YWdlTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMy0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyLmgi
Ci0KLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZS5oIgotI2luY2x1ZGUgIkxvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlci5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwTWVzc2FnZXMu
aCIKLSNpbmNsdWRlICJTdG9yYWdlTWFuYWdlck1lc3NhZ2VzLmgiCi0jaW5jbHVkZSAiV2ViUHJv
Y2Vzc1Byb3h5LmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KLSNp
bmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luSGFzaC5oPgotI2luY2x1ZGUgPFdlYkNvcmUv
U3RvcmFnZU1hcC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvVGV4dEVuY29kaW5nLmg+Ci0jaW5jbHVk
ZSA8bWVtb3J5PgotI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KLSNpbmNsdWRlIDx3dGYvdGhy
ZWFkcy9CaW5hcnlTZW1hcGhvcmUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5h
bWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWEgOiBw
dWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPiB7
Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxTdG9yYWdlQXJlYT4gY3JlYXRlKExvY2FsU3RvcmFn
ZU5hbWVzcGFjZSosIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYsIHVuc2lnbmVkIHF1b3RhSW5C
eXRlcyk7Ci0gICAgflN0b3JhZ2VBcmVhKCk7Ci0KLSAgICBjb25zdCBXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9y
aWdpbjsgfQotCi0gICAgdm9pZCBhZGRMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRf
dCBzdG9yYWdlTWFwSUQpOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9u
JiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKTsKLQotICAgIFJlZjxTdG9yYWdlQXJlYT4gY2xvbmUo
KSBjb25zdDsKLQotICAgIHZvaWQgc2V0SXRlbShJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5l
Y3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBj
b25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZywgYm9vbCYgcXVvdGFF
eGNlcHRpb24pOwotICAgIHZvaWQgcmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNv
bm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5
LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0gICAgdm9pZCBjbGVhcihJUEM6OkNvbm5lY3Rp
b24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0
IFN0cmluZyYgdXJsU3RyaW5nKTsKLQotICAgIGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+
JiBpdGVtcygpIGNvbnN0OwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIGJvb2wgaXNTZXNzaW9u
U3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuICFtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZTsgfQotCi1w
cml2YXRlOgotICAgIGV4cGxpY2l0IFN0b3JhZ2VBcmVhKExvY2FsU3RvcmFnZU5hbWVzcGFjZSos
IGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0KLSAg
ICB2b2lkIG9wZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25zdDsKLQotICAg
IHZvaWQgZGlzcGF0Y2hFdmVudHMoSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1
aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxT
dHJpbmcpIGNvbnN0OwotCi0gICAgLy8gV2lsbCBiZSBudWxsIGlmIHRoZSBzdG9yYWdlIGFyZWEg
YmVsb25ncyB0byBhIHNlc3Npb24gc3RvcmFnZSBuYW1lc3BhY2UuCi0gICAgTG9jYWxTdG9yYWdl
TmFtZXNwYWNlKiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZTsKLSAgICBtdXRhYmxlIFJlZlB0cjxM
b2NhbFN0b3JhZ2VEYXRhYmFzZT4gbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZTsKLSAgICBtdXRhYmxl
IGJvb2wgbV9kaWRJbXBvcnRJdGVtc0Zyb21EYXRhYmFzZSB7IGZhbHNlIH07Ci0KLSAgICBTZWN1
cml0eU9yaWdpbkRhdGEgbV9zZWN1cml0eU9yaWdpbjsKLSAgICB1bnNpZ25lZCBtX3F1b3RhSW5C
eXRlczsKLQotICAgIFJlZlB0cjxTdG9yYWdlTWFwPiBtX3N0b3JhZ2VNYXA7Ci0gICAgSGFzaFNl
dDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gbV9ldmVudExp
c3RlbmVyczsKLX07Ci0KLWNsYXNzIFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiB7
Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZShT
dG9yYWdlTWFuYWdlciosIHVpbnQ2NF90IHN0b3JhZ2VNYW5hZ2VySUQpOwotICAgIH5Mb2NhbFN0
b3JhZ2VOYW1lc3BhY2UoKTsKLQotICAgIFN0b3JhZ2VNYW5hZ2VyKiBzdG9yYWdlTWFuYWdlcigp
IGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZU1hbmFnZXI7IH0KLQotICAgIFJlZjxTdG9yYWdlQXJl
YT4gZ2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0gICAgdm9p
ZCBkaWREZXN0cm95U3RvcmFnZUFyZWEoU3RvcmFnZUFyZWEqKTsKLQotICAgIHZvaWQgY2xlYXJT
dG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmKTsKLSAg
ICB2b2lkIGNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQg
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3RvcmFnZU1h
bmFnZXJJRCk7Ci0KLSAgICBTdG9yYWdlTWFuYWdlciogbV9zdG9yYWdlTWFuYWdlcjsKLSAgICB1
aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKLSAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRl
czsKLQotICAgIC8vIFdlIGRvbid0IGhvbGQgYW4gZXhwbGljaXQgcmVmZXJlbmNlIHRvIHRoZSBT
dG9yYWdlQXJlYXM7IHRoZXkgYXJlIGtlcHQgYWxpdmUgYnkgdGhlIG1fc3RvcmFnZUFyZWFzQnlD
b25uZWN0aW9uIG1hcCBpbiBTdG9yYWdlTWFuYWdlci4KLSAgICBIYXNoTWFwPFNlY3VyaXR5T3Jp
Z2luRGF0YSwgU3RvcmFnZUFyZWEqPiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsKLQotY2xhc3MgU3Rv
cmFnZU1hbmFnZXI6OlRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJl
YWRTYWZlUmVmQ291bnRlZDxUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IHsKLXB1Ymxp
YzoKLSAgICBzdGF0aWMgUmVmPFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRl
KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSgpKTsKLSAgICB9Ci0KLSAgICB+VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0
ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKQotICAgIHsK
LSAgICAgICAgcmV0dXJuICptX3N0b3JhZ2VBcmVhTWFwLmVuc3VyZShzZWN1cml0eU9yaWdpbiwg
W3RoaXMsIHNlY3VyaXR5T3JpZ2luXSgpIG11dGFibGUgewotICAgICAgICAgICAgcmV0dXJuIFN0
b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0ciwgV1RGTW92ZShzZWN1cml0eU9yaWdpbiksIG1fcXVv
dGFJbkJ5dGVzKTsKLSAgICAgICAgfSkuaXRlcmF0b3ItPnZhbHVlLmNvcHlSZWYoKTsKLSAgICB9
Ci0KLSAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3QKLSAgICB7
Ci0gICAgICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7Ci0KLSAgICAgICAg
Zm9yIChjb25zdCBhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkp
IHsKLSAgICAgICAgICAgIGlmICghc3RvcmFnZUFyZWEtPml0ZW1zKCkuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgICAgIG9yaWdpbnMuYXBwZW5kKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigp
KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcmlnaW5zOwotICAgIH0KLQotICAgIHZv
aWQgY2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRh
dGEmIHNlY3VyaXR5T3JpZ2luKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJl
YSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChzdG9yYWdl
QXJlYS0+c2VjdXJpdHlPcmlnaW4oKSA9PSBzZWN1cml0eU9yaWdpbikKLSAgICAgICAgICAgICAg
ICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2xl
YXJBbGxTdG9yYWdlQXJlYXMoKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJl
YSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpCi0gICAgICAgICAgICBzdG9yYWdlQXJlYS0+
Y2xlYXIoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgVHJhbnNpZW50TG9jYWxT
dG9yYWdlTmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgY29uc3QgdW5zaWduZWQgbV9x
dW90YUluQnl0ZXMgPSA1ICogMTAyNCAqIDEwMjQ7Ci0KLSAgICBIYXNoTWFwPFNlY3VyaXR5T3Jp
Z2luRGF0YSwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYU1hcDsKLX07Ci0KLWF1
dG8gU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpjcmVhdGUoTG9jYWxTdG9yYWdlTmFtZXNw
YWNlKiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2Vj
dXJpdHlPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykgLT4gUmVmPFN0b3JhZ2VNYW5hZ2Vy
OjpTdG9yYWdlQXJlYT4KLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYShs
b2NhbFN0b3JhZ2VOYW1lc3BhY2UsIHNlY3VyaXR5T3JpZ2luLCBxdW90YUluQnl0ZXMpKTsKLX0K
LQotU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpTdG9yYWdlQXJlYShMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRh
JiBzZWN1cml0eU9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotICAgIDogbV9sb2NhbFN0
b3JhZ2VOYW1lc3BhY2UobG9jYWxTdG9yYWdlTmFtZXNwYWNlKQotICAgICwgbV9zZWN1cml0eU9y
aWdpbihzZWN1cml0eU9yaWdpbikKLSAgICAsIG1fcXVvdGFJbkJ5dGVzKHF1b3RhSW5CeXRlcykK
LSAgICAsIG1fc3RvcmFnZU1hcChTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpKQot
ewotfQotCi1TdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6On5TdG9yYWdlQXJlYSgpCi17Ci0g
ICAgQVNTRVJUKG1fZXZlbnRMaXN0ZW5lcnMuaXNFbXB0eSgpKTsKLQotICAgIGlmIChtX2xvY2Fs
U3RvcmFnZURhdGFiYXNlKQotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbG9zZSgp
OwotCi0gICAgaWYgKG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlKQotICAgICAgICBtX2xvY2FsU3Rv
cmFnZU5hbWVzcGFjZS0+ZGlkRGVzdHJveVN0b3JhZ2VBcmVhKHRoaXMpOwotfQotCi12b2lkIFN0
b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6YWRkTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9uJiBj
b25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpCi17Ci0gICAgQVNTRVJUKCFtX2V2ZW50
TGlzdGVuZXJzLmNvbnRhaW5zKHN0ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFw
SUQpKSk7Ci0gICAgbV9ldmVudExpc3RlbmVycy5hZGQoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rp
b24sIHN0b3JhZ2VNYXBJRCkpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJl
YTo6cmVtb3ZlTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBz
dG9yYWdlTWFwSUQpCi17Ci0gICAgQVNTRVJUKGlzU2Vzc2lvblN0b3JhZ2UoKSB8fCBtX2V2ZW50
TGlzdGVuZXJzLmNvbnRhaW5zKHN0ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFw
SUQpKSk7Ci0gICAgbV9ldmVudExpc3RlbmVycy5yZW1vdmUoc3RkOjptYWtlX3BhaXIoJmNvbm5l
Y3Rpb24sIHN0b3JhZ2VNYXBJRCkpOwotfQotCi1SZWY8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VB
cmVhPiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmNsb25lKCkgY29uc3QKLXsKLSAgICBB
U1NFUlQoIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlKTsKLQotICAgIGF1dG8gc3RvcmFnZUFyZWEg
PSBTdG9yYWdlQXJlYTo6Y3JlYXRlKG51bGxwdHIsIG1fc2VjdXJpdHlPcmlnaW4sIG1fcXVvdGFJ
bkJ5dGVzKTsKLSAgICBzdG9yYWdlQXJlYS0+bV9zdG9yYWdlTWFwID0gbV9zdG9yYWdlTWFwOwot
Ci0gICAgcmV0dXJuIHN0b3JhZ2VBcmVhOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9y
YWdlQXJlYTo6c2V0SXRlbShJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2
NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcm
IHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZywgYm9vbCYgcXVvdGFFeGNlcHRpb24pCi17
Ci0gICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpOwotCi0gICAgU3RyaW5n
IG9sZFZhbHVlOwotCi0gICAgYXV0byBuZXdTdG9yYWdlTWFwID0gbV9zdG9yYWdlTWFwLT5zZXRJ
dGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbik7Ci0gICAgaWYgKG5ld1N0
b3JhZ2VNYXApCi0gICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3U3RvcmFnZU1hcCk7
Ci0KLSAgICBpZiAocXVvdGFFeGNlcHRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICht
X2xvY2FsU3RvcmFnZURhdGFiYXNlKQotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5z
ZXRJdGVtKGtleSwgdmFsdWUpOwotCi0gICAgZGlzcGF0Y2hFdmVudHMoc291cmNlQ29ubmVjdGlv
biwgc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgdmFsdWUsIHVybFN0cmluZyk7
Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpyZW1vdmVJdGVtKElQQzo6
Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJ
RCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIG9w
ZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKTsKLQotICAgIFN0cmluZyBvbGRWYWx1
ZTsKLSAgICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXAtPnJlbW92ZUl0ZW0oa2V5
LCBvbGRWYWx1ZSk7Ci0gICAgaWYgKG5ld1N0b3JhZ2VNYXApCi0gICAgICAgIG1fc3RvcmFnZU1h
cCA9IFdURk1vdmUobmV3U3RvcmFnZU1hcCk7Ci0KLSAgICBpZiAob2xkVmFsdWUuaXNOdWxsKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX2xvY2FsU3RvcmFnZURhdGFiYXNlKQotICAg
ICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5yZW1vdmVJdGVtKGtleSk7Ci0KLSAgICBkaXNw
YXRjaEV2ZW50cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9s
ZFZhbHVlLCBTdHJpbmcoKSwgdXJsU3RyaW5nKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6
U3RvcmFnZUFyZWE6OmNsZWFyKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWlu
dDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0g
ICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpOwotCi0gICAgaWYgKCFtX3N0
b3JhZ2VNYXAtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N0b3JhZ2VNYXAg
PSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOwotCi0gICAgaWYgKG1fbG9jYWxT
dG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNsZWFyKCk7
Ci0KLSAgICBkaXNwYXRjaEV2ZW50cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJl
YUlELCBTdHJpbmcoKSwgU3RyaW5nKCksIFN0cmluZygpLCB1cmxTdHJpbmcpOwotfQotCi1jb25z
dCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpp
dGVtcygpIGNvbnN0Ci17Ci0gICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgp
OwotCi0gICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+aXRlbXMoKTsKLX0KLQotdm9pZCBTdG9yYWdl
TWFuYWdlcjo6U3RvcmFnZUFyZWE6OmNsZWFyKCkKLXsKLSAgICBtX3N0b3JhZ2VNYXAgPSBTdG9y
YWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOwotCi0gICAgaWYgKG1fbG9jYWxTdG9yYWdl
RGF0YWJhc2UpIHsKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xvc2UoKTsKLSAg
ICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgZm9y
IChhdXRvIGl0ID0gbV9ldmVudExpc3RlbmVycy5iZWdpbigpLCBlbmQgPSBtX2V2ZW50TGlzdGVu
ZXJzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgIGl0LT5maXJzdC0+c2VuZChNZXNz
YWdlczo6U3RvcmFnZUFyZWFNYXA6OkNsZWFyQ2FjaGUoKSwgaXQtPnNlY29uZCk7Ci19Ci0KLXZv
aWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVt
c0lmTmVlZGVkKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBvcGVuIHRoZSBkYXRhYmFzZSBoZXJlIGV2ZW4g
aWYgd2UndmUgYWxyZWFkeSBpbXBvcnRlZCBvdXIgaXRlbXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRh
dGFiYXNlIGlzIG9wZW4gaWYgd2UgbmVlZCB0byB3cml0ZSB0byBpdC4KLSAgICBpZiAoIW1fbG9j
YWxTdG9yYWdlRGF0YWJhc2UpCi0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UgPSBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZTo6Y3JlYXRlKG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdl
TWFuYWdlcigpLT5tX3F1ZXVlLmNvcHlSZWYoKSwgbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPnN0
b3JhZ2VNYW5hZ2VyKCktPm1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNvcHlSZWYoKSwg
bV9zZWN1cml0eU9yaWdpbik7Ci0KLSAgICBpZiAobV9kaWRJbXBvcnRJdGVtc0Zyb21EYXRhYmFz
ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+aW1wb3J0
SXRlbXMoKm1fc3RvcmFnZU1hcCk7Ci0gICAgbV9kaWRJbXBvcnRJdGVtc0Zyb21EYXRhYmFzZSA9
IHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpkaXNwYXRjaEV2
ZW50cyhJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBj
b25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykgY29uc3QKLXsK
LSAgICBmb3IgKEhhc2hTZXQ8c3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50
NjRfdD4+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZXZlbnRMaXN0ZW5lcnMuYmVnaW4oKSwgZW5k
ID0gbV9ldmVudExpc3RlbmVycy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIHVp
bnQ2NF90IHN0b3JhZ2VBcmVhSUQgPSBpdC0+Zmlyc3QgPT0gc291cmNlQ29ubmVjdGlvbiA/IHNv
dXJjZVN0b3JhZ2VBcmVhSUQgOiAwOwotCi0gICAgICAgIGl0LT5maXJzdC0+c2VuZChNZXNzYWdl
czo6U3RvcmFnZUFyZWFNYXA6OkRpc3BhdGNoU3RvcmFnZUV2ZW50KHN0b3JhZ2VBcmVhSUQsIGtl
eSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcpLCBpdC0+c2Vjb25kKTsKLSAgICB9Ci19
Ci0KLVJlZjxTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBTdG9yYWdlTWFu
YWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjcmVhdGUoU3RvcmFnZU1hbmFnZXIqIHN0b3Jh
Z2VNYW5hZ2VyLCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpCi17Ci0gICAgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VNYW5hZ2VyLCBzdG9yYWdl
TmFtZXNwYWNlSUQpKTsKLX0KLQotLy8gRklYTUU6IFRoZSBxdW90YSB2YWx1ZSBpcyBjb3BpZWQg
ZnJvbSBHcm91cFNldHRpbmdzLmNwcC4KLS8vIFdlIHNob3VsZCBpbnZlc3RpZ2F0ZSBhIHdheSB0
byBzaGFyZSBpdCB3aXRoIFdlYkNvcmUuCi1TdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5h
Z2VyLCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpCi0gICAgOiBtX3N0b3JhZ2VNYW5hZ2Vy
KHN0b3JhZ2VNYW5hZ2VyKQotICAgICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVz
cGFjZUlEKQotICAgICwgbV9xdW90YUluQnl0ZXMoNSAqIDEwMjQgKiAxMDI0KQotewotfQotCi1T
dG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjp+TG9jYWxTdG9yYWdlTmFtZXNw
YWNlKCkKLXsKLSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYU1hcC5pc0VtcHR5KCkpOwotfQotCi1h
dXRvIFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmdldE9yQ3JlYXRlU3Rv
cmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pIC0+IFJlZjxTdG9y
YWdlQXJlYT4KLXsKLSAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYU1hcC5hZGQoc2VjdXJp
dHlPcmlnaW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAoc2xvdCkKLSAgICAg
ICAgcmV0dXJuICpzbG90OwotCi0gICAgYXV0byBzdG9yYWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpj
cmVhdGUodGhpcywgV1RGTW92ZShzZWN1cml0eU9yaWdpbiksIG1fcXVvdGFJbkJ5dGVzKTsKLSAg
ICBzbG90ID0gJnN0b3JhZ2VBcmVhLmdldCgpOwotCi0gICAgcmV0dXJuIHN0b3JhZ2VBcmVhOwot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmRpZERlc3Ry
b3lTdG9yYWdlQXJlYShTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEpCi17Ci0gICAgQVNTRVJUKG1f
c3RvcmFnZUFyZWFNYXAuY29udGFpbnMoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpKTsK
LQotICAgIG1fc3RvcmFnZUFyZWFNYXAucmVtb3ZlKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdp
bigpKTsKLSAgICBpZiAoIW1fc3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBBU1NFUlQobV9zdG9yYWdlTWFuYWdlci0+bV9sb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2VzLmNvbnRhaW5zKG1fc3RvcmFnZU5hbWVzcGFjZUlEKSk7Ci0gICAgbV9zdG9yYWdlTWFuYWdl
ci0+bV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnJlbW92ZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7
Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Y2xlYXJT
dG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3Vy
aXR5T3JpZ2luKQotewotICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luQW5kU3RvcmFnZUFyZWEg
OiBtX3N0b3JhZ2VBcmVhTWFwKSB7Ci0gICAgICAgIGlmIChvcmlnaW5BbmRTdG9yYWdlQXJlYS5r
ZXkgPT0gc2VjdXJpdHlPcmlnaW4pCi0gICAgICAgICAgICBvcmlnaW5BbmRTdG9yYWdlQXJlYS52
YWx1ZS0+Y2xlYXIoKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3Rv
cmFnZU5hbWVzcGFjZTo6Y2xlYXJBbGxTdG9yYWdlQXJlYXMoKQotewotICAgIGZvciAoYXV0byog
c3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKQotICAgICAgICBzdG9yYWdl
QXJlYS0+Y2xlYXIoKTsKLX0KLQotY2xhc3MgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZT4gY3JlYXRlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0gICAgflNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlKCk7Ci0KLSAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VB
cmVhTWFwLmlzRW1wdHkoKTsgfQotCi0gICAgSVBDOjpDb25uZWN0aW9uKiBhbGxvd2VkQ29ubmVj
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fYWxsb3dlZENvbm5lY3Rpb24uZ2V0KCk7IH0KLSAgICB2
b2lkIHNldEFsbG93ZWRDb25uZWN0aW9uKElQQzo6Q29ubmVjdGlvbiopOwotCi0gICAgUmVmPFN0
b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmKTsK
LQotICAgIHZvaWQgY2xvbmVUbyhTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSYgbmV3U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UpOwotCi0gICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2lu
cygpIGNvbnN0Ci0gICAgewotICAgICAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmln
aW5zOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VB
cmVhTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIXN0b3JhZ2VBcmVhLT5pdGVtcygp
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBvcmlnaW5zLmFwcGVuZChzdG9yYWdlQXJlYS0+
c2VjdXJpdHlPcmlnaW4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3JpZ2luczsK
LSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29uc3Qg
U2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKLSAgICB7Ci0gICAgICAgIGZvciAo
YXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKSB7Ci0gICAgICAg
ICAgICBpZiAoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkgPT0gc2VjdXJpdHlPcmlnaW4p
Ci0gICAgICAgICAgICAgICAgc3RvcmFnZUFyZWEtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICB2b2lkIGNsZWFyQWxsU3RvcmFnZUFyZWFzKCkKLSAgICB7Ci0gICAgICAgIGZvciAo
YXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKQotICAgICAgICAg
ICAgc3RvcmFnZUFyZWEtPmNsZWFyKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0
IFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0KLSAgICBS
ZWZQdHI8SVBDOjpDb25uZWN0aW9uPiBtX2FsbG93ZWRDb25uZWN0aW9uOwotICAgIHVuc2lnbmVk
IG1fcXVvdGFJbkJ5dGVzOwotCi0gICAgSGFzaE1hcDxTZWN1cml0eU9yaWdpbkRhdGEsIFJlZlB0
cjxTdG9yYWdlQXJlYT4+IG1fc3RvcmFnZUFyZWFNYXA7Ci19OwotCi1SZWY8U3RvcmFnZU1hbmFn
ZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2U6OmNyZWF0ZSh1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKCpuZXcgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UocXVvdGFJbkJ5dGVzKSk7Ci19
Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotICAgIDogbV9xdW90YUluQnl0ZXMo
cXVvdGFJbkJ5dGVzKQotewotfQotCi1TdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2U6On5TZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSgpCi17Ci19Ci0KLXZvaWQgU3RvcmFnZU1h
bmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpzZXRBbGxvd2VkQ29ubmVjdGlvbihJUEM6
OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKQotewotICAgIEFTU0VSVCghYWxsb3dlZENv
bm5lY3Rpb24gfHwgIW1fYWxsb3dlZENvbm5lY3Rpb24pOwotCi0gICAgbV9hbGxvd2VkQ29ubmVj
dGlvbiA9IGFsbG93ZWRDb25uZWN0aW9uOwotfQotCi1hdXRvIFN0b3JhZ2VNYW5hZ2VyOjpTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZTo6Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdp
bkRhdGEmJiBzZWN1cml0eU9yaWdpbikgLT4gUmVmPFN0b3JhZ2VBcmVhPgotewotICAgIHJldHVy
biAqbV9zdG9yYWdlQXJlYU1hcC5lbnN1cmUoc2VjdXJpdHlPcmlnaW4sIFt0aGlzLCBzZWN1cml0
eU9yaWdpbl0oKSBtdXRhYmxlIHsKLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VBcmVhOjpjcmVhdGUo
bnVsbHB0ciwgV1RGTW92ZShzZWN1cml0eU9yaWdpbiksIG1fcXVvdGFJbkJ5dGVzKTsKLSAgICB9
KS5pdGVyYXRvci0+dmFsdWUuY29weVJlZigpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y2xvbmVUbyhTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSYg
bmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChuZXdTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZSwgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UuaXNFbXB0eSgp
KTsKLQotICAgIGZvciAoYXV0byYgcGFpciA6IG1fc3RvcmFnZUFyZWFNYXApCi0gICAgICAgIG5l
d1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLm1fc3RvcmFnZUFyZWFNYXAuYWRkKHBhaXIua2V5LCBw
YWlyLnZhbHVlLT5jbG9uZSgpKTsKLX0KLQotUmVmPFN0b3JhZ2VNYW5hZ2VyPiBTdG9yYWdlTWFu
YWdlcjo6Y3JlYXRlKGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQotewotICAg
IHJldHVybiBhZG9wdFJlZigqbmV3IFN0b3JhZ2VNYW5hZ2VyKGxvY2FsU3RvcmFnZURpcmVjdG9y
eSkpOwotfQotCi1TdG9yYWdlTWFuYWdlcjo6U3RvcmFnZU1hbmFnZXIoY29uc3QgU3RyaW5nJiBs
b2NhbFN0b3JhZ2VEaXJlY3RvcnkpCi0gICAgOiBtX3F1ZXVlKFdvcmtRdWV1ZTo6Y3JlYXRlKCJj
b20uYXBwbGUuV2ViS2l0LlN0b3JhZ2VNYW5hZ2VyIikpCi0gICAgLCBtX2xvY2FsU3RvcmFnZURh
dGFiYXNlVHJhY2tlcihMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmNyZWF0ZShtX3F1ZXVl
LmNvcHlSZWYoKSwgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSkKLXsKLSAgICAvLyBNYWtlIHN1cmUg
dGhlIGVuY29kaW5nIGlzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0
aGluZ3MgdG8gdGhlIHF1ZXVlLgotICAgIFVURjhFbmNvZGluZygpOwotfQotCi1TdG9yYWdlTWFu
YWdlcjo6flN0b3JhZ2VNYW5hZ2VyKCkKLXsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3Jl
YXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1
bnNpZ25lZCBxdW90YUluQnl0ZXMpCi17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlELCBxdW90YUlu
Qnl0ZXNdKCkgbXV0YWJsZSB7Ci0gICAgICAgIEFTU0VSVCghbV9zZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZXMuY29udGFpbnMoc3RvcmFnZU5hbWVzcGFjZUlEKSk7Ci0KLSAgICAgICAgbV9zZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZXMuc2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2U6OmNyZWF0ZShxdW90YUluQnl0ZXMpKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9y
YWdlTWFuYWdlcjo6ZGVzdHJveVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCkKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVk
VGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBzdG9yYWdlTmFtZXNwYWNlSURdIHsKLSAgICAgICAgQVNT
RVJUKG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmNvbnRhaW5zKHN0b3JhZ2VOYW1lc3BhY2VJ
RCkpOwotICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5yZW1vdmUoc3RvcmFnZU5h
bWVzcGFjZUlEKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0QWxsb3dl
ZFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlQ29ubmVjdGlvbih1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQsIElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24pCi17Ci0gICAgbV9xdWV1
ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29ubmVj
dGlvbiA9IFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+KGFsbG93ZWRDb25uZWN0aW9uKSwgc3RvcmFn
ZU5hbWVzcGFjZUlEXSgpIG11dGFibGUgewotICAgICAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZXMuY29udGFpbnMoc3RvcmFnZU5hbWVzcGFjZUlEKSk7Ci0KLSAgICAgICAgbV9z
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCktPnNldEFsbG93
ZWRDb25uZWN0aW9uKGNvbm5lY3Rpb24uZ2V0KCkpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3Jh
Z2VNYW5hZ2VyOjpjbG9uZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VO
YW1lc3BhY2VJRCwgdWludDY0X3QgbmV3U3RvcmFnZU5hbWVzcGFjZUlEKQotewotICAgIG1fcXVl
dWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgbmV3U3RvcmFnZU5hbWVzcGFjZUlEXSB7Ci0gICAgICAgIFNlc3Npb25T
dG9yYWdlTmFtZXNwYWNlKiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA9IG1fc2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2VzLmdldChzdG9yYWdlTmFtZXNwYWNlSUQpOwotICAgICAgICBpZiAoIXNlc3Np
b25TdG9yYWdlTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2UgY2FuIGdldCBp
bnRvIHRoaXMgc2l0dWF0aW9uIGlmIHNvbWVvbmUgY2xvc2VzIHRoZSBvcmlnaW5hdGluZyBwYWdl
IGZyb20gd2l0aGluIGEKLSAgICAgICAgICAgIC8vIGNyZWF0ZU5ld1BhZ2UgY2FsbGJhY2suIFdl
IGJhaWwgZm9yIG5vdywgYnV0IHdlIHNob3VsZCByZWFsbHkgZmluZCBhIHdheSB0byBrZWVwIHRo
ZSBzZXNzaW9uIHN0b3JhZ2UgYWxpdmUKLSAgICAgICAgICAgIC8vIHNvIHdlIHdlJ2xsIGNsb25l
IHRoZSBzZXNzaW9uIHN0b3JhZ2UgY29ycmVjdGx5LgotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0KLSAgICAgICAgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UqIG5ld1Nlc3Npb25TdG9y
YWdlTmFtZXNwYWNlID0gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KG5ld1N0b3JhZ2VO
YW1lc3BhY2VJRCk7Ci0gICAgICAgIEFTU0VSVChuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7
Ci0KLSAgICAgICAgc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPmNsb25lVG8oKm5ld1Nlc3Npb25T
dG9yYWdlTmFtZXNwYWNlKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6cHJv
Y2Vzc1dpbGxPcGVuQ29ubmVjdGlvbihXZWJQcm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24m
IGNvbm5lY3Rpb24pCi17Ci0gICAgY29ubmVjdGlvbi5hZGRXb3JrUXVldWVNZXNzYWdlUmVjZWl2
ZXIoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fcXVl
dWUuZ2V0KCksIHRoaXMpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpwcm9jZXNzRGlkQ2xv
c2VDb25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlv
bikKLXsKLSAgICBjb25uZWN0aW9uLnJlbW92ZVdvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlcihNZXNz
YWdlczo6U3RvcmFnZU1hbmFnZXI6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSk7Ci0KLSAgICBtX3F1
ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb25u
ZWN0aW9uID0gUmVmPElQQzo6Q29ubmVjdGlvbj4oY29ubmVjdGlvbildKCkgbXV0YWJsZSB7Ci0g
ICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90
Pj4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmU7Ci0gICAgICAgIGZvciAo
YXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbikgewotICAgICAg
ICAgICAgaWYgKHN0b3JhZ2VBcmVhLmtleS5maXJzdCAhPSBjb25uZWN0aW9uLnB0cigpKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBzdG9yYWdlQXJlYS52YWx1ZS0+
cmVtb3ZlTGlzdGVuZXIoKnN0b3JhZ2VBcmVhLmtleS5maXJzdCwgc3RvcmFnZUFyZWEua2V5LnNl
Y29uZCk7Ci0gICAgICAgICAgICBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92
ZS5hcHBlbmQoc3RvcmFnZUFyZWEua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoYXV0
byYgcGFpciA6IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlKQotICAgICAg
ICAgICAgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24ucmVtb3ZlKHBhaXIpOwotICAgIH0pOwot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rp
b248dm9pZChIYXNoU2V0PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxl
dGlvbkhhbmRsZXIpCi17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRo
aXMgPSBtYWtlUmVmKCp0aGlzKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRp
b25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgSGFzaFNldDxTZWN1cml0eU9yaWdpbkRh
dGE+IG9yaWdpbnM7Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKSB7Ci0gICAgICAg
ICAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5vcmlnaW5z
KCkpCi0gICAgICAgICAgICAgICAgb3JpZ2lucy5hZGQob3JpZ2luKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3JpZ2lucyA9IFdURk1vdmUob3JpZ2lu
cyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0
YWJsZSB7Ci0gICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbnMpKTsK
LSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0ZVNl
c3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
Ci17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVm
KCp0aGlzKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
KSBtdXRhYmxlIHsKLSAgICAgICAgZm9yIChhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6
IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgc2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7Ci0KLSAgICAgICAgUnVu
TG9vcDo6bWFpbigpLmRpc3BhdGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKLSAgICB9
KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlU2Vzc2lvblN0b3JhZ2VFbnRyaWVz
Rm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYgb3Jp
Z2lucywgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQotewotICAgIFZlY3Rv
cjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+IGNvcGllZE9yaWdpbnM7Ci0gICAgY29waWVk
T3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG9yaWdpbnMuc2l6ZSgpKTsKLQotICAgIGZv
ciAoYXV0byYgb3JpZ2luIDogb3JpZ2lucykKLSAgICAgICAgY29waWVkT3JpZ2lucy51bmNoZWNr
ZWRBcHBlbmQob3JpZ2luLmlzb2xhdGVkQ29weSgpKTsKLQotICAgIG1fcXVldWUtPmRpc3BhdGNo
KFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvcGllZE9yaWdpbnMgPSBX
VEZNb3ZlKGNvcGllZE9yaWdpbnMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxl
dGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IGNv
cGllZE9yaWdpbnMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgc2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2UgOiBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAg
ICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09y
aWdpbihvcmlnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3Bh
dGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9y
YWdlTWFuYWdlcjo6Z2V0TG9jYWxTdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsK
LSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRo
aXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11
dGFibGUgewotICAgICAgICBIYXNoU2V0PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKLQot
ICAgICAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
LT5vcmlnaW5zKCkpCi0gICAgICAgICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOwotCi0gICAgICAg
IGZvciAoYXV0byYgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8m
IG9yaWdpbiA6IHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+b3JpZ2lucygpKQotICAg
ICAgICAgICAgICAgIG9yaWdpbnMuYWRkKG9yaWdpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBS
dW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW29yaWdpbnMgPSBXVEZNb3ZlKG9yaWdpbnMpLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewot
ICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoV1RGTW92ZShvcmlnaW5zKSk7Ci0gICAgICAg
IH0pOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VP
cmlnaW5EZXRhaWxzKEZ1bmN0aW9uPHZvaWQgKFZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI6Ok9yaWdpbkRldGFpbHM+KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBtX3F1
ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewot
ICAgICAgICBhdXRvIG9yaWdpbkRldGFpbHMgPSBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
ci0+b3JpZ2luRGV0YWlscygpOwotCi0gICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChb
b3JpZ2luRGV0YWlscyA9IFdURk1vdmUob3JpZ2luRGV0YWlscyksIGNvbXBsZXRpb25IYW5kbGVy
ID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBj
b21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbkRldGFpbHMpKTsKLSAgICAgICAgfSk7Ci0g
ICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0ZUxvY2FsU3RvcmFnZUVudHJp
ZXNGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pCi17Ci0gICAg
bV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwg
Y29waWVkT3JpZ2luID0gc2VjdXJpdHlPcmlnaW4uaXNvbGF0ZWRDb3B5KCldKCkgbXV0YWJsZSB7
Ci0gICAgICAgIGZvciAoYXV0byYgbG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3Jh
Z2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgbG9jYWxTdG9yYWdlTmFtZXNwYWNl
LT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvcGllZE9yaWdpbik7Ci0KLSAgICAg
ICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVu
dExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICB0cmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29w
aWVkT3JpZ2luKTsKLQotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVs
ZXRlRGF0YWJhc2VXaXRoT3JpZ2luKGNvcGllZE9yaWdpbik7Ci0gICAgfSk7Ci19Ci0KLXZvaWQg
U3RvcmFnZU1hbmFnZXI6OmRlbGV0ZUxvY2FsU3RvcmFnZU9yaWdpbnNNb2RpZmllZFNpbmNlKHN0
ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgdGltZSwgRnVuY3Rpb248dm9pZCgp
PiYmIGNvbXBsZXRpb25IYW5kbGVyKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBw
cm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHRpbWUsIGNvbXBsZXRpb25IYW5kbGVyID0g
V1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAgICAgIGF1dG8gZGVs
ZXRlZE9yaWdpbnMgPSBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVsZXRlRGF0YWJh
c2VzTW9kaWZpZWRTaW5jZSh0aW1lKTsKLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9yaWdp
biA6IGRlbGV0ZWRPcmlnaW5zKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFn
ZU5hbWVzcGFjZSA6IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKLSAgICAgICAg
ICAgICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdP
cmlnaW4ob3JpZ2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoYXV0byYgdHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Vz
LnZhbHVlcygpKQotICAgICAgICAgICAgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5j
bGVhckFsbFN0b3JhZ2VBcmVhcygpOwotCi0gICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRj
aChXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFn
ZU1hbmFnZXI6OmRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3Rv
cjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+
JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4g
Y29waWVkT3JpZ2luczsKLSAgICBjb3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHko
b3JpZ2lucy5zaXplKCkpOwotCi0gICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQotICAg
ICAgICBjb3BpZWRPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5KCkp
OwotCi0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVm
KCp0aGlzKSwgY29waWVkT3JpZ2lucyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBsZXRp
b25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7Ci0gICAg
ICAgIGZvciAoYXV0byYgb3JpZ2luIDogY29waWVkT3JpZ2lucykgewotICAgICAgICAgICAgZm9y
IChhdXRvJiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMu
dmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0
b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0
byYgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOwot
Ci0gICAgICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVsZXRlRGF0YWJh
c2VXaXRoT3JpZ2luKG9yaWdpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBSdW5Mb29wOjptYWlu
KCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOwotICAgIH0pOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9u
JiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1l
c3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW5EYXRhKQotewotICAg
IHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+IGNvbm5lY3Rpb25B
bmRTdG9yYWdlTWFwSURQYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgLy8g
RklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NFUlQoKEhhc2hN
YXA8c3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4sIFJlZlB0cjxT
dG9yYWdlQXJlYT4+Ojppc1ZhbGlkS2V5KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKSkp
OwotCi0gICAgSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2
NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj46OkFkZFJlc3VsdCByZXN1bHQgPSBtX3N0b3JhZ2VB
cmVhc0J5Q29ubmVjdGlvbi5hZGQoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIsIG51bGxw
dHIpOwotCi0gICAgLy8gRklYTUU6IFRoZXNlIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2tzLgot
ICAgIEFTU0VSVChyZXN1bHQuaXNOZXdFbnRyeSk7Ci0gICAgQVNTRVJUKChIYXNoTWFwPHVpbnQ2
NF90LCBSZWZQdHI8TG9jYWxTdG9yYWdlTmFtZXNwYWNlPj46OmlzVmFsaWRLZXkoc3RvcmFnZU5h
bWVzcGFjZUlEKSkpOwotCi0gICAgTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBsb2NhbFN0b3JhZ2VO
YW1lc3BhY2UgPSBnZXRPckNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZShzdG9yYWdlTmFtZXNw
YWNlSUQpOwotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4K
LSAgICBBU1NFUlQobG9jYWxTdG9yYWdlTmFtZXNwYWNlKTsKLQotICAgIGF1dG8gc3RvcmFnZUFy
ZWEgPSBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92
ZShzZWN1cml0eU9yaWdpbkRhdGEpKTsKLSAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29u
bmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAgIHJlc3VsdC5pdGVyYXRvci0+dmFsdWUgPSBX
VEZNb3ZlKHN0b3JhZ2VBcmVhKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlVHJh
bnNpZW50TG9jYWxTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0
X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFNlY3VyaXR5T3Jp
Z2luRGF0YSYmIHRvcExldmVsT3JpZ2luRGF0YSwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgb3JpZ2lu
KQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAg
QVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAmY29ubmVjdGlv
biwgc3RvcmFnZU1hcElEIH0pKTsKLQotICAgIC8vIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgc2Vz
c2lvbiBzdG9yYWdlIGZvciB0aGlzIGNvbm5lY3Rpb24vb3JpZ2luIGNvbWJvLgotICAgIC8vIElm
IHNvLCB1cGRhdGUgdGhlIG1hcCB3aXRoIHRoZSBuZXcgSUQsIG90aGVyd2lzZSBrZWVwIG9uIHRy
dWNraW5nLgotICAgIGZvciAoYXV0byBpdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmJl
Z2luKCksIGVuZCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmVuZCgpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5rZXkuZmlyc3QgIT0gJmNvbm5lY3Rpb24pCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgUmVmPFN0b3JhZ2VBcmVhPiBhcmVhID0gKml0LT52
YWx1ZTsKLSAgICAgICAgaWYgKCFhcmVhLT5pc1Nlc3Npb25TdG9yYWdlKCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgaWYgKCFvcmlnaW4uc2VjdXJpdHlPcmlnaW4oKS0+aXNTYW1l
U2NoZW1lSG9zdFBvcnQoYXJlYS0+c2VjdXJpdHlPcmlnaW4oKS5zZWN1cml0eU9yaWdpbigpLmdl
dCgpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhcmVhLT5hZGRMaXN0ZW5lcihj
b25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVj
dGlvbi5yZW1vdmUoaXQpOwotICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQo
eyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIFdURk1vdmUoYXJlYSkpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byYgc2xvdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0
aW9uLmFkZCh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSwgbnVsbHB0cikuaXRlcmF0b3It
PnZhbHVlOwotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4K
LSAgICBBU1NFUlQoIXNsb3QpOwotCi0gICAgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNl
KiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgPSBnZXRPckNyZWF0ZVRyYW5zaWVudExv
Y2FsU3RvcmFnZU5hbWVzcGFjZShzdG9yYWdlTmFtZXNwYWNlSUQsIFdURk1vdmUodG9wTGV2ZWxP
cmlnaW5EYXRhKSk7Ci0KLSAgICBhdXRvIHN0b3JhZ2VBcmVhID0gdHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlLT5nZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFdURk1vdmUob3JpZ2luKSk7Ci0g
ICAgc3RvcmFnZUFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0K
LSAgICBzbG90ID0gV1RGTW92ZShzdG9yYWdlQXJlYSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFn
ZXI6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwg
dWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFNlY3Vy
aXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luRGF0YSkKLXsKLSAgICAvLyBGSVhNRTogVGhp
cyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVChtX3Nlc3Npb25TdG9yYWdl
TmFtZXNwYWNlcy5pc1ZhbGlkS2V5KHN0b3JhZ2VOYW1lc3BhY2VJRCkpOwotCi0gICAgU2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UqIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0gICAgaWYgKCFzZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZSkgewotICAgICAgICAvLyBXZSdyZSBnZXR0aW5nIGFuIGluY29taW5n
IG1lc3NhZ2UgZnJvbSB0aGUgd2ViIHByb2Nlc3MgdGhhdCdzIGZvciBzZXNzaW9uIHN0b3JhZ2Ug
Zm9yIGEgd2ViIHBhZ2UKLSAgICAgICAgLy8gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwg
anVzdCBpZ25vcmUgaXQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTog
VGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVChtX3N0b3JhZ2VBcmVh
c0J5Q29ubmVjdGlvbi5pc1ZhbGlkS2V5KHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCB9KSk7
Ci0KLSAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNv
bm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0KLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVCgh
c2xvdCk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgot
ICAgIEFTU0VSVCgmY29ubmVjdGlvbiA9PSBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+YWxsb3dl
ZENvbm5lY3Rpb24oKSk7Ci0KLSAgICBhdXRvIHN0b3JhZ2VBcmVhID0gc2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92ZShzZWN1cml0eU9yaWdpbkRh
dGEpKTsKLSAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKTsKLQotICAgIHNsb3QgPSBXVEZNb3ZlKHN0b3JhZ2VBcmVhKTsKLX0KLQotdm9pZCBTdG9y
YWdlTWFuYWdlcjo6ZGVzdHJveVN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9u
LCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpCi17Ci0gICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNv
bm5lY3Rpb24+LCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5l
Y3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBt
ZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVChtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5pc1Zh
bGlkS2V5KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKSk7Ci0KLSAgICBhdXRvIGl0ID0g
bV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZmluZChjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElE
UGFpcik7Ci0gICAgaWYgKGl0ID09IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmVuZCgpKSB7
Ci0gICAgICAgIC8vIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYmVjYXVzZSB0aGUg
bGFzdCBwYWdlIHdhcyBjbG9zZWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpdC0+
dmFsdWUtPnJlbW92ZUxpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICAv
LyBEb24ndCByZW1vdmUgc2Vzc2lvbiBzdG9yYWdlIG1hcHMuIFRoZSB3ZWIgcHJvY2VzcyBtYXkg
cmVjb25uZWN0IGFuZCBleHBlY3QgdGhlIGRhdGEgdG8gc3RpbGwgYmUgYXJvdW5kLgotICAgIGlm
IChpdC0+dmFsdWUtPmlzU2Vzc2lvblN0b3JhZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
bV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24ucmVtb3ZlKGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFw
SURQYWlyKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6Z2V0VmFsdWVzKElQQzo6Q29ubmVj
dGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIHZhbHVlcykKLXsKLSAgICBTdG9yYWdl
QXJlYSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKTsKLSAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBzZXNz
aW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQu
IElnbm9yZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhbHVlcyA9IHN0b3Jh
Z2VBcmVhLT5pdGVtcygpOwotICAgIGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFy
ZWFNYXA6OkRpZEdldFZhbHVlcyhzdG9yYWdlTWFwU2VlZCksIHN0b3JhZ2VNYXBJRCk7Ci19Ci0K
LXZvaWQgU3RvcmFnZU1hbmFnZXI6OnNldEl0ZW0oSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9u
LCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVp
bnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgU3RvcmFnZUFyZWEqIHN0b3Jh
Z2VBcmVhID0gZmluZFN0b3JhZ2VBcmVhKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0gICAg
aWYgKCFzdG9yYWdlQXJlYSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgc2Vzc2lvbiBzdG9yYWdl
IGFyZWEgZm9yIGEgcGFnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBJZ25vcmUgaXQu
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHF1b3RhRXJyb3I7Ci0gICAgc3Rv
cmFnZUFyZWEtPnNldEl0ZW0oJmNvbm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwg
dmFsdWUsIHVybFN0cmluZywgcXVvdGFFcnJvcik7Ci0gICAgY29ubmVjdGlvbi5zZW5kKE1lc3Nh
Z2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkU2V0SXRlbShzdG9yYWdlTWFwU2VlZCwga2V5LCBxdW90
YUVycm9yKSwgc3RvcmFnZU1hcElEKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6cmVtb3Zl
SXRlbShJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwg
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNv
bnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKLXsKLSAgICBTdG9yYWdl
QXJlYSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1h
cElEKTsKLSAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBzZXNz
aW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQu
IElnbm9yZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0b3JhZ2VBcmVhLT5y
ZW1vdmVJdGVtKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIHVybFN0cmlu
Zyk7Ci0gICAgY29ubmVjdGlvbi5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkUmVt
b3ZlSXRlbShzdG9yYWdlTWFwU2VlZCwga2V5KSwgc3RvcmFnZU1hcElEKTsKLX0KLQotdm9pZCBT
dG9yYWdlTWFuYWdlcjo6Y2xlYXIoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRf
dCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0
b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKLXsKLSAgICBTdG9yYWdlQXJl
YSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
KTsKLSAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9u
IHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIEln
bm9yZSBpdC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0b3JhZ2VBcmVhLT5jbGVh
cigmY29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwgdXJsU3RyaW5nKTsKLSAgICBjb25u
ZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRDbGVhcihzdG9yYWdlTWFw
U2VlZCksIHN0b3JhZ2VNYXBJRCk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmFwcGxpY2F0
aW9uV2lsbFRlcm1pbmF0ZSgpCi17Ci0gICAgQmluYXJ5U2VtYXBob3JlIHNlbWFwaG9yZTsKLSAg
ICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgJnNlbWFwaG9yZV0gewotICAgICAgICBWZWN0b3I8
c3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4+IGNvbm5lY3Rpb25B
bmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlOwotICAgICAgICBmb3IgKGF1dG8mIGNvbm5lY3Rp
b25TdG9yYWdlQXJlYVBhaXIgOiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbikgewotICAgICAg
ICAgICAgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoKmNv
bm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5LmZpcnN0LCBjb25uZWN0aW9uU3RvcmFnZUFyZWFQ
YWlyLmtleS5zZWNvbmQpOwotICAgICAgICAgICAgY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBh
aXJzVG9SZW1vdmUuYXBwZW5kKGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5KTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGZvciAoYXV0byYgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IGNv
bm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlKQotICAgICAgICAgICAgbV9zdG9y
YWdlQXJlYXNCeUNvbm5lY3Rpb24ucmVtb3ZlKGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIpOwot
Ci0gICAgICAgIHNlbWFwaG9yZS5zaWduYWwoKTsKLSAgICB9KTsKLSAgICBzZW1hcGhvcmUud2Fp
dChXYWxsVGltZTo6aW5maW5pdHkoKSk7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJl
YSogU3RvcmFnZU1hbmFnZXI6OmZpbmRTdG9yYWdlQXJlYShJUEM6OkNvbm5lY3Rpb24mIGNvbm5l
Y3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkgY29uc3QKLXsKLSAgICBzdGQ6OnBhaXI8SVBD
OjpDb25uZWN0aW9uKiwgdWludDY0X3Q+IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKCZj
b25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgaWYgKCFtX3N0b3JhZ2VBcmVhc0J5Q29u
bmVjdGlvbi5pc1ZhbGlkS2V5KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKSkKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rp
b24uZ2V0KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKTsKLX0KLQotU3RvcmFnZU1hbmFn
ZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZSogU3RvcmFnZU1hbmFnZXI6OmdldE9yQ3JlYXRlTG9j
YWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKLXsKLSAgICBp
ZiAoIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy5pc1ZhbGlkS2V5KHN0b3JhZ2VOYW1lc3BhY2VJ
RCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgYXV0byYgc2xvdCA9IG1fbG9jYWxT
dG9yYWdlTmFtZXNwYWNlcy5hZGQoc3RvcmFnZU5hbWVzcGFjZUlELCBudWxscHRyKS5pdGVyYXRv
ci0+dmFsdWU7Ci0gICAgaWYgKCFzbG90KQotICAgICAgICBzbG90ID0gTG9jYWxTdG9yYWdlTmFt
ZXNwYWNlOjpjcmVhdGUodGhpcywgc3RvcmFnZU5hbWVzcGFjZUlEKTsKLQotICAgIHJldHVybiBz
bG90LmdldCgpOwotfQotCi1TdG9yYWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKiBTdG9yYWdlTWFuYWdlcjo6Z2V0T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGEmJiB0b3BMZXZlbE9yaWdpbikKLXsKLSAgICBpZiAoIW1fdHJhbnNpZW50TG9jYWxT
dG9yYWdlTmFtZXNwYWNlcy5pc1ZhbGlkS2V5KHsgc3RvcmFnZU5hbWVzcGFjZUlELCB0b3BMZXZl
bE9yaWdpbiB9KSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvJiBzbG90ID0g
bV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmFkZCh7IHN0b3JhZ2VOYW1lc3BhY2VJ
RCwgV1RGTW92ZSh0b3BMZXZlbE9yaWdpbikgfSwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOwot
ICAgIGlmICghc2xvdCkKLSAgICAgICAgc2xvdCA9IFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZTo6Y3JlYXRlKCk7Ci0KLSAgICByZXR1cm4gc2xvdC5nZXQoKTsKLX0KLQotfSAvLyBuYW1l
c3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VNYW5hZ2VyLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjY5ZWI3MDczYTNj
YTVmM2I4ZTI3ZDkzM2QxYjhhZTI4MWEwOWIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdl
TWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
cHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2lu
RGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5IYXNoLmg+Ci0jaW5jbHVk
ZSA8Y2hyb25vPgotI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+Ci0jaW5jbHVkZSA8d3RmL0Z1bmN0
aW9uLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFkU2Fm
ZVJlZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+Ci0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLWNsYXNzIFNlY3VyaXR5T3JpZ2luOwotfQotCi1uYW1lc3BhY2UgV2Vi
S2l0IHsKLQotY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOwotY2xhc3MgV2ViUHJv
Y2Vzc1Byb3h5OwotCi1jbGFzcyBTdG9yYWdlTWFuYWdlciA6IHB1YmxpYyBJUEM6OkNvbm5lY3Rp
b246OldvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxT
dG9yYWdlTWFuYWdlcj4gY3JlYXRlKGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5
KTsKLSAgICB+U3RvcmFnZU1hbmFnZXIoKTsKLQotICAgIHZvaWQgY3JlYXRlU2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1bnNpZ25lZCBxdW90YUlu
Qnl0ZXMpOwotICAgIHZvaWQgZGVzdHJveVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90
IHN0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0gICAgdm9pZCBzZXRBbGxvd2VkU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2VDb25uZWN0aW9uKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgSVBDOjpDb25u
ZWN0aW9uKiBhbGxvd2VkQ29ubmVjdGlvbik7Ci0gICAgdm9pZCBjbG9uZVNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdWludDY0X3QgbmV3U3RvcmFn
ZU5hbWVzcGFjZUlEKTsKLQotICAgIHZvaWQgcHJvY2Vzc1dpbGxPcGVuQ29ubmVjdGlvbihXZWJQ
cm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24mKTsKLSAgICB2b2lkIHByb2Nlc3NEaWRDbG9z
ZUNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJik7Ci0gICAgdm9p
ZCBhcHBsaWNhdGlvbldpbGxUZXJtaW5hdGUoKTsKLQotICAgIHZvaWQgZ2V0U2Vzc2lvblN0b3Jh
Z2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKLSAgICB2b2lkIGRlbGV0ZVNlc3Npb25TdG9y
YWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOwotICAgIHZv
aWQgZGVsZXRlU2Vzc2lvblN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8V2Vi
Q29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9u
SGFuZGxlcik7Ci0KLSAgICB2b2lkIGdldExvY2FsU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9p
ZChIYXNoU2V0PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxldGlvbkhh
bmRsZXIpOwotICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbihXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0KLSAgICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFn
ZU9yaWdpbnNNb2RpZmllZFNpbmNlKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9p
bnQsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7Ci0gICAgdm9pZCBkZWxl
dGVMb2NhbFN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhPiYsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7
Ci0KLSAgICB2b2lkIGdldExvY2FsU3RvcmFnZU9yaWdpbkRldGFpbHMoRnVuY3Rpb248dm9pZChW
ZWN0b3I8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpPcmlnaW5EZXRhaWxzPik+JiYgY29t
cGxldGlvbkhhbmRsZXIpOwotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0IFN0b3JhZ2VNYW5hZ2Vy
KGNvbnN0IFN0cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KTsKLQotICAgIC8vIElQQzo6Q29u
bmVjdGlvbjo6V29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVyLgotICAgIHZvaWQgZGlkUmVjZWl2ZU1l
c3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJikgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCBkaWRSZWNlaXZlU3luY01lc3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJiwg
c3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4mIHJlcGx5RW5jb2Rlcikgb3ZlcnJpZGU7Ci0K
LSAgICAvLyBNZXNzYWdlIGhhbmRsZXJzLgotICAgIHZvaWQgY3JlYXRlTG9jYWxTdG9yYWdlTWFw
KElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFn
ZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0gICAgdm9pZCBj
cmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qg
c3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luRGF0YSwgV2ViQ29yZTo6U2VjdXJpdHlPcmln
aW5EYXRhJiYpOwotICAgIHZvaWQgY3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0
aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQs
IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKLSAgICB2b2lkIGRlc3Ryb3lTdG9yYWdl
TWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICB2b2lk
IGdldFZhbHVlcyhJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2
NF90IHN0b3JhZ2VNYXBTZWVkLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgdmFsdWVzKTsKLSAg
ICB2b2lkIHNldEl0ZW0oSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCwg
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNv
bnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0
cmluZyk7Ci0gICAgdm9pZCByZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0
b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0g
ICAgdm9pZCBjbGVhcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVp
bnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZyk7Ci0KLSAgICBjbGFzcyBTdG9yYWdlQXJlYTsKLSAgICBTdG9y
YWdlQXJlYSogZmluZFN0b3JhZ2VBcmVhKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90KSBjb25z
dDsKLQotICAgIGNsYXNzIExvY2FsU3RvcmFnZU5hbWVzcGFjZTsKLSAgICBMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UqIGdldE9yQ3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCk7Ci0KLSAgICBjbGFzcyBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2U7Ci0gICAgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBnZXRPckNyZWF0ZVRyYW5z
aWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luKTsKLQotICAgIFJlZjxX
b3JrUXVldWU+IG1fcXVldWU7Ci0KLSAgICBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2Vy
PiBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjsKLSAgICBIYXNoTWFwPHVpbnQ2NF90LCBS
ZWZQdHI8TG9jYWxTdG9yYWdlTmFtZXNwYWNlPj4gbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzOwot
Ci0gICAgSGFzaE1hcDxzdGQ6OnBhaXI8dWludDY0X3QsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
RGF0YT4sIFJlZlB0cjxUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+PiBtX3RyYW5zaWVu
dExvY2FsU3RvcmFnZU5hbWVzcGFjZXM7Ci0KLSAgICBjbGFzcyBTZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZTsKLSAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8U2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2U+PiBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlczsKLQotICAgIEhhc2hNYXA8c3RkOjpwYWly
PFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4sIFJlZlB0cjxTdG9yYWdlQXJlYT4+
IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5h
Z2VyLm1lc3NhZ2VzLmluIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdl
TWFuYWdlci5tZXNzYWdlcy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3ODlm
NzRjYzA4MWIwNzRiNTg4NTBkMmI3ZDdiYzQxODA0OWM4YS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBA
QAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
IwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0jIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0jIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSMgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIyBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUgotIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotIyBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1tZXNzYWdlcyAtPiBT
dG9yYWdlTWFuYWdlciB7Ci0gICAgQ3JlYXRlTG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2FudHNDb25uZWN0aW9uCi0gICAg
Q3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWlu
dDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5E
YXRhIHRvcExldmVsU2VjdXJpdHlPcmlnaW5EYXRhLCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkgV2FudHNDb25uZWN0aW9uCi0gICAgQ3JlYXRl
U2Vzc2lvblN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdl
TmFtZXNwYWNlSUQsIHN0cnVjdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlP
cmlnaW5EYXRhKSBXYW50c0Nvbm5lY3Rpb24KLSAgICBEZXN0cm95U3RvcmFnZU1hcCh1aW50NjRf
dCBzdG9yYWdlTWFwSUQpIFdhbnRzQ29ubmVjdGlvbgotCi0gICAgR2V0VmFsdWVzKHVpbnQ2NF90
IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpIC0+IChIYXNoTWFwPFN0cmlu
ZywgU3RyaW5nPiB2YWx1ZXMpIFdhbnRzQ29ubmVjdGlvbgotCi0gICAgU2V0SXRlbSh1aW50NjRf
dCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0
b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIFN0cmluZyB1cmxTdHJpbmcp
IFdhbnRzQ29ubmVjdGlvbgotICAgIFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcElELCB1
aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3Ry
aW5nIGtleSwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCi0gICAgQ2xlYXIodWlu
dDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRf
dCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCi19CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9Mb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXJJT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdl
L2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJT1MubW0KZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGZkOTA5ZWE2YjI1MDMxOWIwMTMwNmM0MzZiZDBmMTMyYzBmODI4NTYuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvU3RvcmFnZS9pb3MvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VySU9TLm1t
CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIKLQotI2lm
IFBMQVRGT1JNKElPUykKLQotI2luY2x1ZGUgIlZlcnNpb25DaGVja3MuaCIKLQotbmFtZXNwYWNl
IFdlYktpdCB7Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpwbGF0Zm9ybU1h
eWJlRXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdAotewotICAgIGlmIChtX2hhc0V4Y2x1ZGVkRnJv
bUJhY2t1cCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9oYXNFeGNsdWRlZEZyb21CYWNrdXAg
PSB0cnVlOwotCi0gICAgaWYgKGxpbmtlZE9uT3JBZnRlcihTREtWZXJzaW9uOjpGaXJzdFRvRXhj
bHVkZUxvY2FsU3RvcmFnZUZyb21CYWNrdXApKQotICAgICAgICBbW05TVVJMIGZpbGVVUkxXaXRo
UGF0aDooTlNTdHJpbmcgKiltX2xvY2FsU3RvcmFnZURpcmVjdG9yeV0gc2V0UmVzb3VyY2VWYWx1
ZTpAWUVTIGZvcktleTpOU1VSTElzRXhjbHVkZWRGcm9tQmFja3VwS2V5IGVycm9yOm5pbF07Ci19
Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZUlPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL1Jl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbQpkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggNWI1Y2JkMjhlMjQ5MjkxM2E0MzI3NjRjOWJhOTM2NTI3N2M5Nzcy
MS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2VJT1MubW0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
LSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
Ci0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2UuaCIKLQotI2lmIFBMQVRGT1JNKElPUykKLQotbmFtZXNwYWNlIFdl
YktpdCB7Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpl
eGNsdWRlRnJvbUJhY2t1cCgpIGNvbnN0Ci17Ci0gICAgW1tOU1VSTCBmaWxlVVJMV2l0aFBhdGg6
KE5TU3RyaW5nICopbV9zdG9yYWdlRGlyZWN0b3J5UGF0aF0gc2V0UmVzb3VyY2VWYWx1ZTpAWUVT
IGZvcktleTpOU1VSTElzRXhjbHVkZWRGcm9tQmFja3VwS2V5IGVycm9yOm5pbF07Ci19Ci0KLX0K
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdl
L0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0
b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU5OGEzYmQ2ODkwZTUz
ZDkxYzM5MDRjOTk3OWU5MWRhZTQ1NTA1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcApAQCAtMCww
ICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZS5oIgorCisjaW5jbHVkZSAiTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVt
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJD
b3JlL1NRTGl0ZVRyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdp
bi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U3VkZGVuVGVybWluYXRpb24uaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1dvcmtRdWV1ZS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K3N0YXRpYyBjb25zdCBhdXRvIGRhdGFiYXNlVXBkYXRlSW50ZXJ2YWwgPSAxX3M7CisKK3N0YXRp
YyBjb25zdCBpbnQgbWF4aW11bUl0ZW1zVG9VcGRhdGUgPSAxMDA7CisKK25hbWVzcGFjZSBXZWJL
aXQgeworCitSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IExvY2FsU3RvcmFnZURhdGFiYXNlOjpj
cmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiBxdWV1ZSwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlcj4mJiB0cmFja2VyLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2lu
KQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKFdURk1v
dmUocXVldWUpLCBXVEZNb3ZlKHRyYWNrZXIpLCBzZWN1cml0eU9yaWdpbikpOworfQorCitMb2Nh
bFN0b3JhZ2VEYXRhYmFzZTo6TG9jYWxTdG9yYWdlRGF0YWJhc2UoUmVmPFdvcmtRdWV1ZT4mJiBx
dWV1ZSwgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4mJiB0cmFja2VyLCBjb25zdCBT
ZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQorICAgIDogbV9xdWV1ZShXVEZNb3Zl
KHF1ZXVlKSkKKyAgICAsIG1fdHJhY2tlcihXVEZNb3ZlKHRyYWNrZXIpKQorICAgICwgbV9zZWN1
cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbikKKyAgICAsIG1fZGF0YWJhc2VQYXRoKG1fdHJhY2tl
ci0+ZGF0YWJhc2VQYXRoKG1fc2VjdXJpdHlPcmlnaW4pKQorICAgICwgbV9mYWlsZWRUb09wZW5E
YXRhYmFzZShmYWxzZSkKKyAgICAsIG1fZGlkSW1wb3J0SXRlbXMoZmFsc2UpCisgICAgLCBtX2lz
Q2xvc2VkKGZhbHNlKQorICAgICwgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKGZhbHNlKQor
ICAgICwgbV9zaG91bGRDbGVhckl0ZW1zKGZhbHNlKQoreworfQorCitMb2NhbFN0b3JhZ2VEYXRh
YmFzZTo6fkxvY2FsU3RvcmFnZURhdGFiYXNlKCkKK3sKKyAgICBBU1NFUlQobV9pc0Nsb3NlZCk7
Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Om9wZW5EYXRhYmFzZShEYXRhYmFzZU9w
ZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNl
LmlzT3BlbigpKTsKKyAgICBBU1NFUlQoIW1fZmFpbGVkVG9PcGVuRGF0YWJhc2UpOworCisgICAg
aWYgKCF0cnlUb09wZW5EYXRhYmFzZShvcGVuaW5nU3RyYXRlZ3kpKSB7CisgICAgICAgIG1fZmFp
bGVkVG9PcGVuRGF0YWJhc2UgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIG1fdHJhY2tlci0+ZGlkT3BlbkRhdGFi
YXNlV2l0aE9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKTsKK30KKworYm9vbCBMb2NhbFN0b3JhZ2VE
YXRhYmFzZTo6dHJ5VG9PcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgb3Blbmlu
Z1N0cmF0ZWd5KQoreworICAgIGlmICghZmlsZUV4aXN0cyhtX2RhdGFiYXNlUGF0aCkgJiYgb3Bl
bmluZ1N0cmF0ZWd5ID09IFNraXBJZk5vbkV4aXN0ZW50KQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIGlmIChtX2RhdGFiYXNlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGaWxlbmFtZSBmb3IgbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSBpcyBlbXB0eSAtIGNhbm5vdCBv
cGVuIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKG1fZGF0YWJhc2VQYXRoKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGZpbGUgJXMgZm9yIGxvY2FsIHN0
b3JhZ2UiLCBtX2RhdGFiYXNlUGF0aC51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIC8vIFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0IGJvdW5kIHRvIGEg
c3BlY2lmaWMgdGhyZWFkLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhyZWFkaW5nIGNoZWNrcworICAg
IC8vIGV2ZW4gdGhvdWdoIHdlIG5ldmVyIGFjY2VzcyB0aGUgZGF0YWJhc2UgZnJvbSBkaWZmZXJl
bnQgdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KKyAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJlYWRp
bmdDaGVja3MoKTsKKworICAgIGlmICghbWlncmF0ZUl0ZW1UYWJsZUlmTmVlZGVkKCkpIHsKKyAg
ICAgICAgLy8gV2UgZmFpbGVkIHRvIG1pZ3JhdGUgdGhlIGl0ZW0gdGFibGUuIEluIG9yZGVyIHRv
IGF2b2lkIHRyeWluZyB0byBtaWdyYXRlIHRoZSB0YWJsZSBvdmVyIGFuZCBvdmVyLAorICAgICAg
ICAvLyBqdXN0IGRlbGV0ZSBpdCBhbmQgc3RhcnQgZnJvbSBzY3JhdGNoLgorICAgICAgICBpZiAo
IW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkRST1AgVEFCTEUgSXRlbVRhYmxlIikpCisgICAg
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBkZWxldGUgdGFibGUgSXRlbVRhYmxlIGZvciBs
b2NhbCBzdG9yYWdlIik7CisgICAgfQorCisgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVDb21t
YW5kKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBJdGVtVGFibGUgKGtleSBURVhUIFVOSVFV
RSBPTiBDT05GTElDVCBSRVBMQUNFLCB2YWx1ZSBCTE9CIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZB
SUwpIikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRhYmxlIEl0ZW1U
YWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6Om1pZ3Jh
dGVJdGVtVGFibGVJZk5lZWRlZCgpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLnRhYmxlRXhpc3Rz
KCJJdGVtVGFibGUiKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBTUUxpdGVTdGF0ZW1l
bnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCB2YWx1ZSBGUk9NIEl0ZW1UYWJsZSBMSU1JVCAx
Iik7CisKKyAgICAvLyBUaGlzIHF1ZXJ5IGlzbid0IGV2ZXIgZXhlY3V0ZWQsIGl0J3MganVzdCB1
c2VkIHRvIGNoZWNrIHRoZSBjb2x1bW4gdHlwZS4KKyAgICBpZiAocXVlcnkuaXNDb2x1bW5EZWNs
YXJlZEFzQmxvYigwKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDcmVhdGUgYSBu
ZXcgdGFibGUgd2l0aCB0aGUgcmlnaHQgdHlwZSwgY29weSBhbGwgdGhlIGRhdGEgb3ZlciB0byBp
dCBhbmQgdGhlbiByZXBsYWNlIHRoZSBuZXcgdGFibGUgd2l0aCB0aGUgb2xkIHRhYmxlLgorICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBjb21tYW5kc1tdID0geworICAgICAgICAiRFJPUCBUQUJMRSBJ
RiBFWElTVFMgSXRlbVRhYmxlMiIsCisgICAgICAgICJDUkVBVEUgVEFCTEUgSXRlbVRhYmxlMiAo
a2V5IFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHZhbHVlIEJMT0IgTk9UIE5VTEwg
T04gQ09ORkxJQ1QgRkFJTCkiLAorICAgICAgICAiSU5TRVJUIElOVE8gSXRlbVRhYmxlMiBTRUxF
Q1QgKiBmcm9tIEl0ZW1UYWJsZSIsCisgICAgICAgICJEUk9QIFRBQkxFIEl0ZW1UYWJsZSIsCisg
ICAgICAgICJBTFRFUiBUQUJMRSBJdGVtVGFibGUyIFJFTkFNRSBUTyBJdGVtVGFibGUiLAorICAg
ICAgICAwLAorICAgIH07CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2Rh
dGFiYXNlLCBmYWxzZSk7CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBjb21tYW5kc1tpXTsgKytpKSB7CisgICAgICAgIGlmIChtX2RhdGFiYXNlLmV4
ZWN1dGVDb21tYW5kKGNvbW1hbmRzW2ldKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG1pZ3JhdGUgdGFibGUgSXRlbVRhYmxlIGZvciBsb2Nh
bCBzdG9yYWdlIHdoZW4gZXhlY3V0aW5nOiAlcyIsIGNvbW1hbmRzW2ldKTsKKyAgICAgICAgdHJh
bnNhY3Rpb24ucm9sbGJhY2soKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTG9j
YWxTdG9yYWdlRGF0YWJhc2U6OmltcG9ydEl0ZW1zKFN0b3JhZ2VNYXAmIHN0b3JhZ2VNYXApCit7
CisgICAgaWYgKG1fZGlkSW1wb3J0SXRlbXMpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJ
WE1FOiBJZiBpdCBjYW4ndCBpbXBvcnQsIHRoZW4gdGhlIGRlZmF1bHQgV2ViS2l0IGJlaGF2aW9y
IHNob3VsZCBiZSB0aGF0IG9mIHByaXZhdGUgYnJvd3NpbmcsCisgICAgLy8gbm90IHNpbGVudGx5
IGlnbm9yaW5nIGl0LiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU4
OTQKKworICAgIC8vIFdlIHNldCB0aGlzIHRvIHRydWUgZXZlbiBpZiB3ZSBkb24ndCBlbmQgdXAg
aW1wb3J0aW5nIGFueSBpdGVtcyBkdWUgdG8gZmFpbHVyZSBiZWNhdXNlCisgICAgLy8gdGhlcmUn
cyByZWFsbHkgbm8gZ29vZCB3YXkgdG8gcmVjb3ZlciBvdGhlciB0aGFuIG5vdCBpbXBvcnRpbmcg
YW55dGhpbmcuCisgICAgbV9kaWRJbXBvcnRJdGVtcyA9IHRydWU7CisKKyAgICBvcGVuRGF0YWJh
c2UoU2tpcElmTm9uRXhpc3RlbnQpOworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGF0YWJhc2UsICJT
RUxFQ1Qga2V5LCB2YWx1ZSBGUk9NIEl0ZW1UYWJsZSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJl
KCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHNlbGVjdCBp
dGVtcyBmcm9tIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaXRlbXM7CisKKyAgICBpbnQg
cmVzdWx0ID0gcXVlcnkuc3RlcCgpOworICAgIHdoaWxlIChyZXN1bHQgPT0gU1FMSVRFX1JPVykg
eworICAgICAgICBTdHJpbmcga2V5ID0gcXVlcnkuZ2V0Q29sdW1uVGV4dCgwKTsKKyAgICAgICAg
U3RyaW5nIHZhbHVlID0gcXVlcnkuZ2V0Q29sdW1uQmxvYkFzU3RyaW5nKDEpOworICAgICAgICBp
ZiAoIWtleS5pc051bGwoKSAmJiAhdmFsdWUuaXNOdWxsKCkpCisgICAgICAgICAgICBpdGVtcy5z
ZXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKKyAgICB9CisK
KyAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgIExPR19FUlJPUigiRXJy
b3IgcmVhZGluZyBpdGVtcyBmcm9tIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RvcmFnZU1hcC5pbXBvcnRJdGVtcyhpdGVtcyk7
Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnNldEl0ZW0oY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgaXRlbURpZENoYW5nZShrZXksIHZhbHVl
KTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6cmVtb3ZlSXRlbShjb25zdCBTdHJp
bmcmIGtleSkKK3sKKyAgICBpdGVtRGlkQ2hhbmdlKGtleSwgU3RyaW5nKCkpOworfQorCit2b2lk
IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjbGVhcigpCit7CisgICAgbV9jaGFuZ2VkSXRlbXMuY2xl
YXIoKTsKKyAgICBtX3Nob3VsZENsZWFySXRlbXMgPSB0cnVlOworCisgICAgc2NoZWR1bGVEYXRh
YmFzZVVwZGF0ZSgpOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpjbG9zZSgpCit7
CisgICAgQVNTRVJUKCFtX2lzQ2xvc2VkKTsKKyAgICBtX2lzQ2xvc2VkID0gdHJ1ZTsKKworICAg
IGlmIChtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUpIHsKKyAgICAgICAgdXBkYXRlRGF0YWJh
c2VXaXRoQ2hhbmdlZEl0ZW1zKG1fY2hhbmdlZEl0ZW1zKTsKKyAgICAgICAgbV9jaGFuZ2VkSXRl
bXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkgPSBkYXRhYmFzZUlzRW1wdHko
KTsKKworICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICBtX2RhdGFiYXNlLmNs
b3NlKCk7CisKKyAgICBpZiAoaXNFbXB0eSkKKyAgICAgICAgbV90cmFja2VyLT5kZWxldGVEYXRh
YmFzZVdpdGhPcmlnaW4obV9zZWN1cml0eU9yaWdpbik7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdl
RGF0YWJhc2U6Oml0ZW1EaWRDaGFuZ2UoY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYg
dmFsdWUpCit7CisgICAgbV9jaGFuZ2VkSXRlbXMuc2V0KGtleSwgdmFsdWUpOworICAgIHNjaGVk
dWxlRGF0YWJhc2VVcGRhdGUoKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6c2No
ZWR1bGVEYXRhYmFzZVVwZGF0ZSgpCit7CisgICAgaWYgKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVw
ZGF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX2Rpc2FibGVTdWRkZW5UZXJtaW5h
dGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlKQorICAgICAgICBtX2Rpc2FibGVTdWRkZW5U
ZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlID0gc3RkOjptYWtlX3VuaXF1ZTxT
dWRkZW5UZXJtaW5hdGlvbkRpc2FibGVyPigpOworCisgICAgbV9kaWRTY2hlZHVsZURhdGFiYXNl
VXBkYXRlID0gdHJ1ZTsKKworICAgIFJlZlB0cjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gbG9jYWxT
dG9yYWdlRGF0YWJhc2UodGhpcyk7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2hBZnRlcihkYXRhYmFz
ZVVwZGF0ZUludGVydmFsLCBbbG9jYWxTdG9yYWdlRGF0YWJhc2VdIHsKKyAgICAgICAgbG9jYWxT
dG9yYWdlRGF0YWJhc2UtPnVwZGF0ZURhdGFiYXNlKCk7CisgICAgfSk7Cit9CisKK3ZvaWQgTG9j
YWxTdG9yYWdlRGF0YWJhc2U6OnVwZGF0ZURhdGFiYXNlKCkKK3sKKyAgICBpZiAobV9pc0Nsb3Nl
ZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVw
ZGF0ZSk7CisgICAgbV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlID0gZmFsc2U7CisKKyAgICBI
YXNoTWFwPFN0cmluZywgU3RyaW5nPiBjaGFuZ2VkSXRlbXM7CisgICAgaWYgKG1fY2hhbmdlZEl0
ZW1zLnNpemUoKSA8PSBtYXhpbXVtSXRlbXNUb1VwZGF0ZSkgeworICAgICAgICAvLyBUaGVyZSBh
cmUgZmV3IGVub3VnaCBjaGFuZ2VkIGl0ZW1zIHRoYXQgd2UgY2FuIGp1c3QgYWx3YXlzIHdyaXRl
IGFsbCBvZiB0aGVtLgorICAgICAgICBtX2NoYW5nZWRJdGVtcy5zd2FwKGNoYW5nZWRJdGVtcyk7
CisgICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMpOwor
ICAgICAgICBtX2Rpc2FibGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9y
YWdlID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IG1heGltdW1JdGVtc1RvVXBkYXRlOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtX2No
YW5nZWRJdGVtcy5iZWdpbigpOworICAgICAgICAgICAgY2hhbmdlZEl0ZW1zLmFkZChpdC0+a2V5
LCBpdC0+dmFsdWUpOworCisgICAgICAgICAgICBtX2NoYW5nZWRJdGVtcy5yZW1vdmUoaXQpOwor
ICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUKGNoYW5nZWRJdGVtcy5zaXplKCkgPD0gbWF4aW11
bUl0ZW1zVG9VcGRhdGUpOworCisgICAgICAgIC8vIFJlc2NoZWR1bGUgdGhlIHVwZGF0ZSBmb3Ig
dGhlIHJlbWFpbmluZyBpdGVtcy4KKyAgICAgICAgc2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOwor
ICAgICAgICB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMoY2hhbmdlZEl0ZW1zKTsKKyAg
ICB9Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnVwZGF0ZURhdGFiYXNlV2l0aENo
YW5nZWRJdGVtcyhjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgY2hhbmdlZEl0ZW1zKQor
eworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgb3BlbkRhdGFiYXNlKENy
ZWF0ZUlmTm9uRXhpc3RlbnQpOworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKG1fc2hvdWxkQ2xlYXJJdGVtcykgeworICAgICAgICBtX3No
b3VsZENsZWFySXRlbXMgPSBmYWxzZTsKKworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgY2xlYXJT
dGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIEl0ZW1UYWJsZSIpOworICAgICAgICBp
ZiAoY2xlYXJTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAgICAg
TE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBjbGVhciBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3Jp
dGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGNsZWFyU3RhdGVtZW50LnN0ZXAoKTsKKyAg
ICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY2xlYXIgYWxsIGl0ZW1zIGluIHRoZSBsb2NhbCBzdG9yYWdlIGRhdGFiYXNl
IC0gJWkiLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQor
CisgICAgU1FMaXRlU3RhdGVtZW50IGluc2VydFN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJU
IElOVE8gSXRlbVRhYmxlIFZBTFVFUyAoPywgPykiKTsKKyAgICBpZiAoaW5zZXJ0U3RhdGVtZW50
LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8g
cHJlcGFyZSBpbnNlcnQgc3RhdGVtZW50IC0gY2Fubm90IHdyaXRlIHRvIGxvY2FsIHN0b3JhZ2Ug
ZGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNRTGl0ZVN0YXRlbWVu
dCBkZWxldGVTdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIEl0ZW1UYWJsZSBXSEVS
RSBrZXk9PyIpOworICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9P
SykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGRlbGV0ZSBzdGF0ZW1l
bnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYXRh
YmFzZSk7CisgICAgdHJhbnNhY3Rpb24uYmVnaW4oKTsKKworICAgIGZvciAoYXV0byBpdCA9IGNo
YW5nZWRJdGVtcy5iZWdpbigpLCBlbmQgPSBjaGFuZ2VkSXRlbXMuZW5kKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICAvLyBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCB0aGUga2V5L3ZhbHVl
IHBhaXIgc2hvdWxkIGJlIGRlbGV0ZWQuCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCYgc3RhdGVt
ZW50ID0gaXQtPnZhbHVlLmlzTnVsbCgpID8gZGVsZXRlU3RhdGVtZW50IDogaW5zZXJ0U3RhdGVt
ZW50OworCisgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBpdC0+a2V5KTsKKworICAgICAg
ICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYSBrZXkvdmFsdWUgcGFpciwgYmluZCB0aGUgdmFsdWUg
YXMgd2VsbC4KKyAgICAgICAgaWYgKCFpdC0+dmFsdWUuaXNOdWxsKCkpCisgICAgICAgICAgICBz
dGF0ZW1lbnQuYmluZEJsb2IoMiwgaXQtPnZhbHVlKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0g
c3RhdGVtZW50LnN0ZXAoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgewor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIGl0ZW0gaW4gdGhlIGxvY2Fs
IHN0b3JhZ2UgZGF0YWJhc2UgLSAlaSIsIHJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIHN0YXRlbWVudC5yZXNldCgpOworICAgIH0KKworICAgIHRyYW5z
YWN0aW9uLmNvbW1pdCgpOworfQorCitib29sIExvY2FsU3RvcmFnZURhdGFiYXNlOjpkYXRhYmFz
ZUlzRW1wdHkoKQoreworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fZGF0YWJhc2UsICJTRUxF
Q1QgQ09VTlQoKikgRlJPTSBJdGVtVGFibGUiKTsKKyAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9
IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjb3VudCBudW1iZXIg
b2Ygcm93cyBpbiBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGludCByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAgaWYg
KHJlc3VsdCAhPSBTUUxJVEVfUk9XKSB7CisgICAgICAgIExPR19FUlJPUigiTm8gcmVzdWx0cyB3
aGVuIGNvdW50aW5nIG51bWJlciBvZiByb3dzIGluIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFn
ZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICFxdWVyeS5n
ZXRDb2x1bW5JbnQoMCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5o
IGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFz
ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjk5OTIwMzFmNDQ4ZmIzZDkxNTgwMTg2ZDg4NjBhMTJkODQ4NTk1NjIK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xv
Y2FsU3RvcmFnZURhdGFiYXNlLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVEYXRh
YmFzZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVk
ZSA8d3RmL0ZvcndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKyNpbmNs
dWRlIDx3dGYvV29ya1F1ZXVlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFNlY3Vy
aXR5T3JpZ2luOworY2xhc3MgU3RvcmFnZU1hcDsKK2NsYXNzIFN1ZGRlblRlcm1pbmF0aW9uRGlz
YWJsZXI7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXI7CisKK2NsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlIDogcHVibGljIFRocmVh
ZFNhZmVSZWZDb3VudGVkPExvY2FsU3RvcmFnZURhdGFiYXNlPiB7CitwdWJsaWM6CisgICAgc3Rh
dGljIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gY3JlYXRlKFJlZjxXb3JrUXVldWU+JiYsIFJl
ZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5
T3JpZ2luRGF0YSYpOworICAgIH5Mb2NhbFN0b3JhZ2VEYXRhYmFzZSgpOworCisgICAgLy8gV2ls
bCBibG9jayB1bnRpbCB0aGUgaW1wb3J0IGlzIGNvbXBsZXRlLgorICAgIHZvaWQgaW1wb3J0SXRl
bXMoV2ViQ29yZTo6U3RvcmFnZU1hcCYpOworCisgICAgdm9pZCBzZXRJdGVtKGNvbnN0IFN0cmlu
ZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKyAgICB2b2lkIHJlbW92ZUl0ZW0oY29uc3Qg
U3RyaW5nJiBrZXkpOworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vIFdpbGwgYmxvY2sgdW50
aWwgYWxsIHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gd3JpdHRlbiB0byBkaXNrLgorICAgIHZv
aWQgY2xvc2UoKTsKKworcHJpdmF0ZToKKyAgICBMb2NhbFN0b3JhZ2VEYXRhYmFzZShSZWY8V29y
a1F1ZXVlPiYmLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmLCBjb25zdCBXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKworICAgIGVudW0gRGF0YWJhc2VPcGVuaW5nU3Ry
YXRlZ3kgeworICAgICAgICBDcmVhdGVJZk5vbkV4aXN0ZW50LAorICAgICAgICBTa2lwSWZOb25F
eGlzdGVudAorICAgIH07CisgICAgYm9vbCB0cnlUb09wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5p
bmdTdHJhdGVneSk7CisgICAgdm9pZCBvcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRl
Z3kpOworCisgICAgYm9vbCBtaWdyYXRlSXRlbVRhYmxlSWZOZWVkZWQoKTsKKworICAgIHZvaWQg
aXRlbURpZENoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisK
KyAgICB2b2lkIHNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoKTsKKyAgICB2b2lkIHVwZGF0ZURhdGFi
YXNlKCk7CisgICAgdm9pZCB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMoY29uc3QgSGFz
aE1hcDxTdHJpbmcsIFN0cmluZz4mKTsKKworICAgIGJvb2wgZGF0YWJhc2VJc0VtcHR5KCk7CisK
KyAgICBSZWY8V29ya1F1ZXVlPiBtX3F1ZXVlOworICAgIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXI+IG1fdHJhY2tlcjsKKyAgICBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgbV9z
ZWN1cml0eU9yaWdpbjsKKworICAgIFN0cmluZyBtX2RhdGFiYXNlUGF0aDsKKyAgICBXZWJDb3Jl
OjpTUUxpdGVEYXRhYmFzZSBtX2RhdGFiYXNlOworICAgIGJvb2wgbV9mYWlsZWRUb09wZW5EYXRh
YmFzZTsKKyAgICBib29sIG1fZGlkSW1wb3J0SXRlbXM7CisgICAgYm9vbCBtX2lzQ2xvc2VkOwor
CisgICAgYm9vbCBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGU7CisgICAgYm9vbCBtX3Nob3Vs
ZENsZWFySXRlbXM7CisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbV9jaGFuZ2VkSXRlbXM7
CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U3VkZGVuVGVybWluYXRpb25EaXNhYmxl
cj4gbV9kaXNhYmxlU3VkZGVuVGVybWluYXRpb25XaGlsZVdyaXRpbmdUb0xvY2FsU3RvcmFnZTsK
K307CisKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAgYi9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uMTliMjI5ZjZiNTM3NGE3NzQ2M2FhZjliNDY0Y2U5MzZhMDRh
Y2MyYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3Jh
Z2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcApAQCAtMCwwICsxLDM4OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXIuaCIKKworI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlRmlsZVN5c3RlbS5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U1FMaXRlU3RhdGVtZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbi5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9UZXh0RW5jb2RpbmcuaD4KKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUg
PHd0Zi9SdW5Mb29wLmg+CisjaW5jbHVkZSA8d3RmL1dvcmtRdWV1ZS5oPgorI2luY2x1ZGUgPHd0
Zi90ZXh0L0NTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFj
ZSBXZWJLaXQgeworCitSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiBMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6OmNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBjb25zdCBT
dHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5l
dyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIoV1RGTW92ZShxdWV1ZSksIGxvY2FsU3RvcmFn
ZURpcmVjdG9yeSkpOworfQorCitMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OkxvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcihSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBjb25zdCBTdHJpbmcm
IGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKKyAgICA6IG1fcXVldWUoV1RGTW92ZShxdWV1ZSkpCisg
ICAgLCBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeShsb2NhbFN0b3JhZ2VEaXJlY3RvcnkuaXNvbGF0
ZWRDb3B5KCkpCit7CisgICAgQVNTRVJUKCFtX2xvY2FsU3RvcmFnZURpcmVjdG9yeS5pc0VtcHR5
KCkpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBlbmNvZGluZyBpcyBpbml0aWFsaXplZCBiZWZv
cmUgd2Ugc3RhcnQgZGlzcGF0Y2hpbmcgdGhpbmdzIHRvIHRoZSBxdWV1ZS4KKyAgICBVVEY4RW5j
b2RpbmcoKTsKKworICAgIG1fcXVldWUtPmRpc3BhdGNoKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJl
ZigqdGhpcyldKCkgbXV0YWJsZSB7CisgICAgICAgIHByb3RlY3RlZFRoaXMtPmltcG9ydE9yaWdp
bklkZW50aWZpZXJzKCk7CisgICAgfSk7Cit9CisKK0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cjo6fkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcigpCit7Cit9CisKK1N0cmluZyBMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlUGF0aChjb25zdCBTZWN1cml0eU9yaWdpbkRh
dGEmIHNlY3VyaXR5T3JpZ2luKSBjb25zdAoreworICAgIHJldHVybiBkYXRhYmFzZVBhdGgoc2Vj
dXJpdHlPcmlnaW4uZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmxvY2Fsc3RvcmFnZSIpOworfQor
Cit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGlkT3BlbkRhdGFiYXNlV2l0aE9y
aWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQoreworICAgIGFk
ZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoc2VjdXJpdHlPcmlnaW4uZGF0YWJhc2VJZGVu
dGlmaWVyKCksIGRhdGFiYXNlUGF0aChzZWN1cml0eU9yaWdpbikpOworfQorCit2b2lkIExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VXaXRoT3JpZ2luKGNvbnN0IFNl
Y3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgcmVtb3ZlRGF0YWJhc2VX
aXRoT3JpZ2luSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSk7
Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVBbGxEYXRhYmFz
ZXMoKQoreworICAgIG1fb3JpZ2lucy5jbGVhcigpOworCisgICAgb3BlblRyYWNrZXJEYXRhYmFz
ZShTa2lwSWZOb25FeGlzdGVudCk7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2Us
ICJTRUxFQ1Qgb3JpZ2luLCBwYXRoIEZST00gT3JpZ2lucyIpOworICAgIGlmIChzdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBw
cmVwYXJlIHN0YXRlbWVudC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBy
ZXN1bHQ7CisgICAgd2hpbGUgKChyZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpKSA9PSBTUUxJVEVf
Uk9XKSB7CisgICAgICAgIGRlbGV0ZUZpbGUoc3RhdGVtZW50LmdldENvbHVtblRleHQoMSkpOwor
CisgICAgICAgIC8vIEZJWE1FOiBDYWxsIG91dCB0byB0aGUgY2xpZW50LgorICAgIH0KKworICAg
IGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7CisKKyAgICBpZiAobV9k
YXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworCisgICAgaWYg
KCFkZWxldGVGaWxlKHRyYWNrZXJEYXRhYmFzZVBhdGgoKSkpIHsKKyAgICAgICAgLy8gSW4gdGhl
IGNhc2Ugd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmls
ZSAoZS5nIHNvbWUgb3RoZXIgcHJvZ3JhbQorICAgICAgICAvLyBsaWtlIGEgdmlydXMgc2Nhbm5l
ciBpcyBhY2Nlc3NpbmcgaXQpLCBtYWtlIHN1cmUgdG8gcmVtb3ZlIGFsbCBlbnRyaWVzLgorICAg
ICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKyAgICAgICAgaWYg
KCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNR
TGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIE9y
aWdpbnMiKTsKKyAgICAgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRF
X09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9u
IG9mIGFsbCBvcmlnaW5zIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBhbGwgb3JpZ2lucyIpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlRW1wdHlE
aXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworfQorCitzdGF0aWMgc3RkOjpvcHRp
b25hbDx0aW1lX3Q+IGZpbGVDcmVhdGlvblRpbWUoY29uc3QgU3RyaW5nJiBmaWxlUGF0aCkKK3sK
KyAgICB0aW1lX3QgdGltZTsKKyAgICByZXR1cm4gZ2V0RmlsZUNyZWF0aW9uVGltZShmaWxlUGF0
aCwgdGltZSkgPyB0aW1lIDogc3RkOjpvcHRpb25hbDx0aW1lX3Q+KHN0ZDo6bnVsbG9wdCk7Cit9
CisKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gZmlsZU1vZGlmaWNhdGlvblRpbWUoY29u
c3QgU3RyaW5nJiBmaWxlUGF0aCkKK3sKKyAgICB0aW1lX3QgdGltZTsKKyAgICBpZiAoIWdldEZp
bGVNb2RpZmljYXRpb25UaW1lKGZpbGVQYXRoLCB0aW1lKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6
bnVsbG9wdDsKKworICAgIHJldHVybiB0aW1lOworfQorCitWZWN0b3I8U2VjdXJpdHlPcmlnaW5E
YXRhPiBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlc01vZGlmaWVk
U2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lKQoreworICAg
IEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworICAgIGltcG9ydE9yaWdpbklkZW50aWZpZXJz
KCk7CisgICAgVmVjdG9yPFN0cmluZz4gb3JpZ2luSWRlbnRpZmllcnNUb0RlbGV0ZTsKKworICAg
IGZvciAoY29uc3QgU3RyaW5nJiBvcmlnaW4gOiBtX29yaWdpbnMpIHsKKyAgICAgICAgU3RyaW5n
IGZpbGVQYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luKTsK
KworICAgICAgICBhdXRvIG1vZGlmaWNhdGlvblRpbWUgPSBmaWxlTW9kaWZpY2F0aW9uVGltZShm
aWxlUGF0aCk7CisgICAgICAgIGlmICghbW9kaWZpY2F0aW9uVGltZSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIGlmIChtb2RpZmljYXRpb25UaW1lLnZhbHVlKCkgPj0gc3RkOjpj
aHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KHRpbWUpKQorICAgICAgICAgICAgb3JpZ2lu
SWRlbnRpZmllcnNUb0RlbGV0ZS5hcHBlbmQob3JpZ2luKTsKKyAgICB9CisKKyAgICBWZWN0b3I8
U2VjdXJpdHlPcmlnaW5EYXRhPiBkZWxldGVkRGF0YWJhc2VPcmlnaW5zOworICAgIGRlbGV0ZWRE
YXRhYmFzZU9yaWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5JZGVudGlmaWVyc1Rv
RGVsZXRlLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9yaWdpbklkZW50aWZpZXIg
OiBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlKSB7CisgICAgICAgIHJlbW92ZURhdGFiYXNlV2l0
aE9yaWdpbklkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcik7CisKKyAgICAgICAgaWYgKGF1dG8g
b3JpZ2luID0gU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tRGF0YWJhc2VJZGVudGlmaWVyKG9yaWdp
bklkZW50aWZpZXIpKQorICAgICAgICAgICAgZGVsZXRlZERhdGFiYXNlT3JpZ2lucy51bmNoZWNr
ZWRBcHBlbmQoKm9yaWdpbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgIH0KKworICAgIHJldHVybiBkZWxldGVkRGF0YWJhc2VPcmlnaW5zOwor
fQorCitWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXI6Om9yaWdpbnMoKSBjb25zdAoreworICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9y
aWdpbnM7CisgICAgb3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fb3JpZ2lucy5zaXpl
KCkpOworCisgICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIgOiBtX29yaWdp
bnMpIHsKKyAgICAgICAgaWYgKGF1dG8gb3JpZ2luID0gU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9t
RGF0YWJhc2VJZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpKQorICAgICAgICAgICAgb3JpZ2lu
cy51bmNoZWNrZWRBcHBlbmQoKm9yaWdpbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHJldHVybiBvcmlnaW5zOworfQorCitW
ZWN0b3I8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpPcmlnaW5EZXRhaWxzPiBMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbkRldGFpbHMoKQoreworICAgIFZlY3RvcjxPcmln
aW5EZXRhaWxzPiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9v
cmlnaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IFN0cmluZyYgb3JpZ2luIDogbV9vcmln
aW5zKSB7CisgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IHBhdGhGb3JEYXRhYmFzZVdpdGhPcmln
aW5JZGVudGlmaWVyKG9yaWdpbik7CisKKyAgICAgICAgT3JpZ2luRGV0YWlscyBkZXRhaWxzOwor
ICAgICAgICBkZXRhaWxzLm9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4uaXNvbGF0ZWRDb3B5KCk7
CisgICAgICAgIGRldGFpbHMuY3JlYXRpb25UaW1lID0gZmlsZUNyZWF0aW9uVGltZShmaWxlUGF0
aCk7CisgICAgICAgIGRldGFpbHMubW9kaWZpY2F0aW9uVGltZSA9IGZpbGVNb2RpZmljYXRpb25U
aW1lKGZpbGVQYXRoKTsKKyAgICAgICAgcmVzdWx0LnVuY2hlY2tlZEFwcGVuZChkZXRhaWxzKTsK
KyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmcgTG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyOjpkYXRhYmFzZVBhdGgoY29uc3QgU3RyaW5nJiBmaWxlbmFtZSkgY29uc3QK
K3sKKyAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSkp
IHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIExvY2FsU3RvcmFnZSBkYXRh
YmFzZSBwYXRoICVzIiwgbV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkudXRmOCgpLmRhdGEoKSk7Cisg
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9CisKKyNpZiBQTEFURk9STShJT1MpCisgICAg
cGxhdGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFja3VwKCk7CisjZW5kaWYKKworICAgIHJldHVybiBw
YXRoQnlBcHBlbmRpbmdDb21wb25lbnQobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnksIGZpbGVuYW1l
KTsKK30KKworU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6dHJhY2tlckRhdGFi
YXNlUGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGRhdGFiYXNlUGF0aCgiU3RvcmFnZVRyYWNr
ZXIuZGIiKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFj
a2VyRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQorewor
ICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJp
bmcgZGF0YWJhc2VQYXRoID0gdHJhY2tlckRhdGFiYXNlUGF0aCgpOworCisgICAgaWYgKCFmaWxl
RXhpc3RzKGRhdGFiYXNlUGF0aCkgJiYgb3BlbmluZ1N0cmF0ZWd5ID09IFNraXBJZk5vbkV4aXN0
ZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fZGF0YWJhc2Uub3BlbihkYXRhYmFz
ZVBhdGgpKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2VQYXRo
ICVzLiIsIGRhdGFiYXNlUGF0aC5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBTaW5jZSBhIFdvcmtRdWV1ZSBpc24ndCBib3VuZCB0byBhIHNwZWNpZmlj
IHRocmVhZCwgd2UgaGF2ZSB0byBkaXNhYmxlIHRocmVhZGluZyBjaGVja3MKKyAgICAvLyBldmVu
IHRob3VnaCB3ZSBuZXZlciBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZyb20gZGlmZmVyZW50IHRocmVh
ZHMgc2ltdWx0YW5lb3VzbHkuCisgICAgbV9kYXRhYmFzZS5kaXNhYmxlVGhyZWFkaW5nQ2hlY2tz
KCk7CisKKyAgICBpZiAobV9kYXRhYmFzZS50YWJsZUV4aXN0cygiT3JpZ2lucyIpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBU
QUJMRSBPcmlnaW5zIChvcmlnaW4gVEVYVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgcGF0
aCBURVhUKTsiKSkKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIE9yaWdpbnMg
dGFibGUuIik7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjppbXBvcnRP
cmlnaW5JZGVudGlmaWVycygpCit7CisgICAgb3BlblRyYWNrZXJEYXRhYmFzZShTa2lwSWZOb25F
eGlzdGVudCk7CisKKyAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBTUUxp
dGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1Qgb3JpZ2luIEZST00gT3Jp
Z2lucyIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlc3VsdDsKKwor
ICAgICAgICB3aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTElURV9ST1cp
CisgICAgICAgICAgICBtX29yaWdpbnMuYWRkKHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApKTsK
KworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBMT0df
RVJST1IoIkZhaWxlZCB0byByZWFkIGluIGFsbCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlLiIp
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgdXBkYXRlVHJh
Y2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKTsKK30KKwordm9pZCBM
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnVwZGF0ZVRyYWNrZXJEYXRhYmFzZUZyb21Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZUZpbGVzKCkKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBwYXRocyA9IGxp
c3REaXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnksICIqLmxvY2Fsc3RvcmFnZSIpOwor
CisgICAgSGFzaFNldDxTdHJpbmc+IG9yaWdpbnMobV9vcmlnaW5zKTsKKyAgICBIYXNoU2V0PFN0
cmluZz4gb3JpZ2luc0Zyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVzOworCisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBwYXRocy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBTdHJp
bmcmIHBhdGggPSBwYXRoc1tpXTsKKworICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi5sb2Nh
bHN0b3JhZ2UiKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFN0cmluZyBmaWxl
bmFtZSA9IHBhdGhHZXRGaWxlTmFtZShwYXRoKTsKKworICAgICAgICBTdHJpbmcgb3JpZ2luSWRl
bnRpZmllciA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIHN0cmxl
bigiLmxvY2Fsc3RvcmFnZSIpKTsKKworICAgICAgICBpZiAoIW1fb3JpZ2lucy5jb250YWlucyhv
cmlnaW5JZGVudGlmaWVyKSkKKyAgICAgICAgICAgIGFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50
aWZpZXIob3JpZ2luSWRlbnRpZmllciwgcGF0aCk7CisKKyAgICAgICAgb3JpZ2luc0Zyb21Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZUZpbGVzLmFkZChvcmlnaW5JZGVudGlmaWVyKTsKKyAgICB9CisKKyAg
ICBmb3IgKGF1dG8gaXQgPSBvcmlnaW5zLmJlZ2luKCksIGVuZCA9IG9yaWdpbnMuZW5kKCk7IGl0
ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIg
PSAqaXQ7CisgICAgICAgIGlmIChvcmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2lu
SWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKKyAgICB9Cit9CisKK3ZvaWQgTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0
IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZVBhdGgpCit7
CisgICAgb3BlblRyYWNrZXJEYXRhYmFzZShDcmVhdGVJZk5vbkV4aXN0ZW50KTsKKyAgICBpZiAo
IW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNRTGl0ZVN0YXRl
bWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIE9yaWdpbnMgVkFMVUVTICg/
LCA/KSIpOworICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3JpZ2luICclcycgaW4gdGhlIHRy
YWNrZXIiLCBvcmlnaW5JZGVudGlmaWVyLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOwor
ICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBkYXRhYmFzZVBhdGgpOworCisgICAgaWYgKHN0YXRl
bWVudC5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRv
IGVzdGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbklkZW50aWZpZXIu
dXRmOCgpLmRhdGEoKSk7CisKKyAgICBtX29yaWdpbnMuYWRkKG9yaWdpbklkZW50aWZpZXIpOwor
CisgICAgLy8gRklYTUU6IFRlbGwgY2xpZW50cyB0aGF0IHRoZSBvcmlnaW4gd2FzIGFkZGVkLgor
fQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlRGF0YWJhc2VXaXRo
T3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIpCit7CisgICAg
b3BlblRyYWNrZXJEYXRhYmFzZShTa2lwSWZOb25FeGlzdGVudCk7CisgICAgaWYgKCFtX2RhdGFi
YXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJpbmcgcGF0aCA9IHBhdGhG
b3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOworICAgIGlm
IChwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU1FMaXRlU3RhdGVtZW50
IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyB3aGVyZSBv
cmlnaW49PyIpOworICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9P
SykgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9y
aWdpbiAnJXMnIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgZGVsZXRlU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50
aWZpZXIpOworICAgIGlmICghZGVsZXRlU3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBvcmlnaW4gJyVz
JyIsIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHBhdGgpOwor
CisgICAgbV9vcmlnaW5zLnJlbW92ZShvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBpZiAobV9vcmln
aW5zLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBUaGVyZSBhcmUgbm8gb3JpZ2lucyBsZWZ0OyBk
ZWxldGUgdGhlIHRyYWNrZXIgZGF0YWJhc2UuCisgICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsK
KyAgICAgICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHRyYWNrZXJEYXRh
YmFzZVBhdGgoKSk7CisgICAgICAgIGRlbGV0ZUVtcHR5RGlyZWN0b3J5KG1fbG9jYWxTdG9yYWdl
RGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogVGVsbCBjbGllbnRzIHRoYXQgdGhl
IG9yaWdpbiB3YXMgcmVtb3ZlZC4KK30KKworU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlcjo6cGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBv
cmlnaW5JZGVudGlmaWVyKQoreworICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAg
ICAgcmV0dXJuIFN0cmluZygpOworCisgICAgU1FMaXRlU3RhdGVtZW50IHBhdGhTdGF0ZW1lbnQo
bV9kYXRhYmFzZSwgIlNFTEVDVCBwYXRoIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOwor
ICAgIGlmIChwYXRoU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBzZWxlY3Rpb24gb2YgcGF0aCBmb3Igb3JpZ2lu
ICclcyciLCBvcmlnaW5JZGVudGlmaWVyLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisgICAgfQorCisgICAgcGF0aFN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW5J
ZGVudGlmaWVyKTsKKworICAgIGludCByZXN1bHQgPSBwYXRoU3RhdGVtZW50LnN0ZXAoKTsKKyAg
ICBpZiAocmVzdWx0ICE9IFNRTElURV9ST1cpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKwor
ICAgIHJldHVybiBwYXRoU3RhdGVtZW50LmdldENvbHVtblRleHQoMCk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3Rv
cmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9j
ZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
N2NlYjE5MTZkOTM0ZTU2ZjFmNGEyNDE1NTdkNzMxODM0YmU3N2ZkMQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEs
IDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21h
IG9uY2UKKworI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlRGF0YWJhc2UuaD4KKyNpbmNsdWRlIDx3
dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9PcHRpb25hbC5oPgorI2luY2x1ZGUgPHd0Zi9S
ZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKyNpbmNsdWRl
IDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFz
cyBTZWN1cml0eU9yaWdpbjsKK3N0cnVjdCBTZWN1cml0eU9yaWdpbkRhdGE7Cit9CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitzdHJ1Y3QgTG9jYWxTdG9yYWdlRGV0YWlsczsKKworY2xhc3MgTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPExv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8TG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiwgY29uc3Qg
U3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworICAgIH5Mb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXIoKTsKKworICAgIFN0cmluZyBkYXRhYmFzZVBhdGgoY29uc3QgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhJikgY29uc3Q7CisKKyAgICB2b2lkIGRpZE9wZW5EYXRhYmFzZVdpdGhP
cmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7CisgICAgdm9pZCBkZWxl
dGVEYXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJik7
CisgICAgdm9pZCBkZWxldGVBbGxEYXRhYmFzZXMoKTsKKworICAgIC8vIFJldHVybnMgYSB2ZWN0
b3Igb2YgdGhlIG9yaWdpbnMgd2hvc2UgZGF0YWJhc2VzIGhhdmUgYmVlbiBkZWxldGVkLgorICAg
IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+IGRlbGV0ZURhdGFiYXNlc01vZGlm
aWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCk7CisKKyAgICBW
ZWN0b3I8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3Q7CisKKyAg
ICBzdHJ1Y3QgT3JpZ2luRGV0YWlscyB7CisgICAgICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVy
OworICAgICAgICBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4gY3JlYXRpb25UaW1lOworICAgICAgICBz
dGQ6Om9wdGlvbmFsPHRpbWVfdD4gbW9kaWZpY2F0aW9uVGltZTsKKyAgICB9OworICAgIFZlY3Rv
cjxPcmlnaW5EZXRhaWxzPiBvcmlnaW5EZXRhaWxzKCk7CisKK3ByaXZhdGU6CisgICAgTG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyKFJlZjxXb3JrUXVldWU+JiYsIGNvbnN0IFN0cmluZyYgbG9j
YWxTdG9yYWdlRGlyZWN0b3J5KTsKKworICAgIFN0cmluZyBkYXRhYmFzZVBhdGgoY29uc3QgU3Ry
aW5nJiBmaWxlbmFtZSkgY29uc3Q7CisgICAgU3RyaW5nIHRyYWNrZXJEYXRhYmFzZVBhdGgoKSBj
b25zdDsKKworICAgIGVudW0gRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kgeworICAgICAgICBDcmVh
dGVJZk5vbkV4aXN0ZW50LAorICAgICAgICBTa2lwSWZOb25FeGlzdGVudAorICAgIH07CisgICAg
dm9pZCBvcGVuVHJhY2tlckRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5KTsKKworICAg
IHZvaWQgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKKyAgICB2b2lkIHVwZGF0ZVRyYWNrZXJE
YXRhYmFzZUZyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVzKCk7CisKKyAgICB2b2lkIGFkZERh
dGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVy
LCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCk7CisgICAgdm9pZCByZW1vdmVEYXRhYmFzZVdp
dGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcik7CisgICAg
U3RyaW5nIHBhdGhGb3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYg
b3JpZ2luSWRlbnRpZmllcik7CisKKyAgICBSZWZQdHI8V29ya1F1ZXVlPiBtX3F1ZXVlOworICAg
IFN0cmluZyBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeTsKKworICAgIFdlYkNvcmU6OlNRTGl0ZURh
dGFiYXNlIG1fZGF0YWJhc2U7CisgICAgSGFzaFNldDxTdHJpbmc+IG1fb3JpZ2luczsKKworI2lm
IFBMQVRGT1JNKElPUykKKyAgICB2b2lkIHBsYXRmb3JtTWF5YmVFeGNsdWRlRnJvbUJhY2t1cCgp
IGNvbnN0OworCisgICAgbXV0YWJsZSBib29sIG1faGFzRXhjbHVkZWRGcm9tQmFja3VwIHsgZmFs
c2UgfTsKKyNlbmRpZgorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcCBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjYzOGNhNmNiNTI2MjFmNzIzYmE4MDQ0MTAxZTBjZDA1OTRjOTRiOTkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5h
Z2VyLmNwcApAQCAtMCwwICsxLDg3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE2
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJMb2NhbFN0
b3JhZ2VEYXRhYmFzZS5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5o
IgorI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJTdG9yYWdl
TWFuYWdlck1lc3NhZ2VzLmgiCisjaW5jbHVkZSAiV2ViUHJvY2Vzc1Byb3h5LmgiCisjaW5jbHVk
ZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3Vy
aXR5T3JpZ2luSGFzaC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvVGV4dEVuY29kaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUg
PHd0Zi9Xb3JrUXVldWUuaD4KKyNpbmNsdWRlIDx3dGYvdGhyZWFkcy9CaW5hcnlTZW1hcGhvcmUu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitj
bGFzcyBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWEgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNv
dW50ZWQ8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPiB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFJlZjxTdG9yYWdlQXJlYT4gY3JlYXRlKExvY2FsU3RvcmFnZU5hbWVzcGFjZSosIGNvbnN0IFNl
Y3VyaXR5T3JpZ2luRGF0YSYsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisgICAgflN0b3JhZ2VB
cmVhKCk7CisKKyAgICBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5
T3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbjsgfQorCisgICAgdm9pZCBh
ZGRMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOworICAg
IHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1h
cElEKTsKKworICAgIFJlZjxTdG9yYWdlQXJlYT4gY2xvbmUoKSBjb25zdDsKKworICAgIHZvaWQg
c2V0SXRlbShJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJj
ZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBj
b25zdCBTdHJpbmcmIHVybFN0cmluZywgYm9vbCYgcXVvdGFFeGNlcHRpb24pOworICAgIHZvaWQg
cmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNv
dXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHVybFN0
cmluZyk7CisgICAgdm9pZCBjbGVhcihJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24s
IHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsK
KworICAgIGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBpdGVtcygpIGNvbnN0OworICAg
IHZvaWQgY2xlYXIoKTsKKworICAgIGJvb2wgaXNTZXNzaW9uU3RvcmFnZSgpIGNvbnN0IHsgcmV0
dXJuICFtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZTsgfQorCitwcml2YXRlOgorICAgIGV4cGxpY2l0
IFN0b3JhZ2VBcmVhKExvY2FsU3RvcmFnZU5hbWVzcGFjZSosIGNvbnN0IFNlY3VyaXR5T3JpZ2lu
RGF0YSYsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisKKyAgICB2b2lkIG9wZW5EYXRhYmFzZUFu
ZEltcG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25zdDsKKworICAgIHZvaWQgZGlzcGF0Y2hFdmVudHMo
SVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3Qg
U3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpIGNvbnN0OworCisgICAg
Ly8gV2lsbCBiZSBudWxsIGlmIHRoZSBzdG9yYWdlIGFyZWEgYmVsb25ncyB0byBhIHNlc3Npb24g
c3RvcmFnZSBuYW1lc3BhY2UuCisgICAgTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBtX2xvY2FsU3Rv
cmFnZU5hbWVzcGFjZTsKKyAgICBtdXRhYmxlIFJlZlB0cjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4g
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZTsKKyAgICBtdXRhYmxlIGJvb2wgbV9kaWRJbXBvcnRJdGVt
c0Zyb21EYXRhYmFzZSB7IGZhbHNlIH07CisKKyAgICBTZWN1cml0eU9yaWdpbkRhdGEgbV9zZWN1
cml0eU9yaWdpbjsKKyAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKKworICAgIFJlZlB0cjxT
dG9yYWdlTWFwPiBtX3N0b3JhZ2VNYXA7CisgICAgSGFzaFNldDxzdGQ6OnBhaXI8UmVmUHRyPElQ
Qzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gbV9ldmVudExpc3RlbmVyczsKK307CisKK2NsYXNz
IFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2Fm
ZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFJlZjxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZShTdG9yYWdlTWFuYWdlciosIHVpbnQ2
NF90IHN0b3JhZ2VNYW5hZ2VySUQpOworICAgIH5Mb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKTsKKwor
ICAgIFN0b3JhZ2VNYW5hZ2VyKiBzdG9yYWdlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIG1fc3Rv
cmFnZU1hbmFnZXI7IH0KKworICAgIFJlZjxTdG9yYWdlQXJlYT4gZ2V0T3JDcmVhdGVTdG9yYWdl
QXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJik7CisgICAgdm9pZCBkaWREZXN0cm95U3RvcmFnZUFy
ZWEoU3RvcmFnZUFyZWEqKTsKKworICAgIHZvaWQgY2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09y
aWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lkIGNsZWFyQWxsU3RvcmFn
ZUFyZWFzKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgTG9jYWxTdG9yYWdlTmFtZXNwYWNl
KFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3RvcmFnZU1hbmFnZXJJRCk7CisKKyAgICBTdG9y
YWdlTWFuYWdlciogbV9zdG9yYWdlTWFuYWdlcjsKKyAgICB1aW50NjRfdCBtX3N0b3JhZ2VOYW1l
c3BhY2VJRDsKKyAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKKworICAgIC8vIFdlIGRvbid0
IGhvbGQgYW4gZXhwbGljaXQgcmVmZXJlbmNlIHRvIHRoZSBTdG9yYWdlQXJlYXM7IHRoZXkgYXJl
IGtlcHQgYWxpdmUgYnkgdGhlIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uIG1hcCBpbiBTdG9y
YWdlTWFuYWdlci4KKyAgICBIYXNoTWFwPFNlY3VyaXR5T3JpZ2luRGF0YSwgU3RvcmFnZUFyZWEq
PiBtX3N0b3JhZ2VBcmVhTWFwOworfTsKKworY2xhc3MgU3RvcmFnZU1hbmFnZXI6OlRyYW5zaWVu
dExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxUcmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZigqbmV3IFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSgpKTsKKyAg
ICB9CisKKyAgICB+VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkKKyAgICB7CisgICAg
fQorCisgICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5
T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKQorICAgIHsKKyAgICAgICAgcmV0dXJuICptX3N0
b3JhZ2VBcmVhTWFwLmVuc3VyZShzZWN1cml0eU9yaWdpbiwgW3RoaXMsIHNlY3VyaXR5T3JpZ2lu
XSgpIG11dGFibGUgeworICAgICAgICAgICAgcmV0dXJuIFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVs
bHB0ciwgV1RGTW92ZShzZWN1cml0eU9yaWdpbiksIG1fcXVvdGFJbkJ5dGVzKTsKKyAgICAgICAg
fSkuaXRlcmF0b3ItPnZhbHVlLmNvcHlSZWYoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8U2VjdXJp
dHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3QKKyAgICB7CisgICAgICAgIFZlY3RvcjxTZWN1
cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdG9y
YWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmICgh
c3RvcmFnZUFyZWEtPml0ZW1zKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG9yaWdpbnMu
YXBwZW5kKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHJldHVybiBvcmlnaW5zOworICAgIH0KKworICAgIHZvaWQgY2xlYXJTdG9yYWdlQXJlYXNN
YXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQor
ICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAu
dmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4o
KSA9PSBzZWN1cml0eU9yaWdpbikKKyAgICAgICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIo
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKQor
ICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAu
dmFsdWVzKCkpCisgICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgZXhwbGljaXQgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkKKyAg
ICB7CisgICAgfQorCisgICAgY29uc3QgdW5zaWduZWQgbV9xdW90YUluQnl0ZXMgPSA1ICogMTAy
NCAqIDEwMjQ7CisKKyAgICBIYXNoTWFwPFNlY3VyaXR5T3JpZ2luRGF0YSwgUmVmUHRyPFN0b3Jh
Z2VBcmVhPj4gbV9zdG9yYWdlQXJlYU1hcDsKK307CisKK2F1dG8gU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhOjpjcmVhdGUoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBsb2NhbFN0b3JhZ2VOYW1l
c3BhY2UsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4sIHVuc2lnbmVk
IHF1b3RhSW5CeXRlcykgLT4gUmVmPFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYT4KK3sKKyAg
ICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYShsb2NhbFN0b3JhZ2VOYW1lc3BhY2Us
IHNlY3VyaXR5T3JpZ2luLCBxdW90YUluQnl0ZXMpKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhOjpTdG9yYWdlQXJlYShMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFn
ZU5hbWVzcGFjZSwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbiwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKQorICAgIDogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UobG9jYWxT
dG9yYWdlTmFtZXNwYWNlKQorICAgICwgbV9zZWN1cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbikK
KyAgICAsIG1fcXVvdGFJbkJ5dGVzKHF1b3RhSW5CeXRlcykKKyAgICAsIG1fc3RvcmFnZU1hcChT
dG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpKQoreworfQorCitTdG9yYWdlTWFuYWdl
cjo6U3RvcmFnZUFyZWE6On5TdG9yYWdlQXJlYSgpCit7CisgICAgQVNTRVJUKG1fZXZlbnRMaXN0
ZW5lcnMuaXNFbXB0eSgpKTsKKworICAgIGlmIChtX2xvY2FsU3RvcmFnZURhdGFiYXNlKQorICAg
ICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbG9zZSgpOworCisgICAgaWYgKG1fbG9jYWxT
dG9yYWdlTmFtZXNwYWNlKQorICAgICAgICBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZS0+ZGlkRGVz
dHJveVN0b3JhZ2VBcmVhKHRoaXMpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdl
QXJlYTo6YWRkTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBz
dG9yYWdlTWFwSUQpCit7CisgICAgQVNTRVJUKCFtX2V2ZW50TGlzdGVuZXJzLmNvbnRhaW5zKHN0
ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpKSk7CisgICAgbV9ldmVudExp
c3RlbmVycy5hZGQoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpOwor
fQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6cmVtb3ZlTGlzdGVuZXIoSVBD
OjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpCit7CisgICAg
QVNTRVJUKGlzU2Vzc2lvblN0b3JhZ2UoKSB8fCBtX2V2ZW50TGlzdGVuZXJzLmNvbnRhaW5zKHN0
ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpKSk7CisgICAgbV9ldmVudExp
c3RlbmVycy5yZW1vdmUoc3RkOjptYWtlX3BhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkp
OworfQorCitSZWY8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPiBTdG9yYWdlTWFuYWdlcjo6
U3RvcmFnZUFyZWE6OmNsb25lKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIW1fbG9jYWxTdG9yYWdl
TmFtZXNwYWNlKTsKKworICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBTdG9yYWdlQXJlYTo6Y3JlYXRl
KG51bGxwdHIsIG1fc2VjdXJpdHlPcmlnaW4sIG1fcXVvdGFJbkJ5dGVzKTsKKyAgICBzdG9yYWdl
QXJlYS0+bV9zdG9yYWdlTWFwID0gbV9zdG9yYWdlTWFwOworCisgICAgcmV0dXJuIHN0b3JhZ2VB
cmVhOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6c2V0SXRlbShJUEM6
OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVh
SUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcm
IHVybFN0cmluZywgYm9vbCYgcXVvdGFFeGNlcHRpb24pCit7CisgICAgb3BlbkRhdGFiYXNlQW5k
SW1wb3J0SXRlbXNJZk5lZWRlZCgpOworCisgICAgU3RyaW5nIG9sZFZhbHVlOworCisgICAgYXV0
byBuZXdTdG9yYWdlTWFwID0gbV9zdG9yYWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZh
bHVlLCBxdW90YUV4Y2VwdGlvbik7CisgICAgaWYgKG5ld1N0b3JhZ2VNYXApCisgICAgICAgIG1f
c3RvcmFnZU1hcCA9IFdURk1vdmUobmV3U3RvcmFnZU1hcCk7CisKKyAgICBpZiAocXVvdGFFeGNl
cHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2xvY2FsU3RvcmFnZURhdGFiYXNl
KQorICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5zZXRJdGVtKGtleSwgdmFsdWUpOwor
CisgICAgZGlzcGF0Y2hFdmVudHMoc291cmNlQ29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJ
RCwga2V5LCBvbGRWYWx1ZSwgdmFsdWUsIHVybFN0cmluZyk7Cit9CisKK3ZvaWQgU3RvcmFnZU1h
bmFnZXI6OlN0b3JhZ2VBcmVhOjpyZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29u
bmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIG9wZW5EYXRhYmFzZUFuZEltcG9ydEl0
ZW1zSWZOZWVkZWQoKTsKKworICAgIFN0cmluZyBvbGRWYWx1ZTsKKyAgICBhdXRvIG5ld1N0b3Jh
Z2VNYXAgPSBtX3N0b3JhZ2VNYXAtPnJlbW92ZUl0ZW0oa2V5LCBvbGRWYWx1ZSk7CisgICAgaWYg
KG5ld1N0b3JhZ2VNYXApCisgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3U3RvcmFn
ZU1hcCk7CisKKyAgICBpZiAob2xkVmFsdWUuaXNOdWxsKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChtX2xvY2FsU3RvcmFnZURhdGFiYXNlKQorICAgICAgICBtX2xvY2FsU3RvcmFnZURh
dGFiYXNlLT5yZW1vdmVJdGVtKGtleSk7CisKKyAgICBkaXNwYXRjaEV2ZW50cyhzb3VyY2VDb25u
ZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9sZFZhbHVlLCBTdHJpbmcoKSwgdXJs
U3RyaW5nKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OmNsZWFyKElQ
Qzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFy
ZWFJRCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCit7CisgICAgb3BlbkRhdGFiYXNlQW5kSW1w
b3J0SXRlbXNJZk5lZWRlZCgpOworCisgICAgaWYgKCFtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUo
bV9xdW90YUluQnl0ZXMpOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAg
ICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNsZWFyKCk7CisKKyAgICBkaXNwYXRjaEV2ZW50
cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBTdHJpbmcoKSwgU3RyaW5n
KCksIFN0cmluZygpLCB1cmxTdHJpbmcpOworfQorCitjb25zdCBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiYgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjppdGVtcygpIGNvbnN0Cit7CisgICAg
b3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIG1fc3Rv
cmFnZU1hcC0+aXRlbXMoKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6
OmNsZWFyKCkKK3sKKyAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90
YUluQnl0ZXMpOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpIHsKKyAgICAgICAg
bV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xvc2UoKTsKKyAgICAgICAgbV9sb2NhbFN0b3JhZ2VE
YXRhYmFzZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChhdXRvIGl0ID0gbV9ldmVudExp
c3RlbmVycy5iZWdpbigpLCBlbmQgPSBtX2V2ZW50TGlzdGVuZXJzLmVuZCgpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgIGl0LT5maXJzdC0+c2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6
OkNsZWFyQ2FjaGUoKSwgaXQtPnNlY29uZCk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0
b3JhZ2VBcmVhOjpvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCkgY29uc3QKK3sK
KyAgICBpZiAoIW1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBXZSBvcGVuIHRoZSBkYXRhYmFzZSBoZXJlIGV2ZW4gaWYgd2UndmUgYWxyZWFkeSBpbXBv
cnRlZCBvdXIgaXRlbXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGFiYXNlIGlzIG9wZW4gaWYgd2Ug
bmVlZCB0byB3cml0ZSB0byBpdC4KKyAgICBpZiAoIW1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisg
ICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UgPSBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6Y3Jl
YXRlKG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTWFuYWdlcigpLT5tX3F1ZXVlLmNv
cHlSZWYoKSwgbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VNYW5hZ2VyKCktPm1fbG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNvcHlSZWYoKSwgbV9zZWN1cml0eU9yaWdpbik7CisK
KyAgICBpZiAobV9kaWRJbXBvcnRJdGVtc0Zyb21EYXRhYmFzZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+aW1wb3J0SXRlbXMoKm1fc3RvcmFnZU1hcCk7
CisgICAgbV9kaWRJbXBvcnRJdGVtc0Zyb21EYXRhYmFzZSA9IHRydWU7Cit9CisKK3ZvaWQgU3Rv
cmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpkaXNwYXRjaEV2ZW50cyhJUEM6OkNvbm5lY3Rpb24q
IHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVl
LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykgY29uc3QKK3sKKyAgICBmb3IgKEhhc2hTZXQ8c3Rk
OjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fZXZlbnRMaXN0ZW5lcnMuYmVnaW4oKSwgZW5kID0gbV9ldmVudExpc3RlbmVycy5l
bmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQg
PSBpdC0+Zmlyc3QgPT0gc291cmNlQ29ubmVjdGlvbiA/IHNvdXJjZVN0b3JhZ2VBcmVhSUQgOiAw
OworCisgICAgICAgIGl0LT5maXJzdC0+c2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6OkRp
c3BhdGNoU3RvcmFnZUV2ZW50KHN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVl
LCB1cmxTdHJpbmcpLCBpdC0+c2Vjb25kKTsKKyAgICB9Cit9CisKK1JlZjxTdG9yYWdlTWFuYWdl
cjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlOjpjcmVhdGUoU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5hZ2VyLCB1aW50NjRfdCBz
dG9yYWdlTmFtZXNwYWNlSUQpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTG9jYWxTdG9y
YWdlTmFtZXNwYWNlKHN0b3JhZ2VNYW5hZ2VyLCBzdG9yYWdlTmFtZXNwYWNlSUQpKTsKK30KKwor
Ly8gRklYTUU6IFRoZSBxdW90YSB2YWx1ZSBpcyBjb3BpZWQgZnJvbSBHcm91cFNldHRpbmdzLmNw
cC4KKy8vIFdlIHNob3VsZCBpbnZlc3RpZ2F0ZSBhIHdheSB0byBzaGFyZSBpdCB3aXRoIFdlYkNv
cmUuCitTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UoU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VNYW5hZ2VyLCB1aW50NjRfdCBzdG9yYWdl
TmFtZXNwYWNlSUQpCisgICAgOiBtX3N0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VNYW5hZ2VyKQorICAg
ICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVzcGFjZUlEKQorICAgICwgbV9xdW90
YUluQnl0ZXMoNSAqIDEwMjQgKiAxMDI0KQoreworfQorCitTdG9yYWdlTWFuYWdlcjo6TG9jYWxT
dG9yYWdlTmFtZXNwYWNlOjp+TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkKK3sKKyAgICBBU1NFUlQo
bV9zdG9yYWdlQXJlYU1hcC5pc0VtcHR5KCkpOworfQorCithdXRvIFN0b3JhZ2VNYW5hZ2VyOjpM
b2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmln
aW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pIC0+IFJlZjxTdG9yYWdlQXJlYT4KK3sKKyAgICBhdXRv
JiBzbG90ID0gbV9zdG9yYWdlQXJlYU1hcC5hZGQoc2VjdXJpdHlPcmlnaW4sIG51bGxwdHIpLml0
ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoc2xvdCkKKyAgICAgICAgcmV0dXJuICpzbG90OworCisg
ICAgYXV0byBzdG9yYWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpjcmVhdGUodGhpcywgV1RGTW92ZShz
ZWN1cml0eU9yaWdpbiksIG1fcXVvdGFJbkJ5dGVzKTsKKyAgICBzbG90ID0gJnN0b3JhZ2VBcmVh
LmdldCgpOworCisgICAgcmV0dXJuIHN0b3JhZ2VBcmVhOworfQorCit2b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmRpZERlc3Ryb3lTdG9yYWdlQXJlYShTdG9yYWdl
QXJlYSogc3RvcmFnZUFyZWEpCit7CisgICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFNYXAuY29udGFp
bnMoc3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpKTsKKworICAgIG1fc3RvcmFnZUFyZWFN
YXAucmVtb3ZlKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICBpZiAoIW1fc3Rv
cmFnZUFyZWFNYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9z
dG9yYWdlTWFuYWdlci0+bV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmNvbnRhaW5zKG1fc3RvcmFn
ZU5hbWVzcGFjZUlEKSk7CisgICAgbV9zdG9yYWdlTWFuYWdlci0+bV9sb2NhbFN0b3JhZ2VOYW1l
c3BhY2VzLnJlbW92ZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7Cit9CisKK3ZvaWQgU3RvcmFnZU1h
bmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09y
aWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQoreworICAgIGZv
ciAoY29uc3QgYXV0byYgb3JpZ2luQW5kU3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwKSB7
CisgICAgICAgIGlmIChvcmlnaW5BbmRTdG9yYWdlQXJlYS5rZXkgPT0gc2VjdXJpdHlPcmlnaW4p
CisgICAgICAgICAgICBvcmlnaW5BbmRTdG9yYWdlQXJlYS52YWx1ZS0+Y2xlYXIoKTsKKyAgICB9
Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Y2xlYXJB
bGxTdG9yYWdlQXJlYXMoKQoreworICAgIGZvciAoYXV0byogc3RvcmFnZUFyZWEgOiBtX3N0b3Jh
Z2VBcmVhTWFwLnZhbHVlcygpKQorICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKK30KKwor
Y2xhc3MgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFJlZjxTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlKHVuc2lnbmVkIHF1
b3RhSW5CeXRlcyk7CisgICAgflNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKCk7CisKKyAgICBib29s
IGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLmlzRW1wdHkoKTsgfQor
CisgICAgSVBDOjpDb25uZWN0aW9uKiBhbGxvd2VkQ29ubmVjdGlvbigpIGNvbnN0IHsgcmV0dXJu
IG1fYWxsb3dlZENvbm5lY3Rpb24uZ2V0KCk7IH0KKyAgICB2b2lkIHNldEFsbG93ZWRDb25uZWN0
aW9uKElQQzo6Q29ubmVjdGlvbiopOworCisgICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0
ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKKworICAgIHZvaWQgY2xvbmVUbyhT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSYgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpOworCisg
ICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2lucygpIGNvbnN0CisgICAgeworICAg
ICAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zOworCisgICAgICAgIGZvciAo
Y29uc3QgYXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKSB7Cisg
ICAgICAgICAgICBpZiAoIXN0b3JhZ2VBcmVhLT5pdGVtcygpLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICBvcmlnaW5zLmFwcGVuZChzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSk7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3JpZ2luczsKKyAgICB9CisKKyAgICB2b2lkIGNs
ZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBz
ZWN1cml0eU9yaWdpbikKKyAgICB7CisgICAgICAgIGZvciAoYXV0byYgc3RvcmFnZUFyZWEgOiBt
X3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEt
PnNlY3VyaXR5T3JpZ2luKCkgPT0gc2VjdXJpdHlPcmlnaW4pCisgICAgICAgICAgICAgICAgc3Rv
cmFnZUFyZWEtPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFyQWxs
U3RvcmFnZUFyZWFzKCkKKyAgICB7CisgICAgICAgIGZvciAoYXV0byYgc3RvcmFnZUFyZWEgOiBt
X3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKQorICAgICAgICAgICAgc3RvcmFnZUFyZWEtPmNsZWFy
KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGV4cGxpY2l0IFNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisKKyAgICBSZWZQdHI8SVBDOjpDb25uZWN0aW9u
PiBtX2FsbG93ZWRDb25uZWN0aW9uOworICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisg
ICAgSGFzaE1hcDxTZWN1cml0eU9yaWdpbkRhdGEsIFJlZlB0cjxTdG9yYWdlQXJlYT4+IG1fc3Rv
cmFnZUFyZWFNYXA7Cit9OworCitSZWY8U3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlPiBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZSh1
bnNpZ25lZCBxdW90YUluQnl0ZXMpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UocXVvdGFJbkJ5dGVzKSk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQg
cXVvdGFJbkJ5dGVzKQorICAgIDogbV9xdW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQoreworfQor
CitTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6On5TZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSgpCit7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlOjpzZXRBbGxvd2VkQ29ubmVjdGlvbihJUEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRD
b25uZWN0aW9uKQoreworICAgIEFTU0VSVCghYWxsb3dlZENvbm5lY3Rpb24gfHwgIW1fYWxsb3dl
ZENvbm5lY3Rpb24pOworCisgICAgbV9hbGxvd2VkQ29ubmVjdGlvbiA9IGFsbG93ZWRDb25uZWN0
aW9uOworfQorCithdXRvIFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6
Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdp
bikgLT4gUmVmPFN0b3JhZ2VBcmVhPgoreworICAgIHJldHVybiAqbV9zdG9yYWdlQXJlYU1hcC5l
bnN1cmUoc2VjdXJpdHlPcmlnaW4sIFt0aGlzLCBzZWN1cml0eU9yaWdpbl0oKSBtdXRhYmxlIHsK
KyAgICAgICAgcmV0dXJuIFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0ciwgV1RGTW92ZShzZWN1
cml0eU9yaWdpbiksIG1fcXVvdGFJbkJ5dGVzKTsKKyAgICB9KS5pdGVyYXRvci0+dmFsdWUuY29w
eVJlZigpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZTo6Y2xvbmVUbyhTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSYgbmV3U2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2UpCit7CisgICAgQVNTRVJUX1VOVVNFRChuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSwg
bmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UuaXNFbXB0eSgpKTsKKworICAgIGZvciAoYXV0byYg
cGFpciA6IG1fc3RvcmFnZUFyZWFNYXApCisgICAgICAgIG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNw
YWNlLm1fc3RvcmFnZUFyZWFNYXAuYWRkKHBhaXIua2V5LCBwYWlyLnZhbHVlLT5jbG9uZSgpKTsK
K30KKworUmVmPFN0b3JhZ2VNYW5hZ2VyPiBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlKGNvbnN0IFN0
cmluZyYgbG9jYWxTdG9yYWdlRGlyZWN0b3J5KQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3
IFN0b3JhZ2VNYW5hZ2VyKGxvY2FsU3RvcmFnZURpcmVjdG9yeSkpOworfQorCitTdG9yYWdlTWFu
YWdlcjo6U3RvcmFnZU1hbmFnZXIoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3Rvcnkp
CisgICAgOiBtX3F1ZXVlKFdvcmtRdWV1ZTo6Y3JlYXRlKCJjb20uYXBwbGUuV2ViS2l0LlN0b3Jh
Z2VNYW5hZ2VyIikpCisgICAgLCBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcihMb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmNyZWF0ZShtX3F1ZXVlLmNvcHlSZWYoKSwgbG9jYWxTdG9y
YWdlRGlyZWN0b3J5KSkKK3sKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIGlzIGluaXRp
YWxpemVkIGJlZm9yZSB3ZSBzdGFydCBkaXNwYXRjaGluZyB0aGluZ3MgdG8gdGhlIHF1ZXVlLgor
ICAgIFVURjhFbmNvZGluZygpOworfQorCitTdG9yYWdlTWFuYWdlcjo6flN0b3JhZ2VNYW5hZ2Vy
KCkKK3sKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1bnNpZ25lZCBxdW90YUluQnl0ZXMp
Cit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVm
KCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlELCBxdW90YUluQnl0ZXNdKCkgbXV0YWJsZSB7Cisg
ICAgICAgIEFTU0VSVCghbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMoc3RvcmFn
ZU5hbWVzcGFjZUlEKSk7CisKKyAgICAgICAgbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuc2V0
KHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZShxdW90
YUluQnl0ZXMpKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVzdHJveVNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKK3sKKyAg
ICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMp
LCBzdG9yYWdlTmFtZXNwYWNlSURdIHsKKyAgICAgICAgQVNTRVJUKG1fc2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2VzLmNvbnRhaW5zKHN0b3JhZ2VOYW1lc3BhY2VJRCkpOworICAgICAgICBtX3Nlc3Np
b25TdG9yYWdlTmFtZXNwYWNlcy5yZW1vdmUoc3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAgICB9KTsK
K30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0QWxsb3dlZFNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlQ29ubmVjdGlvbih1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIElQQzo6Q29ubmVjdGlv
biogYWxsb3dlZENvbm5lY3Rpb24pCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29ubmVjdGlvbiA9IFJlZlB0cjxJUEM6OkNv
bm5lY3Rpb24+KGFsbG93ZWRDb25uZWN0aW9uKSwgc3RvcmFnZU5hbWVzcGFjZUlEXSgpIG11dGFi
bGUgeworICAgICAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMo
c3RvcmFnZU5hbWVzcGFjZUlEKSk7CisKKyAgICAgICAgbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZXMuZ2V0KHN0b3JhZ2VOYW1lc3BhY2VJRCktPnNldEFsbG93ZWRDb25uZWN0aW9uKGNvbm5lY3Rp
b24uZ2V0KCkpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjbG9uZVNlc3Np
b25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdWludDY0X3Qg
bmV3U3RvcmFnZU5hbWVzcGFjZUlEKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBw
cm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3JhZ2VOYW1lc3BhY2VJRCwgbmV3U3Rv
cmFnZU5hbWVzcGFjZUlEXSB7CisgICAgICAgIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKiBzZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZSA9IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmdldChzdG9y
YWdlTmFtZXNwYWNlSUQpOworICAgICAgICBpZiAoIXNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKSB7
CisgICAgICAgICAgICAvLyBGSVhNRTogV2UgY2FuIGdldCBpbnRvIHRoaXMgc2l0dWF0aW9uIGlm
IHNvbWVvbmUgY2xvc2VzIHRoZSBvcmlnaW5hdGluZyBwYWdlIGZyb20gd2l0aGluIGEKKyAgICAg
ICAgICAgIC8vIGNyZWF0ZU5ld1BhZ2UgY2FsbGJhY2suIFdlIGJhaWwgZm9yIG5vdywgYnV0IHdl
IHNob3VsZCByZWFsbHkgZmluZCBhIHdheSB0byBrZWVwIHRoZSBzZXNzaW9uIHN0b3JhZ2UgYWxp
dmUKKyAgICAgICAgICAgIC8vIHNvIHdlIHdlJ2xsIGNsb25lIHRoZSBzZXNzaW9uIHN0b3JhZ2Ug
Y29ycmVjdGx5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UqIG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KG5ld1N0b3JhZ2VOYW1lc3BhY2VJRCk7CisgICAgICAg
IEFTU0VSVChuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7CisKKyAgICAgICAgc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2UtPmNsb25lVG8oKm5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlKTsKKyAg
ICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6cHJvY2Vzc1dpbGxPcGVuQ29ubmVjdGlv
bihXZWJQcm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24pCit7CisgICAg
Y29ubmVjdGlvbi5hZGRXb3JrUXVldWVNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0b3JhZ2VN
YW5hZ2VyOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fcXVldWUuZ2V0KCksIHRoaXMpOworfQor
Cit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpwcm9jZXNzRGlkQ2xvc2VDb25uZWN0aW9uKFdlYlByb2Nl
c3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbikKK3sKKyAgICBjb25uZWN0aW9u
LnJlbW92ZVdvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6
Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSk7CisKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywg
cHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb25uZWN0aW9uID0gUmVmPElQQzo6Q29u
bmVjdGlvbj4oY29ubmVjdGlvbildKCkgbXV0YWJsZSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBh
aXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj4gY29ubmVjdGlvbkFuZFN0b3Jh
Z2VNYXBJRFBhaXJzVG9SZW1vdmU7CisgICAgICAgIGZvciAoYXV0byYgc3RvcmFnZUFyZWEgOiBt
X3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbikgeworICAgICAgICAgICAgaWYgKHN0b3JhZ2VBcmVh
LmtleS5maXJzdCAhPSBjb25uZWN0aW9uLnB0cigpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgICAgICBzdG9yYWdlQXJlYS52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoKnN0b3Jh
Z2VBcmVhLmtleS5maXJzdCwgc3RvcmFnZUFyZWEua2V5LnNlY29uZCk7CisgICAgICAgICAgICBj
b25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZS5hcHBlbmQoc3RvcmFnZUFyZWEu
a2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNvbm5lY3Rpb25B
bmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlKQorICAgICAgICAgICAgbV9zdG9yYWdlQXJlYXNC
eUNvbm5lY3Rpb24ucmVtb3ZlKHBhaXIpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpnZXRTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZChIYXNoU2V0PFdlYkNv
cmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAg
bV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwg
Y29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxl
IHsKKyAgICAgICAgSGFzaFNldDxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7CisKKyAgICAg
ICAgZm9yIChjb25zdCBhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG9yaWdp
biA6IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5vcmlnaW5zKCkpCisgICAgICAgICAgICAgICAg
b3JpZ2lucy5hZGQob3JpZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkxvb3A6Om1haW4o
KS5kaXNwYXRjaChbb3JpZ2lucyA9IFdURk1vdmUob3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVy
ID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgICAgICBj
b21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKG9yaWdpbnMpKTsKKyAgICAgICAgfSk7CisgICAgfSk7
Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0ZVNlc3Npb25TdG9yYWdlT3JpZ2lucyhG
dW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAg
Zm9yIChhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2VzLnZhbHVlcygpKQorICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPmNs
ZWFyQWxsU3RvcmFnZUFyZWFzKCk7CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNo
KFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdl
TWFuYWdlcjo6ZGVsZXRlU2Vzc2lvblN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2lucyhjb25zdCBWZWN0
b3I8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYgb3JpZ2lucywgRnVuY3Rpb248dm9pZCgp
PiYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGE+IGNvcGllZE9yaWdpbnM7CisgICAgY29waWVkT3JpZ2lucy5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KG9yaWdpbnMuc2l6ZSgpKTsKKworICAgIGZvciAoYXV0byYgb3JpZ2luIDogb3Jp
Z2lucykKKyAgICAgICAgY29waWVkT3JpZ2lucy51bmNoZWNrZWRBcHBlbmQob3JpZ2luLmlzb2xh
dGVkQ29weSgpKTsKKworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlz
ID0gbWFrZVJlZigqdGhpcyksIGNvcGllZE9yaWdpbnMgPSBXVEZNb3ZlKGNvcGllZE9yaWdpbnMp
LCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFi
bGUgeworICAgICAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IGNvcGllZE9yaWdpbnMpIHsKKyAgICAg
ICAgICAgIGZvciAoYXV0byYgc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgOiBtX3Nlc3Npb25TdG9y
YWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOworICAgICAg
ICB9CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFdURk1vdmUoY29tcGxldGlv
bkhhbmRsZXIpKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Z2V0TG9jYWxT
dG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmln
aW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRj
aChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxl
ciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBIYXNo
U2V0PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKworICAgICAgICBmb3IgKGF1dG8mIG9y
aWdpbiA6IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5vcmlnaW5zKCkpCisgICAgICAg
ICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOworCisgICAgICAgIGZvciAoYXV0byYgdHJhbnNpZW50
TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Vz
LnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG9yaWdpbiA6IHRyYW5zaWVudExv
Y2FsU3RvcmFnZU5hbWVzcGFjZS0+b3JpZ2lucygpKQorICAgICAgICAgICAgICAgIG9yaWdpbnMu
YWRkKG9yaWdpbik7CisgICAgICAgIH0KKworICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0
Y2goW29yaWdpbnMgPSBXVEZNb3ZlKG9yaWdpbnMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1v
dmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAgY29tcGxldGlv
bkhhbmRsZXIoV1RGTW92ZShvcmlnaW5zKSk7CisgICAgICAgIH0pOworICAgIH0pOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VPcmlnaW5EZXRhaWxzKEZ1bmN0aW9u
PHZvaWQgKFZlY3RvcjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+
KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywg
cHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1v
dmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBhdXRvIG9yaWdpbkRl
dGFpbHMgPSBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+b3JpZ2luRGV0YWlscygpOwor
CisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3JpZ2luRGV0YWlscyA9IFdURk1v
dmUob3JpZ2luRGV0YWlscyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9u
SGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZN
b3ZlKG9yaWdpbkRldGFpbHMpKTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3Rv
cmFnZU1hbmFnZXI6OmRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW4oU2VjdXJpdHlP
cmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Ro
aXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29waWVkT3JpZ2luID0gc2VjdXJp
dHlPcmlnaW4uaXNvbGF0ZWRDb3B5KCldKCkgbXV0YWJsZSB7CisgICAgICAgIGZvciAoYXV0byYg
bG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygp
KQorICAgICAgICAgICAgbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01h
dGNoaW5nT3JpZ2luKGNvcGllZE9yaWdpbik7CisKKyAgICAgICAgZm9yIChhdXRvJiB0cmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFj
ZXMudmFsdWVzKCkpCisgICAgICAgICAgICB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Ut
PmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29waWVkT3JpZ2luKTsKKworICAgICAg
ICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVsZXRlRGF0YWJhc2VXaXRoT3JpZ2lu
KGNvcGllZE9yaWdpbik7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0
ZUxvY2FsU3RvcmFnZU9yaWdpbnNNb2RpZmllZFNpbmNlKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xv
Y2s6OnRpbWVfcG9pbnQgdGltZSwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVy
KQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJl
ZigqdGhpcyksIHRpbWUsIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFu
ZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIGF1dG8gZGVsZXRlZE9yaWdpbnMgPSBtX2xvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZSh0aW1l
KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9yaWdpbiA6IGRlbGV0ZWRPcmlnaW5zKSB7
CisgICAgICAgICAgICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fbG9jYWxT
dG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VO
YW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3JpZ2luKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGZvciAoYXV0byYgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNl
IDogbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQorICAgICAgICAg
ICAgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhckFsbFN0b3JhZ2VBcmVhcygp
OworCisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRpb25I
YW5kbGVyKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0ZUxvY2Fs
U3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
Cit7CisgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gY29waWVkT3JpZ2luczsKKyAgICBj
b3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkob3JpZ2lucy5zaXplKCkpOworCisg
ICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQorICAgICAgICBjb3BpZWRPcmlnaW5zLnVu
Y2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5KCkpOworCisgICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29waWVkT3JpZ2lu
cyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShj
b21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIGZvciAoYXV0byYgb3JpZ2lu
IDogY29waWVkT3JpZ2lucykgeworICAgICAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0b3JhZ2VO
YW1lc3BhY2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAg
ICAgICAgbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3Jp
Z2luKG9yaWdpbik7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgdHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygp
KQorICAgICAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJT
dG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOworCisgICAgICAgICAgICBtX2xvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlci0+ZGVsZXRlRGF0YWJhc2VXaXRoT3JpZ2luKG9yaWdpbik7
CisgICAgICAgIH0KKworICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShj
b21wbGV0aW9uSGFuZGxlcikpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpj
cmVhdGVMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRf
dCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmln
aW5EYXRhJiYgc2VjdXJpdHlPcmlnaW5EYXRhKQoreworICAgIHN0ZDo6cGFpcjxSZWZQdHI8SVBD
OjpDb25uZWN0aW9uPiwgdWludDY0X3Q+IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKCZj
b25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJl
IGEgbWVzc2FnZSBjaGVjay4KKyAgICBBU1NFUlQoKEhhc2hNYXA8c3RkOjpwYWlyPFJlZlB0cjxJ
UEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4sIFJlZlB0cjxTdG9yYWdlQXJlYT4+Ojppc1ZhbGlk
S2V5KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKSkpOworCisgICAgSGFzaE1hcDxzdGQ6
OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VB
cmVhPj46OkFkZFJlc3VsdCByZXN1bHQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQo
Y29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIsIG51bGxwdHIpOworCisgICAgLy8gRklYTUU6
IFRoZXNlIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2tzLgorICAgIEFTU0VSVChyZXN1bHQuaXNO
ZXdFbnRyeSk7CisgICAgQVNTRVJUKChIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8TG9jYWxTdG9y
YWdlTmFtZXNwYWNlPj46OmlzVmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSkpOworCisgICAg
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UgPSBnZXRPckNyZWF0
ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZShzdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KKyAgICBBU1NFUlQobG9jYWxTdG9y
YWdlTmFtZXNwYWNlKTsKKworICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBsb2NhbFN0b3JhZ2VOYW1l
c3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoV1RGTW92ZShzZWN1cml0eU9yaWdpbkRhdGEp
KTsKKyAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElE
KTsKKworICAgIHJlc3VsdC5pdGVyYXRvci0+dmFsdWUgPSBXVEZNb3ZlKHN0b3JhZ2VBcmVhKTsK
K30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTWFw
KElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50
NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFNlY3VyaXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3Jp
Z2luRGF0YSwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgb3JpZ2luKQoreworICAgIC8vIEZJWE1FOiBU
aGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFz
QnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0pKTsK
KworICAgIC8vIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgc2Vzc2lvbiBzdG9yYWdlIGZvciB0aGlz
IGNvbm5lY3Rpb24vb3JpZ2luIGNvbWJvLgorICAgIC8vIElmIHNvLCB1cGRhdGUgdGhlIG1hcCB3
aXRoIHRoZSBuZXcgSUQsIG90aGVyd2lzZSBrZWVwIG9uIHRydWNraW5nLgorICAgIGZvciAoYXV0
byBpdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmJlZ2luKCksIGVuZCA9IG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYg
KGl0LT5rZXkuZmlyc3QgIT0gJmNvbm5lY3Rpb24pCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgUmVmPFN0b3JhZ2VBcmVhPiBhcmVhID0gKml0LT52YWx1ZTsKKyAgICAgICAgaWYgKCFh
cmVhLT5pc1Nlc3Npb25TdG9yYWdlKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
aWYgKCFvcmlnaW4uc2VjdXJpdHlPcmlnaW4oKS0+aXNTYW1lU2NoZW1lSG9zdFBvcnQoYXJlYS0+
c2VjdXJpdHlPcmlnaW4oKS5zZWN1cml0eU9yaWdpbigpLmdldCgpKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBhcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFw
SUQpOworICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoaXQpOworICAg
ICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQoeyAmY29ubmVjdGlvbiwgc3RvcmFn
ZU1hcElEIH0sIFdURk1vdmUoYXJlYSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
YXV0byYgc2xvdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZCh7ICZjb25uZWN0aW9u
LCBzdG9yYWdlTWFwSUQgfSwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworCisgICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KKyAgICBBU1NFUlQoIXNsb3QpOwor
CisgICAgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiB0cmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UgPSBnZXRPckNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZShz
dG9yYWdlTmFtZXNwYWNlSUQsIFdURk1vdmUodG9wTGV2ZWxPcmlnaW5EYXRhKSk7CisKKyAgICBh
dXRvIHN0b3JhZ2VBcmVhID0gdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5nZXRPckNy
ZWF0ZVN0b3JhZ2VBcmVhKFdURk1vdmUob3JpZ2luKSk7CisgICAgc3RvcmFnZUFyZWEtPmFkZExp
c3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisKKyAgICBzbG90ID0gV1RGTW92ZShz
dG9yYWdlQXJlYSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZVNlc3Npb25TdG9y
YWdlTWFwKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElE
LCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3Vy
aXR5T3JpZ2luRGF0YSkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdl
IGNoZWNrLgorICAgIEFTU0VSVChtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5pc1ZhbGlkS2V5
KHN0b3JhZ2VOYW1lc3BhY2VJRCkpOworCisgICAgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UqIHNl
c3Npb25TdG9yYWdlTmFtZXNwYWNlID0gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0
b3JhZ2VOYW1lc3BhY2VJRCk7CisgICAgaWYgKCFzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSkgewor
ICAgICAgICAvLyBXZSdyZSBnZXR0aW5nIGFuIGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgd2Vi
IHByb2Nlc3MgdGhhdCdzIGZvciBzZXNzaW9uIHN0b3JhZ2UgZm9yIGEgd2ViIHBhZ2UKKyAgICAg
ICAgLy8gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwganVzdCBpZ25vcmUgaXQuCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNz
YWdlIGNoZWNrLgorICAgIEFTU0VSVChtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5pc1ZhbGlk
S2V5KHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCB9KSk7CisKKyAgICBhdXRvJiBzbG90ID0g
bV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJ
RCB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91
bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVCghc2xvdCk7CisKKyAgICAvLyBGSVhN
RTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVCgmY29ubmVjdGlv
biA9PSBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+YWxsb3dlZENvbm5lY3Rpb24oKSk7CisKKyAg
ICBhdXRvIHN0b3JhZ2VBcmVhID0gc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRl
U3RvcmFnZUFyZWEoV1RGTW92ZShzZWN1cml0eU9yaWdpbkRhdGEpKTsKKyAgICBzdG9yYWdlQXJl
YS0+YWRkTGlzdGVuZXIoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIHNsb3QgPSBX
VEZNb3ZlKHN0b3JhZ2VBcmVhKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVzdHJveVN0
b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFw
SUQpCit7CisgICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4g
Y29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7
CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFT
U0VSVChtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5pc1ZhbGlkS2V5KGNvbm5lY3Rpb25BbmRT
dG9yYWdlTWFwSURQYWlyKSk7CisKKyAgICBhdXRvIGl0ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5l
Y3Rpb24uZmluZChjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcik7CisgICAgaWYgKGl0ID09
IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmVuZCgpKSB7CisgICAgICAgIC8vIFRoZSBjb25u
ZWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYmVjYXVzZSB0aGUgbGFzdCBwYWdlIHdhcyBjbG9zZWQu
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpdC0+dmFsdWUtPnJlbW92ZUxpc3RlbmVy
KGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisKKyAgICAvLyBEb24ndCByZW1vdmUgc2Vzc2lv
biBzdG9yYWdlIG1hcHMuIFRoZSB3ZWIgcHJvY2VzcyBtYXkgcmVjb25uZWN0IGFuZCBleHBlY3Qg
dGhlIGRhdGEgdG8gc3RpbGwgYmUgYXJvdW5kLgorICAgIGlmIChpdC0+dmFsdWUtPmlzU2Vzc2lv
blN0b3JhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zdG9yYWdlQXJlYXNCeUNvbm5l
Y3Rpb24ucmVtb3ZlKGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKTsKK30KKwordm9pZCBT
dG9yYWdlTWFuYWdlcjo6Z2V0VmFsdWVzKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWlu
dDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgSGFzaE1hcDxTdHJp
bmcsIFN0cmluZz4mIHZhbHVlcykKK3sKKyAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBm
aW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKyAgICBpZiAoIXN0b3Jh
Z2VBcmVhKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3Ig
YSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIHZhbHVlcyA9IHN0b3JhZ2VBcmVhLT5pdGVtcygpOworICAg
IGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6OkRpZEdldFZhbHVlcyhz
dG9yYWdlTWFwU2VlZCksIHN0b3JhZ2VNYXBJRCk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6
OnNldEl0ZW0oSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFw
SUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVk
LCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiB1
cmxTdHJpbmcpCit7CisgICAgU3RvcmFnZUFyZWEqIHN0b3JhZ2VBcmVhID0gZmluZFN0b3JhZ2VB
cmVhKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisgICAgaWYgKCFzdG9yYWdlQXJlYSkgewor
ICAgICAgICAvLyBUaGlzIGlzIGEgc2Vzc2lvbiBzdG9yYWdlIGFyZWEgZm9yIGEgcGFnZSB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBJZ25vcmUgaXQuCisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBib29sIHF1b3RhRXJyb3I7CisgICAgc3RvcmFnZUFyZWEtPnNldEl0ZW0oJmNv
bm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgdmFsdWUsIHVybFN0cmluZywgcXVv
dGFFcnJvcik7CisgICAgY29ubmVjdGlvbi5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6
RGlkU2V0SXRlbShzdG9yYWdlTWFwU2VlZCwga2V5LCBxdW90YUVycm9yKSwgc3RvcmFnZU1hcElE
KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6cmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24m
IGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFn
ZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBm
aW5kU3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKyAgICBpZiAoIXN0b3Jh
Z2VBcmVhKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3Ig
YSBwYWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIHN0b3JhZ2VBcmVhLT5yZW1vdmVJdGVtKCZjb25uZWN0aW9u
LCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIHVybFN0cmluZyk7CisgICAgY29ubmVjdGlvbi5z
ZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkUmVtb3ZlSXRlbShzdG9yYWdlTWFwU2Vl
ZCwga2V5KSwgc3RvcmFnZU1hcElEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Y2xlYXIo
SVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2
NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBT
dHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBmaW5k
U3RvcmFnZUFyZWEoY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKyAgICBpZiAoIXN0b3JhZ2VB
cmVhKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBw
YWdlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigmY29ubmVjdGlvbiwgc291cmNl
U3RvcmFnZUFyZWFJRCwgdXJsU3RyaW5nKTsKKyAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6
OlN0b3JhZ2VBcmVhTWFwOjpEaWRDbGVhcihzdG9yYWdlTWFwU2VlZCksIHN0b3JhZ2VNYXBJRCk7
Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZSgpCit7
CisgICAgQmluYXJ5U2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChb
dGhpcywgJnNlbWFwaG9yZV0geworICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPFJlZlB0cjxJUEM6
OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4+IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1Rv
UmVtb3ZlOworICAgICAgICBmb3IgKGF1dG8mIGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIgOiBt
X3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbikgeworICAgICAgICAgICAgY29ubmVjdGlvblN0b3Jh
Z2VBcmVhUGFpci52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoKmNvbm5lY3Rpb25TdG9yYWdlQXJlYVBh
aXIua2V5LmZpcnN0LCBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyLmtleS5zZWNvbmQpOworICAg
ICAgICAgICAgY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUuYXBwZW5kKGNv
bm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAo
YXV0byYgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFw
SURQYWlyc1RvUmVtb3ZlKQorICAgICAgICAgICAgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24u
cmVtb3ZlKGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIpOworCisgICAgICAgIHNlbWFwaG9yZS5z
aWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUud2FpdChXYWxsVGltZTo6aW5maW5pdHko
KSk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYSogU3RvcmFnZU1hbmFnZXI6OmZp
bmRTdG9yYWdlQXJlYShJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCkgY29uc3QKK3sKKyAgICBzdGQ6OnBhaXI8SVBDOjpDb25uZWN0aW9uKiwgdWludDY0
X3Q+IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKCZjb25uZWN0aW9uLCBzdG9yYWdlTWFw
SUQpOworCisgICAgaWYgKCFtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5pc1ZhbGlkS2V5KGNv
bm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICByZXR1cm4gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uZ2V0KGNvbm5lY3Rpb25BbmRT
dG9yYWdlTWFwSURQYWlyKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVz
cGFjZSogU3RvcmFnZU1hbmFnZXI6OmdldE9yQ3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCkKK3sKKyAgICBpZiAoIW1fbG9jYWxTdG9yYWdlTmFt
ZXNwYWNlcy5pc1ZhbGlkS2V5KHN0b3JhZ2VOYW1lc3BhY2VJRCkpCisgICAgICAgIHJldHVybiBu
dWxscHRyOworCisgICAgYXV0byYgc2xvdCA9IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy5hZGQo
c3RvcmFnZU5hbWVzcGFjZUlELCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKCFz
bG90KQorICAgICAgICBzbG90ID0gTG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjcmVhdGUodGhpcywg
c3RvcmFnZU5hbWVzcGFjZUlEKTsKKworICAgIHJldHVybiBzbG90LmdldCgpOworfQorCitTdG9y
YWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBTdG9yYWdlTWFuYWdl
cjo6Z2V0T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9y
aWdpbikKK3sKKyAgICBpZiAoIW1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy5pc1Zh
bGlkS2V5KHsgc3RvcmFnZU5hbWVzcGFjZUlELCB0b3BMZXZlbE9yaWdpbiB9KSkKKyAgICAgICAg
cmV0dXJuIG51bGxwdHI7CisKKyAgICBhdXRvJiBzbG90ID0gbV90cmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2VzLmFkZCh7IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV1RGTW92ZSh0b3BMZXZlbE9y
aWdpbikgfSwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmICghc2xvdCkKKyAgICAg
ICAgc2xvdCA9IFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKCk7CisKKyAg
ICByZXR1cm4gc2xvdC5nZXQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmgg
Yi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uYTFmNjllYjcwNzNhM2NhNWYzYjhlMjdkOTMzZDFiOGFlMjgxYTA5YgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1h
bmFnZXIuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisj
aW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJh
Y2tlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhhc2guaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5j
bHVkZSA8d3RmL0ZvcndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KKyNpbmNsdWRl
IDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Y2xhc3MgU2VjdXJpdHlPcmlnaW47Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBM
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI7CitjbGFzcyBXZWJQcm9jZXNzUHJveHk7CisKK2Ns
YXNzIFN0b3JhZ2VNYW5hZ2VyIDogcHVibGljIElQQzo6Q29ubmVjdGlvbjo6V29ya1F1ZXVlTWVz
c2FnZVJlY2VpdmVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFN0b3JhZ2VNYW5hZ2VyPiBj
cmVhdGUoY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworICAgIH5TdG9yYWdl
TWFuYWdlcigpOworCisgICAgdm9pZCBjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50
NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisgICAgdm9p
ZCBkZXN0cm95U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFj
ZUlEKTsKKyAgICB2b2lkIHNldEFsbG93ZWRTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZUNvbm5lY3Rp
b24odWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBJUEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRD
b25uZWN0aW9uKTsKKyAgICB2b2lkIGNsb25lU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0
X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9yYWdlTmFtZXNwYWNlSUQpOwor
CisgICAgdm9pZCBwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQ
Qzo6Q29ubmVjdGlvbiYpOworICAgIHZvaWQgcHJvY2Vzc0RpZENsb3NlQ29ubmVjdGlvbihXZWJQ
cm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24mKTsKKyAgICB2b2lkIGFwcGxpY2F0aW9uV2ls
bFRlcm1pbmF0ZSgpOworCisgICAgdm9pZCBnZXRTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rp
b248dm9pZChIYXNoU2V0PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxl
dGlvbkhhbmRsZXIpOworICAgIHZvaWQgZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0
aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgdm9pZCBkZWxldGVTZXNzaW9u
U3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGE+JiwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKworICAg
IHZvaWQgZ2V0TG9jYWxTdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29y
ZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgdm9p
ZCBkZWxldGVMb2NhbFN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2luKFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YSYmKTsKKworICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9yYWdlT3JpZ2luc01vZGlmaWVk
U2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCwgRnVuY3Rpb248dm9p
ZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFnZUVu
dHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+
JiwgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKworICAgIHZvaWQgZ2V0
TG9jYWxTdG9yYWdlT3JpZ2luRGV0YWlscyhGdW5jdGlvbjx2b2lkKFZlY3RvcjxMb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+KT4mJiBjb21wbGV0aW9uSGFuZGxlcik7
CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU3RvcmFnZU1hbmFnZXIoY29uc3QgU3RyaW5nJiBs
b2NhbFN0b3JhZ2VEaXJlY3RvcnkpOworCisgICAgLy8gSVBDOjpDb25uZWN0aW9uOjpXb3JrUXVl
dWVNZXNzYWdlUmVjZWl2ZXIuCisgICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5l
Y3Rpb24mLCBJUEM6OkRlY29kZXImKSBvdmVycmlkZTsKKyAgICB2b2lkIGRpZFJlY2VpdmVTeW5j
TWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImLCBzdGQ6OnVuaXF1ZV9wdHI8
SVBDOjpFbmNvZGVyPiYgcmVwbHlFbmNvZGVyKSBvdmVycmlkZTsKKworICAgIC8vIE1lc3NhZ2Ug
aGFuZGxlcnMuCisgICAgdm9pZCBjcmVhdGVMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0aW9u
JiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKKyAgICB2b2lkIGNyZWF0ZVRyYW5zaWVudExv
Y2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYg
dG9wTGV2ZWxPcmlnaW5EYXRhLCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJik7CisgICAg
dm9pZCBjcmVhdGVTZXNzaW9uU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBz
dG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJiYpOworICAgIHZvaWQgZGVzdHJveVN0b3JhZ2VNYXAoSVBDOjpDb25uZWN0
aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKTsKKworICAgIHZvaWQgZ2V0VmFsdWVzKElQQzo6
Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNl
ZWQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiB2YWx1ZXMpOworICAgIHZvaWQgc2V0SXRlbShJ
UEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzb3VyY2VT
dG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAgICB2b2lk
IHJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50
NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3Qg
U3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAgICB2b2lkIGNsZWFyKElQ
Qzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3Rv
cmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYgdXJsU3Ry
aW5nKTsKKworICAgIGNsYXNzIFN0b3JhZ2VBcmVhOworICAgIFN0b3JhZ2VBcmVhKiBmaW5kU3Rv
cmFnZUFyZWEoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3QpIGNvbnN0OworCisgICAgY2xhc3Mg
TG9jYWxTdG9yYWdlTmFtZXNwYWNlOworICAgIExvY2FsU3RvcmFnZU5hbWVzcGFjZSogZ2V0T3JD
cmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKTsK
KworICAgIGNsYXNzIFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZTsKKyAgICBUcmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdl
TmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW4pOworCisgICAgUmVmPFdvcmtRdWV1ZT4gbV9xdWV1
ZTsKKworICAgIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IG1fbG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyOworICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2U+PiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXM7CisKKyAgICBIYXNoTWFwPHN0
ZDo6cGFpcjx1aW50NjRfdCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiwgUmVmUHRyPFRy
YW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZT4+IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlczsKKworICAgIGNsYXNzIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOworICAgIEhhc2hN
YXA8dWludDY0X3QsIFJlZlB0cjxTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4+IG1fc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2VzOworCisgICAgSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29u
bmVjdGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYXNC
eUNvbm5lY3Rpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMu
aW4gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLm1l
c3NhZ2VzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjI1Nzg5Zjc0Y2MwODFiMDc0YjU4ODUwZDJiN2Q3YmM0MTgw
NDljOGEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9y
YWdlL1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJp
Z2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMg
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbWVzc2FnZXMgLT4gU3RvcmFnZU1hbmFn
ZXIgeworICAgIENyZWF0ZUxvY2FsU3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
RGF0YSBzZWN1cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgorICAgIENyZWF0ZVRyYW5z
aWVudExvY2FsU3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSB0b3BMZXZl
bFNlY3VyaXR5T3JpZ2luRGF0YSwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBz
ZWN1cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgorICAgIENyZWF0ZVNlc3Npb25TdG9y
YWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlE
LCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0YSkg
V2FudHNDb25uZWN0aW9uCisgICAgRGVzdHJveVN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFnZU1h
cElEKSBXYW50c0Nvbm5lY3Rpb24KKworICAgIEdldFZhbHVlcyh1aW50NjRfdCBzdG9yYWdlTWFw
SUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKSAtPiAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4g
dmFsdWVzKSBXYW50c0Nvbm5lY3Rpb24KKworICAgIFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1h
cElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2Vl
ZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdXJsU3RyaW5nKSBXYW50c0Nvbm5l
Y3Rpb24KKyAgICBSZW1vdmVJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291
cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXksIFN0
cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgorICAgIENsZWFyKHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1h
cFNlZWQsIFN0cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgorfQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9pb3MvTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VySU9TLm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9pb3Mv
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VySU9TLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZkOTA5ZWE2YjI1
MDMxOWIwMTMwNmM0MzZiZDBmMTMyYzBmODI4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXJJT1MubW0KQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIKKworI2lmIFBMQVRG
T1JNKElPUykKKworI2luY2x1ZGUgIlZlcnNpb25DaGVja3MuaCIKKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpwbGF0Zm9ybU1heWJlRXhj
bHVkZUZyb21CYWNrdXAoKSBjb25zdAoreworICAgIGlmIChtX2hhc0V4Y2x1ZGVkRnJvbUJhY2t1
cCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9oYXNFeGNsdWRlZEZyb21CYWNrdXAgPSB0cnVl
OworCisgICAgaWYgKGxpbmtlZE9uT3JBZnRlcihTREtWZXJzaW9uOjpGaXJzdFRvRXhjbHVkZUxv
Y2FsU3RvcmFnZUZyb21CYWNrdXApKQorICAgICAgICBbW05TVVJMIGZpbGVVUkxXaXRoUGF0aDoo
TlNTdHJpbmcgKiltX2xvY2FsU3RvcmFnZURpcmVjdG9yeV0gc2V0UmVzb3VyY2VWYWx1ZTpAWUVT
IGZvcktleTpOU1VSTElzRXhjbHVkZWRGcm9tQmFja3VwS2V5IGVycm9yOm5pbF07Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1Mu
bW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlSU9TLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjViNWNiZDI4ZTI0OTI5MTNhNDMyNzY0
YzliYTkzNjUyNzdjOTc3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9pb3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tCkBA
IC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQg
IlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIgorCisjaWYgUExBVEZP
Uk0oSU9TKQorCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKK3sKKyAgICBb
W05TVVJMIGZpbGVVUkxXaXRoUGF0aDooTlNTdHJpbmcgKiltX3N0b3JhZ2VEaXJlY3RvcnlQYXRo
XSBzZXRSZXNvdXJjZVZhbHVlOkBZRVMgZm9yS2V5Ok5TVVJMSXNFeGNsdWRlZEZyb21CYWNrdXBL
ZXkgZXJyb3I6bmlsXTsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViS2l0L1dlYktp
dC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IGFlYzhkMzdhZmQ4NmI1YjA0ZGE0NzA2
ZWNjZWY0ZTJjYTRhNzE2NzkuLjk4OTU2NmI4NWVmMjM5OTM3MmNjN2ZjYzk0MWNiZjg1ODAzY2Qz
ODEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKKysrIGIvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agpAQCAtMTA3OSw2ICsxMDc5LDkgQEAKIAkJNTFFMzUyMDIxODBGNUQxRTAwRTUzQkU5IC8qIERh
dGFiYXNlUHJvY2Vzc01hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDUxRTM1MjAxMTgwRjVEMUUwMEU1M0JFOSAvKiBEYXRhYmFzZVByb2Nlc3NNYWMu
bW0gKi87IH07CiAJCTUxRTM1MjA5MTgwRjVENkIwMEU1M0JFOSAvKiBEYXRhYmFzZVNlcnZpY2VF
bnRyeVBvaW50Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNTFFMzUyMDgxODBGNUQ2QjAwRTUzQkU5IC8qIERhdGFiYXNlU2VydmljZUVudHJ5UG9pbnQu
bW0gKi87IH07CiAJCTUxRTM5OTA2MUQ2RjU0QzcwMDlDODgzMSAvKiBVSUdhbWVwYWRQcm92aWRl
ckNvY29hLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
NTFFMzk5MDUxRDZGNTRDNTAwOUM4ODMxIC8qIFVJR2FtZXBhZFByb3ZpZGVyQ29jb2EubW0gKi87
IH07CisJCTUxRTZDMTYwMUYyOTM1NjAwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA1MUU2QzE1RjFGMjkzNTUxMDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovOyB9OworCQk1MUU2QzE2MzFGMjkzNUQ4
MDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUxRTZDMTYyMUYy
OTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
Y3BwICovOyB9OworCQk1MUU2QzE2NDFGMjkzNUREMDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA1MUU2QzE2MTFGMjkzNUNEMDBGRDM0MzcgLyogUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmggKi87IH07CiAJCTUxRThCNjhFMUU3MTI4Nzcw
MDFCNzEzMiAvKiBXZWJVUkxTY2hlbWVUYXNrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUxRThCNjhEMUU3MTI4NzMwMDFCNzEzMiAvKiBXZWJVUkxT
Y2hlbWVUYXNrLmNwcCAqLzsgfTsKIAkJNTFFOTQ5OTcxRDc2MjExMzAwRUM5RUI5IC8qIFVJR2Ft
ZXBhZFByb3ZpZGVySU9TLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNTFFOTQ5OTYxRDc2MUNDNzAwRUM5RUI5IC8qIFVJR2FtZXBhZFByb3ZpZGVySU9T
Lm1tICovOyB9OwogCQk1MUVGQzFDRjE1MjRFNjI1MDBDOUE5MzggLyogV0tCdW5kbGVET01XaW5k
b3dFeHRlbnNpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDUxRkEyRDU0MTUyMTExODYwMEMxQkEwQiAvKiBXS0J1bmRsZURPTVdpbmRvd0V4dGVuc2lv
bi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC0x
MzI1LDcgKzEzMjgsNiBAQAogCQk4MzEwNDI4QzFCRDZCNjZGMDBBNzE1RTQgLyogTmV0d29ya0Nh
Y2hlU3VicmVzb3VyY2VzRW50cnkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gODMxMDQyOEExQkQ2QjY2RjAwQTcxNUU0IC8qIE5ldHdvcmtDYWNoZVN1
YnJlc291cmNlc0VudHJ5LmNwcCAqLzsgfTsKIAkJODMxRUVCQkQxQkQ4NUM0MzAwQkI2NEMzIC8q
IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gODMxRUVCQkIxQkQ4NUM0MzAwQkI2NEMzIC8qIE5ldHdvcmtD
YWNoZVNwZWN1bGF0aXZlTG9hZC5oICovOyB9OwogCQk4MzFFRUJCRTFCRDg1QzQzMDBCQjY0QzMg
LyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzMUVFQkJDMUJEODVDNDMwMEJCNjRDMyAvKiBOZXR3
b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWQuY3BwICovOyB9OwotCQk4MzI0MzU1QzFGMTcxNDY3MDAz
NUFBM0EgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMyNDM1NUIxRjE3
MTQ2MTAwMzVBQTNBIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlP
Uy5tbSAqLzsgfTsKIAkJODMyQUUyNTIxQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNw
ZWN1bGF0aXZlTG9hZE1hbmFnZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDgzMkFFMjUwMUJFMkU4Q0QwMEZBQUUxMCAvKiBOZXR3b3JrQ2FjaGVTcGVj
dWxhdGl2ZUxvYWRNYW5hZ2VyLmggKi87IH07CiAJCTgzMkFFMjUzMUJFMkU4Q0QwMEZBQUUxMCAv
KiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzMkFFMjUxMUJFMkU4Q0QwMEZBQUUxMCAv
KiBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmNwcCAqLzsgfTsKIAkJODMyRUQx
OEIxRTJGRTE1NzAwNkJBNjRBIC8qIFBlckFjdGl2aXR5U3RhdGVDUFVVc2FnZVNhbXBsZXIuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMyRUQxODkx
RTJGRTEzQjAwNkJBNjRBIC8qIFBlckFjdGl2aXR5U3RhdGVDUFVVc2FnZVNhbXBsZXIuY3BwICov
OyB9OwpAQCAtMTMzOSw4ICsxMzQxLDYgQEAKIAkJODM3MkRCMjgxQTY3NTYyODAwQzY5N0M1IC8q
IFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzcyREIyNjFBNjc1NjI4MDBDNjk3QzUgLyogV2Vi
UGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCAqLzsgfTsKIAkJODM3MkRCMjkxQTY3NTYy
ODAwQzY5N0M1IC8qIFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM3MkRCMjcxQTY3NTYyODAwQzY5
N0M1IC8qIFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oICovOyB9OwogCQk4MzcyREIy
RjFBNjc3RDRBMDBDNjk3QzUgLyogV0tEaWFnbm9zdGljTG9nZ2luZ1Jlc3VsdFR5cGUuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzNzJEQjJFMUE2NzdE
NEEwMEM2OTdDNSAvKiBXS0RpYWdub3N0aWNMb2dnaW5nUmVzdWx0VHlwZS5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07Ci0JCTgzODUwQzBDMUYxNkJBOTAw
MEMxNUU1MiAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM4NTBDMEExRjE2
QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5j
cHAgKi87IH07Ci0JCTgzODUwQzBEMUYxNkJBOTAwMEMxNUU1MiAvKiBSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDgzODUwQzBCMUYxNkJBNkMwMEMxNUU1MiAvKiBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCAqLzsgfTsKIAkJODM4OTFCNjMxQTY4QjM0MjAw
MzBGMzg2IC8qIEFQSURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Mzg5MUI2MjFBNjhCMzQyMDAzMEYzODYgLyog
QVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCAqLzsgfTsKIAkJODM4OTFCNjkxQTY4QkVCQzAw
MzBGMzg2IC8qIF9XS0RpYWdub3N0aWNMb2dnaW5nRGVsZWdhdGUuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzODkxQjY4MUE2OEJFQkMwMDMwRjM4NiAv
KiBfV0tEaWFnbm9zdGljTG9nZ2luZ0RlbGVnYXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJODM4OTFCNkMxQTY4QzMwQjAwMzBGMzg2IC8qIERp
YWdub3N0aWNMb2dnaW5nQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA4Mzg5MUI2QTFBNjhDMzBCMDAzMEYzODYgLyogRGlhZ25vc3RpY0xvZ2dp
bmdDbGllbnQuaCAqLzsgfTsKQEAgLTMzNDIsNiArMzM0Miw5IEBACiAJCTUxRTM1MjA3MTgwRjVE
NjEwMEU1M0JFOSAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxh
c3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MUUzNTIwODE4MEY1RDZCMDBFNTNCRTkgLyogRGF0
YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNw
cDsgcGF0aCA9IERhdGFiYXNlU2VydmljZUVudHJ5UG9pbnQubW07IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTUxRTM5OTA1MUQ2RjU0QzUwMDlDODgzMSAvKiBVSUdhbWVwYWRQcm92aWRl
ckNvY29hLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gVUlHYW1l
cGFkUHJvdmlkZXJDb2NvYS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTFFNkMx
NUYxRjI5MzU1MTAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZUlPUy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZUlPUy5tbTsgcGF0aCA9IGlvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2VJT1MubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTUx
RTZDMTYxMUYyOTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTUxRTZDMTYyMUYyOTM1
Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTFFOEI2OEQxRTcxMjg3MzAw
MUI3MTMyIC8qIFdlYlVSTFNjaGVtZVRhc2suY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gV2ViVVJMU2NoZW1lVGFzay5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTUxRTk0OTk2MUQ3NjFDQzcwMEVDOUVCOSAvKiBVSUdhbWVwYWRQcm92aWRlcklPUy5t
bSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFVJR2FtZXBhZFByb3Zp
ZGVySU9TLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MUYwNjBERDE2NTQzMTc1
MDBGMzI4MUIgLyogV2ViUmVzb3VyY2VMb2FkZXJNZXNzYWdlUmVjZWl2ZXIuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gV2ViUmVzb3VyY2VMb2FkZXJNZXNzYWdlUmVjZWl2ZXIuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMzYxNCw3ICszNjE3LDYgQEAKIAkJODMxMDQyOEExQkQ2
QjY2RjAwQTcxNUU0IC8qIE5ldHdvcmtDYWNoZVN1YnJlc291cmNlc0VudHJ5LmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE5ldHdvcmtDYWNoZVN1YnJlc291cmNlc0Vu
dHJ5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODMxRUVCQkIxQkQ4NUM0MzAw
QkI2NEMzIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWQuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODMxRUVCQkMxQkQ4NUM0MzAwQkI2NEMzIC8qIE5ldHdvcmtD
YWNoZVNwZWN1bGF0aXZlTG9hZC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwotCQk4MzI0MzU1QjFGMTcxNDYxMDAzNUFBM0EgLyogUmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2Jq
Y3BwOyBwYXRoID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1t
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzJBRTI1MDFCRTJFOENEMDBGQUFFMTAg
LyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdlci5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBOZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzMkFFMjUxMUJFMkU4Q0QwMEZBQUUxMCAvKiBO
ZXR3b3JrQ2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzJFRDE4OTFFMkZFMTNCMDA2QkE2NEEg
LyogUGVyQWN0aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBQZXJBY3Rpdml0eVN0YXRlQ1BVVXNhZ2VTYW1wbGVyLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTM2MjgsOCArMzYzMCw2IEBACiAJCTgzNzJE
QjI2MUE2NzU2MjgwMEM2OTdDNSAvKiBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV2ViUGFnZURpYWdub3N0aWNM
b2dnaW5nQ2xpZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODM3MkRCMjcx
QTY3NTYyODAwQzY5N0M1IC8qIFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGll
bnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODM3MkRCMkUxQTY3N0Q0QTAwQzY5
N0M1IC8qIFdLRGlhZ25vc3RpY0xvZ2dpbmdSZXN1bHRUeXBlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFdLRGlhZ25vc3RpY0xvZ2dpbmdSZXN1bHRUeXBlLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTgzODUwQzBBMUYxNkJBNkMwMEMxNUU1MiAvKiBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJODM4NTBDMEIxRjE2QkE2QzAwQzE1
RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODM4OTFCNjIxQTY4QjM0
MjAwMzBGMzg2IC8qIEFQSURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IEFQSURpYWdub3N0aWNMb2dnaW5nQ2xpZW50Lmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzODkxQjY4MUE2OEJFQkMwMDMwRjM4NiAvKiBfV0tEaWFn
bm9zdGljTG9nZ2luZ0RlbGVnYXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IF9XS0RpYWdub3N0aWNMb2dnaW5nRGVsZWdhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJODM4OTFCNkExQTY4QzMwQjAwMzBGMzg2IC8qIERpYWdub3N0aWNMb2dnaW5nQ2xpZW50
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERpYWdub3N0aWNMb2dnaW5nQ2xp
ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC00Njc5LDcgKzQ2NzksNyBAQAog
CQkJbmFtZSA9IERlcHJlY2F0ZWQ7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9Owot
CQkxQTQ0Qjk1ODE2QjczRjhDMDBCN0JCRDggLyogU3RvcmFnZSAqLyA9IHsKKwkJMUE0NEI5NTgx
NkI3M0Y4QzAwQjdCQkQ4IC8qIFdlYlN0b3JhZ2UgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKAogCQkJCTUxMjBDODJEMUU1NEUyMDQwMDI1QjI1MCAvKiBpb3MgKi8s
CkBAIC00Njg3LDEzICs0Njg3LDExIEBACiAJCQkJMUExRDhCQTAxNzMxQTM2MzAwMTQxREE0IC8q
IExvY2FsU3RvcmFnZURhdGFiYXNlLmggKi8sCiAJCQkJMUE4QzcyOEExNzM4NDc3QzAwMEE2NTU0
IC8qIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAgKi8sCiAJCQkJMUE4QzcyOEIxNzM4
NDc3QzAwMEE2NTU0IC8qIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oICovLAotCQkJCTgz
ODUwQzBBMUYxNkJBNkMwMEMxNUU1MiAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2UuY3BwICovLAotCQkJCTgzODUwQzBCMUYxNkJBNkMwMEMxNUU1MiAvKiBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCAqLywKIAkJCQkxQTQ0Qjk1OTE2Qjcz
RjlGMDBCN0JCRDggLyogU3RvcmFnZU1hbmFnZXIuY3BwICovLAogCQkJCTFBNDRCOTVBMTZCNzNG
OUYwMEI3QkJEOCAvKiBTdG9yYWdlTWFuYWdlci5oICovLAogCQkJCTFBQjMxQTkzMTZCQzY1QUIw
MEY2REJDOSAvKiBTdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5pbiAqLywKIAkJCSk7Ci0JCQlwYXRo
ID0gU3RvcmFnZTsKKwkJCXBhdGggPSBXZWJTdG9yYWdlOwogCQkJc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsKIAkJfTsKIAkJMUE0ODMyQzAxQTk2NUEzMzAwOEI0REZFIC8qIENvY29hICovID0gewpA
QCAtNDg2MSw3ICs0ODU5LDcgQEAKIAkJCXBhdGggPSBjZzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7CiAJCX07Ci0JCTFBQUM0RERFMTZCMUNCRjYwMDk0MjVFMyAvKiBTdG9yYWdlICovID0g
eworCQkxQUFDNERERTE2QjFDQkY2MDA5NDI1RTMgLyogV2ViU3RvcmFnZSAqLyA9IHsKIAkJCWlz
YSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJMUFEMzMwNkMxNkIxRDk5MTAwNEY2
MEU3IC8qIFN0b3JhZ2VBcmVhSW1wbC5jcHAgKi8sCkBAIC00ODc0LDcgKzQ4NzIsNyBAQAogCQkJ
CTFBNTJDMEY1MUEzOENEQzcwMDE2MTYwQSAvKiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIu
Y3BwICovLAogCQkJCTFBNTJDMEY2MUEzOENEQzcwMDE2MTYwQSAvKiBXZWJTdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIuaCAqLywKIAkJCSk7Ci0JCQlwYXRoID0gU3RvcmFnZTsKKwkJCXBhdGggPSBX
ZWJTdG9yYWdlOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKIAkJMUFBRERGNEIx
MEQ4MkFGMDAwRDNENjNEIC8qIFNoYXJlZCAqLyA9IHsKQEAgLTU0MDIsNiArNTQwMCw3IEBACiAJ
CQkJODZGOTUzNjIxOEZGNTUwQjAwMURCMkVGIC8qIFByb2Nlc3NBc3NlcnRpb25JT1MubW0gKi8s
CiAJCQkJMEYwQzM2NTcxOEMwNTFCQTAwRjYwN0Q3IC8qIFJlbW90ZUxheWVyVHJlZUhvc3RJT1Mu
bW0gKi8sCiAJCQkJMEYwQzM2NUIxOEMwNUNBMTAwRjYwN0Q3IC8qIFJlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yUHJveHlJT1MubW0gKi8sCisJCQkJNTFFNkMxNUYxRjI5MzU1MTAwRkQzNDM3IC8q
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbSAqLywKIAkJCQky
REFGMDZENDE4QkQxQTQ3MDA4MUNFQjEgLyogU21hcnRNYWduaWZpY2F0aW9uQ29udHJvbGxlci5o
ICovLAogCQkJCTJEQUYwNkQ4MThCRDIzQkEwMDgxQ0VCMSAvKiBTbWFydE1hZ25pZmljYXRpb25D
b250cm9sbGVyLm1lc3NhZ2VzLmluICovLAogCQkJCTJEQUYwNkQ1MThCRDFBNDcwMDgxQ0VCMSAv
KiBTbWFydE1hZ25pZmljYXRpb25Db250cm9sbGVyLm1tICovLApAQCAtNjAwMCw3ICs1OTk5LDYg
QEAKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJNTEyMEM4MzAxRTU0
RTI2NTAwMjVCMjUwIC8qIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbSAqLywKLQkJ
CQk4MzI0MzU1QjFGMTcxNDYxMDAzNUFBM0EgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlSU9TLm1tICovLAogCQkJKTsKIAkJCXBhdGggPSBpb3M7CiAJCQlzb3VyY2VU
cmVlID0gIjxncm91cD4iOwpAQCAtNjUzOSwxMCArNjUzNywxMCBAQAogCQkJCTMxMDk5OTc0MTQ2
QzhBQTgwMDI5REVCOSAvKiBOb3RpZmljYXRpb25zIChVc2VyKSAqLywKIAkJCQkxQTZGQjdBQTEx
RTY0QjQ5MDBEQjEzNzEgLyogUGx1Z2lucyAqLywKIAkJCQkwRjU5NDc4QzE4N0IzQjJBMDA0Mzc4
NTcgLyogU2Nyb2xsaW5nICovLAotCQkJCTFBQUM0RERFMTZCMUNCRjYwMDk0MjVFMyAvKiBTdG9y
YWdlICovLAogCQkJCTFBQUYwOEFBMTkyNjkzMEIwMEI2MzkwQyAvKiBVc2VyQ29udGVudCAqLywK
IAkJCQlCQzAzMkQ1RDEwRjQzNzIyMDA1OEMxNUEgLyogV2ViQ29yZVN1cHBvcnQgKi8sCiAJCQkJ
QkMwMzJENUUxMEY0MzcyQjAwNThDMTVBIC8qIFdlYlBhZ2UgKi8sCisJCQkJMUFBQzREREUxNkIx
Q0JGNjAwOTQyNUUzIC8qIFdlYlN0b3JhZ2UgKi8sCiAJCQkJQkNFOUMwQ0YxNDg1OTY1RDAwRTMz
RDYxIC8qIFdlYkNvbm5lY3Rpb25Ub1VJUHJvY2Vzcy5jcHAgKi8sCiAJCQkJQkNFOUMwRDAxNDg1
OTY1RDAwRTMzRDYxIC8qIFdlYkNvbm5lY3Rpb25Ub1VJUHJvY2Vzcy5oICovLAogCQkJCUJDMTEx
QUUzMTEyRjVDMjYwMDMzN0JBQiAvKiBXZWJQcm9jZXNzLmNwcCAqLywKQEAgLTY2ODksOCArNjY4
Nyw4IEBACiAJCQkJMzFBMkVDNDAxNDg5OTczNzAwODEwRDcxIC8qIE5vdGlmaWNhdGlvbnMgKi8s
CiAJCQkJMUFFRkNDMDUxMUQwMUYzNDAwODIxOUQzIC8qIFBsdWdpbnMgKi8sCiAJCQkJMEY1OTQ3
OTMxODdCM0I0QzAwNDM3ODU3IC8qIFNjcm9sbGluZyAqLywKLQkJCQkxQTQ0Qjk1ODE2QjczRjhD
MDBCN0JCRDggLyogU3RvcmFnZSAqLywKIAkJCQkxQUFGMDg5RTE5MjY4MUFDMDBCNjM5MEMgLyog
VXNlckNvbnRlbnQgKi8sCisJCQkJMUE0NEI5NTgxNkI3M0Y4QzAwQjdCQkQ4IC8qIFdlYlN0b3Jh
Z2UgKi8sCiAJCQkJMUE1M0MyQTMxQTMyNTY5MTAwNEU4QzcwIC8qIFdlYnNpdGVEYXRhICovLAog
CQkJCTdDRDEwMkQ5MTg2Njc3MDYwMEVENDI5RCAvKiBBdXRvQ29ycmVjdGlvbkNhbGxiYWNrLmgg
Ki8sCiAJCQkJNDZBMkI2MDYxRTU2NzVBMjAwQzNERURBIC8qIEJhY2tncm91bmRQcm9jZXNzUmVz
cG9uc2l2ZW5lc3NUaW1lci5jcHAgKi8sCkBAIC02NzI0LDYgKzY3MjIsOCBAQAogCQkJCUE1NUJB
ODFCMUJBMjVCMUUwMDdDRDMzRCAvKiBSZW1vdGVXZWJJbnNwZWN0b3JQcm94eS5jcHAgKi8sCiAJ
CQkJQTU1QkE4MTkxQkEyNUIxRTAwN0NEMzNEIC8qIFJlbW90ZVdlYkluc3BlY3RvclByb3h5Lmgg
Ki8sCiAJCQkJQTU1QkE4MUExQkEyNUIxRTAwN0NEMzNEIC8qIFJlbW90ZVdlYkluc3BlY3RvclBy
b3h5Lm1lc3NhZ2VzLmluICovLAorCQkJCTUxRTZDMTYyMUYyOTM1Q0QwMEZEMzQzNyAvKiBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwICovLAorCQkJCTUxRTZDMTYx
MUYyOTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2UuaCAqLywKIAkJCQlCQzExMUIwODExMkY1RTNDMDAzMzdCQUIgLyogUmVzcG9uc2l2ZW5lc3NU
aW1lci5jcHAgKi8sCiAJCQkJMUEzMDA2NkMxMTEwRjRGNzAwMzE5MzdDIC8qIFJlc3BvbnNpdmVu
ZXNzVGltZXIuaCAqLywKIAkJCQk1MUE0RDVBODE2Q0FDNEZGMDAwRTYxNUUgLyogU3RhdGlzdGlj
c1JlcXVlc3QuY3BwICovLApAQCAtODUzMiw3ICs4NTMyLDYgQEAKIAkJCQlBNTVCQTgxNzFCQTIz
RTEyMDA3Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVjdG9yVUkuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTZCRTk2OUNEMUU1NEUwNTQwMDhCNzQ4MyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzQ2xhc3Np
Zmllci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNkJFOTY5Q0IxRTU0RDRDRjAwOEI3NDgzIC8qIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NDbGFzc2lmaWVyQ29jb2EuaCBpbiBIZWFkZXJzICovLAotCQkJ
CTgzODUwQzBEMUYxNkJBOTAwMEMxNUU1MiAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBMzAwNjZFMTExMEY0RjcwMDMxOTM3
QyAvKiBSZXNwb25zaXZlbmVzc1RpbWVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk0MTA0ODJDRTFE
REQzMjRGMDBGMDA2RDAgLyogUlRDTmV0d29yay5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMyRDAy
MTcxMkFDNDFDQjAwRTczMkEzIC8qIFNhbWVEb2N1bWVudE5hdmlnYXRpb25UeXBlLmggaW4gSGVh
ZGVycyAqLywKQEAgLTg5NTcsNiArODk1Niw3IEBACiAJCQkJMUFCQzNERkMxODk5RjUxQzAwNEYw
NjI2IC8qIFdLTmF2aWdhdGlvbkRlbGVnYXRlLmggaW4gSGVhZGVycyAqLywKIAkJCQkxQUEyMEQ1
MTE4QUQ1MEUwMDA1RDFFRDQgLyogV0tOYXZpZ2F0aW9uRGVsZWdhdGVQcml2YXRlLmggaW4gSGVh
ZGVycyAqLywKIAkJCQkxQUJDM0RGMTE4OTlDNkI2MDA0RjA2MjYgLyogV0tOYXZpZ2F0aW9uSW50
ZXJuYWwuaCBpbiBIZWFkZXJzICovLAorCQkJCTUxRTZDMTY0MUYyOTM1REQwMEZEMzQzNyAvKiBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCBpbiBIZWFkZXJzICovLAog
CQkJCTFBQ0M4N0JBMTk4MUMzNDEwMDNEMUFGNCAvKiBXS05hdmlnYXRpb25Qcml2YXRlLmggaW4g
SGVhZGVycyAqLywKIAkJCQkyRDNBNjVFMzFBN0MzQTkzMDBDQUM2MzcgLyogV0tOYXZpZ2F0aW9u
UmVmLmggaW4gSGVhZGVycyAqLywKIAkJCQkxQTFCMEVCNjE4QTQyNDk1MDAzODQ4MUEgLyogV0tO
YXZpZ2F0aW9uUmVzcG9uc2UuaCBpbiBIZWFkZXJzICovLApAQCAtMTAxMDIsOCArMTAxMDIsNiBA
QAogCQkJCTFCQkJFNEEwMTlCNjZDNTMwMDZCN0Q4MSAvKiBSZW1vdGVXZWJJbnNwZWN0b3JVSU1l
c3NhZ2VSZWNlaXZlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk2QkU5NjlDNzFFNTRENEI2MDA4
Qjc0ODMgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc0NsYXNzaWZpZXIuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJNkJFOTY5Q0ExRTU0RDRDRjAwOEI3NDgzIC8qIFJlc291cmNlTG9hZFN0YXRpc3Rp
Y3NDbGFzc2lmaWVyQ29jb2EuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJODM4NTBDMEMxRjE2QkE5
MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAg
aW4gU291cmNlcyAqLywKLQkJCQk4MzI0MzU1QzFGMTcxNDY3MDAzNUFBM0EgLyogUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJ
QkMxMTFCMDkxMTJGNUUzQzAwMzM3QkFCIC8qIFJlc3BvbnNpdmVuZXNzVGltZXIuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJNDEwNDgyQ0QxREREMzI0QzAwRjAwNkQwIC8qIFJUQ05ldHdvcmsuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJMUFBQjRBQUExMjk2RjE1NDAwMjM5NTJGIC8qIFNhbmRib3hF
eHRlbnNpb25NYWMubW0gaW4gU291cmNlcyAqLywKQEAgLTEwMzE1LDYgKzEwMzEzLDcgQEAKIAkJ
CQlCQzk2M0Q2RTExM0REMUE1MDA1NzRCRTIgLyogV2ViUGFnZU1hYy5tbSBpbiBTb3VyY2VzICov
LAogCQkJCUMwQ0U3MkEwMTI0N0U3MUQwMEJDMEVDNCAvKiBXZWJQYWdlTWVzc2FnZVJlY2VpdmVy
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTJENUM5RDA1MTlDODFEOEYwMEIzQzVDMSAvKiBXZWJQ
YWdlT3ZlcmxheS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk1MUU2QzE2MDFGMjkzNTYwMDBGRDM0
MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkJQkMxMTFCMEYxMTJGNUU0RjAwMzM3QkFCIC8qIFdlYlBhZ2VQcm94eS5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkxQUMwMjczRjE5NjYyMkQ2MDBDMTJCNzUgLyogV2ViUGFn
ZVByb3h5Q29jb2EubW0gaW4gU291cmNlcyAqLywKIAkJCQkyREE5NDRBRjE4ODRFOUJBMDBFRDg2
REIgLyogV2ViUGFnZVByb3h5SU9TLm1tIGluIFNvdXJjZXMgKi8sCkBAIC0xMDUyNyw2ICsxMDUy
Niw3IEBACiAJCQkJMkQzQTY1RTIxQTdDM0E5MzAwQ0FDNjM3IC8qIFdLTmF2aWdhdGlvblJlZi5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkxQTFCMEVCNTE4QTQyNDk1MDAzODQ4MUEgLyogV0tOYXZp
Z2F0aW9uUmVzcG9uc2UubW0gaW4gU291cmNlcyAqLywKIAkJCQkyRDNBNjVERTFBN0MzQTdEMDBD
QUM2MzcgLyogV0tOYXZpZ2F0aW9uUmVzcG9uc2VSZWYuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
NTFFNkMxNjMxRjI5MzVEODAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzMThCRTE3NzE0NzQzRTYwMDBBOEZC
QjIgLyogV0tOb3RpZmljYXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMzE4QkUxNzUxNDc0
M0RENzAwQThGQkIyIC8qIFdLTm90aWZpY2F0aW9uTWFuYWdlci5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkzMUEyRUM3NzE0OEQ2NjJFMDA4MTBENzEgLyogV0tOb3RpZmljYXRpb25QZXJtaXNzaW9u
UmVxdWVzdC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCBiZTg1MDdhMzEzMjY0MmRiZGMwZjE4YTY5OWQxZTdjZjNiYTQ4NjFkLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwx
MzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJT
dG9yYWdlQXJlYUltcGwuaCIKLQotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCi0jaW5jbHVk
ZSA8V2ViQ29yZS9Eb2N1bWVudC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUuaD4KLSNpbmNs
dWRlIDxXZWJDb3JlL1BhZ2UuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NjaGVtZVJlZ2lzdHJ5Lmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL1NldHRpbmdzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotc3RhdGljIHVpbnQ2NF90IGdlbmVyYXRlU3RvcmFnZUFyZWFJRCgpCi17Ci0g
ICAgc3RhdGljIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQ7Ci0gICAgcmV0dXJuICsrc3RvcmFnZUFy
ZWFJRDsKLX0KLQotUmVmPFN0b3JhZ2VBcmVhSW1wbD4gU3RvcmFnZUFyZWFJbXBsOjpjcmVhdGUo
UmVmPFN0b3JhZ2VBcmVhTWFwPiYmIHN0b3JhZ2VBcmVhTWFwKQotewotICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IFN0b3JhZ2VBcmVhSW1wbChXVEZNb3ZlKHN0b3JhZ2VBcmVhTWFwKSkpOwotfQot
Ci1TdG9yYWdlQXJlYUltcGw6OlN0b3JhZ2VBcmVhSW1wbChSZWY8U3RvcmFnZUFyZWFNYXA+JiYg
c3RvcmFnZUFyZWFNYXApCi0gICAgOiBtX3N0b3JhZ2VBcmVhSUQoZ2VuZXJhdGVTdG9yYWdlQXJl
YUlEKCkpCi0gICAgLCBtX3N0b3JhZ2VBcmVhTWFwKFdURk1vdmUoc3RvcmFnZUFyZWFNYXApKQot
ewotfQotCi1TdG9yYWdlQXJlYUltcGw6On5TdG9yYWdlQXJlYUltcGwoKQotewotfQotCi11bnNp
Z25lZCBTdG9yYWdlQXJlYUltcGw6Omxlbmd0aCgpCi17Ci0gICAgcmV0dXJuIG1fc3RvcmFnZUFy
ZWFNYXAtPmxlbmd0aCgpOwotfQotCi1TdHJpbmcgU3RvcmFnZUFyZWFJbXBsOjprZXkodW5zaWdu
ZWQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAtPmtleShpbmRleCk7Ci19
Ci0KLVN0cmluZyBTdG9yYWdlQXJlYUltcGw6Oml0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCi17Ci0g
ICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAtPml0ZW0oa2V5KTsKLX0KLQotdm9pZCBTdG9yYWdl
QXJlYUltcGw6OnNldEl0ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRpb24pCi17Ci0gICAgQVNTRVJU
KCF2YWx1ZS5pc051bGwoKSk7Ci0KLSAgICBtX3N0b3JhZ2VBcmVhTWFwLT5zZXRJdGVtKHNvdXJj
ZUZyYW1lLCB0aGlzLCBrZXksIHZhbHVlLCBxdW90YUV4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgU3Rv
cmFnZUFyZWFJbXBsOjpyZW1vdmVJdGVtKEZyYW1lKiBzb3VyY2VGcmFtZSwgY29uc3QgU3RyaW5n
JiBrZXkpCi17Ci0gICAgbV9zdG9yYWdlQXJlYU1hcC0+cmVtb3ZlSXRlbShzb3VyY2VGcmFtZSwg
dGhpcywga2V5KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmNsZWFyKEZyYW1lKiBzb3Vy
Y2VGcmFtZSkKLXsKLSAgICBtX3N0b3JhZ2VBcmVhTWFwLT5jbGVhcihzb3VyY2VGcmFtZSwgdGhp
cyk7Ci19Ci0KLWJvb2wgU3RvcmFnZUFyZWFJbXBsOjpjb250YWlucyhjb25zdCBTdHJpbmcmIGtl
eSkKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+Y29udGFpbnMoa2V5KTsKLX0KLQot
Ym9vbCBTdG9yYWdlQXJlYUltcGw6OmNhbkFjY2Vzc1N0b3JhZ2UoRnJhbWUqIGZyYW1lKQotewot
ICAgIHJldHVybiBmcmFtZSAmJiBmcmFtZS0+cGFnZSgpOwotfQotCi1TdG9yYWdlVHlwZSBTdG9y
YWdlQXJlYUltcGw6OnN0b3JhZ2VUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdl
QXJlYU1hcC0+c3RvcmFnZVR5cGUoKTsKLX0KLQotc2l6ZV90IFN0b3JhZ2VBcmVhSW1wbDo6bWVt
b3J5Qnl0ZXNVc2VkQnlDYWNoZSgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3RvcmFn
ZUFyZWFJbXBsOjppbmNyZW1lbnRBY2Nlc3NDb3VudCgpCi17Ci0gICAgLy8gU3RvcmFnZSBhY2Nl
c3MgaXMgaGFuZGxlZCBpbiB0aGUgVUkgcHJvY2Vzcywgc28gdGhlcmUncyBub3RoaW5nIHRvIGRv
IGhlcmUuCi19Ci0KLXZvaWQgU3RvcmFnZUFyZWFJbXBsOjpkZWNyZW1lbnRBY2Nlc3NDb3VudCgp
Ci17Ci0gICAgLy8gU3RvcmFnZSBhY2Nlc3MgaXMgaGFuZGxlZCBpbiB0aGUgVUkgcHJvY2Vzcywg
c28gdGhlcmUncyBub3RoaW5nIHRvIGRvIGhlcmUuCi19Ci0KLXZvaWQgU3RvcmFnZUFyZWFJbXBs
OjpjbG9zZURhdGFiYXNlSWZJZGxlKCkKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHRoaXMu
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLVdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
RGF0YSBTdG9yYWdlQXJlYUltcGw6OnNlY3VyaXR5T3JpZ2luKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zdG9y
YWdlQXJlYU1hcC0+c2VjdXJpdHlPcmlnaW4oKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktp
dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFy
ZWFJbXBsLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUlt
cGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhNDdjOGQ4MzhlOGZiZGM1ZDQ3
YmY3OGNmNzZlMTlhMDE5OGIzMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUlt
cGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVm
IFN0b3JhZ2VBcmVhSW1wbF9oCi0jZGVmaW5lIFN0b3JhZ2VBcmVhSW1wbF9oCi0KLSNpbmNsdWRl
ICJNZXNzYWdlUmVjZWl2ZXIuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+Ci0j
aW5jbHVkZSA8d3RmL0hhc2hDb3VudGVkU2V0Lmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgU2VjdXJpdHlPcmlnaW47Ci19Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1jbGFzcyBTdG9yYWdlQXJlYU1hcDsKLQotY2xhc3MgU3RvcmFnZUFy
ZWFJbXBsIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VBcmVhIHsKLXB1YmxpYzoKLSAg
ICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhSW1wbD4gY3JlYXRlKFJlZjxTdG9yYWdlQXJlYU1hcD4m
Jik7Ci0gICAgdmlydHVhbCB+U3RvcmFnZUFyZWFJbXBsKCk7Ci0KLSAgICB1aW50NjRfdCBzdG9y
YWdlQXJlYUlEKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlQXJlYUlEOyB9Ci0KLXByaXZhdGU6
Ci0gICAgU3RvcmFnZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJik7Ci0KLSAgICAvLyBX
ZWJDb3JlOjpTdG9yYWdlQXJlYS4KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBvdmVycmlkZTsKLSAg
ICBTdHJpbmcga2V5KHVuc2lnbmVkIGluZGV4KSBvdmVycmlkZTsKLSAgICBTdHJpbmcgaXRlbShj
b25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRJdGVtKFdlYkNvcmU6OkZy
YW1lKiBzb3VyY2VGcmFtZSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUs
IGJvb2wmIHF1b3RhRXhjZXB0aW9uKSBvdmVycmlkZTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0oV2Vi
Q29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBjbGVhcihXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUpIG92ZXJyaWRlOwotICAg
IGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOwotICAgIGJvb2wgY2Fu
QWNjZXNzU3RvcmFnZShXZWJDb3JlOjpGcmFtZSopIG92ZXJyaWRlOwotICAgIFdlYkNvcmU6OlN0
b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc2l6ZV90IG1lbW9y
eUJ5dGVzVXNlZEJ5Q2FjaGUoKSBvdmVycmlkZTsKLSAgICB2b2lkIGluY3JlbWVudEFjY2Vzc0Nv
dW50KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBkZWNyZW1lbnRBY2Nlc3NDb3VudCgpIG92ZXJyaWRl
OwotICAgIHZvaWQgY2xvc2VEYXRhYmFzZUlmSWRsZSgpIG92ZXJyaWRlOwotICAgIFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSBzZWN1cml0eU9yaWdpbigpIGNvbnN0IG92ZXJyaWRlOwotCi0g
ICAgdWludDY0X3QgbV9zdG9yYWdlQXJlYUlEOwotICAgIFJlZjxTdG9yYWdlQXJlYU1hcD4gbV9z
dG9yYWdlQXJlYU1hcDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8g
U3RvcmFnZUFyZWFJbXBsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9T
dG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2
NTBkMWIzZWJmYzcyOGMyNzVlZTAxMGJmZWEzYTI2OGIwYjg4Ni4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3Rv
cmFnZS9TdG9yYWdlQXJlYU1hcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJTdG9yYWdlQXJlYU1h
cC5oIgotCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgiCi0jaW5jbHVkZSAiU3RvcmFnZUFy
ZWFNYXBNZXNzYWdlcy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyTWVzc2FnZXMuaCIKLSNp
bmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIgotI2luY2x1ZGUgIldlYlBhZ2UuaCIKLSNp
bmNsdWRlICJXZWJQYWdlR3JvdXBQcm94eS5oIgotI2luY2x1ZGUgIldlYlByb2Nlc3MuaCIKLSNp
bmNsdWRlIDxXZWJDb3JlL0RPTVdpbmRvdy5oPgotI2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1lbnQu
aD4KLSNpbmNsdWRlIDxXZWJDb3JlL01haW5GcmFtZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvUGFn
ZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvUGFnZUdyb3VwLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9T
ZWN1cml0eU9yaWdpbkRhdGEuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2UuaD4KLSNpbmNs
dWRlIDxXZWJDb3JlL1N0b3JhZ2VFdmVudERpc3BhdGNoZXIuaD4KLSNpbmNsdWRlIDxXZWJDb3Jl
L1N0b3JhZ2VNYXAuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VUeXBlLmg+Ci0KLXVzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotc3RhdGljIHVpbnQ2
NF90IGdlbmVyYXRlU3RvcmFnZU1hcElEKCkKLXsKLSAgICBzdGF0aWMgdWludDY0X3Qgc3RvcmFn
ZU1hcElEOwotICAgIHJldHVybiArK3N0b3JhZ2VNYXBJRDsKLX0KLQotUmVmPFN0b3JhZ2VBcmVh
TWFwPiBTdG9yYWdlQXJlYU1hcDo6Y3JlYXRlKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiBzdG9yYWdl
TmFtZXNwYWNlLCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYgc2VjdXJpdHlPcmlnaW4p
Ci17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWFNYXAoc3RvcmFnZU5hbWVz
cGFjZSwgV1RGTW92ZShzZWN1cml0eU9yaWdpbikpKTsKLX0KLQotU3RvcmFnZUFyZWFNYXA6OlN0
b3JhZ2VBcmVhTWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiBzdG9yYWdlTmFtZXNwYWNlLCBSZWY8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYgc2VjdXJpdHlPcmlnaW4pCi0gICAgOiBtX3N0b3Jh
Z2VOYW1lc3BhY2UoKnN0b3JhZ2VOYW1lc3BhY2UpCi0gICAgLCBtX3N0b3JhZ2VNYXBJRChnZW5l
cmF0ZVN0b3JhZ2VNYXBJRCgpKQotICAgICwgbV9zdG9yYWdlVHlwZShzdG9yYWdlTmFtZXNwYWNl
LT5zdG9yYWdlVHlwZSgpKQotICAgICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVz
cGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCkpCi0gICAgLCBtX3F1b3RhSW5CeXRlcyhzdG9yYWdl
TmFtZXNwYWNlLT5xdW90YUluQnl0ZXMoKSkKLSAgICAsIG1fc2VjdXJpdHlPcmlnaW4oV1RGTW92
ZShzZWN1cml0eU9yaWdpbikpCi0gICAgLCBtX2N1cnJlbnRTZWVkKDApCi0gICAgLCBtX2hhc1Bl
bmRpbmdDbGVhcihmYWxzZSkKLSAgICAsIG1faGFzUGVuZGluZ0dldFZhbHVlcyhmYWxzZSkKLXsK
LSAgICBzd2l0Y2ggKG1fc3RvcmFnZVR5cGUpIHsKLSAgICBjYXNlIFN0b3JhZ2VUeXBlOjpMb2Nh
bDoKLSAgICBjYXNlIFN0b3JhZ2VUeXBlOjpUcmFuc2llbnRMb2NhbDoKLSAgICAgICAgaWYgKFNl
Y3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbiA9IHN0b3JhZ2VOYW1lc3BhY2UtPnRvcExldmVs
T3JpZ2luKCkpCi0gICAgICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9j
ZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlVHJh
bnNpZW50TG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElELCBzdG9yYWdlTmFtZXNwYWNlLT5z
dG9yYWdlTmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmln
aW4oKnRvcExldmVsT3JpZ2luKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmln
aW4obV9zZWN1cml0eU9yaWdpbikpLCAwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgV2Vi
UHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNz
YWdlczo6U3RvcmFnZU1hbmFnZXI6OkNyZWF0ZUxvY2FsU3RvcmFnZU1hcChtX3N0b3JhZ2VNYXBJ
RCwgc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5T3JpZ2lu
RGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKSwgMCk7Ci0KLSAgICAg
ICAgYnJlYWs7Ci0KLSAgICBjYXNlIFN0b3JhZ2VUeXBlOjpTZXNzaW9uOgotICAgICAgICBXZWJQ
cm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3Nh
Z2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAobV9zdG9yYWdlTWFw
SUQsIHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VOYW1lc3BhY2VJRCgpLCBTZWN1cml0eU9yaWdp
bkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSksIDApOwotICAgICAg
ICBicmVhazsKLQotICAgIGNhc2UgU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsOgotICAgICAg
ICAvLyBUaGUgVUkgcHJvY2VzcyBpcyBub3QgaW52b2x2ZWQgZm9yIEVwaGVtZXJhbExvY2FsIHN0
b3JhZ2VzLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgV2ViUHJvY2Vzczo6c2luZ2xl
dG9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6bWVzc2Fn
ZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3JhZ2VNYXBJRCwgKnRoaXMpOwotfQotCi1TdG9yYWdlQXJl
YU1hcDo6flN0b3JhZ2VBcmVhTWFwKCkKLXsKLSAgICBpZiAobV9zdG9yYWdlVHlwZSAhPSBTdG9y
YWdlVHlwZTo6RXBoZW1lcmFsTG9jYWwpIHsKLSAgICAgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9u
KCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFn
ZXI6OkRlc3Ryb3lTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElEKSwgMCk7Ci0gICAgICAgIFdlYlBy
b2Nlc3M6OnNpbmdsZXRvbigpLnJlbW92ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFn
ZUFyZWFNYXA6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9zdG9yYWdlTWFwSUQpOwotICAgIH0K
LQotICAgIG1fc3RvcmFnZU5hbWVzcGFjZS0+ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKCp0aGlz
KTsKLX0KLQotdW5zaWduZWQgU3RvcmFnZUFyZWFNYXA6Omxlbmd0aCgpCi17Ci0gICAgbG9hZFZh
bHVlc0lmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5sZW5ndGgoKTsKLX0K
LQotU3RyaW5nIFN0b3JhZ2VBcmVhTWFwOjprZXkodW5zaWduZWQgaW5kZXgpCi17Ci0gICAgbG9h
ZFZhbHVlc0lmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5rZXkoaW5kZXgp
OwotfQotCi1TdHJpbmcgU3RvcmFnZUFyZWFNYXA6Oml0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCi17
Ci0gICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5n
ZXRJdGVtKGtleSk7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OnNldEl0ZW0oRnJhbWUqIHNv
dXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNvbnN0IFN0cmluZyYga2V5
LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKLXsKLSAgICBsb2Fk
VmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIEFTU0VSVChtX3N0b3JhZ2VNYXAtPmhhc09uZVJlZigp
KTsKLQotICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICBxdW90YUV4Y2VwdGlvbiA9IGZhbHNlOwot
ICAgIG1fc3RvcmFnZU1hcC0+c2V0SXRlbShrZXksIHZhbHVlLCBvbGRWYWx1ZSwgcXVvdGFFeGNl
cHRpb24pOwotICAgIGlmIChxdW90YUV4Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
aWYgKG9sZFZhbHVlID09IHZhbHVlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3BlbmRpbmdW
YWx1ZUNoYW5nZXMuYWRkKGtleSk7Ci0KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJl
bnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6U2V0
SXRlbShtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJl
bnRTZWVkLCBrZXksIHZhbHVlLCBzb3VyY2VGcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsK
LX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6cmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFtZSogc291
cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXkp
Ci17Ci0gICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0gICAgQVNTRVJUKG1fc3RvcmFnZU1hcC0+
aGFzT25lUmVmKCkpOwotCi0gICAgU3RyaW5nIG9sZFZhbHVlOwotICAgIG1fc3RvcmFnZU1hcC0+
cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKLQotICAgIGlmIChvbGRWYWx1ZS5pc051bGwoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmFkZChrZXkpOwot
Ci0gICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+
c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OlJlbW92ZUl0ZW0obV9zdG9yYWdlTWFwSUQs
IHNvdXJjZUFyZWEtPnN0b3JhZ2VBcmVhSUQoKSwgbV9jdXJyZW50U2VlZCwga2V5LCBzb3VyY2VG
cmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6
Y2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJj
ZUFyZWEpCi17Ci0gICAgcmVzZXRWYWx1ZXMoKTsKLQotICAgIG1faGFzUGVuZGluZ0NsZWFyID0g
dHJ1ZTsKLSAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0
ZXMpOwotICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9u
KCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDbGVhcihtX3N0b3JhZ2VNYXBJRCwg
c291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBzb3VyY2VGcmFtZS0+
ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsKLX0KLQotYm9vbCBTdG9yYWdlQXJlYU1hcDo6Y29udGFp
bnMoY29uc3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0KLSAg
ICByZXR1cm4gbV9zdG9yYWdlTWFwLT5jb250YWlucyhrZXkpOwotfQotCi12b2lkIFN0b3JhZ2VB
cmVhTWFwOjpyZXNldFZhbHVlcygpCi17Ci0gICAgbV9zdG9yYWdlTWFwID0gbnVsbHB0cjsKLQot
ICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5jbGVhcigpOwotICAgIG1faGFzUGVuZGluZ0NsZWFy
ID0gZmFsc2U7Ci0gICAgbV9oYXNQZW5kaW5nR2V0VmFsdWVzID0gZmFsc2U7Ci0gICAgbV9jdXJy
ZW50U2VlZCsrOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpsb2FkVmFsdWVzSWZOZWVkZWQo
KQotewotICAgIGlmIChtX3N0b3JhZ2VNYXApCi0gICAgICAgIHJldHVybjsKLQotICAgIEhhc2hN
YXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlczsKLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXNl
IGEgc3BlY2lhbCBzZW5kU3luYyBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qgd2FudCB0
byBwcm9jZXNzIGluY29taW5nIG1lc3NhZ2VzIHdoaWxlIHdhaXRpbmcgZm9yIGEgcmVwbHkuCi0g
ICAgLy8gKFRoaXMgZmxhZyBkb2VzIG5vdCB5ZXQgZXhpc3QpLiBTaW5jZSBsb2FkVmFsdWVzSWZO
ZWVkZWQoKSBlbmRzIHVwIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBKYXZhU2NyaXB0IGNvZGUs
IHByb2Nlc3NpbmcgaW5jb21pbmcgc3luY2hyb25vdXMgbWVzc2FnZXMKLSAgICAvLyBjb3VsZCBs
ZWFkIHRvIHdlaXJkIHJlZW50cmVuY3kgYnVncyBvdGhlcndpc2UuCi0gICAgV2ViUHJvY2Vzczo6
c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZFN5bmMoTWVzc2FnZXM6
OlN0b3JhZ2VNYW5hZ2VyOjpHZXRWYWx1ZXMobV9zdG9yYWdlTWFwSUQsIG1fY3VycmVudFNlZWQp
LCBNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVlczo6UmVwbHkodmFsdWVzKSwgMCk7
Ci0KLSAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMp
OwotICAgIG1fc3RvcmFnZU1hcC0+aW1wb3J0SXRlbXModmFsdWVzKTsKLQotICAgIC8vIFdlIHdh
bnQgdG8gaWdub3JlIGFsbCBjaGFuZ2VzIHVudGlsIHdlIGdldCB0aGUgRGlkR2V0VmFsdWVzIG1l
c3NhZ2UuCi0gICAgbV9oYXNQZW5kaW5nR2V0VmFsdWVzID0gdHJ1ZTsKLX0KLQotdm9pZCBTdG9y
YWdlQXJlYU1hcDo6ZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQotewotICAg
IGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBBU1NFUlQobV9oYXNQZW5kaW5nR2V0VmFsdWVzKTsKLSAgICBtX2hhc1BlbmRpbmdHZXRW
YWx1ZXMgPSBmYWxzZTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkU2V0SXRlbSh1aW50
NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGJvb2wgcXVvdGFFcnJvcikK
LXsKLSAgICBpZiAobV9jdXJyZW50U2VlZCAhPSBzdG9yYWdlTWFwU2VlZCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgQVNTRVJUKG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5jb250YWlucyhrZXkpKTsK
LQotICAgIGlmIChxdW90YUVycm9yKSB7Ci0gICAgICAgIHJlc2V0VmFsdWVzKCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMucmVtb3ZlKGtleSk7
Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpZFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5KQotewotICAgIGlmIChtX2N1cnJlbnRTZWVkICE9
IHN0b3JhZ2VNYXBTZWVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQobV9wZW5kaW5n
VmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpOwotICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5y
ZW1vdmUoa2V5KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkQ2xlYXIodWludDY0X3Qg
c3RvcmFnZU1hcFNlZWQpCi17Ci0gICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNl
ZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX2hhc1BlbmRpbmdDbGVhcik7Ci0g
ICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxzZTsKLX0KLQotYm9vbCBTdG9yYWdlQXJlYU1hcDo6
c2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIGNvbnN0Ci17Ci0gICAg
Ly8gV2UgaGF2ZSBub3QgeWV0IGxvYWRlZCBhbnl0aGluZyBmcm9tIHRoaXMgc3RvcmFnZSBtYXAu
Ci0gICAgaWYgKCFtX3N0b3JhZ2VNYXApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8v
IENoZWNrIGlmIHRoaXMgc3RvcmFnZSBhcmVhIGlzIGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUg
c3RvcmFnZSBtYW5hZ2VyIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4ga2V5LgotICAgIC8vIElmIHRoYXQg
aXMgdGhlIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkgYW55IGNoYW5nZXMgbWFkZSBieSBv
dGhlciBzdG9yYWdlIGFyZWFzLCBzaW5jZQotICAgIC8vIG91ciBjaGFuZ2Ugd2FzIG1hZGUgbGFz
dC4KLSAgICBpZiAobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0b3JhZ2VBcmVh
TWFwOjphcHBseUNoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1
ZSkKLXsKLSAgICBBU1NFUlQoIW1fc3RvcmFnZU1hcCB8fCBtX3N0b3JhZ2VNYXAtPmhhc09uZVJl
ZigpKTsKLQotICAgIC8vIFRoZXJlJ3MgYSBjbGVhciBwZW5kaW5nIG9yIGdldFZhbHVlcyBwZW5k
aW5nIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkgYW55IGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRoZSBj
b3JyZXNwb25kaW5nIERpZENsZWFyL0RpZEdldFZhbHVlcyBtZXNzYWdlcy4KLSAgICBpZiAobV9o
YXNQZW5kaW5nQ2xlYXIgfHwgbV9oYXNQZW5kaW5nR2V0VmFsdWVzKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAoIWtleSkgewotICAgICAgICAvLyBBIG51bGwga2V5IG1lYW5zIGNsZWFyLgot
ICAgICAgICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUlu
Qnl0ZXMpOwotCi0gICAgICAgIC8vIEFueSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIGxvY2FsbHkg
YWZ0ZXIgdGhlIGNsZWFyIG11c3Qgc3RpbGwgYmUga2VwdCBhcm91bmQgaW4gdGhlIG5ldyBtYXAu
Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5iZWdpbigpLmtl
eXMoKSwgZW5kID0gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmVuZCgpLmtleXMoKTsgaXQgIT0gZW5k
OyArK2l0KSB7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmcmIGtleSA9ICppdDsKLQotICAgICAg
ICAgICAgU3RyaW5nIHZhbHVlID0gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7Ci0gICAgICAg
ICAgICBpZiAoIXZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBjaGFuZ2UgbXVzdCBo
YXZlIGJlZW4gYSBwZW5kaW5nIHJlbW92ZSwgaWdub3JlIGl0LgotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWU7Ci0g
ICAgICAgICAgICBuZXdTdG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90YShrZXksIG9sZFZh
bHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3U3Rv
cmFnZU1hcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXNob3VsZEFwcGx5
Q2hhbmdlRm9yS2V5KGtleSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghbmV3VmFsdWUp
IHsKLSAgICAgICAgLy8gQSBudWxsIG5ldyB2YWx1ZSBtZWFucyB0aGF0IHRoZSBpdGVtIHNob3Vs
ZCBiZSByZW1vdmVkLgotICAgICAgICBTdHJpbmcgb2xkVmFsdWU7Ci0gICAgICAgIG1fc3RvcmFn
ZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIG1fc3RvcmFnZU1hcC0+c2V0SXRlbUlnbm9yaW5nUXVvdGEoa2V5LCBuZXdWYWx1ZSk7
Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9s
ZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykK
LXsKLSAgICBpZiAoIXNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKLSAgICAgICAgLy8gVGhpcyBzdG9y
YWdlIGV2ZW50IG9yaWdpbmF0ZXMgZnJvbSBhbm90aGVyIHByb2Nlc3Mgc28gd2UgbmVlZCB0byBh
cHBseSB0aGUgY2hhbmdlIHRvIG91ciBzdG9yYWdlIGFyZWEgbWFwLgotICAgICAgICBhcHBseUNo
YW5nZShrZXksIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RvcmFnZVR5cGUoKSA9PSBT
dG9yYWdlVHlwZTo6U2Vzc2lvbikKLSAgICAgICAgZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50
KHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcp
OwotICAgIGVsc2UKLSAgICAgICAgZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudChzb3VyY2VTdG9y
YWdlQXJlYUlELCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nKTsKLX0KLQotdm9p
ZCBTdG9yYWdlQXJlYU1hcDo6Y2xlYXJDYWNoZSgpCi17Ci0gICAgcmVzZXRWYWx1ZXMoKTsKLX0K
LQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2
NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcm
IG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmlu
ZykKLXsKLSAgICBBU1NFUlQoc3RvcmFnZVR5cGUoKSA9PSBTdG9yYWdlVHlwZTo6U2Vzc2lvbik7
Ci0KLSAgICAvLyBOYW1lc3BhY2UgSURzIGZvciBzZXNzaW9uIHN0b3JhZ2UgbmFtZXNwYWNlcyBh
cmUgZXF1aXZhbGVudCB0byB3ZWIgcGFnZSBJRHMKLSAgICAvLyBzbyB3ZSBjYW4gZ2V0IHRoZSBy
aWdodCBwYWdlIGhlcmUuCi0gICAgV2ViUGFnZSogd2ViUGFnZSA9IFdlYlByb2Nlc3M6OnNpbmds
ZXRvbigpLndlYlBhZ2UobV9zdG9yYWdlTmFtZXNwYWNlSUQpOwotICAgIGlmICghd2ViUGFnZSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPFJlZlB0cjxGcmFtZT4+IGZyYW1lczsKLQot
ICAgIFBhZ2UqIHBhZ2UgPSB3ZWJQYWdlLT5jb3JlUGFnZSgpOwotICAgIGZvciAoRnJhbWUqIGZy
YW1lID0gJnBhZ2UtPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLnRy
YXZlcnNlTmV4dCgpKSB7Ci0gICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1
bWVudCgpOwotICAgICAgICBpZiAoIWRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpLmVxdWFsKG1f
c2VjdXJpdHlPcmlnaW4ucHRyKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
U3RvcmFnZSogc3RvcmFnZSA9IGRvY3VtZW50LT5kb21XaW5kb3coKS0+b3B0aW9uYWxTZXNzaW9u
U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXN0b3JhZ2UpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICBTdG9yYWdlQXJlYUltcGwmIHN0b3JhZ2VBcmVhID0gc3RhdGljX2Nhc3Q8U3Rv
cmFnZUFyZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgpKTsKLSAgICAgICAgaWYgKHN0b3JhZ2VBcmVh
LnN0b3JhZ2VBcmVhSUQoKSA9PSBzb3VyY2VTdG9yYWdlQXJlYUlEKSB7Ci0gICAgICAgICAgICAv
LyBUaGlzIGlzIHRoZSBzdG9yYWdlIGFyZWEgdGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRvIGJlIGRp
c3BhdGNoZWQuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZy
YW1lcy5hcHBlbmQoZnJhbWUpOwotICAgIH0KLQotICAgIFN0b3JhZ2VFdmVudERpc3BhdGNoZXI6
OmRpc3BhdGNoU2Vzc2lvblN0b3JhZ2VFdmVudHNUb0ZyYW1lcygqcGFnZSwgZnJhbWVzLCBrZXks
IG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21T
ZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSk7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFN
YXA6OmRpc3BhdGNoTG9jYWxTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJ
RCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmlu
ZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIEFTU0VSVChpc0xv
Y2FsU3RvcmFnZShzdG9yYWdlVHlwZSgpKSk7Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPj4g
ZnJhbWVzOwotCi0gICAgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSAqV2ViUHJvY2Vzczo6c2luZ2xl
dG9uKCkud2ViUGFnZUdyb3VwKG1fc3RvcmFnZU5hbWVzcGFjZUlEKS0+Y29yZVBhZ2VHcm91cCgp
OwotICAgIGNvbnN0IEhhc2hTZXQ8UGFnZSo+JiBwYWdlcyA9IHBhZ2VHcm91cC5wYWdlcygpOwot
ICAgIGZvciAoSGFzaFNldDxQYWdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcGFnZXMuYmVnaW4o
KSwgZW5kID0gcGFnZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBmb3IgKEZy
YW1lKiBmcmFtZSA9ICYoKml0KS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50
cmVlKCkudHJhdmVyc2VOZXh0KCkpIHsKLSAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9
IGZyYW1lLT5kb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKCFkb2N1bWVudC0+c2VjdXJpdHlP
cmlnaW4oKS5lcXVhbChtX3NlY3VyaXR5T3JpZ2luLnB0cigpKSkKLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLQotICAgICAgICAgICAgU3RvcmFnZSogc3RvcmFnZSA9IGRvY3VtZW50LT5kb21X
aW5kb3coKS0+b3B0aW9uYWxMb2NhbFN0b3JhZ2UoKTsKLSAgICAgICAgICAgIGlmICghc3RvcmFn
ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgU3RvcmFnZUFyZWFJ
bXBsJiBzdG9yYWdlQXJlYSA9IHN0YXRpY19jYXN0PFN0b3JhZ2VBcmVhSW1wbCY+KHN0b3JhZ2Ut
PmFyZWEoKSk7Ci0gICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFnZUFyZWFJRCgpID09
IHNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBz
dG9yYWdlIGFyZWEgdGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyYW1l
cy5hcHBlbmQoZnJhbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RvcmFnZUV2ZW50RGlz
cGF0Y2hlcjo6ZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudHNUb0ZyYW1lcyhwYWdlR3JvdXAsIGZy
YW1lcywga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZywgU2VjdXJpdHlPcmlnaW5E
YXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpOwotfQotCi19IC8vIG5h
bWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhTWFwLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9T
dG9yYWdlQXJlYU1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU0M2U4MDc3
ZjBkZTQ1OGIxMDY5N2Q5OTZmMWNlNjZhYjcxY2M4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0
b3JhZ2VBcmVhTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpZm5kZWYgU3RvcmFnZUFyZWFNYXBfaAotI2RlZmluZSBTdG9yYWdlQXJlYU1hcF9oCi0K
LSNpbmNsdWRlICJNZXNzYWdlUmVjZWl2ZXIuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5
T3JpZ2luLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlQXJlYS5oPgotI2luY2x1ZGUgPHd0
Zi9Gb3J3YXJkLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hDb3VudGVkU2V0Lmg+Ci0jaW5jbHVkZSA8
d3RmL1JlZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLWNsYXNzIFNlY3VyaXR5T3JpZ2luOwotY2xhc3MgU3RvcmFnZU1hcDsKLX0KLQot
bmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhSW1wbDsKLWNsYXNzIFN0b3Jh
Z2VOYW1lc3BhY2VJbXBsOwotCi1jbGFzcyBTdG9yYWdlQXJlYU1hcCA6IHB1YmxpYyBSZWZDb3Vu
dGVkPFN0b3JhZ2VBcmVhTWFwPiwgcHJpdmF0ZSBJUEM6Ok1lc3NhZ2VSZWNlaXZlciB7Ci1wdWJs
aWM6Ci0gICAgc3RhdGljIFJlZjxTdG9yYWdlQXJlYU1hcD4gY3JlYXRlKFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsKiwgUmVmPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiYmKTsKLSAgICB+U3RvcmFnZUFy
ZWFNYXAoKTsKLQotICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3Qg
eyByZXR1cm4gbV9zdG9yYWdlVHlwZTsgfQotCi0gICAgdW5zaWduZWQgbGVuZ3RoKCk7Ci0gICAg
U3RyaW5nIGtleSh1bnNpZ25lZCBpbmRleCk7Ci0gICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5n
JiBrZXkpOwotICAgIHZvaWQgc2V0SXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0
b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmlu
ZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0oV2Vi
Q29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNv
bnN0IFN0cmluZyYga2V5KTsKLSAgICB2b2lkIGNsZWFyKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VG
cmFtZSwgU3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhKTsKLSAgICBib29sIGNvbnRhaW5zKGNv
bnN0IFN0cmluZyYga2V5KTsKLQotICAgIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiBz
ZWN1cml0eU9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW4uZ2V0KCk7IH0K
LQotcHJpdmF0ZToKLSAgICBTdG9yYWdlQXJlYU1hcChTdG9yYWdlTmFtZXNwYWNlSW1wbCosIFJl
ZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJik7Ci0KLSAgICAvLyBJUEM6Ok1lc3NhZ2VSZWNl
aXZlcgotICAgIHZvaWQgZGlkUmVjZWl2ZU1lc3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpE
ZWNvZGVyJikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGRpZEdldFZhbHVlcyh1aW50NjRfdCBzdG9y
YWdlTWFwU2VlZCk7Ci0gICAgdm9pZCBkaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVk
LCBjb25zdCBTdHJpbmcmIGtleSwgYm9vbCBxdW90YUVycm9yKTsKLSAgICB2b2lkIGRpZFJlbW92
ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5KTsKLSAgICB2
b2lkIGRpZENsZWFyKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKTsKLQotICAgIHZvaWQgZGlzcGF0
Y2hTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNv
bnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKLSAgICB2b2lkIGNsZWFyQ2FjaGUoKTsKLQotICAgIHZv
aWQgcmVzZXRWYWx1ZXMoKTsKLSAgICB2b2lkIGxvYWRWYWx1ZXNJZk5lZWRlZCgpOwotCi0gICAg
Ym9vbCBzaG91bGRBcHBseUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtleSkgY29uc3Q7Ci0g
ICAgdm9pZCBhcHBseUNoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBuZXdW
YWx1ZSk7Ci0KLSAgICB2b2lkIGRpc3BhdGNoU2Vzc2lvblN0b3JhZ2VFdmVudCh1aW50NjRfdCBz
b3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRW
YWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwot
ICAgIHZvaWQgZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3Qg
U3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotCi0gICAgUmVmPFN0
b3JhZ2VOYW1lc3BhY2VJbXBsPiBtX3N0b3JhZ2VOYW1lc3BhY2U7Ci0KLSAgICB1aW50NjRfdCBt
X3N0b3JhZ2VNYXBJRDsKLQotICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIG1fc3RvcmFnZVR5cGU7
Ci0gICAgdWludDY0X3QgbV9zdG9yYWdlTmFtZXNwYWNlSUQ7Ci0gICAgdW5zaWduZWQgbV9xdW90
YUluQnl0ZXM7Ci0gICAgUmVmPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiBtX3NlY3VyaXR5T3Jp
Z2luOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKLQot
ICAgIHVpbnQ2NF90IG1fY3VycmVudFNlZWQ7Ci0gICAgYm9vbCBtX2hhc1BlbmRpbmdDbGVhcjsK
LSAgICBib29sIG1faGFzUGVuZGluZ0dldFZhbHVlczsKLSAgICBIYXNoQ291bnRlZFNldDxTdHJp
bmc+IG1fcGVuZGluZ1ZhbHVlQ2hhbmdlczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAot
Ci0jZW5kaWYgLy8gU3RvcmFnZUFyZWFNYXBfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbgpkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1OTA0ZjE2YmVjMTQyYjEwYjQ4MDBkMTA2NDUwMDkz
MzgzMDBkNS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5p
bgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotIyBhcmUgbWV0OgotIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0j
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0jICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFO
RAotIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0jIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SCi0jIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSMgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIKLSMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
LSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLQotbWVzc2FnZXMgLT4gU3RvcmFnZUFyZWFNYXAgewotICAgIERpZEdl
dFZhbHVlcyh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKLSAgICBEaWRTZXRJdGVtKHVpbnQ2NF90
IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5LCBib29sIHF1b3RhRXhjZXB0aW9uKQotICAgIERp
ZFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXkpCi0gICAgRGlk
Q2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCi0KLSAgICBEaXNwYXRjaFN0b3JhZ2VFdmVu
dCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBTdHJpbmcga2V5LCBTdHJpbmcgb2xkVmFs
dWUsIFN0cmluZyBuZXdWYWx1ZSwgU3RyaW5nIHVybFN0cmluZykKLSAgICBDbGVhckNhY2hlKCkK
LX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VO
YW1lc3BhY2VJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VOYW1lc3BhY2VJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiYmM1
YzIxYzE4MTA4OGZmNTg2MDQ1ZjAyNzE5ZTAyNDI2ODcyNS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFn
ZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3Jh
Z2VOYW1lc3BhY2VJbXBsLmgiCi0KLSNpbmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKLSNpbmNs
dWRlICJTdG9yYWdlQXJlYU1hcC5oIgotI2luY2x1ZGUgIldlYlBhZ2UuaCIKLSNpbmNsdWRlICJX
ZWJQYWdlR3JvdXBQcm94eS5oIgotI2luY2x1ZGUgIldlYlByb2Nlc3MuaCIKLSNpbmNsdWRlIDxX
ZWJDb3JlL0ZyYW1lLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KLSNpbmNsdWRl
IDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZXR0aW5ncy5o
PgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZVR5cGUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUlt
cGw+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1
aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6U2Vzc2lvbiwg
aWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdl
TmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUVwaGVtZXJhbExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0
ZXMpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9y
YWdlVHlwZTo6RXBoZW1lcmFsTG9jYWwsIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5CeXRl
cykpOwotfQotCi1SZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RvcmFnZU5h
bWVzcGFjZUltcGwoU3RvcmFnZVR5cGU6OkxvY2FsLCBpZGVudGlmaWVyLCBudWxscHRyLCBxdW90
YUluQnl0ZXMpKTsKLX0KLQotUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFt
ZXNwYWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90
IGlkZW50aWZpZXIsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiB0b3BMZXZlbE9yaWdpbiwgdWlu
dDY0X3QgcXVvdGFJbkJ5dGVzKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RvcmFnZU5h
bWVzcGFjZUltcGwoU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2FsLCBpZGVudGlmaWVyLCAmdG9w
TGV2ZWxPcmlnaW4sIHF1b3RhSW5CeXRlcykpOwotfQotCi1TdG9yYWdlTmFtZXNwYWNlSW1wbDo6
U3RvcmFnZU5hbWVzcGFjZUltcGwoV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUsIHVp
bnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRvcExl
dmVsT3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi0gICAgOiBtX3N0b3JhZ2VUeXBlKHN0
b3JhZ2VUeXBlKQotICAgICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVzcGFjZUlE
KQotICAgICwgbV90b3BMZXZlbE9yaWdpbih0b3BMZXZlbE9yaWdpbikKLSAgICAsIG1fcXVvdGFJ
bkJ5dGVzKHF1b3RhSW5CeXRlcykKLXsKLX0KLQotU3RvcmFnZU5hbWVzcGFjZUltcGw6On5TdG9y
YWdlTmFtZXNwYWNlSW1wbCgpCi17Ci19Ci0KLXZvaWQgU3RvcmFnZU5hbWVzcGFjZUltcGw6OmRp
ZERlc3Ryb3lTdG9yYWdlQXJlYU1hcChTdG9yYWdlQXJlYU1hcCYgbWFwKQotewotICAgIG1fc3Rv
cmFnZUFyZWFNYXBzLnJlbW92ZShTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdp
bihtYXAuc2VjdXJpdHlPcmlnaW4oKSkpOwotfQotCi1SZWZQdHI8U3RvcmFnZUFyZWE+IFN0b3Jh
Z2VOYW1lc3BhY2VJbXBsOjpzdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNl
Y3VyaXR5T3JpZ2luKQotewotICAgIGlmIChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpF
cGhlbWVyYWxMb2NhbCkKLSAgICAgICAgcmV0dXJuIGVwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWEo
c2VjdXJpdHlPcmlnaW4pOwotCi0gICAgUmVmUHRyPFN0b3JhZ2VBcmVhTWFwPiBtYXA7Ci0KLSAg
ICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYU1hcHMuYWRkKHNlY3VyaXR5T3JpZ2luLCBudWxs
cHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgaWYgKCFzbG90KSB7Ci0gICAgICAgIG1hcCA9IFN0
b3JhZ2VBcmVhTWFwOjpjcmVhdGUodGhpcywgc2VjdXJpdHlPcmlnaW4uc2VjdXJpdHlPcmlnaW4o
KSk7Ci0gICAgICAgIHNsb3QgPSBtYXAuZ2V0KCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1hcCA9
IHNsb3Q7Ci0KLSAgICByZXR1cm4gU3RvcmFnZUFyZWFJbXBsOjpjcmVhdGUobWFwLnJlbGVhc2VO
b25OdWxsKCkpOwotfQotCi1jbGFzcyBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6RXBoZW1lcmFsU3Rv
cmFnZUFyZWEgZmluYWwgOiBwdWJsaWMgU3RvcmFnZUFyZWEgewotcHVibGljOgotICAgIHN0YXRp
YyBSZWY8RXBoZW1lcmFsU3RvcmFnZUFyZWE+IGNyZWF0ZShjb25zdCBTZWN1cml0eU9yaWdpbkRh
dGEmIG9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotICAgIHsKLSAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKCpuZXcgRXBoZW1lcmFsU3RvcmFnZUFyZWEob3JpZ2luLCBxdW90YUluQnl0ZXMp
KTsKLSAgICB9Ci0KLSAgICBSZWY8RXBoZW1lcmFsU3RvcmFnZUFyZWE+IGNvcHkoKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRXBoZW1lcmFsU3RvcmFnZUFyZWEoKnRoaXMp
KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRXBoZW1lcmFsU3RvcmFnZUFyZWEoY29uc3QgU2Vj
dXJpdHlPcmlnaW5EYXRhJiBvcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLSAgICAgICAg
OiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvcmlnaW4pCi0gICAgICAgICwgbV9zdG9yYWdlTWFwKFN0
b3JhZ2VNYXA6OmNyZWF0ZShxdW90YUluQnl0ZXMpKQotICAgIHsKLSAgICB9Ci0KLSAgICBFcGhl
bWVyYWxTdG9yYWdlQXJlYShFcGhlbWVyYWxTdG9yYWdlQXJlYSYgb3RoZXIpCi0gICAgICAgIDog
bV9zZWN1cml0eU9yaWdpbkRhdGEob3RoZXIubV9zZWN1cml0eU9yaWdpbkRhdGEpCi0gICAgICAg
ICwgbV9zdG9yYWdlTWFwKG90aGVyLm1fc3RvcmFnZU1hcCkKLSAgICB7Ci0gICAgfQotCi0gICAg
Ly8gV2ViQ29yZTo6U3RvcmFnZUFyZWEuCi0gICAgdW5zaWduZWQgbGVuZ3RoKCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpOwotICAgIH0KLQotICAgIFN0cmlu
ZyBrZXkodW5zaWduZWQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFw
LT5rZXkoaW5kZXgpOwotICAgIH0KLQotICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmluZyYga2V5
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+Z2V0SXRlbShrZXkpOwotICAg
IH0KLQotICAgIHZvaWQgc2V0SXRlbShGcmFtZSosIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBT
dHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmlu
ZyBvbGRWYWx1ZTsKLSAgICAgICAgaWYgKGF1dG8gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5zZXRJ
dGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbikpCi0gICAgICAgICAgICBt
X3N0b3JhZ2VNYXAgPSBXVEZNb3ZlKG5ld01hcCk7Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmVJ
dGVtKEZyYW1lKiwgY29uc3QgU3RyaW5nJiBrZXkpCi0gICAgewotICAgICAgICBTdHJpbmcgb2xk
VmFsdWU7Ci0gICAgICAgIGlmIChhdXRvIG5ld01hcCA9IG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRl
bShrZXksIG9sZFZhbHVlKSkKLSAgICAgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3
TWFwKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyKEZyYW1lKikKLSAgICB7Ci0gICAgICAgIGlm
ICghbV9zdG9yYWdlTWFwLT5sZW5ndGgoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9zdG9yYWdlTWFwLT5xdW90YSgp
KTsKLSAgICB9Ci0KLSAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KQotICAgIHsK
LSAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+Y29udGFpbnMoa2V5KTsKLSAgICB9Ci0KLSAg
ICBib29sIGNhbkFjY2Vzc1N0b3JhZ2UoRnJhbWUqIGZyYW1lKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIGZyYW1lICYmIGZyYW1lLT5wYWdlKCk7Ci0gICAgfQotCi0gICAgU3RvcmFnZVR5cGUgc3Rv
cmFnZVR5cGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VUeXBlOjpFcGhl
bWVyYWxMb2NhbDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbWVtb3J5Qnl0ZXNVc2VkQnlDYWNoZSgp
Ci0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudEFj
Y2Vzc0NvdW50KCkgeyB9Ci0gICAgdm9pZCBkZWNyZW1lbnRBY2Nlc3NDb3VudCgpIHsgfQotICAg
IHZvaWQgY2xvc2VEYXRhYmFzZUlmSWRsZSgpIHsgfQotCi0gICAgU2VjdXJpdHlPcmlnaW5EYXRh
IHNlY3VyaXR5T3JpZ2luKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3NlY3VyaXR5
T3JpZ2luRGF0YTsKLSAgICB9Ci0KLSAgICBTZWN1cml0eU9yaWdpbkRhdGEgbV9zZWN1cml0eU9y
aWdpbkRhdGE7Ci0gICAgUmVmUHRyPFN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKLX07Ci0KLVJl
ZlB0cjxTdG9yYWdlQXJlYT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmVwaGVtZXJhbExvY2FsU3Rv
cmFnZUFyZWEoY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKLXsKLSAg
ICBhdXRvJiBzbG90ID0gbV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhcy5hZGQoc2VjdXJpdHlP
cmlnaW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAoIXNsb3QpCi0gICAgICAg
IHNsb3QgPSBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6RXBoZW1lcmFsU3RvcmFnZUFyZWE6OmNyZWF0
ZShzZWN1cml0eU9yaWdpbiwgbV9xdW90YUluQnl0ZXMpOwotCi0gICAgcmV0dXJuIHNsb3QuZ2V0
KCk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6
Y29weShQYWdlKiBuZXdQYWdlKQotewotICAgIEFTU0VSVChtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7
Ci0KLSAgICBpZiAobV9zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZTo6U2Vzc2lvbikKLSAgICAg
ICAgcmV0dXJuIGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYlBhZ2U6OmZyb21Db3Jl
UGFnZShuZXdQYWdlKS0+cGFnZUlEKCksIG1fcXVvdGFJbkJ5dGVzKTsKLQotICAgIEFTU0VSVCht
X3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCk7Ci0gICAgUmVmUHRy
PFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBuZXdOYW1lc3BhY2UgPSBhZG9wdFJlZihuZXcgU3RvcmFn
ZU5hbWVzcGFjZUltcGwobV9zdG9yYWdlVHlwZSwgbV9zdG9yYWdlTmFtZXNwYWNlSUQsIG1fdG9w
TGV2ZWxPcmlnaW4uZ2V0KCksIG1fcXVvdGFJbkJ5dGVzKSk7Ci0KLSAgICBmb3IgKGF1dG8mIGl0
ZXIgOiBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzKQotICAgICAgICBuZXdOYW1lc3BhY2Ut
Pm1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXMuc2V0KGl0ZXIua2V5LCBpdGVyLnZhbHVlLT5j
b3B5KCkpOwotCi0gICAgcmV0dXJuIG5ld05hbWVzcGFjZTsKLX0KLQotfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9y
YWdlTmFtZXNwYWNlSW1wbC5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3Rv
cmFnZU5hbWVzcGFjZUltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzYTIy
ZGNiZDIxYjY3NDBlNDUyMzdmNGRmYWQ4MzEyNTY3MjllMy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFn
ZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3Vy
aXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5IYXNoLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlQXJlYS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3Rv
cmFnZU1hcC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU5hbWVzcGFjZS5oPgotI2luY2x1
ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBTdG9yYWdl
QXJlYU1hcDsKLWNsYXNzIFdlYlBhZ2U7Ci0KLWNsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJbXBsIDog
cHVibGljIFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2UgewotcHVibGljOgotICAgIHN0YXRpYyBS
ZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
KHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0gICAgc3RhdGlj
IFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdl
TmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0g
ICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlTG9jYWxTdG9yYWdl
TmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0g
ICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlVHJhbnNpZW50TG9j
YWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIFdlYkNvcmU6OlNlY3VyaXR5
T3JpZ2luJiB0b3BMZXZlbE9yaWdpbiwgdWludDY0X3QgcXVvdGFJbkJ5dGVzKTsKLQotICAgIHZp
cnR1YWwgflN0b3JhZ2VOYW1lc3BhY2VJbXBsKCk7Ci0KLSAgICBXZWJDb3JlOjpTdG9yYWdlVHlw
ZSBzdG9yYWdlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZVR5cGU7IH0KLSAgICB1aW50
NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VOYW1lc3Bh
Y2VJRDsgfQotICAgIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbigpIGNv
bnN0IHsgcmV0dXJuIG1fdG9wTGV2ZWxPcmlnaW4uZ2V0KCk7IH0KLSAgICB1bnNpZ25lZCBxdW90
YUluQnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX3F1b3RhSW5CeXRlczsgfQotCi0gICAgdm9pZCBk
aWREZXN0cm95U3RvcmFnZUFyZWFNYXAoU3RvcmFnZUFyZWFNYXAmKTsKLQotcHJpdmF0ZToKLSAg
ICBleHBsaWNpdCBTdG9yYWdlTmFtZXNwYWNlSW1wbChXZWJDb3JlOjpTdG9yYWdlVHlwZSwgdWlu
dDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2
ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7Ci0KLSAgICBSZWZQdHI8V2ViQ29yZTo6
U3RvcmFnZUFyZWE+IHN0b3JhZ2VBcmVhKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0
YSYpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjb3B5
KFdlYkNvcmU6OlBhZ2UqKSBvdmVycmlkZTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdl
QXJlYT4gZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGEmKTsKLQotICAgIGNvbnN0IFdlYkNvcmU6OlN0b3JhZ2VUeXBlIG1fc3RvcmFnZVR5
cGU7Ci0gICAgY29uc3QgdWludDY0X3QgbV9zdG9yYWdlTmFtZXNwYWNlSUQ7Ci0KLSAgICAvLyBP
bmx5IHVzZWQgZm9yIHRyYW5zaWVudCBsb2NhbCBzdG9yYWdlIG5hbWVzcGFjZXMuCi0gICAgY29u
c3QgUmVmUHRyPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiBtX3RvcExldmVsT3JpZ2luOwotCi0g
ICAgY29uc3QgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7Ci0KLSAgICBIYXNoTWFwPFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSwgU3RvcmFnZUFyZWFNYXAqPiBtX3N0b3JhZ2VBcmVhTWFwczsK
LQotICAgIGNsYXNzIEVwaGVtZXJhbFN0b3JhZ2VBcmVhOwotICAgIEhhc2hNYXA8V2ViQ29yZTo6
U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8RXBoZW1lcmFsU3RvcmFnZUFyZWE+PiBtX2VwaGVt
ZXJhbExvY2FsU3RvcmFnZUFyZWFzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvV2ViU3Rv
cmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
YTM3NThlYjg3NDI4OGZmZDg5NjYyZDAyNWUxNThkNjZhMDcwYzU3MC4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
U3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCisrKyAvZGV2L251bGwKQEAg
LTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oIgotCi0jaW5jbHVkZSAiU3RvcmFn
ZU5hbWVzcGFjZUltcGwuaCIKLSNpbmNsdWRlICJXZWJQYWdlLmgiCi0jaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvTmV2ZXJEZXN0cm95ZWQuaD4KLQotdXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdGF0aWMgSGFzaE1hcDx1aW50
NjRfdCwgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKj4mIHN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlcnMoKQotewotICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxIYXNoTWFwPHVpbnQ2NF90LCBX
ZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIqPj4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyczsK
LQotICAgIHJldHVybiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzOwotfQotCi1SZWZQdHI8V2Vi
U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6Omdl
dE9yQ3JlYXRlKHVpbnQ2NF90IGlkZW50aWZpZXIpCi17Ci0gICAgYXV0byYgc2xvdCA9IHN0b3Jh
Z2VOYW1lc3BhY2VQcm92aWRlcnMoKS5hZGQoaWRlbnRpZmllciwgbnVsbHB0cikuaXRlcmF0b3It
PnZhbHVlOwotICAgIGlmIChzbG90KQotICAgICAgICByZXR1cm4gc2xvdDsKLQotICAgIFJlZlB0
cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI+IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlciA9
IGFkb3B0UmVmKG5ldyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIoaWRlbnRpZmllcikpOwot
ICAgIHNsb3QgPSBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuZ2V0KCk7Ci0KLSAgICByZXR1cm4g
c3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOwotfQotCi1XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXI6OldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcih1aW50NjRfdCBpZGVudGlmaWVyKQotICAg
IDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCi17Ci19Ci0KLVdlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcjo6fldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcigpCi17Ci0gICAgQVNTRVJUKHN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKS5jb250YWlucyhtX2lkZW50aWZpZXIpKTsKLQotICAg
IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnMoKS5yZW1vdmUobV9pZGVudGlmaWVyKTsKLX0KLQot
UmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoUGFnZSYgcGFnZSwgdW5zaWduZWQg
cXVvdGEpCi17Ci0gICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2UoJnBhZ2UpLT5wYWdlSUQoKSwg
cXVvdGEpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
UGFnZSYgcGFnZSwgdW5zaWduZWQgcXVvdGEpCi17Ci0gICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsOjpjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJv
bUNvcmVQYWdlKCZwYWdlKS0+cGFnZUlEKCksIHF1b3RhKTsKLX0KLQotUmVmUHRyPFdlYkNvcmU6
OlN0b3JhZ2VOYW1lc3BhY2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlTG9j
YWxTdG9yYWdlTmFtZXNwYWNlKHVuc2lnbmVkIHF1b3RhKQotewotICAgIHJldHVybiBTdG9yYWdl
TmFtZXNwYWNlSW1wbDo6Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKG1faWRlbnRpZmllciwg
cXVvdGEpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1bnNpZ25lZCBxdW90YSkK
LXsKLSAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZShtX2lkZW50aWZpZXIsIHRvcExldmVsT3JpZ2luLCBxdW90YSk7Ci19
Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3Jh
Z2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGE0YzIxNDI0YmYyNmUzNDEwMTA4OGJjMDI4MmI0MzEyMjZhNjQ5YTYuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgKKysrIC9kZXYvbnVs
bApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFdlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcl9oCi0jZGVmaW5lIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcl9o
Ci0KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oPgotCi1uYW1l
c3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyIGZpbmFs
IDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlciB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFJlZlB0cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI+IGdldE9yQ3JlYXRl
KHVpbnQ2NF90IGlkZW50aWZpZXIpOwotICAgIHZpcnR1YWwgfldlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcigpOwotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0IFdlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcih1aW50NjRfdCBpZGVudGlmaWVyKTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9y
YWdlTmFtZXNwYWNlPiBjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdl
JiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdl
TmFtZXNwYWNlPiBjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6
UGFnZSYsIHVuc2lnbmVkIHF1b3RhKSBvdmVycmlkZTsKLSAgICBSZWZQdHI8V2ViQ29yZTo6U3Rv
cmFnZU5hbWVzcGFjZT4gY3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVuc2lnbmVkIHF1b3Rh
KSBvdmVycmlkZTsKLSAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRl
VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiwg
dW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOwotCi0gICAgY29uc3QgdWludDY0X3QgbV9pZGVudGlm
aWVyOwotfTsKLQotfQotCi0jZW5kaWYgLy8gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VB
cmVhSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdl
QXJlYUltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmJlODUwN2EzMTMyNjQyZGJkYzBmMThhNjk5ZDFlN2Nm
M2JhNDg2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
U3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgorCisj
aW5jbHVkZSAiU3RvcmFnZUFyZWFNYXAuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0RvY3VtZW50Lmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvU2NoZW1lUmVnaXN0cnkuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1Nl
Y3VyaXR5T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2V0dGluZ3MuaD4KKwordXNp
bmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgdWlu
dDY0X3QgZ2VuZXJhdGVTdG9yYWdlQXJlYUlEKCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgc3Rv
cmFnZUFyZWFJRDsKKyAgICByZXR1cm4gKytzdG9yYWdlQXJlYUlEOworfQorCitSZWY8U3RvcmFn
ZUFyZWFJbXBsPiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShSZWY8U3RvcmFnZUFyZWFNYXA+JiYg
c3RvcmFnZUFyZWFNYXApCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWFJ
bXBsKFdURk1vdmUoc3RvcmFnZUFyZWFNYXApKSk7Cit9CisKK1N0b3JhZ2VBcmVhSW1wbDo6U3Rv
cmFnZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJiBzdG9yYWdlQXJlYU1hcCkKKyAgICA6
IG1fc3RvcmFnZUFyZWFJRChnZW5lcmF0ZVN0b3JhZ2VBcmVhSUQoKSkKKyAgICAsIG1fc3RvcmFn
ZUFyZWFNYXAoV1RGTW92ZShzdG9yYWdlQXJlYU1hcCkpCit7Cit9CisKK1N0b3JhZ2VBcmVhSW1w
bDo6flN0b3JhZ2VBcmVhSW1wbCgpCit7Cit9CisKK3Vuc2lnbmVkIFN0b3JhZ2VBcmVhSW1wbDo6
bGVuZ3RoKCkKK3sKKyAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+bGVuZ3RoKCk7Cit9CisK
K1N0cmluZyBTdG9yYWdlQXJlYUltcGw6OmtleSh1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1
cm4gbV9zdG9yYWdlQXJlYU1hcC0+a2V5KGluZGV4KTsKK30KKworU3RyaW5nIFN0b3JhZ2VBcmVh
SW1wbDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICByZXR1cm4gbV9zdG9yYWdlQXJl
YU1hcC0+aXRlbShrZXkpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6c2V0SXRlbShGcmFt
ZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBi
b29sJiBxdW90YUV4Y2VwdGlvbikKK3sKKyAgICBBU1NFUlQoIXZhbHVlLmlzTnVsbCgpKTsKKwor
ICAgIG1fc3RvcmFnZUFyZWFNYXAtPnNldEl0ZW0oc291cmNlRnJhbWUsIHRoaXMsIGtleSwgdmFs
dWUsIHF1b3RhRXhjZXB0aW9uKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYUltcGw6OnJlbW92ZUl0
ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBtX3N0b3Jh
Z2VBcmVhTWFwLT5yZW1vdmVJdGVtKHNvdXJjZUZyYW1lLCB0aGlzLCBrZXkpOworfQorCit2b2lk
IFN0b3JhZ2VBcmVhSW1wbDo6Y2xlYXIoRnJhbWUqIHNvdXJjZUZyYW1lKQoreworICAgIG1fc3Rv
cmFnZUFyZWFNYXAtPmNsZWFyKHNvdXJjZUZyYW1lLCB0aGlzKTsKK30KKworYm9vbCBTdG9yYWdl
QXJlYUltcGw6OmNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIHJldHVybiBtX3N0
b3JhZ2VBcmVhTWFwLT5jb250YWlucyhrZXkpOworfQorCitib29sIFN0b3JhZ2VBcmVhSW1wbDo6
Y2FuQWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCit7CisgICAgcmV0dXJuIGZyYW1lICYmIGZy
YW1lLT5wYWdlKCk7Cit9CisKK1N0b3JhZ2VUeXBlIFN0b3JhZ2VBcmVhSW1wbDo6c3RvcmFnZVR5
cGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5zdG9yYWdlVHlwZSgp
OworfQorCitzaXplX3QgU3RvcmFnZUFyZWFJbXBsOjptZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkK
K3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTdG9yYWdlQXJlYUltcGw6OmluY3JlbWVudEFj
Y2Vzc0NvdW50KCkKK3sKKyAgICAvLyBTdG9yYWdlIGFjY2VzcyBpcyBoYW5kbGVkIGluIHRoZSBV
SSBwcm9jZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS4KK30KKwordm9pZCBTdG9y
YWdlQXJlYUltcGw6OmRlY3JlbWVudEFjY2Vzc0NvdW50KCkKK3sKKyAgICAvLyBTdG9yYWdlIGFj
Y2VzcyBpcyBoYW5kbGVkIGluIHRoZSBVSSBwcm9jZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8g
ZG8gaGVyZS4KK30KKwordm9pZCBTdG9yYWdlQXJlYUltcGw6OmNsb3NlRGF0YWJhc2VJZklkbGUo
KQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhpcy4KKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKK30KKworV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIFN0b3JhZ2VBcmVhSW1wbDo6
c2VjdXJpdHlPcmlnaW4oKSBjb25zdAoreworICAgIHJldHVybiBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3N0b3JhZ2VBcmVhTWFwLT5zZWN1cml0eU9y
aWdpbigpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuaCBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmRkYTQ3YzhkODM4ZThmYmRjNWQ0N2JmNzhjZjc2ZTE5YTAxOThiMzIKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwu
aApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBTdG9yYWdlQXJlYUltcGxf
aAorI2RlZmluZSBTdG9yYWdlQXJlYUltcGxfaAorCisjaW5jbHVkZSAiTWVzc2FnZVJlY2VpdmVy
LmgiCisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlQXJlYS5oPgorI2luY2x1ZGUgPHd0Zi9IYXNo
Q291bnRlZFNldC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK2NsYXNzIFNlY3VyaXR5T3JpZ2luOworfQorCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
Y2xhc3MgU3RvcmFnZUFyZWFNYXA7CisKK2NsYXNzIFN0b3JhZ2VBcmVhSW1wbCBmaW5hbCA6IHB1
YmxpYyBXZWJDb3JlOjpTdG9yYWdlQXJlYSB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxTdG9y
YWdlQXJlYUltcGw+IGNyZWF0ZShSZWY8U3RvcmFnZUFyZWFNYXA+JiYpOworICAgIHZpcnR1YWwg
flN0b3JhZ2VBcmVhSW1wbCgpOworCisgICAgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCgpIGNvbnN0
IHsgcmV0dXJuIG1fc3RvcmFnZUFyZWFJRDsgfQorCitwcml2YXRlOgorICAgIFN0b3JhZ2VBcmVh
SW1wbChSZWY8U3RvcmFnZUFyZWFNYXA+JiYpOworCisgICAgLy8gV2ViQ29yZTo6U3RvcmFnZUFy
ZWEuCisgICAgdW5zaWduZWQgbGVuZ3RoKCkgb3ZlcnJpZGU7CisgICAgU3RyaW5nIGtleSh1bnNp
Z25lZCBpbmRleCkgb3ZlcnJpZGU7CisgICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5nJiBrZXkp
IG92ZXJyaWRlOworICAgIHZvaWQgc2V0SXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUs
IGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2Vw
dGlvbikgb3ZlcnJpZGU7CisgICAgdm9pZCByZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3Vy
Y2VGcmFtZSwgY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOworICAgIHZvaWQgY2xlYXIoV2Vi
Q29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lKSBvdmVycmlkZTsKKyAgICBib29sIGNvbnRhaW5zKGNv
bnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgICBib29sIGNhbkFjY2Vzc1N0b3JhZ2UoV2Vi
Q29yZTo6RnJhbWUqKSBvdmVycmlkZTsKKyAgICBXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdl
VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHNpemVfdCBtZW1vcnlCeXRlc1VzZWRCeUNhY2hl
KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBpbmNyZW1lbnRBY2Nlc3NDb3VudCgpIG92ZXJyaWRlOwor
ICAgIHZvaWQgZGVjcmVtZW50QWNjZXNzQ291bnQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3Nl
RGF0YWJhc2VJZklkbGUoKSBvdmVycmlkZTsKKyAgICBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGEgc2VjdXJpdHlPcmlnaW4oKSBjb25zdCBvdmVycmlkZTsKKworICAgIHVpbnQ2NF90IG1fc3Rv
cmFnZUFyZWFJRDsKKyAgICBSZWY8U3RvcmFnZUFyZWFNYXA+IG1fc3RvcmFnZUFyZWFNYXA7Cit9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFN0b3JhZ2VBcmVhSW1wbF9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdl
QXJlYU1hcC5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdl
QXJlYU1hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTI2NTBkMWIzZWJmYzcyOGMyNzVlZTAxMGJmZWEzYTI2
OGIwYjg4NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJT
dG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNwcApAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcC5oIgorCisjaW5j
bHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXBNZXNzYWdl
cy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJTdG9y
YWdlTmFtZXNwYWNlSW1wbC5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJQ
YWdlR3JvdXBQcm94eS5oIgorI2luY2x1ZGUgIldlYlByb2Nlc3MuaCIKKyNpbmNsdWRlIDxXZWJD
b3JlL0RPTVdpbmRvdy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1lbnQuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL01haW5GcmFtZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvUGFnZUdyb3VwLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdp
bkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2UuaD4KKyNpbmNsdWRlIDxXZWJDb3Jl
L1N0b3JhZ2VFdmVudERpc3BhdGNoZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VNYXAu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VUeXBlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBX
ZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGljIHVpbnQ2NF90IGdlbmVyYXRl
U3RvcmFnZU1hcElEKCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgc3RvcmFnZU1hcElEOworICAg
IHJldHVybiArK3N0b3JhZ2VNYXBJRDsKK30KKworUmVmPFN0b3JhZ2VBcmVhTWFwPiBTdG9yYWdl
QXJlYU1hcDo6Y3JlYXRlKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiBzdG9yYWdlTmFtZXNwYWNlLCBS
ZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgcmV0
dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWFNYXAoc3RvcmFnZU5hbWVzcGFjZSwgV1RGTW92
ZShzZWN1cml0eU9yaWdpbikpKTsKK30KKworU3RvcmFnZUFyZWFNYXA6OlN0b3JhZ2VBcmVhTWFw
KFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiBzdG9yYWdlTmFtZXNwYWNlLCBSZWY8V2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW4+JiYgc2VjdXJpdHlPcmlnaW4pCisgICAgOiBtX3N0b3JhZ2VOYW1lc3BhY2Uo
KnN0b3JhZ2VOYW1lc3BhY2UpCisgICAgLCBtX3N0b3JhZ2VNYXBJRChnZW5lcmF0ZVN0b3JhZ2VN
YXBJRCgpKQorICAgICwgbV9zdG9yYWdlVHlwZShzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlVHlw
ZSgpKQorICAgICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFn
ZU5hbWVzcGFjZUlEKCkpCisgICAgLCBtX3F1b3RhSW5CeXRlcyhzdG9yYWdlTmFtZXNwYWNlLT5x
dW90YUluQnl0ZXMoKSkKKyAgICAsIG1fc2VjdXJpdHlPcmlnaW4oV1RGTW92ZShzZWN1cml0eU9y
aWdpbikpCisgICAgLCBtX2N1cnJlbnRTZWVkKDApCisgICAgLCBtX2hhc1BlbmRpbmdDbGVhcihm
YWxzZSkKKyAgICAsIG1faGFzUGVuZGluZ0dldFZhbHVlcyhmYWxzZSkKK3sKKyAgICBzd2l0Y2gg
KG1fc3RvcmFnZVR5cGUpIHsKKyAgICBjYXNlIFN0b3JhZ2VUeXBlOjpMb2NhbDoKKyAgICBjYXNl
IFN0b3JhZ2VUeXBlOjpUcmFuc2llbnRMb2NhbDoKKyAgICAgICAgaWYgKFNlY3VyaXR5T3JpZ2lu
KiB0b3BMZXZlbE9yaWdpbiA9IHN0b3JhZ2VOYW1lc3BhY2UtPnRvcExldmVsT3JpZ2luKCkpCisg
ICAgICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlv
bigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlVHJhbnNpZW50TG9jYWxT
dG9yYWdlTWFwKG1fc3RvcmFnZU1hcElELCBzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNw
YWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4oKnRvcExldmVs
T3JpZ2luKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0
eU9yaWdpbikpLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV2ViUHJvY2Vzczo6c2lu
Z2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFn
ZU1hbmFnZXI6OkNyZWF0ZUxvY2FsU3RvcmFnZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3RvcmFnZU5h
bWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNl
Y3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKSwgMCk7CisKKyAgICAgICAgYnJlYWs7CisK
KyAgICBjYXNlIFN0b3JhZ2VUeXBlOjpTZXNzaW9uOgorICAgICAgICBXZWJQcm9jZXNzOjpzaW5n
bGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdl
TWFuYWdlcjo6Q3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0b3JhZ2VO
YW1lc3BhY2UtPnN0b3JhZ2VOYW1lc3BhY2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21T
ZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSksIDApOworICAgICAgICBicmVhazsKKwor
ICAgIGNhc2UgU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsOgorICAgICAgICAvLyBUaGUgVUkg
cHJvY2VzcyBpcyBub3QgaW52b2x2ZWQgZm9yIEVwaGVtZXJhbExvY2FsIHN0b3JhZ2VzLgorICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuYWRkTWVz
c2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6bWVzc2FnZVJlY2VpdmVyTmFt
ZSgpLCBtX3N0b3JhZ2VNYXBJRCwgKnRoaXMpOworfQorCitTdG9yYWdlQXJlYU1hcDo6flN0b3Jh
Z2VBcmVhTWFwKCkKK3sKKyAgICBpZiAobV9zdG9yYWdlVHlwZSAhPSBTdG9yYWdlVHlwZTo6RXBo
ZW1lcmFsTG9jYWwpIHsKKyAgICAgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJv
Y2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkRlc3Ryb3lT
dG9yYWdlTWFwKG1fc3RvcmFnZU1hcElEKSwgMCk7CisgICAgICAgIFdlYlByb2Nlc3M6OnNpbmds
ZXRvbigpLnJlbW92ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6Om1l
c3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9zdG9yYWdlTWFwSUQpOworICAgIH0KKworICAgIG1fc3Rv
cmFnZU5hbWVzcGFjZS0+ZGlkRGVzdHJveVN0b3JhZ2VBcmVhTWFwKCp0aGlzKTsKK30KKwordW5z
aWduZWQgU3RvcmFnZUFyZWFNYXA6Omxlbmd0aCgpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVk
KCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5sZW5ndGgoKTsKK30KKworU3RyaW5nIFN0
b3JhZ2VBcmVhTWFwOjprZXkodW5zaWduZWQgaW5kZXgpCit7CisgICAgbG9hZFZhbHVlc0lmTmVl
ZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5rZXkoaW5kZXgpOworfQorCitTdHJp
bmcgU3RvcmFnZUFyZWFNYXA6Oml0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbG9hZFZh
bHVlc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7
Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OnNldEl0ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBT
dG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJp
bmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVk
ZWQoKTsKKworICAgIEFTU0VSVChtX3N0b3JhZ2VNYXAtPmhhc09uZVJlZigpKTsKKworICAgIFN0
cmluZyBvbGRWYWx1ZTsKKyAgICBxdW90YUV4Y2VwdGlvbiA9IGZhbHNlOworICAgIG1fc3RvcmFn
ZU1hcC0+c2V0SXRlbShrZXksIHZhbHVlLCBvbGRWYWx1ZSwgcXVvdGFFeGNlcHRpb24pOworICAg
IGlmIChxdW90YUV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG9sZFZhbHVl
ID09IHZhbHVlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMu
YWRkKGtleSk7CisKKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29u
bmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6U2V0SXRlbShtX3N0b3Jh
Z2VNYXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBrZXks
IHZhbHVlLCBzb3VyY2VGcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsKK30KKwordm9pZCBT
dG9yYWdlQXJlYU1hcDo6cmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0
b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbG9h
ZFZhbHVlc0lmTmVlZGVkKCk7CisgICAgQVNTRVJUKG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkp
OworCisgICAgU3RyaW5nIG9sZFZhbHVlOworICAgIG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShr
ZXksIG9sZFZhbHVlKTsKKworICAgIGlmIChvbGRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmFkZChrZXkpOworCisgICAgV2ViUHJv
Y2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdl
czo6U3RvcmFnZU1hbmFnZXI6OlJlbW92ZUl0ZW0obV9zdG9yYWdlTWFwSUQsIHNvdXJjZUFyZWEt
PnN0b3JhZ2VBcmVhSUQoKSwgbV9jdXJyZW50U2VlZCwga2V5LCBzb3VyY2VGcmFtZS0+ZG9jdW1l
bnQoKS0+dXJsKCkpLCAwKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6Y2xlYXIoV2ViQ29y
ZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEpCit7Cisg
ICAgcmVzZXRWYWx1ZXMoKTsKKworICAgIG1faGFzUGVuZGluZ0NsZWFyID0gdHJ1ZTsKKyAgICBt
X3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOworICAgIFdl
YlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVz
c2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDbGVhcihtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+
c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBzb3VyY2VGcmFtZS0+ZG9jdW1lbnQoKS0+
dXJsKCkpLCAwKTsKK30KKworYm9vbCBTdG9yYWdlQXJlYU1hcDo6Y29udGFpbnMoY29uc3QgU3Ry
aW5nJiBrZXkpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9z
dG9yYWdlTWFwLT5jb250YWlucyhrZXkpOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpyZXNl
dFZhbHVlcygpCit7CisgICAgbV9zdG9yYWdlTWFwID0gbnVsbHB0cjsKKworICAgIG1fcGVuZGlu
Z1ZhbHVlQ2hhbmdlcy5jbGVhcigpOworICAgIG1faGFzUGVuZGluZ0NsZWFyID0gZmFsc2U7Cisg
ICAgbV9oYXNQZW5kaW5nR2V0VmFsdWVzID0gZmFsc2U7CisgICAgbV9jdXJyZW50U2VlZCsrOwor
fQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpsb2FkVmFsdWVzSWZOZWVkZWQoKQoreworICAgIGlm
IChtX3N0b3JhZ2VNYXApCisgICAgICAgIHJldHVybjsKKworICAgIEhhc2hNYXA8U3RyaW5nLCBT
dHJpbmc+IHZhbHVlczsKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXNlIGEgc3BlY2lhbCBz
ZW5kU3luYyBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGlu
Y29taW5nIG1lc3NhZ2VzIHdoaWxlIHdhaXRpbmcgZm9yIGEgcmVwbHkuCisgICAgLy8gKFRoaXMg
ZmxhZyBkb2VzIG5vdCB5ZXQgZXhpc3QpLiBTaW5jZSBsb2FkVmFsdWVzSWZOZWVkZWQoKSBlbmRz
IHVwIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBKYXZhU2NyaXB0IGNvZGUsIHByb2Nlc3Npbmcg
aW5jb21pbmcgc3luY2hyb25vdXMgbWVzc2FnZXMKKyAgICAvLyBjb3VsZCBsZWFkIHRvIHdlaXJk
IHJlZW50cmVuY3kgYnVncyBvdGhlcndpc2UuCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCku
cGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZFN5bmMoTWVzc2FnZXM6OlN0b3JhZ2VNYW5h
Z2VyOjpHZXRWYWx1ZXMobV9zdG9yYWdlTWFwSUQsIG1fY3VycmVudFNlZWQpLCBNZXNzYWdlczo6
U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVlczo6UmVwbHkodmFsdWVzKSwgMCk7CisKKyAgICBtX3N0
b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOworICAgIG1fc3Rv
cmFnZU1hcC0+aW1wb3J0SXRlbXModmFsdWVzKTsKKworICAgIC8vIFdlIHdhbnQgdG8gaWdub3Jl
IGFsbCBjaGFuZ2VzIHVudGlsIHdlIGdldCB0aGUgRGlkR2V0VmFsdWVzIG1lc3NhZ2UuCisgICAg
bV9oYXNQZW5kaW5nR2V0VmFsdWVzID0gdHJ1ZTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6
ZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQoreworICAgIGlmIChtX2N1cnJl
bnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQo
bV9oYXNQZW5kaW5nR2V0VmFsdWVzKTsKKyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBmYWxz
ZTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkU2V0SXRlbSh1aW50NjRfdCBzdG9yYWdl
TWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGJvb2wgcXVvdGFFcnJvcikKK3sKKyAgICBpZiAo
bV9jdXJyZW50U2VlZCAhPSBzdG9yYWdlTWFwU2VlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
QVNTRVJUKG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5jb250YWlucyhrZXkpKTsKKworICAgIGlmIChx
dW90YUVycm9yKSB7CisgICAgICAgIHJlc2V0VmFsdWVzKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMucmVtb3ZlKGtleSk7Cit9CisKK3ZvaWQg
U3RvcmFnZUFyZWFNYXA6OmRpZFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNv
bnN0IFN0cmluZyYga2V5KQoreworICAgIGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBT
ZWVkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2Vz
LmNvbnRhaW5zKGtleSkpOworICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUoa2V5KTsK
K30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNl
ZWQpCit7CisgICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCisgICAgICAg
IHJldHVybjsKKworICAgIEFTU0VSVChtX2hhc1BlbmRpbmdDbGVhcik7CisgICAgbV9oYXNQZW5k
aW5nQ2xlYXIgPSBmYWxzZTsKK30KKworYm9vbCBTdG9yYWdlQXJlYU1hcDo6c2hvdWxkQXBwbHlD
aGFuZ2VGb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIGNvbnN0Cit7CisgICAgLy8gV2UgaGF2ZSBu
b3QgeWV0IGxvYWRlZCBhbnl0aGluZyBmcm9tIHRoaXMgc3RvcmFnZSBtYXAuCisgICAgaWYgKCFt
X3N0b3JhZ2VNYXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrIGlmIHRo
aXMgc3RvcmFnZSBhcmVhIGlzIGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUgc3RvcmFnZSBtYW5h
Z2VyIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4ga2V5LgorICAgIC8vIElmIHRoYXQgaXMgdGhlIGNhc2Us
IHdlIGRvbid0IHdhbnQgdG8gYXBwbHkgYW55IGNoYW5nZXMgbWFkZSBieSBvdGhlciBzdG9yYWdl
IGFyZWFzLCBzaW5jZQorICAgIC8vIG91ciBjaGFuZ2Ugd2FzIG1hZGUgbGFzdC4KKyAgICBpZiAo
bV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjphcHBseUNo
YW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSkKK3sKKyAgICBB
U1NFUlQoIW1fc3RvcmFnZU1hcCB8fCBtX3N0b3JhZ2VNYXAtPmhhc09uZVJlZigpKTsKKworICAg
IC8vIFRoZXJlJ3MgYSBjbGVhciBwZW5kaW5nIG9yIGdldFZhbHVlcyBwZW5kaW5nIHdlIGRvbid0
IHdhbnQgdG8gYXBwbHkgYW55IGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRoZSBjb3JyZXNwb25kaW5n
IERpZENsZWFyL0RpZEdldFZhbHVlcyBtZXNzYWdlcy4KKyAgICBpZiAobV9oYXNQZW5kaW5nQ2xl
YXIgfHwgbV9oYXNQZW5kaW5nR2V0VmFsdWVzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
IWtleSkgeworICAgICAgICAvLyBBIG51bGwga2V5IG1lYW5zIGNsZWFyLgorICAgICAgICBhdXRv
IG5ld1N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOworCisg
ICAgICAgIC8vIEFueSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIGxvY2FsbHkgYWZ0ZXIgdGhlIGNs
ZWFyIG11c3Qgc3RpbGwgYmUga2VwdCBhcm91bmQgaW4gdGhlIG5ldyBtYXAuCisgICAgICAgIGZv
ciAoYXV0byBpdCA9IG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5iZWdpbigpLmtleXMoKSwgZW5kID0g
bV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmVuZCgpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgICAgICBjb25zdCBTdHJpbmcmIGtleSA9ICppdDsKKworICAgICAgICAgICAgU3RyaW5n
IHZhbHVlID0gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7CisgICAgICAgICAgICBpZiAoIXZh
bHVlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGFuZ2UgbXVzdCBoYXZlIGJlZW4gYSBw
ZW5kaW5nIHJlbW92ZSwgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWU7CisgICAgICAgICAgICBu
ZXdTdG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90YShrZXksIG9sZFZhbHVlKTsKKyAgICAg
ICAgfQorCisgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUobmV3U3RvcmFnZU1hcCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNob3VsZEFwcGx5Q2hhbmdlRm9yS2V5
KGtleSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbmV3VmFsdWUpIHsKKyAgICAgICAg
Ly8gQSBudWxsIG5ldyB2YWx1ZSBtZWFucyB0aGF0IHRoZSBpdGVtIHNob3VsZCBiZSByZW1vdmVk
LgorICAgICAgICBTdHJpbmcgb2xkVmFsdWU7CisgICAgICAgIG1fc3RvcmFnZU1hcC0+cmVtb3Zl
SXRlbShrZXksIG9sZFZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc3Rv
cmFnZU1hcC0+c2V0SXRlbUlnbm9yaW5nUXVvdGEoa2V5LCBuZXdWYWx1ZSk7Cit9CisKK3ZvaWQg
U3RvcmFnZUFyZWFNYXA6OmRpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3Jh
Z2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25z
dCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBpZiAo
IXNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKKyAgICAgICAgLy8gVGhpcyBzdG9yYWdlIGV2ZW50IG9y
aWdpbmF0ZXMgZnJvbSBhbm90aGVyIHByb2Nlc3Mgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgY2hh
bmdlIHRvIG91ciBzdG9yYWdlIGFyZWEgbWFwLgorICAgICAgICBhcHBseUNoYW5nZShrZXksIG5l
d1ZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoc3RvcmFnZVR5cGUoKSA9PSBTdG9yYWdlVHlwZTo6
U2Vzc2lvbikKKyAgICAgICAgZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHNvdXJjZVN0b3Jh
Z2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcpOworICAgIGVsc2UK
KyAgICAgICAgZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudChzb3VyY2VTdG9yYWdlQXJlYUlELCBr
ZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nKTsKK30KKwordm9pZCBTdG9yYWdlQXJl
YU1hcDo6Y2xlYXJDYWNoZSgpCit7CisgICAgcmVzZXRWYWx1ZXMoKTsKK30KKwordm9pZCBTdG9y
YWdlQXJlYU1hcDo6ZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBj
b25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBB
U1NFUlQoc3RvcmFnZVR5cGUoKSA9PSBTdG9yYWdlVHlwZTo6U2Vzc2lvbik7CisKKyAgICAvLyBO
YW1lc3BhY2UgSURzIGZvciBzZXNzaW9uIHN0b3JhZ2UgbmFtZXNwYWNlcyBhcmUgZXF1aXZhbGVu
dCB0byB3ZWIgcGFnZSBJRHMKKyAgICAvLyBzbyB3ZSBjYW4gZ2V0IHRoZSByaWdodCBwYWdlIGhl
cmUuCisgICAgV2ViUGFnZSogd2ViUGFnZSA9IFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLndlYlBh
Z2UobV9zdG9yYWdlTmFtZXNwYWNlSUQpOworICAgIGlmICghd2ViUGFnZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgVmVjdG9yPFJlZlB0cjxGcmFtZT4+IGZyYW1lczsKKworICAgIFBhZ2UqIHBh
Z2UgPSB3ZWJQYWdlLT5jb3JlUGFnZSgpOworICAgIGZvciAoRnJhbWUqIGZyYW1lID0gJnBhZ2Ut
Pm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLnRyYXZlcnNlTmV4dCgp
KSB7CisgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOworICAg
ICAgICBpZiAoIWRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpLmVxdWFsKG1fc2VjdXJpdHlPcmln
aW4ucHRyKCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgU3RvcmFnZSogc3Rv
cmFnZSA9IGRvY3VtZW50LT5kb21XaW5kb3coKS0+b3B0aW9uYWxTZXNzaW9uU3RvcmFnZSgpOwor
ICAgICAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBT
dG9yYWdlQXJlYUltcGwmIHN0b3JhZ2VBcmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFyZWFJbXBs
Jj4oc3RvcmFnZS0+YXJlYSgpKTsKKyAgICAgICAgaWYgKHN0b3JhZ2VBcmVhLnN0b3JhZ2VBcmVh
SUQoKSA9PSBzb3VyY2VTdG9yYWdlQXJlYUlEKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRo
ZSBzdG9yYWdlIGFyZWEgdGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lcy5hcHBlbmQo
ZnJhbWUpOworICAgIH0KKworICAgIFN0b3JhZ2VFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoU2Vz
c2lvblN0b3JhZ2VFdmVudHNUb0ZyYW1lcygqcGFnZSwgZnJhbWVzLCBrZXksIG9sZFZhbHVlLCBu
ZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdp
bihtX3NlY3VyaXR5T3JpZ2luKSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpc3BhdGNo
TG9jYWxTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3Ry
aW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUs
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQoreworICAgIEFTU0VSVChpc0xvY2FsU3RvcmFnZShz
dG9yYWdlVHlwZSgpKSk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVzOworCisg
ICAgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSAqV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2ViUGFn
ZUdyb3VwKG1fc3RvcmFnZU5hbWVzcGFjZUlEKS0+Y29yZVBhZ2VHcm91cCgpOworICAgIGNvbnN0
IEhhc2hTZXQ8UGFnZSo+JiBwYWdlcyA9IHBhZ2VHcm91cC5wYWdlcygpOworICAgIGZvciAoSGFz
aFNldDxQYWdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcGFnZXMuYmVnaW4oKSwgZW5kID0gcGFn
ZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBmb3IgKEZyYW1lKiBmcmFtZSA9
ICYoKml0KS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCkudHJhdmVy
c2VOZXh0KCkpIHsKKyAgICAgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1
bWVudCgpOworICAgICAgICAgICAgaWYgKCFkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKS5lcXVh
bChtX3NlY3VyaXR5T3JpZ2luLnB0cigpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgU3RvcmFnZSogc3RvcmFnZSA9IGRvY3VtZW50LT5kb21XaW5kb3coKS0+b3B0
aW9uYWxMb2NhbFN0b3JhZ2UoKTsKKyAgICAgICAgICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgU3RvcmFnZUFyZWFJbXBsJiBzdG9yYWdl
QXJlYSA9IHN0YXRpY19jYXN0PFN0b3JhZ2VBcmVhSW1wbCY+KHN0b3JhZ2UtPmFyZWEoKSk7Cisg
ICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFnZUFyZWFJRCgpID09IHNvdXJjZVN0b3Jh
Z2VBcmVhSUQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdG9yYWdlIGFyZWEg
dGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lcy5hcHBlbmQoZnJh
bWUpOworICAgICAgICB9CisgICAgfQorCisgICAgU3RvcmFnZUV2ZW50RGlzcGF0Y2hlcjo6ZGlz
cGF0Y2hMb2NhbFN0b3JhZ2VFdmVudHNUb0ZyYW1lcyhwYWdlR3JvdXAsIGZyYW1lcywga2V5LCBv
bGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZywgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2Vj
dXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3Jh
Z2VBcmVhTWFwLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdl
QXJlYU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI5ZTQzZTgwNzdmMGRlNDU4YjEwNjk3ZDk5NmYxY2U2NmFi
NzFjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3Rv
cmFnZS9TdG9yYWdlQXJlYU1hcC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBTdG9yYWdlQXJlYU1hcF9oCisjZGVmaW5lIFN0b3JhZ2VBcmVhTWFwX2gKKworI2luY2x1
ZGUgIk1lc3NhZ2VSZWNlaXZlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4u
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+CisjaW5jbHVkZSA8d3RmL0Zvcndh
cmQuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaENvdW50ZWRTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVm
Q291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworY2xhc3MgU2VjdXJpdHlPcmlnaW47CitjbGFzcyBTdG9yYWdlTWFwOworfQorCituYW1lc3Bh
Y2UgV2ViS2l0IHsKKworY2xhc3MgU3RvcmFnZUFyZWFJbXBsOworY2xhc3MgU3RvcmFnZU5hbWVz
cGFjZUltcGw7CisKK2NsYXNzIFN0b3JhZ2VBcmVhTWFwIDogcHVibGljIFJlZkNvdW50ZWQ8U3Rv
cmFnZUFyZWFNYXA+LCBwcml2YXRlIElQQzo6TWVzc2FnZVJlY2VpdmVyIHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgUmVmPFN0b3JhZ2VBcmVhTWFwPiBjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwq
LCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYpOworICAgIH5TdG9yYWdlQXJlYU1hcCgp
OworCisgICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25zdCB7IHJldHVy
biBtX3N0b3JhZ2VUeXBlOyB9CisKKyAgICB1bnNpZ25lZCBsZW5ndGgoKTsKKyAgICBTdHJpbmcg
a2V5KHVuc2lnbmVkIGluZGV4KTsKKyAgICBTdHJpbmcgaXRlbShjb25zdCBTdHJpbmcmIGtleSk7
CisgICAgdm9pZCBzZXRJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFy
ZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSwgYm9vbCYgcXVvdGFFeGNlcHRpb24pOworICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpG
cmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3Ry
aW5nJiBrZXkpOworICAgIHZvaWQgY2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBT
dG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEpOworICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3Ry
aW5nJiBrZXkpOworCisgICAgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHNlY3VyaXR5
T3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbi5nZXQoKTsgfQorCitwcml2
YXRlOgorICAgIFN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiwgUmVmPFdlYkNv
cmU6OlNlY3VyaXR5T3JpZ2luPiYmKTsKKworICAgIC8vIElQQzo6TWVzc2FnZVJlY2VpdmVyCisg
ICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXIm
KSBvdmVycmlkZTsKKworICAgIHZvaWQgZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBT
ZWVkKTsKKyAgICB2b2lkIGRpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0
IFN0cmluZyYga2V5LCBib29sIHF1b3RhRXJyb3IpOworICAgIHZvaWQgZGlkUmVtb3ZlSXRlbSh1
aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkpOworICAgIHZvaWQgZGlk
Q2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpOworCisgICAgdm9pZCBkaXNwYXRjaFN0b3Jh
Z2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwg
Y29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3Ry
aW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgY2xlYXJDYWNoZSgpOworCisgICAgdm9pZCByZXNl
dFZhbHVlcygpOworICAgIHZvaWQgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisKKyAgICBib29sIHNo
b3VsZEFwcGx5Q2hhbmdlRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBjb25zdDsKKyAgICB2b2lk
IGFwcGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKTsK
KworICAgIHZvaWQgZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBj
b25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7CisgICAgdm9p
ZCBkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQs
IGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcm
IG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7CisKKyAgICBSZWY8U3RvcmFnZU5h
bWVzcGFjZUltcGw+IG1fc3RvcmFnZU5hbWVzcGFjZTsKKworICAgIHVpbnQ2NF90IG1fc3RvcmFn
ZU1hcElEOworCisgICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdlVHlwZTsKKyAgICB1
aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKKyAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRl
czsKKyAgICBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fc2VjdXJpdHlPcmlnaW47CisK
KyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOworCisgICAgdWlu
dDY0X3QgbV9jdXJyZW50U2VlZDsKKyAgICBib29sIG1faGFzUGVuZGluZ0NsZWFyOworICAgIGJv
b2wgbV9oYXNQZW5kaW5nR2V0VmFsdWVzOworICAgIEhhc2hDb3VudGVkU2V0PFN0cmluZz4gbV9w
ZW5kaW5nVmFsdWVDaGFuZ2VzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRp
ZiAvLyBTdG9yYWdlQXJlYU1hcF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nl
c3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmIxNTkwNGYxNmJlYzE0MmIxMGI0ODAwZDEwNjQ1MDA5MzM4MzAwZDUKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1h
cC5tZXNzYWdlcy5pbgpAQCAtMCwwICsxLDMxIEBACisjIENvcHlyaWdodCAoQykgMjAxMyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQK
KyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUgorIyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisj
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKK21lc3NhZ2VzIC0+IFN0b3JhZ2VBcmVhTWFwIHsKKyAgICBEaWRHZXRW
YWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCisgICAgRGlkU2V0SXRlbSh1aW50NjRfdCBz
dG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtleSwgYm9vbCBxdW90YUV4Y2VwdGlvbikKKyAgICBEaWRS
ZW1vdmVJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcga2V5KQorICAgIERpZENs
ZWFyKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQorCisgICAgRGlzcGF0Y2hTdG9yYWdlRXZlbnQo
dWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgU3RyaW5nIGtleSwgU3RyaW5nIG9sZFZhbHVl
LCBTdHJpbmcgbmV3VmFsdWUsIFN0cmluZyB1cmxTdHJpbmcpCisgICAgQ2xlYXJDYWNoZSgpCit9
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdl
TmFtZXNwYWNlSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9T
dG9yYWdlTmFtZXNwYWNlSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmFiYmM1YzIxYzE4MTA4OGZmNTg2
MDQ1ZjAyNzE5ZTAyNDI2ODcyNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcApAQCAtMCwwICsxLDIx
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN0
b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCisKKyNpbmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKKyNp
bmNsdWRlICJTdG9yYWdlQXJlYU1hcC5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRl
ICJXZWJQYWdlR3JvdXBQcm94eS5oIgorI2luY2x1ZGUgIldlYlByb2Nlc3MuaCIKKyNpbmNsdWRl
IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KKyNpbmNs
dWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZXR0aW5n
cy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZVR5cGUuaD4KKwordXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitSZWZQdHI8U3RvcmFnZU5hbWVzcGFj
ZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCit7CisgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChTdG9yYWdlVHlwZTo6U2Vzc2lv
biwgaWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Cit9CisKK1JlZlB0cjxTdG9y
YWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUVwaGVtZXJhbExv
Y2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90YUlu
Qnl0ZXMpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1wbChT
dG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWwsIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5C
eXRlcykpOworfQorCitSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwg
dW5zaWduZWQgcXVvdGFJbkJ5dGVzKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RvcmFn
ZU5hbWVzcGFjZUltcGwoU3RvcmFnZVR5cGU6OkxvY2FsLCBpZGVudGlmaWVyLCBudWxscHRyLCBx
dW90YUluQnl0ZXMpKTsKK30KKworUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdl
TmFtZXNwYWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2
NF90IGlkZW50aWZpZXIsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiB0b3BMZXZlbE9yaWdpbiwg
dWludDY0X3QgcXVvdGFJbkJ5dGVzKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RvcmFn
ZU5hbWVzcGFjZUltcGwoU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2FsLCBpZGVudGlmaWVyLCAm
dG9wTGV2ZWxPcmlnaW4sIHF1b3RhSW5CeXRlcykpOworfQorCitTdG9yYWdlTmFtZXNwYWNlSW1w
bDo6U3RvcmFnZU5hbWVzcGFjZUltcGwoV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUs
IHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRv
cExldmVsT3JpZ2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCisgICAgOiBtX3N0b3JhZ2VUeXBl
KHN0b3JhZ2VUeXBlKQorICAgICwgbV9zdG9yYWdlTmFtZXNwYWNlSUQoc3RvcmFnZU5hbWVzcGFj
ZUlEKQorICAgICwgbV90b3BMZXZlbE9yaWdpbih0b3BMZXZlbE9yaWdpbikKKyAgICAsIG1fcXVv
dGFJbkJ5dGVzKHF1b3RhSW5CeXRlcykKK3sKK30KKworU3RvcmFnZU5hbWVzcGFjZUltcGw6On5T
dG9yYWdlTmFtZXNwYWNlSW1wbCgpCit7Cit9CisKK3ZvaWQgU3RvcmFnZU5hbWVzcGFjZUltcGw6
OmRpZERlc3Ryb3lTdG9yYWdlQXJlYU1hcChTdG9yYWdlQXJlYU1hcCYgbWFwKQoreworICAgIG1f
c3RvcmFnZUFyZWFNYXBzLnJlbW92ZShTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9y
aWdpbihtYXAuc2VjdXJpdHlPcmlnaW4oKSkpOworfQorCitSZWZQdHI8U3RvcmFnZUFyZWE+IFN0
b3JhZ2VOYW1lc3BhY2VJbXBsOjpzdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEm
IHNlY3VyaXR5T3JpZ2luKQoreworICAgIGlmIChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBl
OjpFcGhlbWVyYWxMb2NhbCkKKyAgICAgICAgcmV0dXJuIGVwaGVtZXJhbExvY2FsU3RvcmFnZUFy
ZWEoc2VjdXJpdHlPcmlnaW4pOworCisgICAgUmVmUHRyPFN0b3JhZ2VBcmVhTWFwPiBtYXA7CisK
KyAgICBhdXRvJiBzbG90ID0gbV9zdG9yYWdlQXJlYU1hcHMuYWRkKHNlY3VyaXR5T3JpZ2luLCBu
dWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKCFzbG90KSB7CisgICAgICAgIG1hcCA9
IFN0b3JhZ2VBcmVhTWFwOjpjcmVhdGUodGhpcywgc2VjdXJpdHlPcmlnaW4uc2VjdXJpdHlPcmln
aW4oKSk7CisgICAgICAgIHNsb3QgPSBtYXAuZ2V0KCk7CisgICAgfSBlbHNlCisgICAgICAgIG1h
cCA9IHNsb3Q7CisKKyAgICByZXR1cm4gU3RvcmFnZUFyZWFJbXBsOjpjcmVhdGUobWFwLnJlbGVh
c2VOb25OdWxsKCkpOworfQorCitjbGFzcyBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6RXBoZW1lcmFs
U3RvcmFnZUFyZWEgZmluYWwgOiBwdWJsaWMgU3RvcmFnZUFyZWEgeworcHVibGljOgorICAgIHN0
YXRpYyBSZWY8RXBoZW1lcmFsU3RvcmFnZUFyZWE+IGNyZWF0ZShjb25zdCBTZWN1cml0eU9yaWdp
bkRhdGEmIG9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKCpuZXcgRXBoZW1lcmFsU3RvcmFnZUFyZWEob3JpZ2luLCBxdW90YUluQnl0
ZXMpKTsKKyAgICB9CisKKyAgICBSZWY8RXBoZW1lcmFsU3RvcmFnZUFyZWE+IGNvcHkoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRXBoZW1lcmFsU3RvcmFnZUFyZWEoKnRo
aXMpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXBoZW1lcmFsU3RvcmFnZUFyZWEoY29uc3Qg
U2VjdXJpdHlPcmlnaW5EYXRhJiBvcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKKyAgICAg
ICAgOiBtX3NlY3VyaXR5T3JpZ2luRGF0YShvcmlnaW4pCisgICAgICAgICwgbV9zdG9yYWdlTWFw
KFN0b3JhZ2VNYXA6OmNyZWF0ZShxdW90YUluQnl0ZXMpKQorICAgIHsKKyAgICB9CisKKyAgICBF
cGhlbWVyYWxTdG9yYWdlQXJlYShFcGhlbWVyYWxTdG9yYWdlQXJlYSYgb3RoZXIpCisgICAgICAg
IDogbV9zZWN1cml0eU9yaWdpbkRhdGEob3RoZXIubV9zZWN1cml0eU9yaWdpbkRhdGEpCisgICAg
ICAgICwgbV9zdG9yYWdlTWFwKG90aGVyLm1fc3RvcmFnZU1hcCkKKyAgICB7CisgICAgfQorCisg
ICAgLy8gV2ViQ29yZTo6U3RvcmFnZUFyZWEuCisgICAgdW5zaWduZWQgbGVuZ3RoKCkKKyAgICB7
CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpOworICAgIH0KKworICAgIFN0
cmluZyBrZXkodW5zaWduZWQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gbV9zdG9yYWdl
TWFwLT5rZXkoaW5kZXgpOworICAgIH0KKworICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmluZyYg
a2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+Z2V0SXRlbShrZXkpOwor
ICAgIH0KKworICAgIHZvaWQgc2V0SXRlbShGcmFtZSosIGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIFN0
cmluZyBvbGRWYWx1ZTsKKyAgICAgICAgaWYgKGF1dG8gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5z
ZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbikpCisgICAgICAgICAg
ICBtX3N0b3JhZ2VNYXAgPSBXVEZNb3ZlKG5ld01hcCk7CisgICAgfQorCisgICAgdm9pZCByZW1v
dmVJdGVtKEZyYW1lKiwgY29uc3QgU3RyaW5nJiBrZXkpCisgICAgeworICAgICAgICBTdHJpbmcg
b2xkVmFsdWU7CisgICAgICAgIGlmIChhdXRvIG5ld01hcCA9IG1fc3RvcmFnZU1hcC0+cmVtb3Zl
SXRlbShrZXksIG9sZFZhbHVlKSkKKyAgICAgICAgICAgIG1fc3RvcmFnZU1hcCA9IFdURk1vdmUo
bmV3TWFwKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKEZyYW1lKikKKyAgICB7CisgICAgICAg
IGlmICghbV9zdG9yYWdlTWFwLT5sZW5ndGgoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpjcmVhdGUobV9zdG9yYWdlTWFwLT5xdW90
YSgpKTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+Y29udGFpbnMoa2V5KTsKKyAgICB9CisK
KyAgICBib29sIGNhbkFjY2Vzc1N0b3JhZ2UoRnJhbWUqIGZyYW1lKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGZyYW1lICYmIGZyYW1lLT5wYWdlKCk7CisgICAgfQorCisgICAgU3RvcmFnZVR5cGUg
c3RvcmFnZVR5cGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0b3JhZ2VUeXBlOjpF
cGhlbWVyYWxMb2NhbDsKKyAgICB9CisKKyAgICBzaXplX3QgbWVtb3J5Qnl0ZXNVc2VkQnlDYWNo
ZSgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVu
dEFjY2Vzc0NvdW50KCkgeyB9CisgICAgdm9pZCBkZWNyZW1lbnRBY2Nlc3NDb3VudCgpIHsgfQor
ICAgIHZvaWQgY2xvc2VEYXRhYmFzZUlmSWRsZSgpIHsgfQorCisgICAgU2VjdXJpdHlPcmlnaW5E
YXRhIHNlY3VyaXR5T3JpZ2luKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3NlY3Vy
aXR5T3JpZ2luRGF0YTsKKyAgICB9CisKKyAgICBTZWN1cml0eU9yaWdpbkRhdGEgbV9zZWN1cml0
eU9yaWdpbkRhdGE7CisgICAgUmVmUHRyPFN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKK307CisK
K1JlZlB0cjxTdG9yYWdlQXJlYT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmVwaGVtZXJhbExvY2Fs
U3RvcmFnZUFyZWEoY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKK3sK
KyAgICBhdXRvJiBzbG90ID0gbV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhcy5hZGQoc2VjdXJp
dHlPcmlnaW4sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoIXNsb3QpCisgICAg
ICAgIHNsb3QgPSBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6RXBoZW1lcmFsU3RvcmFnZUFyZWE6OmNy
ZWF0ZShzZWN1cml0eU9yaWdpbiwgbV9xdW90YUluQnl0ZXMpOworCisgICAgcmV0dXJuIHNsb3Qu
Z2V0KCk7Cit9CisKK1JlZlB0cjxTdG9yYWdlTmFtZXNwYWNlPiBTdG9yYWdlTmFtZXNwYWNlSW1w
bDo6Y29weShQYWdlKiBuZXdQYWdlKQoreworICAgIEFTU0VSVChtX3N0b3JhZ2VOYW1lc3BhY2VJ
RCk7CisKKyAgICBpZiAobV9zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZTo6U2Vzc2lvbikKKyAg
ICAgICAgcmV0dXJuIGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYlBhZ2U6OmZyb21D
b3JlUGFnZShuZXdQYWdlKS0+cGFnZUlEKCksIG1fcXVvdGFJbkJ5dGVzKTsKKworICAgIEFTU0VS
VChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpFcGhlbWVyYWxMb2NhbCk7CisgICAgUmVm
UHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBuZXdOYW1lc3BhY2UgPSBhZG9wdFJlZihuZXcgU3Rv
cmFnZU5hbWVzcGFjZUltcGwobV9zdG9yYWdlVHlwZSwgbV9zdG9yYWdlTmFtZXNwYWNlSUQsIG1f
dG9wTGV2ZWxPcmlnaW4uZ2V0KCksIG1fcXVvdGFJbkJ5dGVzKSk7CisKKyAgICBmb3IgKGF1dG8m
IGl0ZXIgOiBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzKQorICAgICAgICBuZXdOYW1lc3Bh
Y2UtPm1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXMuc2V0KGl0ZXIua2V5LCBpdGVyLnZhbHVl
LT5jb3B5KCkpOworCisgICAgcmV0dXJuIG5ld05hbWVzcGFjZTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFn
ZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0
b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mMTNhMjJkY2JkMjFiNjc0
MGU0NTIzN2Y0ZGZhZDgzMTI1NjcyOWUzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaApAQCAtMCwwICsx
LDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFdlYkNv
cmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdp
bkhhc2guaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9TdG9yYWdlTWFwLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTmFtZXNwYWNlLmg+
CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNz
IFN0b3JhZ2VBcmVhTWFwOworY2xhc3MgV2ViUGFnZTsKKworY2xhc3MgU3RvcmFnZU5hbWVzcGFj
ZUltcGwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZSB7CitwdWJsaWM6CisgICAg
c3RhdGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAg
ICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVFcGhlbWVyYWxMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5
dGVzKTsKKyAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5
dGVzKTsKKyAgICBzdGF0aWMgUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVUcmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6
U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpOwor
CisgICAgdmlydHVhbCB+U3RvcmFnZU5hbWVzcGFjZUltcGwoKTsKKworICAgIFdlYkNvcmU6OlN0
b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlVHlwZTsgfQor
ICAgIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFn
ZU5hbWVzcGFjZUlEOyB9CisgICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3Jp
Z2luKCkgY29uc3QgeyByZXR1cm4gbV90b3BMZXZlbE9yaWdpbi5nZXQoKTsgfQorICAgIHVuc2ln
bmVkIHF1b3RhSW5CeXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcXVvdGFJbkJ5dGVzOyB9CisKKyAg
ICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYU1hcChTdG9yYWdlQXJlYU1hcCYpOworCitwcml2
YXRlOgorICAgIGV4cGxpY2l0IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFdlYkNvcmU6OlN0b3JhZ2VU
eXBlLCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
KiB0b3BMZXZlbE9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKworICAgIFJlZlB0cjxX
ZWJDb3JlOjpTdG9yYWdlQXJlYT4gc3RvcmFnZUFyZWEoY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhJikgb3ZlcnJpZGU7CisgICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IGNvcHkoV2ViQ29yZTo6UGFnZSopIG92ZXJyaWRlOworCisgICAgUmVmUHRyPFdlYkNvcmU6
OlN0b3JhZ2VBcmVhPiBlcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhKGNvbnN0IFdlYkNvcmU6OlNl
Y3VyaXR5T3JpZ2luRGF0YSYpOworCisgICAgY29uc3QgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9z
dG9yYWdlVHlwZTsKKyAgICBjb25zdCB1aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKKwor
ICAgIC8vIE9ubHkgdXNlZCBmb3IgdHJhbnNpZW50IGxvY2FsIHN0b3JhZ2UgbmFtZXNwYWNlcy4K
KyAgICBjb25zdCBSZWZQdHI8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fdG9wTGV2ZWxPcmln
aW47CisKKyAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKKworICAgIEhhc2hNYXA8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYU1hcCo+IG1fc3RvcmFnZUFy
ZWFNYXBzOworCisgICAgY2xhc3MgRXBoZW1lcmFsU3RvcmFnZUFyZWE7CisgICAgSGFzaE1hcDxX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEsIFJlZlB0cjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4+
IG1fZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
U3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmEzNzU4
ZWI4NzQyODhmZmQ4OTY2MmQwMjVlMTU4ZDY2YTA3MGM1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJv
dmlkZXIuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaCIKKworI2lu
Y2x1ZGUgIlN0b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL05ldmVyRGVzdHJveWVkLmg+CisK
K3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGlj
IEhhc2hNYXA8dWludDY0X3QsIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcio+JiBzdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXJzKCkKK3sKKyAgICBzdGF0aWMgTmV2ZXJEZXN0cm95ZWQ8SGFzaE1h
cDx1aW50NjRfdCwgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKj4+IHN0b3JhZ2VOYW1lc3Bh
Y2VQcm92aWRlcnM7CisKKyAgICByZXR1cm4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyczsKK30K
KworUmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcj4gV2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyOjpnZXRPckNyZWF0ZSh1aW50NjRfdCBpZGVudGlmaWVyKQoreworICAgIGF1dG8m
IHNsb3QgPSBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzKCkuYWRkKGlkZW50aWZpZXIsIG51bGxw
dHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoc2xvdCkKKyAgICAgICAgcmV0dXJuIHNsb3Q7
CisKKyAgICBSZWZQdHI8V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyPiBzdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIgPSBhZG9wdFJlZihuZXcgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKGlk
ZW50aWZpZXIpKTsKKyAgICBzbG90ID0gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmdldCgpOwor
CisgICAgcmV0dXJuIHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjsKK30KKworV2ViU3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVyOjpXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIodWludDY0X3QgaWRl
bnRpZmllcikKKyAgICA6IG1faWRlbnRpZmllcihpZGVudGlmaWVyKQoreworfQorCitXZWJTdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXI6On5XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIoKQorewor
ICAgIEFTU0VSVChzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzKCkuY29udGFpbnMobV9pZGVudGlm
aWVyKSk7CisKKyAgICBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzKCkucmVtb3ZlKG1faWRlbnRp
Zmllcik7Cit9CisKK1JlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXI6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFBhZ2UmIHBh
Z2UsIHVuc2lnbmVkIHF1b3RhKQoreworICAgIHJldHVybiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6
Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKCZwYWdl
KS0+cGFnZUlEKCksIHF1b3RhKTsKK30KKworUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9y
YWdlTmFtZXNwYWNlKFBhZ2UmIHBhZ2UsIHVuc2lnbmVkIHF1b3RhKQoreworICAgIHJldHVybiBT
dG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdlTmFtZXNwYWNl
KFdlYlBhZ2U6OmZyb21Db3JlUGFnZSgmcGFnZSktPnBhZ2VJRCgpLCBxdW90YSk7Cit9CisKK1Jl
ZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXI6OmNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YSkKK3sKKyAgICBy
ZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSht
X2lkZW50aWZpZXIsIHF1b3RhKTsKK30KKworUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlKFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiB0b3BMZXZlbE9yaWdpbiwgdW5z
aWduZWQgcXVvdGEpCit7CisgICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVU
cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UobV9pZGVudGlmaWVyLCB0b3BMZXZlbE9yaWdp
biwgcXVvdGEpOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmE0YzIxNDI0YmYyNmUzNDEwMTA4OGJjMDI4MmI0MzEyMjZhNjQ5YTYKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE0LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcl9oCisjZGVmaW5lIFdlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcl9oCisKKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZlB0cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJv
dmlkZXI+IGdldE9yQ3JlYXRlKHVpbnQ2NF90IGlkZW50aWZpZXIpOworICAgIHZpcnR1YWwgfldl
YlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcigpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IFdl
YlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcih1aW50NjRfdCBpZGVudGlmaWVyKTsKKworICAgIFJl
ZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZShXZWJDb3JlOjpQYWdlJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOworICAgIFJlZlB0
cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UoV2ViQ29yZTo6UGFnZSYsIHVuc2lnbmVkIHF1b3RhKSBvdmVycmlkZTsKKyAgICBS
ZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNw
YWNlKHVuc2lnbmVkIHF1b3RhKSBvdmVycmlkZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFn
ZU5hbWVzcGFjZT4gY3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRlOworCisgICAgY29uc3Qg
dWludDY0X3QgbV9pZGVudGlmaWVyOworfTsKKworfQorCisjZW5kaWYgLy8gV2ViU3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316482</attachid>
            <date>2017-07-26 14:36:35 -0700</date>
            <delta_ts>2017-07-26 15:52:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174871-20170726143635.patch</filename>
            <type>text/plain</type>
            <size>319817</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5OTYwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZkMDA4NjNkMWFmZjRkZDFm
YmZhMzAxNzNiYjEwODFkOWVhYzVlYjQuLjg3YjJlZTkxNzdmMzNlMDlkNmVhYjFkOGNlODQ3MGE4
YzdiYWU0MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNDQgQEAKIDIwMTctMDctMjYgIEJyYWR5IEVp
ZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCisgICAgICAgIFJlbmFtZSB7V2ViL1VJfVByb2Nl
c3MvU3RvcmFnZSB0byB7V2ViL1VJfVByb2Nlc3MvV2ViU3RvcmFnZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDg3MQorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBzdGFuZGFyZCB0aGVzZSBkaXJl
Y3RvcmllcyBoZWxwIGltcGxlbWVudCBpcyB0aGUgIldlYiBTdG9yYWdlIiBzdGFuZGFyZC4KKyAg
ICAgICAgIlN0b3JhZ2UiIGlzIHRvbyBnZW5lcmFsIG9mIGEgd29yZCB0aGF0IHdlIGhhdmUgcGxh
bnMgdG8gc3RhcnQgdXNpbmcgaW4gb3RoZXIgY29udGV4dHMgc29vbi4KKworICAgICAgICAqIENN
YWtlTGlzdHMudHh0OgorICAgICAgICAqIERlcml2ZWRTb3VyY2VzLm1ha2U6CisgICAgICAgICog
UGxhdGZvcm1HVEsuY21ha2U6CisgICAgICAgICogUGxhdGZvcm1NYWMuY21ha2U6CisgICAgICAg
ICogUGxhdGZvcm1XUEUuY21ha2U6CisgICAgICAgICogV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6CisKKyAgICAgICAgKiBVSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcC4KKyAg
ICAgICAgKiBVSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
Lmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oLgorICAgICAgICAqIFVJUHJvY2Vzcy9X
ZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2UuY3BwLgorICAgICAg
ICAqIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmg6IFJlbmFtZWQg
ZnJvbSBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNl
LmguCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2Uv
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2Vi
U3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaDogUmVuYW1lZCBmcm9tIFNvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgu
CisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwOiBSZW5h
bWVkIGZyb20gU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5j
cHAuCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaDogUmVu
YW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIu
aC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdl
cy5pbjogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFn
ZU1hbmFnZXIubWVzc2FnZXMuaW4uCisgICAgICAgICogVUlQcm9jZXNzL1dlYlN0b3JhZ2UvaW9z
L0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbTogUmVuYW1lZCBmcm9tIFNvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklP
Uy5tbS4KKyAgICAgICAgKiBVSVByb2Nlc3MvaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZUlPUy5tbTogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1N0b3JhZ2UvaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5t
bS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuY3Bw
OiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFy
ZWFJbXBsLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJ
bXBsLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9y
YWdlQXJlYUltcGwuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFy
ZWFNYXAuY3BwOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2Uv
U3RvcmFnZUFyZWFNYXAuY3BwLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9y
YWdlQXJlYU1hcC5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3Jh
Z2UvU3RvcmFnZUFyZWFNYXAuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3Rv
cmFnZUFyZWFNYXAubWVzc2FnZXMuaW46IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbi4KKyAgICAgICAgKiBXZWJQ
cm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwOiBSZW5hbWVkIGZyb20g
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3Bw
LgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNlSW1wbC5o
OiBSZW5hbWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5h
bWVzcGFjZUltcGwuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3RvcmFn
ZU5hbWVzcGFjZVByb3ZpZGVyLmNwcDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAuCisgICAgICAgICog
V2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oOiBSZW5h
bWVkIGZyb20gU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyLmguCisKKzIwMTctMDctMjYgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBw
bGUuY29tPgorCiAgICAgICAgIFJlbW92ZSBEQVRBQkFTRV9QUk9DRVNTIGJ1aWxkIGZsYWcuCiAg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ4NjgKIApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DTWFrZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJLaXQv
Q01ha2VMaXN0cy50eHQKaW5kZXggMTIzZjRiZmE4MTNmMDNkMWQ3MzA1NTFkNzA0ZWVhNWYyMWQ2
YjZiNi4uNDQ1ZmQxNjQwZDVhNTcwOGM1NTcwOWQ5MGVjOGNjMjk4OGMwODFlNyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9DTWFrZUxpc3RzLnR4dAorKysgYi9Tb3VyY2UvV2ViS2l0L0NNYWtl
TGlzdHMudHh0CkBAIC00NCw4ICs0NCw4IEBAIHNldChXZWJLaXQyX0lOQ0xVREVfRElSRUNUT1JJ
RVMKICAgICAiJHtXRUJLSVQyX0RJUn0vVUlQcm9jZXNzL05ldHdvcmsvQ3VzdG9tUHJvdG9jb2xz
IgogICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3MvTm90aWZpY2F0aW9ucyIKICAgICAiJHtX
RUJLSVQyX0RJUn0vVUlQcm9jZXNzL1BsdWdpbnMiCi0gICAgIiR7V0VCS0lUMl9ESVJ9L1VJUHJv
Y2Vzcy9TdG9yYWdlIgogICAgICIke1dFQktJVDJfRElSfS9VSVByb2Nlc3MvVXNlckNvbnRlbnQi
CisgICAgIiR7V0VCS0lUMl9ESVJ9L1VJUHJvY2Vzcy9XZWJTdG9yYWdlIgogICAgICIke1dFQktJ
VDJfRElSfS9VSVByb2Nlc3MvV2Vic2l0ZURhdGEiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlBy
b2Nlc3MiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvQXBwbGVQYXkiCkBAIC03Mywx
MCArNzMsMTAgQEAgc2V0KFdlYktpdDJfSU5DTFVERV9ESVJFQ1RPUklFUwogICAgICIke1dFQktJ
VDJfRElSfS9XZWJQcm9jZXNzL1BsdWdpbnMiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nl
c3MvUGx1Z2lucy9OZXRzY2FwZSIKICAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9SZXNv
dXJjZUNhY2hlIgotICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1N0b3JhZ2UiCiAgICAg
IiR7V0VCS0lUMl9ESVJ9L1dlYlByb2Nlc3MvVXNlckNvbnRlbnQiCiAgICAgIiR7V0VCS0lUMl9E
SVJ9L1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQiCiAgICAgIiR7V0VCS0lUMl9ESVJ9L1dlYlBy
b2Nlc3MvV2ViUGFnZSIKKyAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9XZWJTdG9yYWdl
IgogICAgICIke0RFUklWRURfU09VUkNFU19XRUJLSVQyX0RJUn0iCiAgICAgIiR7REVSSVZFRF9T
T1VSQ0VTX1dFQktJVDJfRElSfS9pbmNsdWRlIgogICAgICIke0NNQUtFX1NPVVJDRV9ESVJ9L1dl
YktpdExpYnJhcmllcyIKQEAgLTI4NCw2ICsyODQsNyBAQCBzZXQoV2ViS2l0Ml9TT1VSQ0VTCiAg
ICAgVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRpb24uY3BwCiAgICAgVUlQcm9jZXNzL1Byb2Nlc3NU
aHJvdHRsZXIuY3BwCiAgICAgVUlQcm9jZXNzL1JlbW90ZVdlYkluc3BlY3RvclByb3h5LmNwcAor
ICAgIFVJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3Bw
CiAgICAgVUlQcm9jZXNzL1Jlc3BvbnNpdmVuZXNzVGltZXIuY3BwCiAgICAgVUlQcm9jZXNzL1N0
YXRpc3RpY3NSZXF1ZXN0LmNwcAogICAgIFVJUHJvY2Vzcy9UZXh0Q2hlY2tlckNvbXBsZXRpb24u
Y3BwCkBAIC00MjksMTMgKzQzMCwxMiBAQCBzZXQoV2ViS2l0Ml9TT1VSQ0VTCiAgICAgVUlQcm9j
ZXNzL1BsdWdpbnMvUGx1Z2luUHJvY2Vzc01hbmFnZXIuY3BwCiAgICAgVUlQcm9jZXNzL1BsdWdp
bnMvUGx1Z2luUHJvY2Vzc1Byb3h5LmNwcAogCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxT
dG9yYWdlRGF0YWJhc2UuY3BwCi0gICAgVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyLmNwcAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKLQogICAgIFVJUHJvY2Vzcy9Vc2VyQ29udGVudC9X
ZWJTY3JpcHRNZXNzYWdlSGFuZGxlci5jcHAKICAgICBVSVByb2Nlc3MvVXNlckNvbnRlbnQvV2Vi
VXNlckNvbnRlbnRDb250cm9sbGVyUHJveHkuY3BwCiAKKyAgICBVSVByb2Nlc3MvV2ViU3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKKyAgICBVSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwCisKICAgICBVSVByb2Nlc3MvV2Vic2l0ZURhdGEv
V2Vic2l0ZURhdGFSZWNvcmQuY3BwCiAgICAgVUlQcm9jZXNzL1dlYnNpdGVEYXRhL1dlYnNpdGVE
YXRhU3RvcmUuY3BwCiAKQEAgLTUyNywxMSArNTI3LDYgQEAgc2V0KFdlYktpdDJfU09VUkNFUwog
ICAgIFdlYlByb2Nlc3MvUGx1Z2lucy9OZXRzY2FwZS9OZXRzY2FwZVBsdWdpbk5vbmUuY3BwCiAg
ICAgV2ViUHJvY2Vzcy9QbHVnaW5zL05ldHNjYXBlL05ldHNjYXBlUGx1Z2luU3RyZWFtLmNwcAog
Ci0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKLSAgICBXZWJQcm9j
ZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAuY3BwCi0gICAgV2ViUHJvY2Vzcy9TdG9yYWdlL1N0
b3JhZ2VOYW1lc3BhY2VJbXBsLmNwcAotICAgIFdlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdl
TmFtZXNwYWNlUHJvdmlkZXIuY3BwCi0KICAgICBXZWJQcm9jZXNzL1VzZXJDb250ZW50L1dlYlVz
ZXJDb250ZW50Q29udHJvbGxlci5jcHAKIAogICAgIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQv
U2Vzc2lvblN0YXRlQ29udmVyc2lvbi5jcHAKQEAgLTU3Niw2ICs1NzEsMTEgQEAgc2V0KFdlYktp
dDJfU09VUkNFUwogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJVUkxTY2hlbWVIYW5kbGVyUHJv
eHkuY3BwCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlVSTFNjaGVtZVRhc2tQcm94eS5jcHAK
ICAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViVW5kb1N0ZXAuY3BwCisKKyAgICBXZWJQcm9jZXNz
L1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcAorICAgIFdlYlByb2Nlc3MvV2ViU3RvcmFn
ZS9TdG9yYWdlQXJlYU1hcC5jcHAKKyAgICBXZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5h
bWVzcGFjZUltcGwuY3BwCisgICAgV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1dlYlN0b3JhZ2VOYW1l
c3BhY2VQcm92aWRlci5jcHAKICkKIAogc2V0KFdlYktpdDJfTUVTU0FHRVNfSU5fRklMRVMKQEAg
LTYzMSwxMCArNjMxLDEwIEBAIHNldChXZWJLaXQyX01FU1NBR0VTX0lOX0ZJTEVTCiAKICAgICBV
SVByb2Nlc3MvUGx1Z2lucy9QbHVnaW5Qcm9jZXNzUHJveHkubWVzc2FnZXMuaW4KIAotICAgIFVJ
UHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCi0KICAgICBVSVByb2Nl
c3MvVXNlckNvbnRlbnQvV2ViVXNlckNvbnRlbnRDb250cm9sbGVyUHJveHkubWVzc2FnZXMuaW4K
IAorICAgIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluCisK
ICAgICBXZWJQcm9jZXNzL1dlYlByb2Nlc3MubWVzc2FnZXMuaW4KIAogICAgIFdlYlByb2Nlc3Mv
QXV0b21hdGlvbi9XZWJBdXRvbWF0aW9uU2Vzc2lvblByb3h5Lm1lc3NhZ2VzLmluCkBAIC02NjEs
OCArNjYxLDYgQEAgc2V0KFdlYktpdDJfTUVTU0FHRVNfSU5fRklMRVMKICAgICBXZWJQcm9jZXNz
L1BsdWdpbnMvUGx1Z2luUHJvY2Vzc0Nvbm5lY3Rpb25NYW5hZ2VyLm1lc3NhZ2VzLmluCiAgICAg
V2ViUHJvY2Vzcy9QbHVnaW5zL1BsdWdpblByb3h5Lm1lc3NhZ2VzLmluCiAKLSAgICBXZWJQcm9j
ZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4KLQogICAgIFdlYlByb2Nlc3Mv
VXNlckNvbnRlbnQvV2ViVXNlckNvbnRlbnRDb250cm9sbGVyLm1lc3NhZ2VzLmluCiAKICAgICBX
ZWJQcm9jZXNzL1dlYlBhZ2UvRHJhd2luZ0FyZWEubWVzc2FnZXMuaW4KQEAgLTY3Myw2ICs2NzEs
OCBAQCBzZXQoV2ViS2l0Ml9NRVNTQUdFU19JTl9GSUxFUwogICAgIFdlYlByb2Nlc3MvV2ViUGFn
ZS9XZWJJbnNwZWN0b3JJbnRlcnJ1cHREaXNwYXRjaGVyLm1lc3NhZ2VzLmluCiAgICAgV2ViUHJv
Y2Vzcy9XZWJQYWdlL1dlYkluc3BlY3RvclVJLm1lc3NhZ2VzLmluCiAgICAgV2ViUHJvY2Vzcy9X
ZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KKworICAgIFdlYlByb2Nlc3MvV2ViU3RvcmFnZS9T
dG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbgogKQogCiBzZXQoV2ViUHJvY2Vzc19MSUJSQVJJRVMK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvRGVyaXZlZFNvdXJjZXMubWFrZSBiL1NvdXJjZS9X
ZWJLaXQvRGVyaXZlZFNvdXJjZXMubWFrZQppbmRleCA0NDY4ZTFlOTBmYmJjODlhM2Q1Y2VkNzI2
MWIwNDBkMWI3ZDRkYmM3Li4wYjA1NTA4Y2E5NmViOGIzZTRmYTIzNWFmN2MxZDA3ZTA2ZDc3NjNl
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L0Rlcml2ZWRTb3VyY2VzLm1ha2UKKysrIGIvU291
cmNlL1dlYktpdC9EZXJpdmVkU291cmNlcy5tYWtlCkBAIC01Nyw2ICs1Nyw3IEBAIFZQQVRIID0g
XAogICAgICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9Vc2VyQ29udGVudCBcCiAgICAgJChXZWJLaXQy
KS9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0IFwKICAgICAkKFdlYktpdDIpL1dlYlByb2Nlc3Mv
V2ViUGFnZSBcCisgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UgXAogICAgICQo
V2ViS2l0MikvV2ViUHJvY2Vzcy9jb2NvYSBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL2lv
cyBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzIFwKQEAgLTcxLDggKzcyLDggQEAgVlBBVEgg
PSBcCiAgICAgJChXZWJLaXQyKS9VSVByb2Nlc3MvTmV0d29yay9DdXN0b21Qcm90b2NvbHMgXAog
ICAgICQoV2ViS2l0MikvVUlQcm9jZXNzL05vdGlmaWNhdGlvbnMgXAogICAgICQoV2ViS2l0Mikv
VUlQcm9jZXNzL1BsdWdpbnMgXAotICAgICQoV2ViS2l0MikvVUlQcm9jZXNzL1N0b3JhZ2UgXAog
ICAgICQoV2ViS2l0MikvVUlQcm9jZXNzL1VzZXJDb250ZW50IFwKKyAgICAkKFdlYktpdDIpL1VJ
UHJvY2Vzcy9XZWJTdG9yYWdlIFwKICAgICAkKFdlYktpdDIpL1VJUHJvY2Vzcy9tYWMgXAogICAg
ICQoV2ViS2l0MikvVUlQcm9jZXNzL2lvcyBcCiAgICAgJChXRUJLSVRBRERJVElPTlNfSEVBREVS
X1NFQVJDSF9QQVRIUykgXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybUdUSy5j
bWFrZSBiL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1HVEsuY21ha2UKaW5kZXggNGRjZmQ2MmQ2MmQ4
ZTdjNjk3YWRlMmE5YjQ1MGJkMGI0ZTNjYmRiYS4uZWUyODgzYjI4MzVlMmRjNzMzYjhhMmE2NDRk
N2RmNjMzYzRiYWExZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybUdUSy5jbWFr
ZQorKysgYi9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtR1RLLmNtYWtlCkBAIC0yMDEsNyArMjAxLDcg
QEAgbGlzdChBUFBFTkQgV2ViS2l0Ml9TT1VSQ0VTCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvdW5p
eC9QbHVnaW5JbmZvU3RvcmVVbml4LmNwcAogICAgIFVJUHJvY2Vzcy9QbHVnaW5zL3VuaXgvUGx1
Z2luUHJvY2Vzc1Byb3h5VW5peC5jcHAKIAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VN
YW5hZ2VyLmNwcAorICAgIFVJUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcAog
CiAgICAgVUlQcm9jZXNzL1dlYnNpdGVEYXRhL3VuaXgvV2Vic2l0ZURhdGFTdG9yZVVuaXguY3Bw
CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMuY21ha2UgYi9Tb3VyY2Uv
V2ViS2l0L1BsYXRmb3JtTWFjLmNtYWtlCmluZGV4IDYzNThmYWY4OWFlZWY4Njc3MWFlNzlhNDQ5
YjU5Y2IyZjllMjU1Y2EuLmE0MTExZjNjZjM2OTkyNWU2Yjk3YjVkZmRiNTBlMGNiZGQ2ZDJhNjIg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMuY21ha2UKKysrIGIvU291cmNl
L1dlYktpdC9QbGF0Zm9ybU1hYy5jbWFrZQpAQCAtMjc4LDcgKzI3OCw3IEBAIGxpc3QoQVBQRU5E
IFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3JQcm94eS5jcHAKICAgICBVSVByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9s
bGluZ1RyZWUuY3BwCiAKLSAgICBVSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5jcHAK
KyAgICBVSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5jcHAKIAogICAgIFVJUHJv
Y2Vzcy9XZWJzaXRlRGF0YS9Db2NvYS9XZWJzaXRlRGF0YVN0b3JlQ29jb2EubW0KIApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybVdQRS5jbWFrZSBiL1NvdXJjZS9XZWJLaXQvUGxh
dGZvcm1XUEUuY21ha2UKaW5kZXggNWM2YjlmZTY0ZWJjMWM1YWU5MDBiY2FjMjQ4YTNmZWNjMzY0
ZWE1ZS4uZjZlZTY3NGZkOGU5ZjRiMTBjYTcyYTViYjkzMjVkYmRlMDIyMTI0YSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9QbGF0Zm9ybVdQRS5jbWFrZQorKysgYi9Tb3VyY2UvV2ViS2l0L1Bs
YXRmb3JtV1BFLmNtYWtlCkBAIC0xOTgsNyArMTk4LDcgQEAgbGlzdChBUFBFTkQgV2ViS2l0Ml9T
T1VSQ0VTCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvdW5peC9QbHVnaW5JbmZvU3RvcmVVbml4LmNw
cAogICAgIFVJUHJvY2Vzcy9QbHVnaW5zL3VuaXgvUGx1Z2luUHJvY2Vzc1Byb3h5VW5peC5jcHAK
IAotICAgIFVJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcAorICAgIFVJUHJvY2Vz
cy9XZWJTdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmNwcAogCiAgICAgVUlQcm9jZXNzL1dlYnNpdGVE
YXRhL3VuaXgvV2Vic2l0ZURhdGFTdG9yZVVuaXguY3BwCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5j
cHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQzMDQ1MjU3Nzc4OGU5YjAzODMxMTBmZjBlNTQy
N2E4ZDk5NmU1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9S
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwCkBAIC0wLDAgKzEsMzQ1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIgorCisjaW5jbHVkZSAiTG9nZ2luZy5o
IgorI2luY2x1ZGUgIldlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9yZS5oIgorI2luY2x1ZGUg
PFdlYkNvcmUvRmlsZU1vbml0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4K
KyNpbmNsdWRlIDxXZWJDb3JlL0tleWVkQ29kaW5nLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TaGFy
ZWRCdWZmZXIuaD4KKyNpbmNsdWRlIDx3dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi9Xb3Jr
UXVldWUuaD4KKyNpbmNsdWRlIDx3dGYvdGhyZWFkcy9CaW5hcnlTZW1hcGhvcmUuaD4KKworbmFt
ZXNwYWNlIFdlYktpdCB7CisKK2NvbnN0ZXhwciBTZWNvbmRzIG1pbmltdW1Xcml0ZUludGVydmFs
IHsgNV9taW4gfTsKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK3N0YXRpYyBib29sIGhh
c0ZpbGVDaGFuZ2VkU2luY2UoY29uc3QgU3RyaW5nJiBwYXRoLCBXYWxsVGltZSBzaW5jZSkKK3sK
KyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICB0aW1lX3QgbW9kaWZpY2F0aW9u
VGltZTsKKyAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKHBhdGgsIG1vZGlmaWNhdGlv
blRpbWUpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBXYWxsVGltZTo6ZnJv
bVJhd1NlY29uZHMobW9kaWZpY2F0aW9uVGltZSkgPiBzaW5jZTsKK30KKworc3RhdGljIHN0ZDo6
dW5pcXVlX3B0cjxLZXllZERlY29kZXI+IGNyZWF0ZURlY29kZXJGb3JGaWxlKGNvbnN0IFN0cmlu
ZyYgcGF0aCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBhdXRvIGhh
bmRsZSA9IG9wZW5BbmRMb2NrRmlsZShwYXRoLCBPcGVuRm9yUmVhZCk7CisgICAgaWYgKGhhbmRs
ZSA9PSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsK
KworICAgIGxvbmcgbG9uZyBmaWxlU2l6ZSA9IDA7CisgICAgaWYgKCFnZXRGaWxlU2l6ZShoYW5k
bGUsIGZpbGVTaXplKSkgeworICAgICAgICB1bmxvY2tBbmRDbG9zZUZpbGUoaGFuZGxlKTsKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IGJ5dGVzVG9SZWFkOwor
ICAgIGlmICghV1RGOjpjb252ZXJ0U2FmZWx5KGZpbGVTaXplLCBieXRlc1RvUmVhZCkpIHsKKyAg
ICAgICAgdW5sb2NrQW5kQ2xvc2VGaWxlKGhhbmRsZSk7CisgICAgICAgIHJldHVybiBudWxscHRy
OworICAgIH0KKworICAgIFZlY3RvcjxjaGFyPiBidWZmZXIoYnl0ZXNUb1JlYWQpOworICAgIHNp
emVfdCB0b3RhbEJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShoYW5kbGUsIGJ1ZmZlci5kYXRhKCks
IGJ1ZmZlci5zaXplKCkpOworCisgICAgdW5sb2NrQW5kQ2xvc2VGaWxlKGhhbmRsZSk7CisKKyAg
ICBpZiAodG90YWxCeXRlc1JlYWQgIT0gYnl0ZXNUb1JlYWQpCisgICAgICAgIHJldHVybiBudWxs
cHRyOworCisgICAgcmV0dXJuIEtleWVkRGVjb2Rlcjo6ZGVjb2RlcihyZWludGVycHJldF9jYXN0
PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIuZGF0YSgpKSwgYnVmZmVyLnNpemUoKSk7Cit9CisKK1Jl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6UmVzb3VyY2VMb2FkU3RhdGlz
dGljc1BlcnNpc3RlbnRTdG9yYWdlKFdlYlJlc291cmNlTG9hZFN0YXRpc3RpY3NTdG9yZSYgc3Rv
cmUsIGNvbnN0IFN0cmluZyYgc3RvcmFnZURpcmVjdG9yeVBhdGgpCisgICAgOiBtX21lbW9yeVN0
b3JlKHN0b3JlKQorICAgICwgbV9zdG9yYWdlRGlyZWN0b3J5UGF0aChzdG9yYWdlRGlyZWN0b3J5
UGF0aCkKKyAgICAsIG1fYXN5bmNXcml0ZVRpbWVyKFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJlJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6YXN5bmNXcml0ZVRpbWVyRmly
ZWQpCit7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
Ojppbml0aWFsaXplKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBw
b3B1bGF0ZU1lbW9yeVN0b3JlRnJvbURpc2soKTsKKyAgICBzdGFydE1vbml0b3JpbmdEaXNrKCk7
Cit9CisKK1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6flJlc291cmNl
TG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZSgpCit7CisgICAgZmluaXNoQWxsUGVuZGlu
Z1dvcmtTeW5jaHJvbm91c2x5KCk7CisgICAgQVNTRVJUKCFtX2hhc1BlbmRpbmdXcml0ZSk7Cit9
CisKK1N0cmluZyBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnN0b3Jh
Z2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdG9yYWdlRGlyZWN0b3J5
UGF0aC5pc29sYXRlZENvcHkoKTsKK30KKworU3RyaW5nIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZTo6cmVzb3VyY2VMb2dGaWxlUGF0aCgpIGNvbnN0Cit7CisgICAgU3Ry
aW5nIHN0b3JhZ2VQYXRoID0gc3RvcmFnZURpcmVjdG9yeVBhdGgoKTsKKyAgICBpZiAoc3RvcmFn
ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZW1wdHlTdHJpbmcoKTsKKworICAgIHJl
dHVybiBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoc3RvcmFnZVBhdGgsICJmdWxsX2Jyb3dzaW5n
X3Nlc3Npb25fcmVzb3VyY2VMb2cucGxpc3QiKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnN0YXJ0TW9uaXRvcmluZ0Rpc2soKQoreworICAgIEFT
U0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOworICAgIGlmIChtX2ZpbGVNb25pdG9yKQorICAgICAg
ICByZXR1cm47CisKKyAgICBTdHJpbmcgcmVzb3VyY2VMb2dQYXRoID0gcmVzb3VyY2VMb2dGaWxl
UGF0aCgpOworICAgIGlmIChyZXNvdXJjZUxvZ1BhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX2ZpbGVNb25pdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxGaWxlTW9uaXRvcj4o
cmVzb3VyY2VMb2dQYXRoLCBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLCBbdGhpc10g
KEZpbGVNb25pdG9yOjpGaWxlQ2hhbmdlVHlwZSB0eXBlKSB7CisgICAgICAgIEFTU0VSVCghUnVu
TG9vcDo6aXNNYWluKCkpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBG
aWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGU6Ok1vZGlmaWNhdGlvbjoKKyAgICAgICAgICAgIHJl
ZnJlc2hNZW1vcnlTdG9yZUZyb21EaXNrKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGU6OlJlbW92YWw6CisgICAgICAgICAgICBt
X21lbW9yeVN0b3JlLmNsZWFySW5NZW1vcnkoKTsKKyAgICAgICAgICAgIG1fZmlsZU1vbml0b3Ig
PSBudWxscHRyOworICAgICAgICAgICAgbW9uaXRvckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3Mo
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjptb25pdG9yRGlyZWN0b3J5Rm9y
TmV3U3RhdGlzdGljcygpCit7CisgICAgU3RyaW5nIHN0b3JhZ2VQYXRoID0gc3RvcmFnZURpcmVj
dG9yeVBhdGgoKTsKKyAgICBBU1NFUlQoIXN0b3JhZ2VQYXRoLmlzRW1wdHkoKSk7CisKKyAgICBp
ZiAoIWZpbGVFeGlzdHMoc3RvcmFnZVBhdGgpKSB7CisgICAgICAgIGlmICghbWFrZUFsbERpcmVj
dG9yaWVzKHN0b3JhZ2VQYXRoKSkgeworICAgICAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVz
b3VyY2VMb2FkU3RhdGlzdGljcywgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3Rv
cmFnZTogRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgcGF0aCAlcyIsIHN0b3JhZ2VQYXRoLnV0
ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisg
ICAgbV9maWxlTW9uaXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8RmlsZU1vbml0b3I+KHN0b3JhZ2VQ
YXRoLCBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLCBbdGhpc10gKEZpbGVNb25pdG9y
OjpGaWxlQ2hhbmdlVHlwZSB0eXBlKSB7CisgICAgICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWlu
KCkpOworICAgICAgICBpZiAodHlwZSA9PSBGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGU6OlJl
bW92YWwpIHsKKyAgICAgICAgICAgIC8vIERpcmVjdG9yeSB3YXMgcmVtb3ZlZCEKKyAgICAgICAg
ICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgU3RyaW5nIHJlc291cmNlTG9nUGF0aCA9IHJlc291cmNlTG9nRmlsZVBh
dGgoKTsKKyAgICAgICAgQVNTRVJUKCFyZXNvdXJjZUxvZ1BhdGguaXNFbXB0eSgpKTsKKworICAg
ICAgICBpZiAoIWZpbGVFeGlzdHMocmVzb3VyY2VMb2dQYXRoKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKKworICAgICAgICByZWZyZXNo
TWVtb3J5U3RvcmVGcm9tRGlzaygpOworICAgICAgICBzdGFydE1vbml0b3JpbmdEaXNrKCk7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
OjpzdG9wTW9uaXRvcmluZ0Rpc2soKQoreworICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkp
OworICAgIG1fZmlsZU1vbml0b3IgPSBudWxscHRyOworfQorCisvLyBUaGlzIGlzIGNhbGxlZCB3
aGVuIHRoZSBmaWxlIGNoYW5nZXMgb24gZGlzay4KK3ZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlOjpyZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlzaygpCit7CisgICAg
QVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBTdHJpbmcgZmlsZVBhdGggPSByZXNv
dXJjZUxvZ0ZpbGVQYXRoKCk7CisgICAgaWYgKGZpbGVQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gV2Ugc29tZXRpbWVzIHNlZSBmaWxlIGNoYW5nZWQgZXZlbnRzIGZy
b20gYmVmb3JlIG91ciBsb2FkIGNvbXBsZXRlZCAod2Ugc3RhcnQKKyAgICAvLyByZWFkaW5nIGF0
IHRoZSBmaXJzdCBjaGFuZ2UgZXZlbnQsIGJ1dCB3ZSBtaWdodCByZWNlaXZlIGEgc2VyaWVzIG9m
IGV2ZW50cyByZWxhdGVkCisgICAgLy8gdG8gdGhlIHNhbWUgZmlsZSBvcGVyYXRpb24pLiBDYXRj
aCB0aGlzIGNhc2UgdG8gYXZvaWQgcmVhZGluZyBvdmVybHkgb2Z0ZW4uCisgICAgaWYgKCFoYXNG
aWxlQ2hhbmdlZFNpbmNlKGZpbGVQYXRoLCBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgV2FsbFRpbWUgcmVhZFRpbWUgPSBXYWxsVGltZTo6bm93
KCk7CisKKyAgICBhdXRvIGRlY29kZXIgPSBjcmVhdGVEZWNvZGVyRm9yRmlsZShmaWxlUGF0aCk7
CisgICAgaWYgKCFkZWNvZGVyKQorICAgICAgICByZXR1cm47CisKKyAgICBtX21lbW9yeVN0b3Jl
Lm1lcmdlV2l0aERhdGFGcm9tRGVjb2RlcigqZGVjb2Rlcik7CisgICAgbV9sYXN0U3RhdGlzdGlj
c0ZpbGVTeW5jVGltZSA9IHJlYWRUaW1lOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZTo6cG9wdWxhdGVNZW1vcnlTdG9yZUZyb21EaXNrKCkKK3sKKyAg
ICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIFN0cmluZyBmaWxlUGF0aCA9IHJl
c291cmNlTG9nRmlsZVBhdGgoKTsKKyAgICBpZiAoZmlsZVBhdGguaXNFbXB0eSgpIHx8ICFmaWxl
RXhpc3RzKGZpbGVQYXRoKSkgeworICAgICAgICBtX21lbW9yeVN0b3JlLmdyYW5kZmF0aGVyRXhp
c3RpbmdXZWJzaXRlRGF0YSgpOworICAgICAgICBtb25pdG9yRGlyZWN0b3J5Rm9yTmV3U3RhdGlz
dGljcygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFoYXNGaWxlQ2hhbmdl
ZFNpbmNlKGZpbGVQYXRoLCBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lKSkgeworICAgICAg
ICAvLyBObyBuZWVkIHRvIGdyYW5kZmF0aGVyIGluIHRoaXMgY2FzZS4KKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIFdhbGxUaW1lIHJlYWRUaW1lID0gV2FsbFRpbWU6Om5vdygpOworCisg
ICAgYXV0byBkZWNvZGVyID0gY3JlYXRlRGVjb2RlckZvckZpbGUoZmlsZVBhdGgpOworICAgIGlm
ICghZGVjb2RlcikgeworICAgICAgICBtX21lbW9yeVN0b3JlLmdyYW5kZmF0aGVyRXhpc3RpbmdX
ZWJzaXRlRGF0YSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUX1dJVEhf
TUVTU0FHRShtX21lbW9yeVN0b3JlLmlzRW1wdHkoKSwgIlRoaXMgaXMgdGhlIGluaXRpYWwgaW1w
b3J0IHNvIHRoZSBzdG9yZSBzaG91bGQgYmUgZW1wdHkiKTsKKyAgICBtX21lbW9yeVN0b3JlLm1l
cmdlV2l0aERhdGFGcm9tRGVjb2RlcigqZGVjb2Rlcik7CisKKyAgICBtX2xhc3RTdGF0aXN0aWNz
RmlsZVN5bmNUaW1lID0gcmVhZFRpbWU7CisKKyAgICBtX21lbW9yeVN0b3JlLmxvZ1Rlc3RpbmdF
dmVudChBU0NJSUxpdGVyYWwoIlBvcHVsYXRlZFdpdGhvdXRHcmFuZGZhdGhlcmluZyIpKTsKK30K
Kwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmFzeW5jV3Jp
dGVUaW1lckZpcmVkKCkKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworICAgIG1f
bWVtb3J5U3RvcmUuc3RhdGlzdGljc1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXNdICgpIG11dGFibGUg
eworICAgICAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7CisgICAgfSk7Cit9CisKK3ZvaWQg
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjp3cml0ZU1lbW9yeVN0b3Jl
VG9EaXNrKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIG1faGFz
UGVuZGluZ1dyaXRlID0gZmFsc2U7CisgICAgc3RvcE1vbml0b3JpbmdEaXNrKCk7CisKKyAgICBh
dXRvIGVuY29kZXIgPSBtX21lbW9yeVN0b3JlLmNyZWF0ZUVuY29kZXJGcm9tRGF0YSgpOworICAg
IGF1dG8gcmF3RGF0YSA9IGVuY29kZXItPmZpbmlzaEVuY29kaW5nKCk7CisgICAgaWYgKCFyYXdE
YXRhKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIHN0b3JhZ2VQYXRoID0gc3RvcmFnZURp
cmVjdG9yeVBhdGgoKTsKKyAgICBpZiAoIXN0b3JhZ2VQYXRoLmlzRW1wdHkoKSkgeworICAgICAg
ICBtYWtlQWxsRGlyZWN0b3JpZXMoc3RvcmFnZVBhdGgpOworICAgICAgICBleGNsdWRlRnJvbUJh
Y2t1cCgpOworICAgIH0KKworICAgIGF1dG8gaGFuZGxlID0gb3BlbkFuZExvY2tGaWxlKHJlc291
cmNlTG9nRmlsZVBhdGgoKSwgT3BlbkZvcldyaXRlKTsKKyAgICBpZiAoaGFuZGxlID09IGludmFs
aWRQbGF0Zm9ybUZpbGVIYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIGludDY0X3Qgd3Jp
dHRlbkJ5dGVzID0gd3JpdGVUb0ZpbGUoaGFuZGxlLCByYXdEYXRhLT5kYXRhKCksIHJhd0RhdGEt
PnNpemUoKSk7CisgICAgdW5sb2NrQW5kQ2xvc2VGaWxlKGhhbmRsZSk7CisKKyAgICBpZiAod3Jp
dHRlbkJ5dGVzICE9IHN0YXRpY19jYXN0PGludDY0X3Q+KHJhd0RhdGEtPnNpemUoKSkpCisgICAg
ICAgIFJFTEVBU0VfTE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6IFdlIG9ubHkgd3JvdGUgJWQgb3V0IG9mICV6
dSBieXRlcyB0byBkaXNrIiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHdyaXR0ZW5CeXRlcyksIHJh
d0RhdGEtPnNpemUoKSk7CisKKyAgICBtX2xhc3RTdGF0aXN0aWNzRmlsZVN5bmNUaW1lID0gV2Fs
bFRpbWU6Om5vdygpOworICAgIG1fbGFzdFN0YXRpc3RpY3NXcml0ZVRpbWUgPSBNb25vdG9uaWNU
aW1lOjpub3coKTsKKworICAgIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsKK30KKwordm9pZCBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnNjaGVkdWxlT3JXcml0ZU1lbW9y
eVN0b3JlKEZvcmNlSW1tZWRpYXRlV3JpdGUgZm9yY2VJbW1lZGlhdGVXcml0ZSkKK3sKKyAgICBB
U1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKKworICAgIGF1dG8gdGltZVNpbmNlTGFzdFdyaXRl
ID0gTW9ub3RvbmljVGltZTo6bm93KCkgLSBtX2xhc3RTdGF0aXN0aWNzV3JpdGVUaW1lOworICAg
IGlmIChmb3JjZUltbWVkaWF0ZVdyaXRlICE9IEZvcmNlSW1tZWRpYXRlV3JpdGU6OlllcyAmJiB0
aW1lU2luY2VMYXN0V3JpdGUgPCBtaW5pbXVtV3JpdGVJbnRlcnZhbCkgeworICAgICAgICBpZiAo
IW1faGFzUGVuZGluZ1dyaXRlKSB7CisgICAgICAgICAgICBtX2hhc1BlbmRpbmdXcml0ZSA9IHRy
dWU7CisgICAgICAgICAgICBTZWNvbmRzIGRlbGF5ID0gbWluaW11bVdyaXRlSW50ZXJ2YWwgLSB0
aW1lU2luY2VMYXN0V3JpdGUgKyAxX3M7CisgICAgICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgZGVsYXldIHsKKyAg
ICAgICAgICAgICAgICBtX2FzeW5jV3JpdGVUaW1lci5zdGFydE9uZVNob3QoZGVsYXkpOworICAg
ICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdy
aXRlTWVtb3J5U3RvcmVUb0Rpc2soKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2U6OmNsZWFyKCkKK3sKKyAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFp
bigpKTsKKyAgICBTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7CisgICAg
aWYgKGZpbGVQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RvcE1vbml0
b3JpbmdEaXNrKCk7CisKKyAgICBpZiAoIWRlbGV0ZUZpbGUoZmlsZVBhdGgpKQorICAgICAgICBS
RUxFQVNFX0xPR19FUlJPUihSZXNvdXJjZUxvYWRTdGF0aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOiBVbmFibGUgdG8gZGVsZXRlIHN0YXRpc3RpY3MgZmls
ZTogJXMiLCBmaWxlUGF0aC51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OmZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25v
dXNseSgpCit7CisgICAgbV9hc3luY1dyaXRlVGltZXIuc3RvcCgpOworCisgICAgQmluYXJ5U2Vt
YXBob3JlIHNlbWFwaG9yZTsKKyAgICAvLyBNYWtlIHN1cmUgYW55IHBlbmRpbmcgd29yayBpbiBv
dXIgcXVldWUgaXMgZmluaXNoZWQgYmVmb3JlIHdlIHRlcm1pbmF0ZS4KKyAgICBtX21lbW9yeVN0
b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLmRpc3BhdGNoKFsmc2VtYXBob3JlLCB0aGlzXSB7CisgICAg
ICAgIC8vIFdyaXRlIGZpbmFsIGZpbGUgc3RhdGUgdG8gZGlzay4KKyAgICAgICAgaWYgKG1faGFz
UGVuZGluZ1dyaXRlKQorICAgICAgICAgICAgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOworICAg
ICAgICBzZW1hcGhvcmUuc2lnbmFsKCk7CisgICAgfSk7CisgICAgc2VtYXBob3JlLndhaXQoV2Fs
bFRpbWU6OmluZmluaXR5KCkpOworfQorCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZTo6cmVmKCkKK3sKKyAgICBtX21lbW9yeVN0b3JlLnJlZigpOworfQorCit2
b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZGVyZWYoKQorewor
ICAgIG1fbWVtb3J5U3RvcmUuZGVyZWYoKTsKK30KKworI2lmICFQTEFURk9STShJT1MpCit2b2lk
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZXhjbHVkZUZyb21CYWNr
dXAoKSBjb25zdAoreworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9SZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jNWQyZWQ0YmM2OTNiYTFlYTIx
OTQyZTQwM2NkMTM2ZDRlNzY3MjVjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgKQEAgLTAs
MCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8d3RmL0Zv
cndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvTW9ub3RvbmljVGltZS5oPgorI2luY2x1ZGUgPHd0Zi9S
dW5Mb29wLmg+CisjaW5jbHVkZSA8d3RmL1dhbGxUaW1lLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
V1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEZpbGVNb25pdG9yOwor
fQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgV2ViUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1N0b3JlOworCitjbGFzcyBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Ug
eworcHVibGljOgorICAgIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZShX
ZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmUmLCBjb25zdCBTdHJpbmcmIHN0b3JhZ2VEaXJl
Y3RvcnlQYXRoKTsKKyAgICB+UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
KCk7CisKKyAgICB2b2lkIGluaXRpYWxpemUoKTsKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICB2
b2lkIGZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgpOworCisgICAgdm9pZCByZWYo
KTsKKyAgICB2b2lkIGRlcmVmKCk7CisKKyAgICBlbnVtIGNsYXNzIEZvcmNlSW1tZWRpYXRlV3Jp
dGUgeworICAgICAgICBObywKKyAgICAgICAgWWVzLAorICAgIH07CisgICAgdm9pZCBzY2hlZHVs
ZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVkaWF0ZVdyaXRlKTsKKworcHJpdmF0ZToKKyAg
ICBTdHJpbmcgc3RvcmFnZURpcmVjdG9yeVBhdGgoKSBjb25zdDsKKyAgICBTdHJpbmcgcmVzb3Vy
Y2VMb2dGaWxlUGF0aCgpIGNvbnN0OworCisgICAgdm9pZCBzdGFydE1vbml0b3JpbmdEaXNrKCk7
CisgICAgdm9pZCBzdG9wTW9uaXRvcmluZ0Rpc2soKTsKKyAgICB2b2lkIG1vbml0b3JEaXJlY3Rv
cnlGb3JOZXdTdGF0aXN0aWNzKCk7CisKKyAgICB2b2lkIHdyaXRlTWVtb3J5U3RvcmVUb0Rpc2so
KTsKKyAgICB2b2lkIHBvcHVsYXRlTWVtb3J5U3RvcmVGcm9tRGlzaygpOworICAgIHZvaWQgZXhj
bHVkZUZyb21CYWNrdXAoKSBjb25zdDsKKyAgICB2b2lkIHJlZnJlc2hNZW1vcnlTdG9yZUZyb21E
aXNrKCk7CisgICAgdm9pZCBhc3luY1dyaXRlVGltZXJGaXJlZCgpOworCisgICAgV2ViUmVzb3Vy
Y2VMb2FkU3RhdGlzdGljc1N0b3JlJiBtX21lbW9yeVN0b3JlOworICAgIGNvbnN0IFN0cmluZyBt
X3N0b3JhZ2VEaXJlY3RvcnlQYXRoOworICAgIFJ1bkxvb3A6OlRpbWVyPFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZT4gbV9hc3luY1dyaXRlVGltZXI7CisgICAgc3RkOjp1
bmlxdWVfcHRyPFdlYkNvcmU6OkZpbGVNb25pdG9yPiBtX2ZpbGVNb25pdG9yOworICAgIFdhbGxU
aW1lIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWU7CisgICAgTW9ub3RvbmljVGltZSBtX2xh
c3RTdGF0aXN0aWNzV3JpdGVUaW1lOworICAgIGJvb2wgbV9oYXNQZW5kaW5nV3JpdGUgeyBmYWxz
ZSB9OworfTsKKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFn
ZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9y
YWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggNTk4YTNiZDY4OTBlNTNkOTFjMzkwNGM5OTc5ZTkxZGFlNDU1MDUxMS4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vz
cy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2
OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlLmgiCi0KLSNpbmNsdWRlICJMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0u
aD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVN0YXRlbWVudC5oPgotI2luY2x1ZGUgPFdlYkNv
cmUvU1FMaXRlVHJhbnNhY3Rpb24uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2lu
Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9T
dWRkZW5UZXJtaW5hdGlvbi5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLSNpbmNsdWRlIDx3
dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQot
c3RhdGljIGNvbnN0IGF1dG8gZGF0YWJhc2VVcGRhdGVJbnRlcnZhbCA9IDFfczsKLQotc3RhdGlj
IGNvbnN0IGludCBtYXhpbXVtSXRlbXNUb1VwZGF0ZSA9IDEwMDsKLQotbmFtZXNwYWNlIFdlYktp
dCB7Ci0KLVJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNy
ZWF0ZShSZWY8V29ya1F1ZXVlPiYmIHF1ZXVlLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFj
a2VyPiYmIHRyYWNrZXIsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4p
Ci17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTG9jYWxTdG9yYWdlRGF0YWJhc2UoV1RGTW92
ZShxdWV1ZSksIFdURk1vdmUodHJhY2tlciksIHNlY3VyaXR5T3JpZ2luKSk7Ci19Ci0KLUxvY2Fs
U3RvcmFnZURhdGFiYXNlOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZShSZWY8V29ya1F1ZXVlPiYmIHF1
ZXVlLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmIHRyYWNrZXIsIGNvbnN0IFNl
Y3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi0gICAgOiBtX3F1ZXVlKFdURk1vdmUo
cXVldWUpKQotICAgICwgbV90cmFja2VyKFdURk1vdmUodHJhY2tlcikpCi0gICAgLCBtX3NlY3Vy
aXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQotICAgICwgbV9kYXRhYmFzZVBhdGgobV90cmFja2Vy
LT5kYXRhYmFzZVBhdGgobV9zZWN1cml0eU9yaWdpbikpCi0gICAgLCBtX2ZhaWxlZFRvT3BlbkRh
dGFiYXNlKGZhbHNlKQotICAgICwgbV9kaWRJbXBvcnRJdGVtcyhmYWxzZSkKLSAgICAsIG1faXND
bG9zZWQoZmFsc2UpCi0gICAgLCBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoZmFsc2UpCi0g
ICAgLCBtX3Nob3VsZENsZWFySXRlbXMoZmFsc2UpCi17Ci19Ci0KLUxvY2FsU3RvcmFnZURhdGFi
YXNlOjp+TG9jYWxTdG9yYWdlRGF0YWJhc2UoKQotewotICAgIEFTU0VSVChtX2lzQ2xvc2VkKTsK
LX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6b3BlbkRhdGFiYXNlKERhdGFiYXNlT3Bl
bmluZ1N0cmF0ZWd5IG9wZW5pbmdTdHJhdGVneSkKLXsKLSAgICBBU1NFUlQoIW1fZGF0YWJhc2Uu
aXNPcGVuKCkpOwotICAgIEFTU0VSVCghbV9mYWlsZWRUb09wZW5EYXRhYmFzZSk7Ci0KLSAgICBp
ZiAoIXRyeVRvT3BlbkRhdGFiYXNlKG9wZW5pbmdTdHJhdGVneSkpIHsKLSAgICAgICAgbV9mYWls
ZWRUb09wZW5EYXRhYmFzZSA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp
ZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgbV90cmFja2VyLT5kaWRPcGVuRGF0YWJh
c2VXaXRoT3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pOwotfQotCi1ib29sIExvY2FsU3RvcmFnZURh
dGFiYXNlOjp0cnlUb09wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5n
U3RyYXRlZ3kpCi17Ci0gICAgaWYgKCFmaWxlRXhpc3RzKG1fZGF0YWJhc2VQYXRoKSAmJiBvcGVu
aW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhpc3RlbnQpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgaWYgKG1fZGF0YWJhc2VQYXRoLmlzRW1wdHkoKSkgewotICAgICAgICBMT0dfRVJST1Io
IkZpbGVuYW1lIGZvciBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIGlzIGVtcHR5IC0gY2Fubm90IG9w
ZW4gZm9yIHBlcnNpc3RlbnQgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgaWYgKCFtX2RhdGFiYXNlLm9wZW4obV9kYXRhYmFzZVBhdGgpKSB7Ci0gICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgZmlsZSAlcyBmb3IgbG9jYWwgc3Rv
cmFnZSIsIG1fZGF0YWJhc2VQYXRoLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotCi0gICAgLy8gU2luY2UgYSBXb3JrUXVldWUgaXNuJ3QgYm91bmQgdG8gYSBz
cGVjaWZpYyB0aHJlYWQsIHdlIGhhdmUgdG8gZGlzYWJsZSB0aHJlYWRpbmcgY2hlY2tzCi0gICAg
Ly8gZXZlbiB0aG91Z2ggd2UgbmV2ZXIgYWNjZXNzIHRoZSBkYXRhYmFzZSBmcm9tIGRpZmZlcmVu
dCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5LgotICAgIG1fZGF0YWJhc2UuZGlzYWJsZVRocmVhZGlu
Z0NoZWNrcygpOwotCi0gICAgaWYgKCFtaWdyYXRlSXRlbVRhYmxlSWZOZWVkZWQoKSkgewotICAg
ICAgICAvLyBXZSBmYWlsZWQgdG8gbWlncmF0ZSB0aGUgaXRlbSB0YWJsZS4gSW4gb3JkZXIgdG8g
YXZvaWQgdHJ5aW5nIHRvIG1pZ3JhdGUgdGhlIHRhYmxlIG92ZXIgYW5kIG92ZXIsCi0gICAgICAg
IC8vIGp1c3QgZGVsZXRlIGl0IGFuZCBzdGFydCBmcm9tIHNjcmF0Y2guCi0gICAgICAgIGlmICgh
bV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiRFJPUCBUQUJMRSBJdGVtVGFibGUiKSkKLSAgICAg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGRlbGV0ZSB0YWJsZSBJdGVtVGFibGUgZm9yIGxv
Y2FsIHN0b3JhZ2UiKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1h
bmQoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEl0ZW1UYWJsZSAoa2V5IFRFWFQgVU5JUVVF
IE9OIENPTkZMSUNUIFJFUExBQ0UsIHZhbHVlIEJMT0IgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJ
TCkiKSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgdGFibGUgSXRlbVRh
YmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6bWlncmF0
ZUl0ZW1UYWJsZUlmTmVlZGVkKCkKLXsKLSAgICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMo
Ikl0ZW1UYWJsZSIpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFNRTGl0ZVN0YXRlbWVu
dCBxdWVyeShtX2RhdGFiYXNlLCAiU0VMRUNUIHZhbHVlIEZST00gSXRlbVRhYmxlIExJTUlUIDEi
KTsKLQotICAgIC8vIFRoaXMgcXVlcnkgaXNuJ3QgZXZlciBleGVjdXRlZCwgaXQncyBqdXN0IHVz
ZWQgdG8gY2hlY2sgdGhlIGNvbHVtbiB0eXBlLgotICAgIGlmIChxdWVyeS5pc0NvbHVtbkRlY2xh
cmVkQXNCbG9iKDApKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIENyZWF0ZSBhIG5l
dyB0YWJsZSB3aXRoIHRoZSByaWdodCB0eXBlLCBjb3B5IGFsbCB0aGUgZGF0YSBvdmVyIHRvIGl0
IGFuZCB0aGVuIHJlcGxhY2UgdGhlIG5ldyB0YWJsZSB3aXRoIHRoZSBvbGQgdGFibGUuCi0gICAg
c3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmRzW10gPSB7Ci0gICAgICAgICJEUk9QIFRBQkxFIElG
IEVYSVNUUyBJdGVtVGFibGUyIiwKLSAgICAgICAgIkNSRUFURSBUQUJMRSBJdGVtVGFibGUyIChr
ZXkgVEVYVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgdmFsdWUgQkxPQiBOT1QgTlVMTCBP
TiBDT05GTElDVCBGQUlMKSIsCi0gICAgICAgICJJTlNFUlQgSU5UTyBJdGVtVGFibGUyIFNFTEVD
VCAqIGZyb20gSXRlbVRhYmxlIiwKLSAgICAgICAgIkRST1AgVEFCTEUgSXRlbVRhYmxlIiwKLSAg
ICAgICAgIkFMVEVSIFRBQkxFIEl0ZW1UYWJsZTIgUkVOQU1FIFRPIEl0ZW1UYWJsZSIsCi0gICAg
ICAgIDAsCi0gICAgfTsKLQotICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKG1fZGF0
YWJhc2UsIGZhbHNlKTsKLSAgICB0cmFuc2FjdGlvbi5iZWdpbigpOwotCi0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGNvbW1hbmRzW2ldOyArK2kpIHsKLSAgICAgICAgaWYgKG1fZGF0YWJhc2UuZXhl
Y3V0ZUNvbW1hbmQoY29tbWFuZHNbaV0pKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gbWlncmF0ZSB0YWJsZSBJdGVtVGFibGUgZm9yIGxvY2Fs
IHN0b3JhZ2Ugd2hlbiBleGVjdXRpbmc6ICVzIiwgY29tbWFuZHNbaV0pOwotICAgICAgICB0cmFu
c2FjdGlvbi5yb2xsYmFjaygpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAg
ICB0cmFuc2FjdGlvbi5jb21taXQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZTo6aW1wb3J0SXRlbXMoU3RvcmFnZU1hcCYgc3RvcmFnZU1hcCkKLXsK
LSAgICBpZiAobV9kaWRJbXBvcnRJdGVtcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gRklY
TUU6IElmIGl0IGNhbid0IGltcG9ydCwgdGhlbiB0aGUgZGVmYXVsdCBXZWJLaXQgYmVoYXZpb3Ig
c2hvdWxkIGJlIHRoYXQgb2YgcHJpdmF0ZSBicm93c2luZywKLSAgICAvLyBub3Qgc2lsZW50bHkg
aWdub3JpbmcgaXQuIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTg5
NAotCi0gICAgLy8gV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBldmVuIGlmIHdlIGRvbid0IGVuZCB1cCBp
bXBvcnRpbmcgYW55IGl0ZW1zIGR1ZSB0byBmYWlsdXJlIGJlY2F1c2UKLSAgICAvLyB0aGVyZSdz
IHJlYWxseSBubyBnb29kIHdheSB0byByZWNvdmVyIG90aGVyIHRoYW4gbm90IGltcG9ydGluZyBh
bnl0aGluZy4KLSAgICBtX2RpZEltcG9ydEl0ZW1zID0gdHJ1ZTsKLQotICAgIG9wZW5EYXRhYmFz
ZShTa2lwSWZOb25FeGlzdGVudCk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNF
TEVDVCBrZXksIHZhbHVlIEZST00gSXRlbVRhYmxlIik7Ci0gICAgaWYgKHF1ZXJ5LnByZXBhcmUo
KSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc2VsZWN0IGl0
ZW1zIGZyb20gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBpdGVtczsKLQotICAgIGludCBy
ZXN1bHQgPSBxdWVyeS5zdGVwKCk7Ci0gICAgd2hpbGUgKHJlc3VsdCA9PSBTUUxJVEVfUk9XKSB7
Ci0gICAgICAgIFN0cmluZyBrZXkgPSBxdWVyeS5nZXRDb2x1bW5UZXh0KDApOwotICAgICAgICBT
dHJpbmcgdmFsdWUgPSBxdWVyeS5nZXRDb2x1bW5CbG9iQXNTdHJpbmcoMSk7Ci0gICAgICAgIGlm
ICgha2V5LmlzTnVsbCgpICYmICF2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIGl0ZW1zLnNl
dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOwotICAgIH0KLQot
ICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJFcnJv
ciByZWFkaW5nIGl0ZW1zIGZyb20gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdG9yYWdlTWFwLmltcG9ydEl0ZW1zKGl0ZW1zKTsK
LX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6c2V0SXRlbShjb25zdCBTdHJpbmcmIGtl
eSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKLXsKLSAgICBpdGVtRGlkQ2hhbmdlKGtleSwgdmFsdWUp
OwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpyZW1vdmVJdGVtKGNvbnN0IFN0cmlu
ZyYga2V5KQotewotICAgIGl0ZW1EaWRDaGFuZ2Uoa2V5LCBTdHJpbmcoKSk7Ci19Ci0KLXZvaWQg
TG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNsZWFyKCkKLXsKLSAgICBtX2NoYW5nZWRJdGVtcy5jbGVh
cigpOwotICAgIG1fc2hvdWxkQ2xlYXJJdGVtcyA9IHRydWU7Ci0KLSAgICBzY2hlZHVsZURhdGFi
YXNlVXBkYXRlKCk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmNsb3NlKCkKLXsK
LSAgICBBU1NFUlQoIW1faXNDbG9zZWQpOwotICAgIG1faXNDbG9zZWQgPSB0cnVlOwotCi0gICAg
aWYgKG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSkgewotICAgICAgICB1cGRhdGVEYXRhYmFz
ZVdpdGhDaGFuZ2VkSXRlbXMobV9jaGFuZ2VkSXRlbXMpOwotICAgICAgICBtX2NoYW5nZWRJdGVt
cy5jbGVhcigpOwotICAgIH0KLQotICAgIGJvb2wgaXNFbXB0eSA9IGRhdGFiYXNlSXNFbXB0eSgp
OwotCi0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIG1fZGF0YWJhc2UuY2xv
c2UoKTsKLQotICAgIGlmIChpc0VtcHR5KQotICAgICAgICBtX3RyYWNrZXItPmRlbGV0ZURhdGFi
YXNlV2l0aE9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VE
YXRhYmFzZTo6aXRlbURpZENoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSkKLXsKLSAgICBtX2NoYW5nZWRJdGVtcy5zZXQoa2V5LCB2YWx1ZSk7Ci0gICAgc2NoZWR1
bGVEYXRhYmFzZVVwZGF0ZSgpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpzY2hl
ZHVsZURhdGFiYXNlVXBkYXRlKCkKLXsKLSAgICBpZiAobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBk
YXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIW1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0
aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UpCi0gICAgICAgIG1fZGlzYWJsZVN1ZGRlblRl
cm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFN1
ZGRlblRlcm1pbmF0aW9uRGlzYWJsZXI+KCk7Ci0KLSAgICBtX2RpZFNjaGVkdWxlRGF0YWJhc2VV
cGRhdGUgPSB0cnVlOwotCi0gICAgUmVmUHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBsb2NhbFN0
b3JhZ2VEYXRhYmFzZSh0aGlzKTsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaEFmdGVyKGRhdGFiYXNl
VXBkYXRlSW50ZXJ2YWwsIFtsb2NhbFN0b3JhZ2VEYXRhYmFzZV0gewotICAgICAgICBsb2NhbFN0
b3JhZ2VEYXRhYmFzZS0+dXBkYXRlRGF0YWJhc2UoKTsKLSAgICB9KTsKLX0KLQotdm9pZCBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0YWJhc2UoKQotewotICAgIGlmIChtX2lzQ2xvc2Vk
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBk
YXRlKTsKLSAgICBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUgPSBmYWxzZTsKLQotICAgIEhh
c2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNoYW5nZWRJdGVtczsKLSAgICBpZiAobV9jaGFuZ2VkSXRl
bXMuc2l6ZSgpIDw9IG1heGltdW1JdGVtc1RvVXBkYXRlKSB7Ci0gICAgICAgIC8vIFRoZXJlIGFy
ZSBmZXcgZW5vdWdoIGNoYW5nZWQgaXRlbXMgdGhhdCB3ZSBjYW4ganVzdCBhbHdheXMgd3JpdGUg
YWxsIG9mIHRoZW0uCi0gICAgICAgIG1fY2hhbmdlZEl0ZW1zLnN3YXAoY2hhbmdlZEl0ZW1zKTsK
LSAgICAgICAgdXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNoYW5nZWRJdGVtcyk7Ci0g
ICAgICAgIG1fZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3Jh
Z2UgPSBudWxscHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bWF4aW11bUl0ZW1zVG9VcGRhdGU7ICsraSkgewotICAgICAgICAgICAgYXV0byBpdCA9IG1fY2hh
bmdlZEl0ZW1zLmJlZ2luKCk7Ci0gICAgICAgICAgICBjaGFuZ2VkSXRlbXMuYWRkKGl0LT5rZXks
IGl0LT52YWx1ZSk7Ci0KLSAgICAgICAgICAgIG1fY2hhbmdlZEl0ZW1zLnJlbW92ZShpdCk7Ci0g
ICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoY2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBtYXhpbXVt
SXRlbXNUb1VwZGF0ZSk7Ci0KLSAgICAgICAgLy8gUmVzY2hlZHVsZSB0aGUgdXBkYXRlIGZvciB0
aGUgcmVtYWluaW5nIGl0ZW1zLgotICAgICAgICBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7Ci0g
ICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMpOwotICAg
IH0KLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0YWJhc2VXaXRoQ2hh
bmdlZEl0ZW1zKGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBjaGFuZ2VkSXRlbXMpCi17
Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICBvcGVuRGF0YWJhc2UoQ3Jl
YXRlSWZOb25FeGlzdGVudCk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAobV9zaG91bGRDbGVhckl0ZW1zKSB7Ci0gICAgICAgIG1fc2hv
dWxkQ2xlYXJJdGVtcyA9IGZhbHNlOwotCi0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBjbGVhclN0
YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxlIik7Ci0gICAgICAgIGlm
IChjbGVhclN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGNsZWFyIHN0YXRlbWVudCAtIGNhbm5vdCB3cml0
ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLQotICAgICAgICBpbnQgcmVzdWx0ID0gY2xlYXJTdGF0ZW1lbnQuc3RlcCgpOwotICAg
ICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byBjbGVhciBhbGwgaXRlbXMgaW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2Ug
LSAlaSIsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBTUUxpdGVTdGF0ZW1lbnQgaW5zZXJ0U3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQg
SU5UTyBJdGVtVGFibGUgVkFMVUVTICg/LCA/KSIpOwotICAgIGlmIChpbnNlcnRTdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBw
cmVwYXJlIGluc2VydCBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBk
YXRhYmFzZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU1FMaXRlU3RhdGVtZW50
IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxlIFdIRVJF
IGtleT0/Iik7Ci0gICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09L
KSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgZGVsZXRlIHN0YXRlbWVu
dCAtIGNhbm5vdCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RhdGFi
YXNlKTsKLSAgICB0cmFuc2FjdGlvbi5iZWdpbigpOwotCi0gICAgZm9yIChhdXRvIGl0ID0gY2hh
bmdlZEl0ZW1zLmJlZ2luKCksIGVuZCA9IGNoYW5nZWRJdGVtcy5lbmQoKTsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgIC8vIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IHRoZSBrZXkvdmFsdWUg
cGFpciBzaG91bGQgYmUgZGVsZXRlZC4KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50JiBzdGF0ZW1l
bnQgPSBpdC0+dmFsdWUuaXNOdWxsKCkgPyBkZWxldGVTdGF0ZW1lbnQgOiBpbnNlcnRTdGF0ZW1l
bnQ7Ci0KLSAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIGl0LT5rZXkpOwotCi0gICAgICAg
IC8vIElmIHdlJ3JlIGluc2VydGluZyBhIGtleS92YWx1ZSBwYWlyLCBiaW5kIHRoZSB2YWx1ZSBh
cyB3ZWxsLgotICAgICAgICBpZiAoIWl0LT52YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIHN0
YXRlbWVudC5iaW5kQmxvYigyLCBpdC0+dmFsdWUpOwotCi0gICAgICAgIGludCByZXN1bHQgPSBz
dGF0ZW1lbnQuc3RlcCgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7Ci0g
ICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byB1cGRhdGUgaXRlbSBpbiB0aGUgbG9jYWwg
c3RvcmFnZSBkYXRhYmFzZSAtICVpIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0KLSAgICAgICAgc3RhdGVtZW50LnJlc2V0KCk7Ci0gICAgfQotCi0gICAgdHJhbnNh
Y3Rpb24uY29tbWl0KCk7Ci19Ci0KLWJvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmRhdGFiYXNl
SXNFbXB0eSgpCi17Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVD
VCBDT1VOVCgqKSBGUk9NIEl0ZW1UYWJsZSIpOwotICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0g
U1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNvdW50IG51bWJlciBv
ZiByb3dzIGluIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKLSAgICBpZiAo
cmVzdWx0ICE9IFNRTElURV9ST1cpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJObyByZXN1bHRzIHdo
ZW4gY291bnRpbmcgbnVtYmVyIG9mIHJvd3MgaW4gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdl
Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIXF1ZXJ5Lmdl
dENvbHVtbkludCgwKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmggYi9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmgKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTIwMzFmNDQ4ZmIzZDkxNTgwMTg2ZDg4NjBh
MTJkODQ4NTk1NjIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5o
CisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
OCwgMjAwOSwgMjAxMCwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVEYXRhYmFzZS5o
PgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8d3Rm
L0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQ
dHIuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3
dGYvV29ya1F1ZXVlLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLWNsYXNzIFNlY3VyaXR5T3Jp
Z2luOwotY2xhc3MgU3RvcmFnZU1hcDsKLWNsYXNzIFN1ZGRlblRlcm1pbmF0aW9uRGlzYWJsZXI7
Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI7Ci0KLWNsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlIDogcHVibGljIFRocmVhZFNhZmVS
ZWZDb3VudGVkPExvY2FsU3RvcmFnZURhdGFiYXNlPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJl
ZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZT4gY3JlYXRlKFJlZjxXb3JrUXVldWU+JiYsIFJlZjxMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2lu
RGF0YSYpOwotICAgIH5Mb2NhbFN0b3JhZ2VEYXRhYmFzZSgpOwotCi0gICAgLy8gV2lsbCBibG9j
ayB1bnRpbCB0aGUgaW1wb3J0IGlzIGNvbXBsZXRlLgotICAgIHZvaWQgaW1wb3J0SXRlbXMoV2Vi
Q29yZTo6U3RvcmFnZU1hcCYpOwotCi0gICAgdm9pZCBzZXRJdGVtKGNvbnN0IFN0cmluZyYga2V5
LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0oY29uc3QgU3RyaW5n
JiBrZXkpOwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIC8vIFdpbGwgYmxvY2sgdW50aWwgYWxs
IHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gd3JpdHRlbiB0byBkaXNrLgotICAgIHZvaWQgY2xv
c2UoKTsKLQotcHJpdmF0ZToKLSAgICBMb2NhbFN0b3JhZ2VEYXRhYmFzZShSZWY8V29ya1F1ZXVl
PiYmLCBSZWY8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyPiYmLCBjb25zdCBXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGEmKTsKLQotICAgIGVudW0gRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kg
ewotICAgICAgICBDcmVhdGVJZk5vbkV4aXN0ZW50LAotICAgICAgICBTa2lwSWZOb25FeGlzdGVu
dAotICAgIH07Ci0gICAgYm9vbCB0cnlUb09wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJh
dGVneSk7Ci0gICAgdm9pZCBvcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOwot
Ci0gICAgYm9vbCBtaWdyYXRlSXRlbVRhYmxlSWZOZWVkZWQoKTsKLQotICAgIHZvaWQgaXRlbURp
ZENoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgICB2
b2lkIHNjaGVkdWxlRGF0YWJhc2VVcGRhdGUoKTsKLSAgICB2b2lkIHVwZGF0ZURhdGFiYXNlKCk7
Ci0gICAgdm9pZCB1cGRhdGVEYXRhYmFzZVdpdGhDaGFuZ2VkSXRlbXMoY29uc3QgSGFzaE1hcDxT
dHJpbmcsIFN0cmluZz4mKTsKLQotICAgIGJvb2wgZGF0YWJhc2VJc0VtcHR5KCk7Ci0KLSAgICBS
ZWY8V29ya1F1ZXVlPiBtX3F1ZXVlOwotICAgIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXI+IG1fdHJhY2tlcjsKLSAgICBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgbV9zZWN1cml0
eU9yaWdpbjsKLQotICAgIFN0cmluZyBtX2RhdGFiYXNlUGF0aDsKLSAgICBXZWJDb3JlOjpTUUxp
dGVEYXRhYmFzZSBtX2RhdGFiYXNlOwotICAgIGJvb2wgbV9mYWlsZWRUb09wZW5EYXRhYmFzZTsK
LSAgICBib29sIG1fZGlkSW1wb3J0SXRlbXM7Ci0gICAgYm9vbCBtX2lzQ2xvc2VkOwotCi0gICAg
Ym9vbCBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGU7Ci0gICAgYm9vbCBtX3Nob3VsZENsZWFy
SXRlbXM7Ci0gICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbV9jaGFuZ2VkSXRlbXM7Ci0KLSAg
ICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U3VkZGVuVGVybWluYXRpb25EaXNhYmxlcj4gbV9k
aXNhYmxlU3VkZGVuVGVybWluYXRpb25XaGlsZVdyaXRpbmdUb0xvY2FsU3RvcmFnZTsKLX07Ci0K
LQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jcHAKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjIyOWY2YjUzNzRhNzc0NjNhYWY5YjQ2NGNl
OTM2YTA0YWNjMmIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTEsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyLmgiCi0KLSNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1NRTGl0ZUZpbGVTeXN0ZW0uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVN0YXRl
bWVudC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvVGV4dEVuY29k
aW5nLmg+Ci0jaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KLSNpbmNsdWRlIDx3dGYvUnVuTG9v
cC5oPgotI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsK
LQotUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gTG9jYWxTdG9yYWdlRGF0YWJhc2VU
cmFja2VyOjpjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiBxdWV1ZSwgY29uc3QgU3RyaW5nJiBsb2Nh
bFN0b3JhZ2VEaXJlY3RvcnkpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyKFdURk1vdmUocXVldWUpLCBsb2NhbFN0b3JhZ2VEaXJlY3Rvcnkp
KTsKLX0KLQotTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXIoUmVmPFdvcmtRdWV1ZT4mJiBxdWV1ZSwgY29uc3QgU3RyaW5nJiBsb2NhbFN0b3Jh
Z2VEaXJlY3RvcnkpCi0gICAgOiBtX3F1ZXVlKFdURk1vdmUocXVldWUpKQotICAgICwgbV9sb2Nh
bFN0b3JhZ2VEaXJlY3RvcnkobG9jYWxTdG9yYWdlRGlyZWN0b3J5Lmlzb2xhdGVkQ29weSgpKQot
ewotICAgIEFTU0VSVCghbV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkuaXNFbXB0eSgpKTsKLQotICAg
IC8vIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIHN0YXJ0
IGRpc3BhdGNoaW5nIHRoaW5ncyB0byB0aGUgcXVldWUuCi0gICAgVVRGOEVuY29kaW5nKCk7Ci0K
LSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSgp
IG11dGFibGUgewotICAgICAgICBwcm90ZWN0ZWRUaGlzLT5pbXBvcnRPcmlnaW5JZGVudGlmaWVy
cygpOwotICAgIH0pOwotfQotCi1Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6On5Mb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXIoKQotewotfQotCi1TdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyOjpkYXRhYmFzZVBhdGgoY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0
eU9yaWdpbikgY29uc3QKLXsKLSAgICByZXR1cm4gZGF0YWJhc2VQYXRoKHNlY3VyaXR5T3JpZ2lu
LmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5sb2NhbHN0b3JhZ2UiKTsKLX0KLQotdm9pZCBMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRpZE9wZW5EYXRhYmFzZVdpdGhPcmlnaW4oY29uc3Qg
U2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKLXsKLSAgICBhZGREYXRhYmFzZVdp
dGhPcmlnaW5JZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmRhdGFiYXNlSWRlbnRpZmllcigpLCBk
YXRhYmFzZVBhdGgoc2VjdXJpdHlPcmlnaW4pKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlV2l0aE9yaWdpbihjb25zdCBTZWN1cml0eU9yaWdp
bkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIHJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklk
ZW50aWZpZXIoc2VjdXJpdHlPcmlnaW4uZGF0YWJhc2VJZGVudGlmaWVyKCkpOwotfQotCi12b2lk
IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJhc2VzKCkKLXsKLSAg
ICBtX29yaWdpbnMuY2xlYXIoKTsKLQotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tpcElmTm9u
RXhpc3RlbnQpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIG9y
aWdpbiwgcGF0aCBGUk9NIE9yaWdpbnMiKTsKLSAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAh
PSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0
ZW1lbnQuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0OwotICAg
IHdoaWxlICgocmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMSVRFX1JPVykgewotICAg
ICAgICBkZWxldGVGaWxlKHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDEpKTsKLQotICAgICAgICAv
LyBGSVhNRTogQ2FsbCBvdXQgdG8gdGhlIGNsaWVudC4KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0
ICE9IFNRTElURV9ET05FKQotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byByZWFkIGluIGFs
bCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlLiIpOwotCi0gICAgaWYgKG1fZGF0YWJhc2UuaXNP
cGVuKCkpCi0gICAgICAgIG1fZGF0YWJhc2UuY2xvc2UoKTsKLQotICAgIGlmICghZGVsZXRlRmls
ZSh0cmFja2VyRGF0YWJhc2VQYXRoKCkpKSB7Ci0gICAgICAgIC8vIEluIHRoZSBjYXNlIHdoZXJl
IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWxldGUgdGhlIGRhdGFiYXNlIGZpbGUgKGUuZyBzb21l
IG90aGVyIHByb2dyYW0KLSAgICAgICAgLy8gbGlrZSBhIHZpcnVzIHNjYW5uZXIgaXMgYWNjZXNz
aW5nIGl0KSwgbWFrZSBzdXJlIHRvIHJlbW92ZSBhbGwgZW50cmllcy4KLSAgICAgICAgb3BlblRy
YWNrZXJEYXRhYmFzZShTa2lwSWZOb25FeGlzdGVudCk7Ci0gICAgICAgIGlmICghbV9kYXRhYmFz
ZS5pc09wZW4oKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTUUxpdGVTdGF0ZW1l
bnQgZGVsZXRlU3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIik7Ci0g
ICAgICAgIGlmIChkZWxldGVTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAg
ICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBhbGwgb3Jp
Z2lucyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGVs
ZXRlU3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKLSAgICAgICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgYWxsIG9yaWdpbnMiKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZUVtcHR5RGlyZWN0b3J5KG1f
bG9jYWxTdG9yYWdlRGlyZWN0b3J5KTsKLX0KLQotc3RhdGljIHN0ZDo6b3B0aW9uYWw8dGltZV90
PiBmaWxlQ3JlYXRpb25UaW1lKGNvbnN0IFN0cmluZyYgZmlsZVBhdGgpCi17Ci0gICAgdGltZV90
IHRpbWU7Ci0gICAgcmV0dXJuIGdldEZpbGVDcmVhdGlvblRpbWUoZmlsZVBhdGgsIHRpbWUpID8g
dGltZSA6IHN0ZDo6b3B0aW9uYWw8dGltZV90PihzdGQ6Om51bGxvcHQpOwotfQotCi1zdGF0aWMg
c3RkOjpvcHRpb25hbDx0aW1lX3Q+IGZpbGVNb2RpZmljYXRpb25UaW1lKGNvbnN0IFN0cmluZyYg
ZmlsZVBhdGgpCi17Ci0gICAgdGltZV90IHRpbWU7Ci0gICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0
aW9uVGltZShmaWxlUGF0aCwgdGltZSkpCi0gICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0K
LSAgICByZXR1cm4gdGltZTsKLX0KLQotVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gTG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZXNNb2RpZmllZFNpbmNlKHN0ZDo6
Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgdGltZSkKLXsKLSAgICBBU1NFUlQoIVJ1
bkxvb3A6OmlzTWFpbigpKTsKLSAgICBpbXBvcnRPcmlnaW5JZGVudGlmaWVycygpOwotICAgIFZl
Y3RvcjxTdHJpbmc+IG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGU7Ci0KLSAgICBmb3IgKGNvbnN0
IFN0cmluZyYgb3JpZ2luIDogbV9vcmlnaW5zKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9
IHBhdGhGb3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdpbik7Ci0KLSAgICAgICAg
YXV0byBtb2RpZmljYXRpb25UaW1lID0gZmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBhdGgpOwot
ICAgICAgICBpZiAoIW1vZGlmaWNhdGlvblRpbWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLQot
ICAgICAgICBpZiAobW9kaWZpY2F0aW9uVGltZS52YWx1ZSgpID49IHN0ZDo6Y2hyb25vOjpzeXN0
ZW1fY2xvY2s6OnRvX3RpbWVfdCh0aW1lKSkKLSAgICAgICAgICAgIG9yaWdpbklkZW50aWZpZXJz
VG9EZWxldGUuYXBwZW5kKG9yaWdpbik7Ci0gICAgfQotCi0gICAgVmVjdG9yPFNlY3VyaXR5T3Jp
Z2luRGF0YT4gZGVsZXRlZERhdGFiYXNlT3JpZ2luczsKLSAgICBkZWxldGVkRGF0YWJhc2VPcmln
aW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkob3JpZ2luSWRlbnRpZmllcnNUb0RlbGV0ZS5zaXpl
KCkpOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW5JZGVudGlmaWVyIDogb3JpZ2luSWRl
bnRpZmllcnNUb0RlbGV0ZSkgewotICAgICAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVu
dGlmaWVyKG9yaWdpbklkZW50aWZpZXIpOwotCi0gICAgICAgIGlmIChhdXRvIG9yaWdpbiA9IFNl
Y3VyaXR5T3JpZ2luRGF0YTo6ZnJvbURhdGFiYXNlSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVy
KSkKLSAgICAgICAgICAgIGRlbGV0ZWREYXRhYmFzZU9yaWdpbnMudW5jaGVja2VkQXBwZW5kKCpv
cmlnaW4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gZGVsZXRlZERhdGFiYXNlT3JpZ2luczsKLX0KLQotVmVjdG9y
PFNlY3VyaXR5T3JpZ2luRGF0YT4gTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5z
KCkgY29uc3QKLXsKLSAgICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zOwotICAg
IG9yaWdpbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX29yaWdpbnMuc2l6ZSgpKTsKLQotICAg
IGZvciAoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyIDogbV9vcmlnaW5zKSB7Ci0gICAg
ICAgIGlmIChhdXRvIG9yaWdpbiA9IFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbURhdGFiYXNlSWRl
bnRpZmllcihvcmlnaW5JZGVudGlmaWVyKSkKLSAgICAgICAgICAgIG9yaWdpbnMudW5jaGVja2Vk
QXBwZW5kKCpvcmlnaW4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3JpZ2luczsKLX0KLQotVmVjdG9yPExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4gTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyOjpvcmlnaW5EZXRhaWxzKCkKLXsKLSAgICBWZWN0b3I8T3JpZ2luRGV0YWlscz4g
cmVzdWx0OwotICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fb3JpZ2lucy5zaXpl
KCkpOwotCi0gICAgZm9yIChjb25zdCBTdHJpbmcmIG9yaWdpbiA6IG1fb3JpZ2lucykgewotICAg
ICAgICBTdHJpbmcgZmlsZVBhdGggPSBwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmll
cihvcmlnaW4pOwotCi0gICAgICAgIE9yaWdpbkRldGFpbHMgZGV0YWlsczsKLSAgICAgICAgZGV0
YWlscy5vcmlnaW5JZGVudGlmaWVyID0gb3JpZ2luLmlzb2xhdGVkQ29weSgpOwotICAgICAgICBk
ZXRhaWxzLmNyZWF0aW9uVGltZSA9IGZpbGVDcmVhdGlvblRpbWUoZmlsZVBhdGgpOwotICAgICAg
ICBkZXRhaWxzLm1vZGlmaWNhdGlvblRpbWUgPSBmaWxlTW9kaWZpY2F0aW9uVGltZShmaWxlUGF0
aCk7Ci0gICAgICAgIHJlc3VsdC51bmNoZWNrZWRBcHBlbmQoZGV0YWlscyk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cjo6ZGF0YWJhc2VQYXRoKGNvbnN0IFN0cmluZyYgZmlsZW5hbWUpIGNvbnN0Ci17Ci0gICAgaWYg
KCFtYWtlQWxsRGlyZWN0b3JpZXMobV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnkpKSB7Ci0gICAgICAg
IExPR19FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSBMb2NhbFN0b3JhZ2UgZGF0YWJhc2UgcGF0aCAl
cyIsIG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5LnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1
cm4gU3RyaW5nKCk7Ci0gICAgfQotCi0jaWYgUExBVEZPUk0oSU9TKQotICAgIHBsYXRmb3JtTWF5
YmVFeGNsdWRlRnJvbUJhY2t1cCgpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gcGF0aEJ5QXBwZW5k
aW5nQ29tcG9uZW50KG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5LCBmaWxlbmFtZSk7Ci19Ci0KLVN0
cmluZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXJEYXRhYmFzZVBhdGgoKSBj
b25zdAotewotICAgIHJldHVybiBkYXRhYmFzZVBhdGgoIlN0b3JhZ2VUcmFja2VyLmRiIik7Ci19
Ci0KLXZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNl
KERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5IG9wZW5pbmdTdHJhdGVneSkKLXsKLSAgICBpZiAobV9k
YXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5nIGRhdGFiYXNl
UGF0aCA9IHRyYWNrZXJEYXRhYmFzZVBhdGgoKTsKLQotICAgIGlmICghZmlsZUV4aXN0cyhkYXRh
YmFzZVBhdGgpICYmIG9wZW5pbmdTdHJhdGVneSA9PSBTa2lwSWZOb25FeGlzdGVudCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaWYgKCFtX2RhdGFiYXNlLm9wZW4oZGF0YWJhc2VQYXRoKSkgewot
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlUGF0aCAlcy4iLCBkYXRh
YmFzZVBhdGguYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
Ly8gU2luY2UgYSBXb3JrUXVldWUgaXNuJ3QgYm91bmQgdG8gYSBzcGVjaWZpYyB0aHJlYWQsIHdl
IGhhdmUgdG8gZGlzYWJsZSB0aHJlYWRpbmcgY2hlY2tzCi0gICAgLy8gZXZlbiB0aG91Z2ggd2Ug
bmV2ZXIgYWNjZXNzIHRoZSBkYXRhYmFzZSBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFu
ZW91c2x5LgotICAgIG1fZGF0YWJhc2UuZGlzYWJsZVRocmVhZGluZ0NoZWNrcygpOwotCi0gICAg
aWYgKG1fZGF0YWJhc2UudGFibGVFeGlzdHMoIk9yaWdpbnMiKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgT3JpZ2lu
cyAob3JpZ2luIFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHBhdGggVEVYVCk7Iikp
Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBPcmlnaW5zIHRhYmxlLiIpOwot
fQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6aW1wb3J0T3JpZ2luSWRlbnRp
ZmllcnMoKQotewotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOwot
Ci0gICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50
IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIG9yaWdpbiBGUk9NIE9yaWdpbnMiKTsKLSAg
ICAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXN1bHQ7Ci0KLSAgICAgICAgd2hp
bGUgKChyZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpKSA9PSBTUUxJVEVfUk9XKQotICAgICAgICAg
ICAgbV9vcmlnaW5zLmFkZChzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKSk7Ci0KLSAgICAgICAg
aWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHVwZGF0ZVRyYWNrZXJEYXRhYmFz
ZUZyb21Mb2NhbFN0b3JhZ2VEYXRhYmFzZUZpbGVzKCk7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyOjp1cGRhdGVUcmFja2VyRGF0YWJhc2VGcm9tTG9jYWxTdG9yYWdlRGF0
YWJhc2VGaWxlcygpCi17Ci0gICAgVmVjdG9yPFN0cmluZz4gcGF0aHMgPSBsaXN0RGlyZWN0b3J5
KG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5LCAiKi5sb2NhbHN0b3JhZ2UiKTsKLQotICAgIEhhc2hT
ZXQ8U3RyaW5nPiBvcmlnaW5zKG1fb3JpZ2lucyk7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG9yaWdp
bnNGcm9tTG9jYWxTdG9yYWdlRGF0YWJhc2VGaWxlczsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcGF0aHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgU3RyaW5nJiBwYXRoID0g
cGF0aHNbaV07Ci0KLSAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIubG9jYWxzdG9yYWdlIikp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRo
R2V0RmlsZU5hbWUocGF0aCk7Ci0KLSAgICAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBm
aWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGVuZ3RoKCkgLSBzdHJsZW4oIi5sb2NhbHN0
b3JhZ2UiKSk7Ci0KLSAgICAgICAgaWYgKCFtX29yaWdpbnMuY29udGFpbnMob3JpZ2luSWRlbnRp
ZmllcikpCi0gICAgICAgICAgICBhZGREYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKG9yaWdp
bklkZW50aWZpZXIsIHBhdGgpOwotCi0gICAgICAgIG9yaWdpbnNGcm9tTG9jYWxTdG9yYWdlRGF0
YWJhc2VGaWxlcy5hZGQob3JpZ2luSWRlbnRpZmllcik7Ci0gICAgfQotCi0gICAgZm9yIChhdXRv
IGl0ID0gb3JpZ2lucy5iZWdpbigpLCBlbmQgPSBvcmlnaW5zLmVuZCgpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyID0gKml0OwotICAg
ICAgICBpZiAob3JpZ2lucy5jb250YWlucyhvcmlnaW5JZGVudGlmaWVyKSkKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotCi0gICAgICAgIHJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIo
b3JpZ2luSWRlbnRpZmllcik7Ci0gICAgfQotfQotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlcjo6YWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9y
aWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRoKQotewotICAgIG9wZW5U
cmFja2VyRGF0YWJhc2UoQ3JlYXRlSWZOb25FeGlzdGVudCk7Ci0gICAgaWYgKCFtX2RhdGFiYXNl
LmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVt
ZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKLSAg
ICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgTE9HX0VS
Uk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAnJXMnIGluIHRoZSB0cmFja2VyIiwgb3Jp
Z2luSWRlbnRpZmllci51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW5JZGVudGlmaWVyKTsKLSAgICBzdGF0ZW1l
bnQuYmluZFRleHQoMiwgZGF0YWJhc2VQYXRoKTsKLQotICAgIGlmIChzdGF0ZW1lbnQuc3RlcCgp
ICE9IFNRTElURV9ET05FKQotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2gg
b3JpZ2luICclcycgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW5JZGVudGlmaWVyLnV0ZjgoKS5kYXRh
KCkpOwotCi0gICAgbV9vcmlnaW5zLmFkZChvcmlnaW5JZGVudGlmaWVyKTsKLQotICAgIC8vIEZJ
WE1FOiBUZWxsIGNsaWVudHMgdGhhdCB0aGUgb3JpZ2luIHdhcyBhZGRlZC4KLX0KLQotdm9pZCBM
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklkZW50
aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyKQotewotICAgIG9wZW5UcmFja2Vy
RGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4o
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5nIHBhdGggPSBwYXRoRm9yRGF0YWJhc2VX
aXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKLSAgICBpZiAocGF0aC5pc0Vt
cHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBkZWxldGVTdGF0
ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIE9yaWdpbnMgd2hlcmUgb3JpZ2luPT8iKTsK
LSAgICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKLSAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBvcmlnaW4gJyVzJyIs
IG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIGRlbGV0ZVN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW5JZGVudGlmaWVyKTsKLSAg
ICBpZiAoIWRlbGV0ZVN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19F
UlJPUigiVW5hYmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2Ygb3JpZ2luICclcyciLCBvcmlnaW5J
ZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZURhdGFiYXNlRmlsZShwYXRoKTsKLQotICAgIG1fb3Jp
Z2lucy5yZW1vdmUob3JpZ2luSWRlbnRpZmllcik7Ci0gICAgaWYgKG1fb3JpZ2lucy5pc0VtcHR5
KCkpIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG9yaWdpbnMgbGVmdDsgZGVsZXRlIHRoZSB0
cmFja2VyIGRhdGFiYXNlLgotICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIFNR
TGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZURhdGFiYXNlRmlsZSh0cmFja2VyRGF0YWJhc2VQYXRoKCkp
OwotICAgICAgICBkZWxldGVFbXB0eURpcmVjdG9yeShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSk7
Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRlbGwgY2xpZW50cyB0aGF0IHRoZSBvcmlnaW4gd2Fz
IHJlbW92ZWQuCi19Ci0KLVN0cmluZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnBhdGhG
b3JEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRp
ZmllcikKLXsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybiBT
dHJpbmcoKTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBwYXRoU3RhdGVtZW50KG1fZGF0YWJhc2Us
ICJTRUxFQ1QgcGF0aCBGUk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8iKTsKLSAgICBpZiAocGF0
aFN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIHByZXBhcmUgc2VsZWN0aW9uIG9mIHBhdGggZm9yIG9yaWdpbiAnJXMnIiwgb3Jp
Z2luSWRlbnRpZmllci51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwot
ICAgIH0KLQotICAgIHBhdGhTdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7
Ci0KLSAgICBpbnQgcmVzdWx0ID0gcGF0aFN0YXRlbWVudC5zdGVwKCk7Ci0gICAgaWYgKHJlc3Vs
dCAhPSBTUUxJVEVfUk9XKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICByZXR1cm4g
cGF0aFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJL
aXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvTG9jYWxTdG9y
YWdlRGF0YWJhc2VUcmFja2VyLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL0xv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCA3Y2ViMTkxNmQ5MzRlNTZmMWY0YTI0MTU1N2Q3MzE4MzRiZTc3ZmQxLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1N0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgKKysrIC9kZXYvbnVsbApAQCAt
MSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVk
ZSA8V2ViQ29yZS9TUUxpdGVEYXRhYmFzZS5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+Ci0j
aW5jbHVkZSA8d3RmL09wdGlvbmFsLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgotI2luY2x1
ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgotI2luY2x1ZGUgPHd0Zi9Xb3JrUXVldWUu
aD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQv
V1RGU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLWNsYXNzIFNlY3VyaXR5T3JpZ2lu
Owotc3RydWN0IFNlY3VyaXR5T3JpZ2luRGF0YTsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0K
LXN0cnVjdCBMb2NhbFN0b3JhZ2VEZXRhaWxzOwotCi1jbGFzcyBMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXIgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXI+IGNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmLCBjb25zdCBTdHJpbmcmIGxvY2FsU3Rv
cmFnZURpcmVjdG9yeSk7Ci0gICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcigpOwotCi0g
ICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEm
KSBjb25zdDsKLQotICAgIHZvaWQgZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdpbihjb25zdCBXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKLSAgICB2b2lkIGRlbGV0ZURhdGFiYXNlV2l0aE9y
aWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKLSAgICB2b2lkIGRlbGV0
ZUFsbERhdGFiYXNlcygpOwotCi0gICAgLy8gUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgb3JpZ2lu
cyB3aG9zZSBkYXRhYmFzZXMgaGF2ZSBiZWVuIGRlbGV0ZWQuCi0gICAgVmVjdG9yPFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YT4gZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShzdGQ6OmNo
cm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50KTsKLQotICAgIFZlY3RvcjxXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25zdDsKLQotICAgIHN0cnVjdCBPcmlnaW5E
ZXRhaWxzIHsKLSAgICAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXI7Ci0gICAgICAgIHN0ZDo6
b3B0aW9uYWw8dGltZV90PiBjcmVhdGlvblRpbWU7Ci0gICAgICAgIHN0ZDo6b3B0aW9uYWw8dGlt
ZV90PiBtb2RpZmljYXRpb25UaW1lOwotICAgIH07Ci0gICAgVmVjdG9yPE9yaWdpbkRldGFpbHM+
IG9yaWdpbkRldGFpbHMoKTsKLQotcHJpdmF0ZToKLSAgICBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIoUmVmPFdvcmtRdWV1ZT4mJiwgY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VEaXJlY3Rv
cnkpOwotCi0gICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVuYW1lKSBj
b25zdDsKLSAgICBTdHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0OwotCi0gICAgZW51
bSBEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSB7Ci0gICAgICAgIENyZWF0ZUlmTm9uRXhpc3RlbnQs
Ci0gICAgICAgIFNraXBJZk5vbkV4aXN0ZW50Ci0gICAgfTsKLSAgICB2b2lkIG9wZW5UcmFja2Vy
RGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOwotCi0gICAgdm9pZCBpbXBvcnRPcmln
aW5JZGVudGlmaWVycygpOwotICAgIHZvaWQgdXBkYXRlVHJhY2tlckRhdGFiYXNlRnJvbUxvY2Fs
U3RvcmFnZURhdGFiYXNlRmlsZXMoKTsKLQotICAgIHZvaWQgYWRkRGF0YWJhc2VXaXRoT3JpZ2lu
SWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYg
ZGF0YWJhc2VQYXRoKTsKLSAgICB2b2lkIHJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZp
ZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyKTsKLSAgICBTdHJpbmcgcGF0aEZvckRh
dGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVy
KTsKLQotICAgIFJlZlB0cjxXb3JrUXVldWU+IG1fcXVldWU7Ci0gICAgU3RyaW5nIG1fbG9jYWxT
dG9yYWdlRGlyZWN0b3J5OwotCi0gICAgV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFz
ZTsKLSAgICBIYXNoU2V0PFN0cmluZz4gbV9vcmlnaW5zOwotCi0jaWYgUExBVEZPUk0oSU9TKQot
ICAgIHZvaWQgcGxhdGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3Q7Ci0KLSAgICBt
dXRhYmxlIGJvb2wgbV9oYXNFeGNsdWRlZEZyb21CYWNrdXAgeyBmYWxzZSB9OwotI2VuZGlmCi19
OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3RhdGlzdGlj
c1BlcnNpc3RlbnRTdG9yYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMw
NDUyNTc3Nzg4ZTliMDM4MzExMGZmMGU1NDI3YThkOTk2ZTUwYi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9y
YWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuaCIKLQot
I2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
U3RvcmUuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVNb25pdG9yLmg+Ci0jaW5jbHVkZSA8V2Vi
Q29yZS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9LZXllZENvZGluZy5oPgotI2lu
Y2x1ZGUgPFdlYkNvcmUvU2hhcmVkQnVmZmVyLmg+Ci0jaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4K
LSNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3RocmVhZHMvQmluYXJ5
U2VtYXBob3JlLmg+Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jb25zdGV4cHIgU2Vjb25kcyBt
aW5pbXVtV3JpdGVJbnRlcnZhbCB7IDVfbWluIH07Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OwotCi1zdGF0aWMgYm9vbCBoYXNGaWxlQ2hhbmdlZFNpbmNlKGNvbnN0IFN0cmluZyYgcGF0aCwg
V2FsbFRpbWUgc2luY2UpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAg
dGltZV90IG1vZGlmaWNhdGlvblRpbWU7Ci0gICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGlt
ZShwYXRoLCBtb2RpZmljYXRpb25UaW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBy
ZXR1cm4gV2FsbFRpbWU6OmZyb21SYXdTZWNvbmRzKG1vZGlmaWNhdGlvblRpbWUpID4gc2luY2U7
Ci19Ci0KLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8S2V5ZWREZWNvZGVyPiBjcmVhdGVEZWNvZGVy
Rm9yRmlsZShjb25zdCBTdHJpbmcmIHBhdGgpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01h
aW4oKSk7Ci0gICAgYXV0byBoYW5kbGUgPSBvcGVuQW5kTG9ja0ZpbGUocGF0aCwgT3BlbkZvclJl
YWQpOwotICAgIGlmIChoYW5kbGUgPT0gaW52YWxpZFBsYXRmb3JtRmlsZUhhbmRsZSkKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBsb25nIGxvbmcgZmlsZVNpemUgPSAwOwotICAgIGlm
ICghZ2V0RmlsZVNpemUoaGFuZGxlLCBmaWxlU2l6ZSkpIHsKLSAgICAgICAgdW5sb2NrQW5kQ2xv
c2VGaWxlKGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHNp
emVfdCBieXRlc1RvUmVhZDsKLSAgICBpZiAoIVdURjo6Y29udmVydFNhZmVseShmaWxlU2l6ZSwg
Ynl0ZXNUb1JlYWQpKSB7Ci0gICAgICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5kbGUpOwotICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyKGJ5
dGVzVG9SZWFkKTsKLSAgICBzaXplX3QgdG90YWxCeXRlc1JlYWQgPSByZWFkRnJvbUZpbGUoaGFu
ZGxlLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKLQotICAgIHVubG9ja0FuZENsb3Nl
RmlsZShoYW5kbGUpOwotCi0gICAgaWYgKHRvdGFsQnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiBLZXllZERlY29kZXI6OmRlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyLmRhdGEoKSksIGJ1ZmZl
ci5zaXplKCkpOwotfQotCi1SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZShXZWJSZXNvdXJjZUxvYWRT
dGF0aXN0aWNzU3RvcmUmIHN0b3JlLCBjb25zdCBTdHJpbmcmIHN0b3JhZ2VEaXJlY3RvcnlQYXRo
KQotICAgIDogbV9tZW1vcnlTdG9yZShzdG9yZSkKLSAgICAsIG1fc3RvcmFnZURpcmVjdG9yeVBh
dGgoc3RvcmFnZURpcmVjdG9yeVBhdGgpCi0gICAgLCBtX2FzeW5jV3JpdGVUaW1lcihSdW5Mb29w
OjptYWluKCksIHRoaXMsICZSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6
OmFzeW5jV3JpdGVUaW1lckZpcmVkKQotewotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZTo6aW5pdGlhbGl6ZSgpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29w
Ojppc01haW4oKSk7Ci0gICAgcG9wdWxhdGVNZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0gICAgc3Rh
cnRNb25pdG9yaW5nRGlzaygpOwotfQotCi1SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVu
dFN0b3JhZ2U6On5SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoKQotewot
ICAgIGZpbmlzaEFsbFBlbmRpbmdXb3JrU3luY2hyb25vdXNseSgpOwotICAgIEFTU0VSVCghbV9o
YXNQZW5kaW5nV3JpdGUpOwotfQotCi1TdHJpbmcgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNp
c3RlbnRTdG9yYWdlOjpzdG9yYWdlRGlyZWN0b3J5UGF0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fc3RvcmFnZURpcmVjdG9yeVBhdGguaXNvbGF0ZWRDb3B5KCk7Ci19Ci0KLVN0cmluZyBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlc291cmNlTG9nRmlsZVBhdGgo
KSBjb25zdAotewotICAgIFN0cmluZyBzdG9yYWdlUGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRo
KCk7Ci0gICAgaWYgKHN0b3JhZ2VQYXRoLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGVtcHR5
U3RyaW5nKCk7Ci0KLSAgICByZXR1cm4gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHN0b3JhZ2VQ
YXRoLCAiZnVsbF9icm93c2luZ19zZXNzaW9uX3Jlc291cmNlTG9nLnBsaXN0Iik7Ci19Ci0KLXZv
aWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpzdGFydE1vbml0b3Jp
bmdEaXNrKCkKLXsKLSAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBpZiAobV9m
aWxlTW9uaXRvcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RyaW5nIHJlc291cmNlTG9nUGF0
aCA9IHJlc291cmNlTG9nRmlsZVBhdGgoKTsKLSAgICBpZiAocmVzb3VyY2VMb2dQYXRoLmlzRW1w
dHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9maWxlTW9uaXRvciA9IHN0ZDo6bWFrZV91
bmlxdWU8RmlsZU1vbml0b3I+KHJlc291cmNlTG9nUGF0aCwgbV9tZW1vcnlTdG9yZS5zdGF0aXN0
aWNzUXVldWUoKSwgW3RoaXNdIChGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGUgdHlwZSkgewot
ICAgICAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICAgICAgc3dpdGNoICh0eXBl
KSB7Ci0gICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlOjpNb2RpZmljYXRp
b246Ci0gICAgICAgICAgICByZWZyZXNoTWVtb3J5U3RvcmVGcm9tRGlzaygpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmlsZU1vbml0b3I6OkZpbGVDaGFuZ2VUeXBlOjpSZW1v
dmFsOgotICAgICAgICAgICAgbV9tZW1vcnlTdG9yZS5jbGVhckluTWVtb3J5KCk7Ci0gICAgICAg
ICAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1vbml0b3JEaXJlY3Rv
cnlGb3JOZXdTdGF0aXN0aWNzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
IH0pOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6
bW9uaXRvckRpcmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKQotewotICAgIFN0cmluZyBzdG9yYWdl
UGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7Ci0gICAgQVNTRVJUKCFzdG9yYWdlUGF0aC5p
c0VtcHR5KCkpOwotCi0gICAgaWYgKCFmaWxlRXhpc3RzKHN0b3JhZ2VQYXRoKSkgewotICAgICAg
ICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhzdG9yYWdlUGF0aCkpIHsKLSAgICAgICAgICAgIFJF
TEVBU0VfTE9HX0VSUk9SKFJlc291cmNlTG9hZFN0YXRpc3RpY3MsICJSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6IEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IHBhdGgg
JXMiLCBzdG9yYWdlUGF0aC51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIG1fZmlsZU1vbml0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEZp
bGVNb25pdG9yPihzdG9yYWdlUGF0aCwgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKSwg
W3RoaXNdIChGaWxlTW9uaXRvcjo6RmlsZUNoYW5nZVR5cGUgdHlwZSkgewotICAgICAgICBBU1NF
UlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gRmlsZU1vbml0b3I6
OkZpbGVDaGFuZ2VUeXBlOjpSZW1vdmFsKSB7Ci0gICAgICAgICAgICAvLyBEaXJlY3Rvcnkgd2Fz
IHJlbW92ZWQhCi0gICAgICAgICAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXNvdXJjZUxvZ1BhdGgg
PSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7Ci0gICAgICAgIEFTU0VSVCghcmVzb3VyY2VMb2dQYXRo
LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKHJlc291cmNlTG9nUGF0aCkp
Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgbV9maWxlTW9uaXRvciA9IG51bGxwdHI7
Ci0KLSAgICAgICAgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKTsKLSAgICAgICAgc3RhcnRN
b25pdG9yaW5nRGlzaygpOwotICAgIH0pOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3Rp
Y3NQZXJzaXN0ZW50U3RvcmFnZTo6c3RvcE1vbml0b3JpbmdEaXNrKCkKLXsKLSAgICBBU1NFUlQo
IVJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBtX2ZpbGVNb25pdG9yID0gbnVsbHB0cjsKLX0KLQot
Ly8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2suCi12b2lkIFJl
c291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6cmVmcmVzaE1lbW9yeVN0b3Jl
RnJvbURpc2soKQotewotICAgIEFTU0VSVCghUnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgU3Ry
aW5nIGZpbGVQYXRoID0gcmVzb3VyY2VMb2dGaWxlUGF0aCgpOwotICAgIGlmIChmaWxlUGF0aC5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIHNvbWV0aW1lcyBzZWUgZmls
ZSBjaGFuZ2VkIGV2ZW50cyBmcm9tIGJlZm9yZSBvdXIgbG9hZCBjb21wbGV0ZWQgKHdlIHN0YXJ0
Ci0gICAgLy8gcmVhZGluZyBhdCB0aGUgZmlyc3QgY2hhbmdlIGV2ZW50LCBidXQgd2UgbWlnaHQg
cmVjZWl2ZSBhIHNlcmllcyBvZiBldmVudHMgcmVsYXRlZAotICAgIC8vIHRvIHRoZSBzYW1lIGZp
bGUgb3BlcmF0aW9uKS4gQ2F0Y2ggdGhpcyBjYXNlIHRvIGF2b2lkIHJlYWRpbmcgb3Zlcmx5IG9m
dGVuLgotICAgIGlmICghaGFzRmlsZUNoYW5nZWRTaW5jZShmaWxlUGF0aCwgbV9sYXN0U3RhdGlz
dGljc0ZpbGVTeW5jVGltZSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFdhbGxUaW1lIHJlYWRU
aW1lID0gV2FsbFRpbWU6Om5vdygpOwotCi0gICAgYXV0byBkZWNvZGVyID0gY3JlYXRlRGVjb2Rl
ckZvckZpbGUoZmlsZVBhdGgpOwotICAgIGlmICghZGVjb2RlcikKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgbV9tZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURlY29kZXIoKmRlY29kZXIpOwot
ICAgIG1fbGFzdFN0YXRpc3RpY3NGaWxlU3luY1RpbWUgPSByZWFkVGltZTsKLX0KLQotdm9pZCBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnBvcHVsYXRlTWVtb3J5U3Rv
cmVGcm9tRGlzaygpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0KLSAgICBT
dHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZUxvZ0ZpbGVQYXRoKCk7Ci0gICAgaWYgKGZpbGVQYXRo
LmlzRW1wdHkoKSB8fCAhZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHsKLSAgICAgICAgbV9tZW1vcnlT
dG9yZS5ncmFuZGZhdGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsKLSAgICAgICAgbW9uaXRvckRp
cmVjdG9yeUZvck5ld1N0YXRpc3RpY3MoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGlmICghaGFzRmlsZUNoYW5nZWRTaW5jZShmaWxlUGF0aCwgbV9sYXN0U3RhdGlzdGljc0ZpbGVT
eW5jVGltZSkpIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBncmFuZGZhdGhlciBpbiB0aGlzIGNh
c2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBXYWxsVGltZSByZWFkVGltZSA9IFdh
bGxUaW1lOjpub3coKTsKLQotICAgIGF1dG8gZGVjb2RlciA9IGNyZWF0ZURlY29kZXJGb3JGaWxl
KGZpbGVQYXRoKTsKLSAgICBpZiAoIWRlY29kZXIpIHsKLSAgICAgICAgbV9tZW1vcnlTdG9yZS5n
cmFuZGZhdGhlckV4aXN0aW5nV2Vic2l0ZURhdGEoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9tZW1vcnlTdG9yZS5pc0VtcHR5KCksICJUaGlz
IGlzIHRoZSBpbml0aWFsIGltcG9ydCBzbyB0aGUgc3RvcmUgc2hvdWxkIGJlIGVtcHR5Iik7Ci0g
ICAgbV9tZW1vcnlTdG9yZS5tZXJnZVdpdGhEYXRhRnJvbURlY29kZXIoKmRlY29kZXIpOwotCi0g
ICAgbV9sYXN0U3RhdGlzdGljc0ZpbGVTeW5jVGltZSA9IHJlYWRUaW1lOwotCi0gICAgbV9tZW1v
cnlTdG9yZS5sb2dUZXN0aW5nRXZlbnQoQVNDSUlMaXRlcmFsKCJQb3B1bGF0ZWRXaXRob3V0R3Jh
bmRmYXRoZXJpbmciKSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlOjphc3luY1dyaXRlVGltZXJGaXJlZCgpCi17Ci0gICAgQVNTRVJUKFJ1bkxvb3A6
OmlzTWFpbigpKTsKLSAgICBtX21lbW9yeVN0b3JlLnN0YXRpc3RpY3NRdWV1ZSgpLmRpc3BhdGNo
KFt0aGlzXSAoKSBtdXRhYmxlIHsKLSAgICAgICAgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOwot
ICAgIH0pOwotfQotCi12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZTo6d3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01h
aW4oKSk7Ci0KLSAgICBtX2hhc1BlbmRpbmdXcml0ZSA9IGZhbHNlOwotICAgIHN0b3BNb25pdG9y
aW5nRGlzaygpOwotCi0gICAgYXV0byBlbmNvZGVyID0gbV9tZW1vcnlTdG9yZS5jcmVhdGVFbmNv
ZGVyRnJvbURhdGEoKTsKLSAgICBhdXRvIHJhd0RhdGEgPSBlbmNvZGVyLT5maW5pc2hFbmNvZGlu
ZygpOwotICAgIGlmICghcmF3RGF0YSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBzdG9y
YWdlUGF0aCA9IHN0b3JhZ2VEaXJlY3RvcnlQYXRoKCk7Ci0gICAgaWYgKCFzdG9yYWdlUGF0aC5p
c0VtcHR5KCkpIHsKLSAgICAgICAgbWFrZUFsbERpcmVjdG9yaWVzKHN0b3JhZ2VQYXRoKTsKLSAg
ICAgICAgZXhjbHVkZUZyb21CYWNrdXAoKTsKLSAgICB9Ci0KLSAgICBhdXRvIGhhbmRsZSA9IG9w
ZW5BbmRMb2NrRmlsZShyZXNvdXJjZUxvZ0ZpbGVQYXRoKCksIE9wZW5Gb3JXcml0ZSk7Ci0gICAg
aWYgKGhhbmRsZSA9PSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpbnQ2NF90IHdyaXR0ZW5CeXRlcyA9IHdyaXRlVG9GaWxlKGhhbmRsZSwgcmF3RGF0
YS0+ZGF0YSgpLCByYXdEYXRhLT5zaXplKCkpOwotICAgIHVubG9ja0FuZENsb3NlRmlsZShoYW5k
bGUpOwotCi0gICAgaWYgKHdyaXR0ZW5CeXRlcyAhPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihyYXdE
YXRhLT5zaXplKCkpKQotICAgICAgICBSRUxFQVNFX0xPR19FUlJPUihSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzLCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOiBXZSBvbmx5
IHdyb3RlICVkIG91dCBvZiAlenUgYnl0ZXMgdG8gZGlzayIsIHN0YXRpY19jYXN0PHVuc2lnbmVk
Pih3cml0dGVuQnl0ZXMpLCByYXdEYXRhLT5zaXplKCkpOwotCi0gICAgbV9sYXN0U3RhdGlzdGlj
c0ZpbGVTeW5jVGltZSA9IFdhbGxUaW1lOjpub3coKTsKLSAgICBtX2xhc3RTdGF0aXN0aWNzV3Jp
dGVUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0KLSAgICBzdGFydE1vbml0b3JpbmdEaXNr
KCk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpz
Y2hlZHVsZU9yV3JpdGVNZW1vcnlTdG9yZShGb3JjZUltbWVkaWF0ZVdyaXRlIGZvcmNlSW1tZWRp
YXRlV3JpdGUpCi17Ci0gICAgQVNTRVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0KLSAgICBhdXRv
IHRpbWVTaW5jZUxhc3RXcml0ZSA9IE1vbm90b25pY1RpbWU6Om5vdygpIC0gbV9sYXN0U3RhdGlz
dGljc1dyaXRlVGltZTsKLSAgICBpZiAoZm9yY2VJbW1lZGlhdGVXcml0ZSAhPSBGb3JjZUltbWVk
aWF0ZVdyaXRlOjpZZXMgJiYgdGltZVNpbmNlTGFzdFdyaXRlIDwgbWluaW11bVdyaXRlSW50ZXJ2
YWwpIHsKLSAgICAgICAgaWYgKCFtX2hhc1BlbmRpbmdXcml0ZSkgewotICAgICAgICAgICAgbV9o
YXNQZW5kaW5nV3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgU2Vjb25kcyBkZWxheSA9IG1pbmlt
dW1Xcml0ZUludGVydmFsIC0gdGltZVNpbmNlTGFzdFdyaXRlICsgMV9zOwotICAgICAgICAgICAg
UnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigq
dGhpcyksIGRlbGF5XSB7Ci0gICAgICAgICAgICAgICAgbV9hc3luY1dyaXRlVGltZXIuc3RhcnRP
bmVTaG90KGRlbGF5KTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICB3cml0ZU1lbW9yeVN0b3JlVG9EaXNrKCk7Ci19Ci0KLXZvaWQgUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpjbGVhcigpCi17Ci0gICAgQVNT
RVJUKCFSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2VM
b2dGaWxlUGF0aCgpOwotICAgIGlmIChmaWxlUGF0aC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHN0b3BNb25pdG9yaW5nRGlzaygpOwotCi0gICAgaWYgKCFkZWxldGVGaWxlKGZp
bGVQYXRoKSkKLSAgICAgICAgUkVMRUFTRV9MT0dfRVJST1IoUmVzb3VyY2VMb2FkU3RhdGlzdGlj
cywgIlJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTogVW5hYmxlIHRvIGRl
bGV0ZSBzdGF0aXN0aWNzIGZpbGU6ICVzIiwgZmlsZVBhdGgudXRmOCgpLmRhdGEoKSk7Ci19Ci0K
LXZvaWQgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlOjpmaW5pc2hBbGxQ
ZW5kaW5nV29ya1N5bmNocm9ub3VzbHkoKQotewotICAgIG1fYXN5bmNXcml0ZVRpbWVyLnN0b3Ao
KTsKLQotICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7Ci0gICAgLy8gTWFrZSBzdXJlIGFu
eSBwZW5kaW5nIHdvcmsgaW4gb3VyIHF1ZXVlIGlzIGZpbmlzaGVkIGJlZm9yZSB3ZSB0ZXJtaW5h
dGUuCi0gICAgbV9tZW1vcnlTdG9yZS5zdGF0aXN0aWNzUXVldWUoKS5kaXNwYXRjaChbJnNlbWFw
aG9yZSwgdGhpc10gewotICAgICAgICAvLyBXcml0ZSBmaW5hbCBmaWxlIHN0YXRlIHRvIGRpc2su
Ci0gICAgICAgIGlmIChtX2hhc1BlbmRpbmdXcml0ZSkKLSAgICAgICAgICAgIHdyaXRlTWVtb3J5
U3RvcmVUb0Rpc2soKTsKLSAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOwotICAgIH0pOwotICAg
IHNlbWFwaG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKLX0KLQotdm9pZCBSZXNvdXJj
ZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2U6OnJlZigpCi17Ci0gICAgbV9tZW1vcnlT
dG9yZS5yZWYoKTsKLX0KLQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2U6OmRlcmVmKCkKLXsKLSAgICBtX21lbW9yeVN0b3JlLmRlcmVmKCk7Ci19Ci0KLSNpZiAh
UExBVEZPUk0oSU9TKQotdm9pZCBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2U6OmV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3QKLXsKLX0KLSNlbmRpZgotCi19IC8vIG5hbWVz
cGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2Uv
UmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmggYi9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9TdG9yYWdlL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQyZWQ0YmM2OTNiYTFlYTIxOTQy
ZTQwM2NkMTM2ZDRlNzY3MjVjLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvUmVzb3VyY2VMb2FkU3Rh
dGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBA
Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgot
I2luY2x1ZGUgPHd0Zi9Nb25vdG9uaWNUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4K
LSNpbmNsdWRlIDx3dGYvV2FsbFRpbWUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcu
aD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgRmlsZU1vbml0b3I7Ci19Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1jbGFzcyBXZWJSZXNvdXJjZUxvYWRTdGF0aXN0aWNzU3RvcmU7Ci0K
LWNsYXNzIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZSB7Ci1wdWJsaWM6
Ci0gICAgUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlKFdlYlJlc291cmNl
TG9hZFN0YXRpc3RpY3NTdG9yZSYsIGNvbnN0IFN0cmluZyYgc3RvcmFnZURpcmVjdG9yeVBhdGgp
OwotICAgIH5SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UoKTsKLQotICAg
IHZvaWQgaW5pdGlhbGl6ZSgpOwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIHZvaWQgZmluaXNo
QWxsUGVuZGluZ1dvcmtTeW5jaHJvbm91c2x5KCk7Ci0KLSAgICB2b2lkIHJlZigpOwotICAgIHZv
aWQgZGVyZWYoKTsKLQotICAgIGVudW0gY2xhc3MgRm9yY2VJbW1lZGlhdGVXcml0ZSB7Ci0gICAg
ICAgIE5vLAotICAgICAgICBZZXMsCi0gICAgfTsKLSAgICB2b2lkIHNjaGVkdWxlT3JXcml0ZU1l
bW9yeVN0b3JlKEZvcmNlSW1tZWRpYXRlV3JpdGUpOwotCi1wcml2YXRlOgotICAgIFN0cmluZyBz
dG9yYWdlRGlyZWN0b3J5UGF0aCgpIGNvbnN0OwotICAgIFN0cmluZyByZXNvdXJjZUxvZ0ZpbGVQ
YXRoKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHN0YXJ0TW9uaXRvcmluZ0Rpc2soKTsKLSAgICB2b2lk
IHN0b3BNb25pdG9yaW5nRGlzaygpOwotICAgIHZvaWQgbW9uaXRvckRpcmVjdG9yeUZvck5ld1N0
YXRpc3RpY3MoKTsKLQotICAgIHZvaWQgd3JpdGVNZW1vcnlTdG9yZVRvRGlzaygpOwotICAgIHZv
aWQgcG9wdWxhdGVNZW1vcnlTdG9yZUZyb21EaXNrKCk7Ci0gICAgdm9pZCBleGNsdWRlRnJvbUJh
Y2t1cCgpIGNvbnN0OwotICAgIHZvaWQgcmVmcmVzaE1lbW9yeVN0b3JlRnJvbURpc2soKTsKLSAg
ICB2b2lkIGFzeW5jV3JpdGVUaW1lckZpcmVkKCk7Ci0KLSAgICBXZWJSZXNvdXJjZUxvYWRTdGF0
aXN0aWNzU3RvcmUmIG1fbWVtb3J5U3RvcmU7Ci0gICAgY29uc3QgU3RyaW5nIG1fc3RvcmFnZURp
cmVjdG9yeVBhdGg7Ci0gICAgUnVuTG9vcDo6VGltZXI8UmVzb3VyY2VMb2FkU3RhdGlzdGljc1Bl
cnNpc3RlbnRTdG9yYWdlPiBtX2FzeW5jV3JpdGVUaW1lcjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8
V2ViQ29yZTo6RmlsZU1vbml0b3I+IG1fZmlsZU1vbml0b3I7Ci0gICAgV2FsbFRpbWUgbV9sYXN0
U3RhdGlzdGljc0ZpbGVTeW5jVGltZTsKLSAgICBNb25vdG9uaWNUaW1lIG1fbGFzdFN0YXRpc3Rp
Y3NXcml0ZVRpbWU7Ci0gICAgYm9vbCBtX2hhc1BlbmRpbmdXcml0ZSB7IGZhbHNlIH07Ci19Owot
Ci19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VN
YW5hZ2VyLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFn
ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhjYTZjYjUyNjIxZjcyM2Jh
ODA0NDEwMWUwY2QwNTk0Yzk0Yjk5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFn
ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTMtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0g
KgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJTdG9yYWdlTWFuYWdlci5oIgotCi0jaW5j
bHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXIuaCIKLSNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcE1lc3NhZ2VzLmgiCi0jaW5j
bHVkZSAiU3RvcmFnZU1hbmFnZXJNZXNzYWdlcy5oIgotI2luY2x1ZGUgIldlYlByb2Nlc3NQcm94
eS5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5EYXRhLmg+Ci0jaW5jbHVkZSA8
V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhhc2guaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VN
YXAuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1RleHRFbmNvZGluZy5oPgotI2luY2x1ZGUgPG1lbW9y
eT4KLSNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+Ci0jaW5jbHVkZSA8d3RmL3RocmVhZHMvQmlu
YXJ5U2VtYXBob3JlLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotY2xhc3MgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYT4gewotcHVibGlj
OgotICAgIHN0YXRpYyBSZWY8U3RvcmFnZUFyZWE+IGNyZWF0ZShMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UqLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOwot
ICAgIH5TdG9yYWdlQXJlYSgpOwotCi0gICAgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5E
YXRhJiBzZWN1cml0eU9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW47IH0K
LQotICAgIHZvaWQgYWRkTGlzdGVuZXIoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFn
ZU1hcElEKTsKLSAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2
NF90IHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICBSZWY8U3RvcmFnZUFyZWE+IGNsb25lKCkgY29uc3Q7
Ci0KLSAgICB2b2lkIHNldEl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1
aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcsIGJvb2wmIHF1b3RhRXhjZXB0aW9u
KTsKLSAgICB2b2lkIHJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9u
LCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3Qg
U3RyaW5nJiB1cmxTdHJpbmcpOwotICAgIHZvaWQgY2xlYXIoSVBDOjpDb25uZWN0aW9uKiBzb3Vy
Y2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcm
IHVybFN0cmluZyk7Ci0KLSAgICBjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgaXRlbXMo
KSBjb25zdDsKLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICBib29sIGlzU2Vzc2lvblN0b3JhZ2Uo
KSBjb25zdCB7IHJldHVybiAhbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2U7IH0KLQotcHJpdmF0ZToK
LSAgICBleHBsaWNpdCBTdG9yYWdlQXJlYShMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqLCBjb25zdCBT
ZWN1cml0eU9yaWdpbkRhdGEmLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpOwotCi0gICAgdm9pZCBv
cGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGRp
c3BhdGNoRXZlbnRzKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qg
c291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xk
VmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKSBj
b25zdDsKLQotICAgIC8vIFdpbGwgYmUgbnVsbCBpZiB0aGUgc3RvcmFnZSBhcmVhIGJlbG9uZ3Mg
dG8gYSBzZXNzaW9uIHN0b3JhZ2UgbmFtZXNwYWNlLgotICAgIExvY2FsU3RvcmFnZU5hbWVzcGFj
ZSogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2U7Ci0gICAgbXV0YWJsZSBSZWZQdHI8TG9jYWxTdG9y
YWdlRGF0YWJhc2U+IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2U7Ci0gICAgbXV0YWJsZSBib29sIG1f
ZGlkSW1wb3J0SXRlbXNGcm9tRGF0YWJhc2UgeyBmYWxzZSB9OwotCi0gICAgU2VjdXJpdHlPcmln
aW5EYXRhIG1fc2VjdXJpdHlPcmlnaW47Ci0gICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7Ci0K
LSAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwotICAgIEhhc2hTZXQ8c3RkOjpw
YWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4+IG1fZXZlbnRMaXN0ZW5lcnM7
Ci19OwotCi1jbGFzcyBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogcHVi
bGljIFRocmVhZFNhZmVSZWZDb3VudGVkPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4gewotcHVibGlj
OgotICAgIHN0YXRpYyBSZWY8TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUoU3RvcmFnZU1h
bmFnZXIqLCB1aW50NjRfdCBzdG9yYWdlTWFuYWdlcklEKTsKLSAgICB+TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKCk7Ci0KLSAgICBTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIoKSBjb25zdCB7
IHJldHVybiBtX3N0b3JhZ2VNYW5hZ2VyOyB9Ci0KLSAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9y
Q3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYpOwotICAgIHZvaWQgZGlkRGVz
dHJveVN0b3JhZ2VBcmVhKFN0b3JhZ2VBcmVhKik7Ci0KLSAgICB2b2lkIGNsZWFyU3RvcmFnZUFy
ZWFzTWF0Y2hpbmdPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJik7Ci0gICAgdm9pZCBj
bGVhckFsbFN0b3JhZ2VBcmVhcygpOwotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0IExvY2FsU3Rv
cmFnZU5hbWVzcGFjZShTdG9yYWdlTWFuYWdlciosIHVpbnQ2NF90IHN0b3JhZ2VNYW5hZ2VySUQp
OwotCi0gICAgU3RvcmFnZU1hbmFnZXIqIG1fc3RvcmFnZU1hbmFnZXI7Ci0gICAgdWludDY0X3Qg
bV9zdG9yYWdlTmFtZXNwYWNlSUQ7Ci0gICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7Ci0KLSAg
ICAvLyBXZSBkb24ndCBob2xkIGFuIGV4cGxpY2l0IHJlZmVyZW5jZSB0byB0aGUgU3RvcmFnZUFy
ZWFzOyB0aGV5IGFyZSBrZXB0IGFsaXZlIGJ5IHRoZSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlv
biBtYXAgaW4gU3RvcmFnZU1hbmFnZXIuCi0gICAgSGFzaE1hcDxTZWN1cml0eU9yaWdpbkRhdGEs
IFN0b3JhZ2VBcmVhKj4gbV9zdG9yYWdlQXJlYU1hcDsKLX07Ci0KLWNsYXNzIFN0b3JhZ2VNYW5h
Z2VyOjpUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJl
ZkNvdW50ZWQ8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlPiB7Ci1wdWJsaWM6Ci0gICAg
c3RhdGljIFJlZjxUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0ZSgpCi0gICAg
ewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UoKSk7Ci0gICAgfQotCi0gICAgflRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSgp
Ci0gICAgewotICAgIH0KLQotICAgIFJlZjxTdG9yYWdlQXJlYT4gZ2V0T3JDcmVhdGVTdG9yYWdl
QXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJiBzZWN1cml0eU9yaWdpbikKLSAgICB7Ci0gICAgICAg
IHJldHVybiAqbV9zdG9yYWdlQXJlYU1hcC5lbnN1cmUoc2VjdXJpdHlPcmlnaW4sIFt0aGlzLCBz
ZWN1cml0eU9yaWdpbl0oKSBtdXRhYmxlIHsKLSAgICAgICAgICAgIHJldHVybiBTdG9yYWdlQXJl
YTo6Y3JlYXRlKG51bGxwdHIsIFdURk1vdmUoc2VjdXJpdHlPcmlnaW4pLCBtX3F1b3RhSW5CeXRl
cyk7Ci0gICAgICAgIH0pLml0ZXJhdG9yLT52YWx1ZS5jb3B5UmVmKCk7Ci0gICAgfQotCi0gICAg
VmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2lucygpIGNvbnN0Ci0gICAgewotICAgICAg
ICBWZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zOwotCi0gICAgICAgIGZvciAoY29u
c3QgYXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0b3JhZ2VBcmVhTWFwLnZhbHVlcygpKSB7Ci0gICAg
ICAgICAgICBpZiAoIXN0b3JhZ2VBcmVhLT5pdGVtcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICBvcmlnaW5zLmFwcGVuZChzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSk7Ci0gICAg
ICAgIH0KLQotICAgICAgICByZXR1cm4gb3JpZ2luczsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFy
U3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1
cml0eU9yaWdpbikKLSAgICB7Ci0gICAgICAgIGZvciAoYXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0
b3JhZ2VBcmVhTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEtPnNl
Y3VyaXR5T3JpZ2luKCkgPT0gc2VjdXJpdHlPcmlnaW4pCi0gICAgICAgICAgICAgICAgc3RvcmFn
ZUFyZWEtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyQWxsU3Rv
cmFnZUFyZWFzKCkKLSAgICB7Ci0gICAgICAgIGZvciAoYXV0byYgc3RvcmFnZUFyZWEgOiBtX3N0
b3JhZ2VBcmVhTWFwLnZhbHVlcygpKQotICAgICAgICAgICAgc3RvcmFnZUFyZWEtPmNsZWFyKCk7
Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0IFRyYW5zaWVudExvY2FsU3RvcmFnZU5h
bWVzcGFjZSgpCi0gICAgewotICAgIH0KLQotICAgIGNvbnN0IHVuc2lnbmVkIG1fcXVvdGFJbkJ5
dGVzID0gNSAqIDEwMjQgKiAxMDI0OwotCi0gICAgSGFzaE1hcDxTZWN1cml0eU9yaWdpbkRhdGEs
IFJlZlB0cjxTdG9yYWdlQXJlYT4+IG1fc3RvcmFnZUFyZWFNYXA7Ci19OwotCi1hdXRvIFN0b3Jh
Z2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y3JlYXRlKExvY2FsU3RvcmFnZU5hbWVzcGFjZSogbG9j
YWxTdG9yYWdlTmFtZXNwYWNlLCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3Jp
Z2luLCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpIC0+IFJlZjxTdG9yYWdlTWFuYWdlcjo6U3RvcmFn
ZUFyZWE+Ci17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZUFyZWEobG9jYWxTdG9y
YWdlTmFtZXNwYWNlLCBzZWN1cml0eU9yaWdpbiwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0KLVN0b3Jh
Z2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6U3RvcmFnZUFyZWEoTG9jYWxTdG9yYWdlTmFtZXNwYWNl
KiBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UsIGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJp
dHlPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLSAgICA6IG1fbG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSkKLSAgICAsIG1fc2VjdXJpdHlPcmlnaW4oc2Vj
dXJpdHlPcmlnaW4pCi0gICAgLCBtX3F1b3RhSW5CeXRlcyhxdW90YUluQnl0ZXMpCi0gICAgLCBt
X3N0b3JhZ2VNYXAoU3RvcmFnZU1hcDo6Y3JlYXRlKG1fcXVvdGFJbkJ5dGVzKSkKLXsKLX0KLQot
U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjp+U3RvcmFnZUFyZWEoKQotewotICAgIEFTU0VS
VChtX2V2ZW50TGlzdGVuZXJzLmlzRW1wdHkoKSk7Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VE
YXRhYmFzZSkKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+Y2xvc2UoKTsKLQotICAg
IGlmIChtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZSkKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VOYW1l
c3BhY2UtPmRpZERlc3Ryb3lTdG9yYWdlQXJlYSh0aGlzKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFu
YWdlcjo6U3RvcmFnZUFyZWE6OmFkZExpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlv
biwgdWludDY0X3Qgc3RvcmFnZU1hcElEKQotewotICAgIEFTU0VSVCghbV9ldmVudExpc3RlbmVy
cy5jb250YWlucyhzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSkpOwot
ICAgIG1fZXZlbnRMaXN0ZW5lcnMuYWRkKHN0ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBzdG9y
YWdlTWFwSUQpKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6OnJlbW92
ZUxpc3RlbmVyKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1h
cElEKQotewotICAgIEFTU0VSVChpc1Nlc3Npb25TdG9yYWdlKCkgfHwgbV9ldmVudExpc3RlbmVy
cy5jb250YWlucyhzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSkpOwot
ICAgIG1fZXZlbnRMaXN0ZW5lcnMucmVtb3ZlKHN0ZDo6bWFrZV9wYWlyKCZjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQpKTsKLX0KLQotUmVmPFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYT4gU3Rv
cmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpjbG9uZSgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFt
X2xvY2FsU3RvcmFnZU5hbWVzcGFjZSk7Ci0KLSAgICBhdXRvIHN0b3JhZ2VBcmVhID0gU3RvcmFn
ZUFyZWE6OmNyZWF0ZShudWxscHRyLCBtX3NlY3VyaXR5T3JpZ2luLCBtX3F1b3RhSW5CeXRlcyk7
Ci0gICAgc3RvcmFnZUFyZWEtPm1fc3RvcmFnZU1hcCA9IG1fc3RvcmFnZU1hcDsKLQotICAgIHJl
dHVybiBzdG9yYWdlQXJlYTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6
OnNldEl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3Vy
Y2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwg
Y29uc3QgU3RyaW5nJiB1cmxTdHJpbmcsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQotewotICAgIG9w
ZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKTsKLQotICAgIFN0cmluZyBvbGRWYWx1
ZTsKLQotICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IG1fc3RvcmFnZU1hcC0+c2V0SXRlbShrZXks
IHZhbHVlLCBvbGRWYWx1ZSwgcXVvdGFFeGNlcHRpb24pOwotICAgIGlmIChuZXdTdG9yYWdlTWFw
KQotICAgICAgICBtX3N0b3JhZ2VNYXAgPSBXVEZNb3ZlKG5ld1N0b3JhZ2VNYXApOwotCi0gICAg
aWYgKHF1b3RhRXhjZXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9sb2NhbFN0
b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZS0+c2V0SXRlbShr
ZXksIHZhbHVlKTsKLQotICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNvdXJj
ZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIHZhbHVlLCB1cmxTdHJpbmcpOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6cmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rp
b24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0
IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykKLXsKLSAgICBvcGVuRGF0YWJh
c2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7Ci0KLSAgICBTdHJpbmcgb2xkVmFsdWU7Ci0gICAg
YXV0byBuZXdTdG9yYWdlTWFwID0gbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xkVmFs
dWUpOwotICAgIGlmIChuZXdTdG9yYWdlTWFwKQotICAgICAgICBtX3N0b3JhZ2VNYXAgPSBXVEZN
b3ZlKG5ld1N0b3JhZ2VNYXApOwotCi0gICAgaWYgKG9sZFZhbHVlLmlzTnVsbCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKLSAgICAgICAgbV9s
b2NhbFN0b3JhZ2VEYXRhYmFzZS0+cmVtb3ZlSXRlbShrZXkpOwotCi0gICAgZGlzcGF0Y2hFdmVu
dHMoc291cmNlQ29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwg
U3RyaW5nKCksIHVybFN0cmluZyk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VB
cmVhOjpjbGVhcihJUEM6OkNvbm5lY3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNv
dXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIG9wZW5E
YXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKTsKLQotICAgIGlmICghbV9zdG9yYWdlTWFw
LT5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9zdG9yYWdlTWFwID0gU3RvcmFn
ZU1hcDo6Y3JlYXRlKG1fcXVvdGFJbkJ5dGVzKTsKLQotICAgIGlmIChtX2xvY2FsU3RvcmFnZURh
dGFiYXNlKQotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlLT5jbGVhcigpOwotCi0gICAg
ZGlzcGF0Y2hFdmVudHMoc291cmNlQ29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwgU3Ry
aW5nKCksIFN0cmluZygpLCBTdHJpbmcoKSwgdXJsU3RyaW5nKTsKLX0KLQotY29uc3QgSGFzaE1h
cDxTdHJpbmcsIFN0cmluZz4mIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6aXRlbXMoKSBj
b25zdAotewotICAgIG9wZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKTsKLQotICAg
IHJldHVybiBtX3N0b3JhZ2VNYXAtPml0ZW1zKCk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6
OlN0b3JhZ2VBcmVhOjpjbGVhcigpCi17Ci0gICAgbV9zdG9yYWdlTWFwID0gU3RvcmFnZU1hcDo6
Y3JlYXRlKG1fcXVvdGFJbkJ5dGVzKTsKLQotICAgIGlmIChtX2xvY2FsU3RvcmFnZURhdGFiYXNl
KSB7Ci0gICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmNsb3NlKCk7Ci0gICAgICAgIG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2UgPSBudWxscHRyOwotICAgIH0KLQotICAgIGZvciAoYXV0byBp
dCA9IG1fZXZlbnRMaXN0ZW5lcnMuYmVnaW4oKSwgZW5kID0gbV9ldmVudExpc3RlbmVycy5lbmQo
KTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBpdC0+Zmlyc3QtPnNlbmQoTWVzc2FnZXM6OlN0
b3JhZ2VBcmVhTWFwOjpDbGVhckNhY2hlKCksIGl0LT5zZWNvbmQpOwotfQotCi12b2lkIFN0b3Jh
Z2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6b3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRl
ZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gV2Ugb3BlbiB0aGUgZGF0YWJhc2UgaGVyZSBldmVuIGlmIHdlJ3Zl
IGFscmVhZHkgaW1wb3J0ZWQgb3VyIGl0ZW1zIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhYmFzZSBp
cyBvcGVuIGlmIHdlIG5lZWQgdG8gd3JpdGUgdG8gaXQuCi0gICAgaWYgKCFtX2xvY2FsU3RvcmFn
ZURhdGFiYXNlKQotICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlID0gTG9jYWxTdG9yYWdl
RGF0YWJhc2U6OmNyZWF0ZShtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU1hbmFnZXIo
KS0+bV9xdWV1ZS5jb3B5UmVmKCksIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTWFu
YWdlcigpLT5tX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5jb3B5UmVmKCksIG1fc2VjdXJp
dHlPcmlnaW4pOwotCi0gICAgaWYgKG1fZGlkSW1wb3J0SXRlbXNGcm9tRGF0YWJhc2UpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPmltcG9ydEl0ZW1zKCpt
X3N0b3JhZ2VNYXApOwotICAgIG1fZGlkSW1wb3J0SXRlbXNGcm9tRGF0YWJhc2UgPSB0cnVlOwot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6ZGlzcGF0Y2hFdmVudHMoSVBD
OjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJl
YUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3Ry
aW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpIGNvbnN0Ci17Ci0gICAgZm9y
IChIYXNoU2V0PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+Pjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2V2ZW50TGlzdGVuZXJzLmJlZ2luKCksIGVuZCA9IG1fZXZl
bnRMaXN0ZW5lcnMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICB1aW50NjRfdCBz
dG9yYWdlQXJlYUlEID0gaXQtPmZpcnN0ID09IHNvdXJjZUNvbm5lY3Rpb24gPyBzb3VyY2VTdG9y
YWdlQXJlYUlEIDogMDsKLQotICAgICAgICBpdC0+Zmlyc3QtPnNlbmQoTWVzc2FnZXM6OlN0b3Jh
Z2VBcmVhTWFwOjpEaXNwYXRjaFN0b3JhZ2VFdmVudChzdG9yYWdlQXJlYUlELCBrZXksIG9sZFZh
bHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nKSwgaXQtPnNlY29uZCk7Ci0gICAgfQotfQotCi1SZWY8
U3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZT4gU3RvcmFnZU1hbmFnZXI6Okxv
Y2FsU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKFN0b3JhZ2VNYW5hZ2VyKiBzdG9yYWdlTWFuYWdl
ciwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQotewotICAgIHJldHVybiBhZG9wdFJlZigq
bmV3IExvY2FsU3RvcmFnZU5hbWVzcGFjZShzdG9yYWdlTWFuYWdlciwgc3RvcmFnZU5hbWVzcGFj
ZUlEKSk7Ci19Ci0KLS8vIEZJWE1FOiBUaGUgcXVvdGEgdmFsdWUgaXMgY29waWVkIGZyb20gR3Jv
dXBTZXR0aW5ncy5jcHAuCi0vLyBXZSBzaG91bGQgaW52ZXN0aWdhdGUgYSB3YXkgdG8gc2hhcmUg
aXQgd2l0aCBXZWJDb3JlLgotU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6
TG9jYWxTdG9yYWdlTmFtZXNwYWNlKFN0b3JhZ2VNYW5hZ2VyKiBzdG9yYWdlTWFuYWdlciwgdWlu
dDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQotICAgIDogbV9zdG9yYWdlTWFuYWdlcihzdG9yYWdl
TWFuYWdlcikKLSAgICAsIG1fc3RvcmFnZU5hbWVzcGFjZUlEKHN0b3JhZ2VOYW1lc3BhY2VJRCkK
LSAgICAsIG1fcXVvdGFJbkJ5dGVzKDUgKiAxMDI0ICogMTAyNCkKLXsKLX0KLQotU3RvcmFnZU1h
bmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZTo6fkxvY2FsU3RvcmFnZU5hbWVzcGFjZSgpCi17
Ci0gICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgpKTsKLX0KLQotYXV0byBTdG9y
YWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpnZXRPckNyZWF0ZVN0b3JhZ2VBcmVh
KFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKSAtPiBSZWY8U3RvcmFnZUFyZWE+
Ci17Ci0gICAgYXV0byYgc2xvdCA9IG1fc3RvcmFnZUFyZWFNYXAuYWRkKHNlY3VyaXR5T3JpZ2lu
LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0gICAgaWYgKHNsb3QpCi0gICAgICAgIHJldHVy
biAqc2xvdDsKLQotICAgIGF1dG8gc3RvcmFnZUFyZWEgPSBTdG9yYWdlQXJlYTo6Y3JlYXRlKHRo
aXMsIFdURk1vdmUoc2VjdXJpdHlPcmlnaW4pLCBtX3F1b3RhSW5CeXRlcyk7Ci0gICAgc2xvdCA9
ICZzdG9yYWdlQXJlYS5nZXQoKTsKLQotICAgIHJldHVybiBzdG9yYWdlQXJlYTsKLX0KLQotdm9p
ZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpkaWREZXN0cm95U3RvcmFn
ZUFyZWEoU3RvcmFnZUFyZWEqIHN0b3JhZ2VBcmVhKQotewotICAgIEFTU0VSVChtX3N0b3JhZ2VB
cmVhTWFwLmNvbnRhaW5zKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKSk7Ci0KLSAgICBt
X3N0b3JhZ2VBcmVhTWFwLnJlbW92ZShzdG9yYWdlQXJlYS0+c2VjdXJpdHlPcmlnaW4oKSk7Ci0g
ICAgaWYgKCFtX3N0b3JhZ2VBcmVhTWFwLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgQVNTRVJUKG1fc3RvcmFnZU1hbmFnZXItPm1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy5jb250
YWlucyhtX3N0b3JhZ2VOYW1lc3BhY2VJRCkpOwotICAgIG1fc3RvcmFnZU1hbmFnZXItPm1fbG9j
YWxTdG9yYWdlTmFtZXNwYWNlcy5yZW1vdmUobV9zdG9yYWdlTmFtZXNwYWNlSUQpOwotfQotCi12
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNsZWFyU3RvcmFnZUFy
ZWFzTWF0Y2hpbmdPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdp
bikKLXsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG9yaWdpbkFuZFN0b3JhZ2VBcmVhIDogbV9zdG9y
YWdlQXJlYU1hcCkgewotICAgICAgICBpZiAob3JpZ2luQW5kU3RvcmFnZUFyZWEua2V5ID09IHNl
Y3VyaXR5T3JpZ2luKQotICAgICAgICAgICAgb3JpZ2luQW5kU3RvcmFnZUFyZWEudmFsdWUtPmNs
ZWFyKCk7Ci0gICAgfQotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1l
c3BhY2U6OmNsZWFyQWxsU3RvcmFnZUFyZWFzKCkKLXsKLSAgICBmb3IgKGF1dG8qIHN0b3JhZ2VB
cmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkKLSAgICAgICAgc3RvcmFnZUFyZWEtPmNs
ZWFyKCk7Ci19Ci0KLWNsYXNzIFN0b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZT4g
ewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IGNyZWF0
ZSh1bnNpZ25lZCBxdW90YUluQnl0ZXMpOwotICAgIH5TZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSgp
OwotCi0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC5p
c0VtcHR5KCk7IH0KLQotICAgIElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24oKSBj
b25zdCB7IHJldHVybiBtX2FsbG93ZWRDb25uZWN0aW9uLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRB
bGxvd2VkQ29ubmVjdGlvbihJUEM6OkNvbm5lY3Rpb24qKTsKLQotICAgIFJlZjxTdG9yYWdlQXJl
YT4gZ2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0KLSAgICB2
b2lkIGNsb25lVG8oU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UmIG5ld1Nlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlKTsKLQotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25z
dAotICAgIHsKLSAgICAgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKLQot
ICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52
YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFzdG9yYWdlQXJlYS0+aXRlbXMoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQoc3RvcmFnZUFyZWEtPnNlY3VyaXR5
T3JpZ2luKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9yaWdpbnM7Ci0gICAgfQot
Ci0gICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0IFNlY3VyaXR5
T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCi0gICAgewotICAgICAgICBmb3IgKGF1dG8mIHN0
b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYg
KHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpID09IHNlY3VyaXR5T3JpZ2luKQotICAgICAg
ICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
dm9pZCBjbGVhckFsbFN0b3JhZ2VBcmVhcygpCi0gICAgewotICAgICAgICBmb3IgKGF1dG8mIHN0
b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkKLSAgICAgICAgICAgIHN0b3Jh
Z2VBcmVhLT5jbGVhcigpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBleHBsaWNpdCBTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YUluQnl0ZXMpOwotCi0gICAgUmVmUHRyPElQ
Qzo6Q29ubmVjdGlvbj4gbV9hbGxvd2VkQ29ubmVjdGlvbjsKLSAgICB1bnNpZ25lZCBtX3F1b3Rh
SW5CeXRlczsKLQotICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8U3RvcmFn
ZUFyZWE+PiBtX3N0b3JhZ2VBcmVhTWFwOwotfTsKLQotUmVmPFN0b3JhZ2VNYW5hZ2VyOjpTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZT4gU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlOjpjcmVhdGUodW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotewotICAgIHJldHVybiBhZG9wdFJl
ZigqbmV3IFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHF1b3RhSW5CeXRlcykpOwotfQotCi1TdG9y
YWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6OlNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLSAgICA6IG1fcXVvdGFJbkJ5dGVzKHF1b3RhSW5C
eXRlcykKLXsKLX0KLQotU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjp+
U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoKQotewotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6c2V0QWxsb3dlZENvbm5lY3Rpb24oSVBDOjpDb25uZWN0
aW9uKiBhbGxvd2VkQ29ubmVjdGlvbikKLXsKLSAgICBBU1NFUlQoIWFsbG93ZWRDb25uZWN0aW9u
IHx8ICFtX2FsbG93ZWRDb25uZWN0aW9uKTsKLQotICAgIG1fYWxsb3dlZENvbm5lY3Rpb24gPSBh
bGxvd2VkQ29ubmVjdGlvbjsKLX0KLQotYXV0byBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2U6OmdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYg
c2VjdXJpdHlPcmlnaW4pIC0+IFJlZjxTdG9yYWdlQXJlYT4KLXsKLSAgICByZXR1cm4gKm1fc3Rv
cmFnZUFyZWFNYXAuZW5zdXJlKHNlY3VyaXR5T3JpZ2luLCBbdGhpcywgc2VjdXJpdHlPcmlnaW5d
KCkgbXV0YWJsZSB7Ci0gICAgICAgIHJldHVybiBTdG9yYWdlQXJlYTo6Y3JlYXRlKG51bGxwdHIs
IFdURk1vdmUoc2VjdXJpdHlPcmlnaW4pLCBtX3F1b3RhSW5CeXRlcyk7Ci0gICAgfSkuaXRlcmF0
b3ItPnZhbHVlLmNvcHlSZWYoKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2U6OmNsb25lVG8oU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UmIG5ld1Nlc3Np
b25TdG9yYWdlTmFtZXNwYWNlKQotewotICAgIEFTU0VSVF9VTlVTRUQobmV3U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UsIG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLmlzRW1wdHkoKSk7Ci0KLSAg
ICBmb3IgKGF1dG8mIHBhaXIgOiBtX3N0b3JhZ2VBcmVhTWFwKQotICAgICAgICBuZXdTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZS5tX3N0b3JhZ2VBcmVhTWFwLmFkZChwYWlyLmtleSwgcGFpci52YWx1
ZS0+Y2xvbmUoKSk7Ci19Ci0KLVJlZjxTdG9yYWdlTWFuYWdlcj4gU3RvcmFnZU1hbmFnZXI6OmNy
ZWF0ZShjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKLXsKLSAgICByZXR1cm4g
YWRvcHRSZWYoKm5ldyBTdG9yYWdlTWFuYWdlcihsb2NhbFN0b3JhZ2VEaXJlY3RvcnkpKTsKLX0K
LQotU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VNYW5hZ2VyKGNvbnN0IFN0cmluZyYgbG9jYWxTdG9y
YWdlRGlyZWN0b3J5KQotICAgIDogbV9xdWV1ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29tLmFwcGxl
LldlYktpdC5TdG9yYWdlTWFuYWdlciIpKQotICAgICwgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXIoTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpjcmVhdGUobV9xdWV1ZS5jb3B5UmVm
KCksIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkpCi17Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBlbmNv
ZGluZyBpcyBpbml0aWFsaXplZCBiZWZvcmUgd2Ugc3RhcnQgZGlzcGF0Y2hpbmcgdGhpbmdzIHRv
IHRoZSBxdWV1ZS4KLSAgICBVVEY4RW5jb2RpbmcoKTsKLX0KLQotU3RvcmFnZU1hbmFnZXI6On5T
dG9yYWdlTWFuYWdlcigpCi17Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZVNlc3Np
b25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdW5zaWduZWQg
cXVvdGFJbkJ5dGVzKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3JhZ2VOYW1lc3BhY2VJRCwgcXVvdGFJbkJ5dGVzXSgp
IG11dGFibGUgewotICAgICAgICBBU1NFUlQoIW1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmNv
bnRhaW5zKHN0b3JhZ2VOYW1lc3BhY2VJRCkpOwotCi0gICAgICAgIG1fc2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2VzLnNldChzdG9yYWdlTmFtZXNwYWNlSUQsIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
OjpjcmVhdGUocXVvdGFJbkJ5dGVzKSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFn
ZXI6OmRlc3Ryb3lTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQpCi17Ci0gICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlEXSB7Ci0gICAgICAgIEFTU0VSVChtX3Nl
c3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNlSUQpKTsKLSAg
ICAgICAgbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMucmVtb3ZlKHN0b3JhZ2VOYW1lc3BhY2VJ
RCk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OnNldEFsbG93ZWRTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZUNvbm5lY3Rpb24odWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBJ
UEM6OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKQotewotICAgIG1fcXVldWUtPmRpc3Bh
dGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbm5lY3Rpb24gPSBS
ZWZQdHI8SVBDOjpDb25uZWN0aW9uPihhbGxvd2VkQ29ubmVjdGlvbiksIHN0b3JhZ2VOYW1lc3Bh
Y2VJRF0oKSBtdXRhYmxlIHsKLSAgICAgICAgQVNTRVJUKG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2VzLmNvbnRhaW5zKHN0b3JhZ2VOYW1lc3BhY2VJRCkpOwotCi0gICAgICAgIG1fc2Vzc2lvblN0
b3JhZ2VOYW1lc3BhY2VzLmdldChzdG9yYWdlTmFtZXNwYWNlSUQpLT5zZXRBbGxvd2VkQ29ubmVj
dGlvbihjb25uZWN0aW9uLmdldCgpKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdl
cjo6Y2xvbmVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNl
SUQsIHVpbnQ2NF90IG5ld1N0b3JhZ2VOYW1lc3BhY2VJRCkKLXsKLSAgICBtX3F1ZXVlLT5kaXNw
YXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBzdG9yYWdlTmFtZXNw
YWNlSUQsIG5ld1N0b3JhZ2VOYW1lc3BhY2VJRF0gewotICAgICAgICBTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZSogc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNw
YWNlcy5nZXQoc3RvcmFnZU5hbWVzcGFjZUlEKTsKLSAgICAgICAgaWYgKCFzZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSkgewotICAgICAgICAgICAgLy8gRklYTUU6IFdlIGNhbiBnZXQgaW50byB0aGlz
IHNpdHVhdGlvbiBpZiBzb21lb25lIGNsb3NlcyB0aGUgb3JpZ2luYXRpbmcgcGFnZSBmcm9tIHdp
dGhpbiBhCi0gICAgICAgICAgICAvLyBjcmVhdGVOZXdQYWdlIGNhbGxiYWNrLiBXZSBiYWlsIGZv
ciBub3csIGJ1dCB3ZSBzaG91bGQgcmVhbGx5IGZpbmQgYSB3YXkgdG8ga2VlcCB0aGUgc2Vzc2lv
biBzdG9yYWdlIGFsaXZlCi0gICAgICAgICAgICAvLyBzbyB3ZSB3ZSdsbCBjbG9uZSB0aGUgc2Vz
c2lvbiBzdG9yYWdlIGNvcnJlY3RseS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
Ci0gICAgICAgIFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZSA9IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmdldChuZXdTdG9yYWdlTmFtZXNwYWNl
SUQpOwotICAgICAgICBBU1NFUlQobmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpOwotCi0gICAg
ICAgIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5jbG9uZVRvKCpuZXdTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OnByb2Nlc3NXaWxs
T3BlbkNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0
aW9uKQotewotICAgIGNvbm5lY3Rpb24uYWRkV29ya1F1ZXVlTWVzc2FnZVJlY2VpdmVyKE1lc3Nh
Z2VzOjpTdG9yYWdlTWFuYWdlcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3F1ZXVlLmdldCgp
LCB0aGlzKTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6cHJvY2Vzc0RpZENsb3NlQ29ubmVj
dGlvbihXZWJQcm9jZXNzUHJveHkmLCBJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24pCi17Ci0g
ICAgY29ubmVjdGlvbi5yZW1vdmVXb3JrUXVldWVNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0
b3JhZ2VNYW5hZ2VyOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCkpOwotCi0gICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29ubmVjdGlvbiA9
IFJlZjxJUEM6OkNvbm5lY3Rpb24+KGNvbm5lY3Rpb24pXSgpIG11dGFibGUgewotICAgICAgICBW
ZWN0b3I8c3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4+IGNvbm5l
Y3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlOwotICAgICAgICBmb3IgKGF1dG8mIHN0
b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlm
IChzdG9yYWdlQXJlYS5rZXkuZmlyc3QgIT0gY29ubmVjdGlvbi5wdHIoKSkKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgc3RvcmFnZUFyZWEudmFsdWUtPnJlbW92ZUxp
c3RlbmVyKCpzdG9yYWdlQXJlYS5rZXkuZmlyc3QsIHN0b3JhZ2VBcmVhLmtleS5zZWNvbmQpOwot
ICAgICAgICAgICAgY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmUuYXBwZW5k
KHN0b3JhZ2VBcmVhLmtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGF1dG8mIHBhaXIg
OiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZSkKLSAgICAgICAgICAgIG1f
c3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLnJlbW92ZShwYWlyKTsKLSAgICB9KTsKLX0KLQotdm9p
ZCBTdG9yYWdlTWFuYWdlcjo6Z2V0U2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQo
SGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5k
bGVyKQotewotICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFr
ZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxl
cildKCkgbXV0YWJsZSB7Ci0gICAgICAgIEhhc2hTZXQ8U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmln
aW5zOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2Ug
OiBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9y
IChhdXRvJiBvcmlnaW4gOiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+b3JpZ2lucygpKQotICAg
ICAgICAgICAgICAgIG9yaWdpbnMuYWRkKG9yaWdpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBS
dW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW29yaWdpbnMgPSBXVEZNb3ZlKG9yaWdpbnMpLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewot
ICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoV1RGTW92ZShvcmlnaW5zKSk7Ci0gICAgICAg
IH0pOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZWxldGVTZXNzaW9uU3Rv
cmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQotewotICAg
IG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJs
ZSB7Ci0gICAgICAgIGZvciAoYXV0byYgc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgOiBtX3Nlc3Np
b25TdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgIHNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlLT5jbGVhckFsbFN0b3JhZ2VBcmVhcygpOwotCi0gICAgICAgIFJ1bkxvb3A6Om1h
aW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7Ci0gICAgfSk7Ci19Ci0K
LXZvaWQgU3RvcmFnZU1hbmFnZXI6OmRlbGV0ZVNlc3Npb25TdG9yYWdlRW50cmllc0Zvck9yaWdp
bnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mIG9yaWdpbnMsIEZ1
bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKLXsKLSAgICBWZWN0b3I8V2ViQ29y
ZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiBjb3BpZWRPcmlnaW5zOwotICAgIGNvcGllZE9yaWdpbnMu
cmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5zLnNpemUoKSk7Ci0KLSAgICBmb3IgKGF1dG8m
IG9yaWdpbiA6IG9yaWdpbnMpCi0gICAgICAgIGNvcGllZE9yaWdpbnMudW5jaGVja2VkQXBwZW5k
KG9yaWdpbi5pc29sYXRlZENvcHkoKSk7Ci0KLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywg
cHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW5zID0gV1RGTW92ZShj
b3BpZWRPcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5k
bGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBjb3BpZWRPcmln
aW5zKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDog
bV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgc2Vz
c2lvblN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3Jp
Z2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChXVEZN
b3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFn
ZXI6OmdldExvY2FsU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZChIYXNoU2V0PFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YT4mJik+JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAgbV9x
dWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29t
cGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsK
LSAgICAgICAgSGFzaFNldDxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7Ci0KLSAgICAgICAg
Zm9yIChhdXRvJiBvcmlnaW4gOiBtX2xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci0+b3JpZ2lu
cygpKQotICAgICAgICAgICAgb3JpZ2lucy5hZGQob3JpZ2luKTsKLQotICAgICAgICBmb3IgKGF1
dG8mIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4g
OiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPm9yaWdpbnMoKSkKLSAgICAgICAgICAg
ICAgICBvcmlnaW5zLmFkZChvcmlnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgUnVuTG9vcDo6
bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5zID0gV1RGTW92ZShvcmlnaW5zKSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAg
ICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2lucykpOwotICAgICAgICB9KTsKLSAg
ICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlTWFuYWdlcjo6Z2V0TG9jYWxTdG9yYWdlT3JpZ2luRGV0
YWlscyhGdW5jdGlvbjx2b2lkIChWZWN0b3I8TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpP
cmlnaW5EZXRhaWxzPik+JiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAgbV9xdWV1ZS0+ZGlz
cGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgY29tcGxldGlvbkhh
bmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKLSAgICAgICAg
YXV0byBvcmlnaW5EZXRhaWxzID0gbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPm9yaWdp
bkRldGFpbHMoKTsKLQotICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW29yaWdpbkRl
dGFpbHMgPSBXVEZNb3ZlKG9yaWdpbkRldGFpbHMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1v
dmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICAgICAgY29tcGxldGlv
bkhhbmRsZXIoV1RGTW92ZShvcmlnaW5EZXRhaWxzKSk7Ci0gICAgICAgIH0pOwotICAgIH0pOwot
fQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZWxldGVMb2NhbFN0b3JhZ2VFbnRyaWVzRm9yT3Jp
Z2luKFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIG1fcXVldWUt
PmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvcGllZE9y
aWdpbiA9IHNlY3VyaXR5T3JpZ2luLmlzb2xhdGVkQ29weSgpXSgpIG11dGFibGUgewotICAgICAg
ICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fbG9jYWxTdG9yYWdlTmFtZXNw
YWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJT
dG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb3BpZWRPcmlnaW4pOwotCi0gICAgICAgIGZvciAo
YXV0byYgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV90cmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygpKQotICAgICAgICAgICAgdHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvcGllZE9yaWdp
bik7Ci0KLSAgICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPmRlbGV0ZURhdGFi
YXNlV2l0aE9yaWdpbihjb3BpZWRPcmlnaW4pOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VN
YW5hZ2VyOjpkZWxldGVMb2NhbFN0b3JhZ2VPcmlnaW5zTW9kaWZpZWRTaW5jZShzdGQ6OmNocm9u
bzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21w
bGV0aW9uSGFuZGxlcikKLXsKLSAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVk
VGhpcyA9IG1ha2VSZWYoKnRoaXMpLCB0aW1lLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUo
Y29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICBhdXRvIGRlbGV0ZWRPcmln
aW5zID0gbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPmRlbGV0ZURhdGFiYXNlc01vZGlm
aWVkU2luY2UodGltZSk7Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvcmlnaW4gOiBkZWxl
dGVkT3JpZ2lucykgewotICAgICAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCi0gICAgICAgICAgICAgICAg
bG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9y
aWdpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGF1dG8mIHRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMo
KSkKLSAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJBbGxT
dG9yYWdlQXJlYXMoKTsKLQotICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcikpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2Vy
OjpkZWxldGVMb2NhbFN0b3JhZ2VFbnRyaWVzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8V2ViQ29y
ZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYgb3JpZ2lucywgRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBs
ZXRpb25IYW5kbGVyKQotewotICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IGNvcGllZE9y
aWdpbnM7Ci0gICAgY29waWVkT3JpZ2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG9yaWdpbnMu
c2l6ZSgpKTsKLQotICAgIGZvciAoYXV0byYgb3JpZ2luIDogb3JpZ2lucykKLSAgICAgICAgY29w
aWVkT3JpZ2lucy51bmNoZWNrZWRBcHBlbmQob3JpZ2luLmlzb2xhdGVkQ29weSgpKTsKLQotICAg
IG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGNvcGllZE9yaWdpbnMgPSBXVEZNb3ZlKGNvcGllZE9yaWdpbnMpLCBjb21wbGV0aW9uSGFuZGxl
ciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewotICAgICAgICBmb3Ig
KGF1dG8mIG9yaWdpbiA6IGNvcGllZE9yaWdpbnMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYg
bG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLnZhbHVlcygp
KQotICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9yYWdlQXJl
YXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOwotCi0gICAgICAgICAgICBmb3IgKGF1dG8mIHRyYW5z
aWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNw
YWNlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1l
c3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3JpZ2luKTsKLQotICAgICAg
ICAgICAgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPmRlbGV0ZURhdGFiYXNlV2l0aE9y
aWdpbihvcmlnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3Bh
dGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKLSAgICB9KTsKLX0KLQotdm9pZCBTdG9y
YWdlTWFuYWdlcjo6Y3JlYXRlTG9jYWxTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYgY29ubmVj
dGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQs
IFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luRGF0YSkKLXsKLSAgICBzdGQ6OnBh
aXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiBjb25uZWN0aW9uQW5kU3RvcmFn
ZU1hcElEUGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKLQotICAgIC8vIEZJWE1FOiBU
aGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNTRVJUKChIYXNoTWFwPHN0ZDo6
cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFy
ZWE+Pjo6aXNWYWxpZEtleShjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcikpKTsKLQotICAg
IEhhc2hNYXA8c3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+LCB1aW50NjRfdD4sIFJl
ZlB0cjxTdG9yYWdlQXJlYT4+OjpBZGRSZXN1bHQgcmVzdWx0ID0gbV9zdG9yYWdlQXJlYXNCeUNv
bm5lY3Rpb24uYWRkKGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyLCBudWxscHRyKTsKLQot
ICAgIC8vIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrcy4KLSAgICBBU1NF
UlQocmVzdWx0LmlzTmV3RW50cnkpOwotICAgIEFTU0VSVCgoSGFzaE1hcDx1aW50NjRfdCwgUmVm
UHRyPExvY2FsU3RvcmFnZU5hbWVzcGFjZT4+Ojppc1ZhbGlkS2V5KHN0b3JhZ2VOYW1lc3BhY2VJ
RCkpKTsKLQotICAgIExvY2FsU3RvcmFnZU5hbWVzcGFjZSogbG9jYWxTdG9yYWdlTmFtZXNwYWNl
ID0gZ2V0T3JDcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uoc3RvcmFnZU5hbWVzcGFjZUlEKTsK
LQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNT
RVJUKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSk7Ci0KLSAgICBhdXRvIHN0b3JhZ2VBcmVhID0gbG9j
YWxTdG9yYWdlTmFtZXNwYWNlLT5nZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFdURk1vdmUoc2VjdXJp
dHlPcmlnaW5EYXRhKSk7Ci0gICAgc3RvcmFnZUFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24s
IHN0b3JhZ2VNYXBJRCk7Ci0KLSAgICByZXN1bHQuaXRlcmF0b3ItPnZhbHVlID0gV1RGTW92ZShz
dG9yYWdlQXJlYSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZVRyYW5zaWVudExv
Y2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3Jh
Z2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdpbkRhdGEm
JiB0b3BMZXZlbE9yaWdpbkRhdGEsIFNlY3VyaXR5T3JpZ2luRGF0YSYmIG9yaWdpbikKLXsKLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgotICAgIEFTU0VSVCht
X3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5pc1ZhbGlkS2V5KHsgJmNvbm5lY3Rpb24sIHN0b3Jh
Z2VNYXBJRCB9KSk7Ci0KLSAgICAvLyBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHNlc3Npb24gc3Rv
cmFnZSBmb3IgdGhpcyBjb25uZWN0aW9uL29yaWdpbiBjb21iby4KLSAgICAvLyBJZiBzbywgdXBk
YXRlIHRoZSBtYXAgd2l0aCB0aGUgbmV3IElELCBvdGhlcndpc2Uga2VlcCBvbiB0cnVja2luZy4K
LSAgICBmb3IgKGF1dG8gaXQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5iZWdpbigpLCBl
bmQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7
Ci0gICAgICAgIGlmIChpdC0+a2V5LmZpcnN0ICE9ICZjb25uZWN0aW9uKQotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIFJlZjxTdG9yYWdlQXJlYT4gYXJlYSA9ICppdC0+dmFsdWU7Ci0g
ICAgICAgIGlmICghYXJlYS0+aXNTZXNzaW9uU3RvcmFnZSgpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgIGlmICghb3JpZ2luLnNlY3VyaXR5T3JpZ2luKCktPmlzU2FtZVNjaGVtZUhv
c3RQb3J0KGFyZWEtPnNlY3VyaXR5T3JpZ2luKCkuc2VjdXJpdHlPcmlnaW4oKS5nZXQoKSkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXJlYS0+YWRkTGlzdGVuZXIoY29ubmVjdGlv
biwgc3RvcmFnZU1hcElEKTsKLSAgICAgICAgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24ucmVt
b3ZlKGl0KTsKLSAgICAgICAgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5l
Y3Rpb24sIHN0b3JhZ2VNYXBJRCB9LCBXVEZNb3ZlKGFyZWEpKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5hZGQo
eyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsK
LQotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCi0gICAgQVNT
RVJUKCFzbG90KTsKLQotICAgIFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSogdHJhbnNp
ZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlID0gZ2V0T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2Uoc3RvcmFnZU5hbWVzcGFjZUlELCBXVEZNb3ZlKHRvcExldmVsT3JpZ2luRGF0
YSkpOwotCi0gICAgYXV0byBzdG9yYWdlQXJlYSA9IHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVz
cGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKG9yaWdpbikpOwotICAgIHN0b3Jh
Z2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgc2xv
dCA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVh
dGVTZXNzaW9uU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90
IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdp
bkRhdGEmJiBzZWN1cml0eU9yaWdpbkRhdGEpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
IGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZXMuaXNWYWxpZEtleShzdG9yYWdlTmFtZXNwYWNlSUQpKTsKLQotICAgIFNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlKiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA9IG1fc2Vzc2lvblN0b3JhZ2VOYW1l
c3BhY2VzLmdldChzdG9yYWdlTmFtZXNwYWNlSUQpOwotICAgIGlmICghc2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UpIHsKLSAgICAgICAgLy8gV2UncmUgZ2V0dGluZyBhbiBpbmNvbWluZyBtZXNzYWdl
IGZyb20gdGhlIHdlYiBwcm9jZXNzIHRoYXQncyBmb3Igc2Vzc2lvbiBzdG9yYWdlIGZvciBhIHdl
YiBwYWdlCi0gICAgICAgIC8vIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQsIGp1c3QgaWdu
b3JlIGl0LgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hv
dWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5l
Y3Rpb24uaXNWYWxpZEtleSh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSkpOwotCi0gICAg
YXV0byYgc2xvdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZCh7ICZjb25uZWN0aW9u
LCBzdG9yYWdlTWFwSUQgfSwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOwotCi0gICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NFUlQoIXNsb3QpOwot
Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBjaGVjay4KLSAgICBBU1NF
UlQoJmNvbm5lY3Rpb24gPT0gc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UtPmFsbG93ZWRDb25uZWN0
aW9uKCkpOwotCi0gICAgYXV0byBzdG9yYWdlQXJlYSA9IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
LT5nZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFdURk1vdmUoc2VjdXJpdHlPcmlnaW5EYXRhKSk7Ci0g
ICAgc3RvcmFnZUFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0K
LSAgICBzbG90ID0gV1RGTW92ZShzdG9yYWdlQXJlYSk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFn
ZXI6OmRlc3Ryb3lTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0
X3Qgc3RvcmFnZU1hcElEKQotewotICAgIHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9u
PiwgdWludDY0X3Q+IGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKCZjb25uZWN0aW9uLCBz
dG9yYWdlTWFwSUQpOwotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWVzc2FnZSBj
aGVjay4KLSAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uaXNWYWxpZEtleShj
b25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcikpOwotCi0gICAgYXV0byBpdCA9IG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uLmZpbmQoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOwot
ICAgIGlmIChpdCA9PSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5lbmQoKSkgewotICAgICAg
ICAvLyBUaGUgY29ubmVjdGlvbiBoYXMgYmVlbiByZW1vdmVkIGJlY2F1c2UgdGhlIGxhc3QgcGFn
ZSB3YXMgY2xvc2VkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaXQtPnZhbHVlLT5y
ZW1vdmVMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotCi0gICAgLy8gRG9uJ3Qg
cmVtb3ZlIHNlc3Npb24gc3RvcmFnZSBtYXBzLiBUaGUgd2ViIHByb2Nlc3MgbWF5IHJlY29ubmVj
dCBhbmQgZXhwZWN0IHRoZSBkYXRhIHRvIHN0aWxsIGJlIGFyb3VuZC4KLSAgICBpZiAoaXQtPnZh
bHVlLT5pc1Nlc3Npb25TdG9yYWdlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fc3RvcmFn
ZUFyZWFzQnlDb25uZWN0aW9uLnJlbW92ZShjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcik7
Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldFZhbHVlcyhJUEM6OkNvbm5lY3Rpb24mIGNv
bm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQs
IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiB2YWx1ZXMpCi17Ci0gICAgU3RvcmFnZUFyZWEqIHN0
b3JhZ2VBcmVhID0gZmluZFN0b3JhZ2VBcmVhKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0g
ICAgaWYgKCFzdG9yYWdlQXJlYSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgc2Vzc2lvbiBzdG9y
YWdlIGFyZWEgZm9yIGEgcGFnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBJZ25vcmUg
aXQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YWx1ZXMgPSBzdG9yYWdlQXJlYS0+
aXRlbXMoKTsKLSAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpE
aWRHZXRWYWx1ZXMoc3RvcmFnZU1hcFNlZWQpLCBzdG9yYWdlTWFwSUQpOwotfQotCi12b2lkIFN0
b3JhZ2VNYW5hZ2VyOjpzZXRJdGVtKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0
X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBz
dG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNv
bnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9
IGZpbmRTdG9yYWdlQXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOwotICAgIGlmICghc3Rv
cmFnZUFyZWEpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZv
ciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBxdW90YUVycm9yOwotICAgIHN0b3JhZ2VBcmVh
LT5zZXRJdGVtKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIHZhbHVlLCB1
cmxTdHJpbmcsIHF1b3RhRXJyb3IpOwotICAgIGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3Rv
cmFnZUFyZWFNYXA6OkRpZFNldEl0ZW0oc3RvcmFnZU1hcFNlZWQsIGtleSwgcXVvdGFFcnJvciks
IHN0b3JhZ2VNYXBJRCk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OnJlbW92ZUl0ZW0oSVBD
OjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJp
bmcmIGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgU3RvcmFnZUFyZWEqIHN0
b3JhZ2VBcmVhID0gZmluZFN0b3JhZ2VBcmVhKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0g
ICAgaWYgKCFzdG9yYWdlQXJlYSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgc2Vzc2lvbiBzdG9y
YWdlIGFyZWEgZm9yIGEgcGFnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBJZ25vcmUg
aXQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdG9yYWdlQXJlYS0+cmVtb3ZlSXRl
bSgmY29ubmVjdGlvbiwgc291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCB1cmxTdHJpbmcpOwotICAg
IGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6OkRpZFJlbW92ZUl0ZW0o
c3RvcmFnZU1hcFNlZWQsIGtleSksIHN0b3JhZ2VNYXBJRCk7Ci19Ci0KLXZvaWQgU3RvcmFnZU1h
bmFnZXI6OmNsZWFyKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFn
ZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFw
U2VlZCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgU3RvcmFnZUFyZWEqIHN0b3Jh
Z2VBcmVhID0gZmluZFN0b3JhZ2VBcmVhKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7Ci0gICAg
aWYgKCFzdG9yYWdlQXJlYSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgc2Vzc2lvbiBzdG9yYWdl
IGFyZWEgZm9yIGEgcGFnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBJZ25vcmUgaXQu
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoJmNvbm5l
Y3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVybFN0cmluZyk7Ci0gICAgY29ubmVjdGlvbi5z
ZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkQ2xlYXIoc3RvcmFnZU1hcFNlZWQpLCBz
dG9yYWdlTWFwSUQpOwotfQotCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjphcHBsaWNhdGlvbldpbGxU
ZXJtaW5hdGUoKQotewotICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7Ci0gICAgbV9xdWV1
ZS0+ZGlzcGF0Y2goW3RoaXMsICZzZW1hcGhvcmVdIHsKLSAgICAgICAgVmVjdG9yPHN0ZDo6cGFp
cjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBjb25uZWN0aW9uQW5kU3RvcmFn
ZU1hcElEUGFpcnNUb1JlbW92ZTsKLSAgICAgICAgZm9yIChhdXRvJiBjb25uZWN0aW9uU3RvcmFn
ZUFyZWFQYWlyIDogbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGNv
bm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIudmFsdWUtPnJlbW92ZUxpc3RlbmVyKCpjb25uZWN0aW9u
U3RvcmFnZUFyZWFQYWlyLmtleS5maXJzdCwgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXku
c2Vjb25kKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyc1RvUmVt
b3ZlLmFwcGVuZChjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyLmtleSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBmb3IgKGF1dG8mIGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIgOiBjb25uZWN0aW9u
QW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZSkKLSAgICAgICAgICAgIG1fc3RvcmFnZUFyZWFz
QnlDb25uZWN0aW9uLnJlbW92ZShjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWlyKTsKLQotICAgICAg
ICBzZW1hcGhvcmUuc2lnbmFsKCk7Ci0gICAgfSk7Ci0gICAgc2VtYXBob3JlLndhaXQoV2FsbFRp
bWU6OmluZmluaXR5KCkpOwotfQotCi1TdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWEqIFN0b3Jh
Z2VNYW5hZ2VyOjpmaW5kU3RvcmFnZUFyZWEoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1
aW50NjRfdCBzdG9yYWdlTWFwSUQpIGNvbnN0Ci17Ci0gICAgc3RkOjpwYWlyPElQQzo6Q29ubmVj
dGlvbiosIHVpbnQ2NF90PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcigmY29ubmVjdGlv
biwgc3RvcmFnZU1hcElEKTsKLQotICAgIGlmICghbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24u
aXNWYWxpZEtleShjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcikpCi0gICAgICAgIHJldHVy
biBudWxscHRyOwotCi0gICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmdldChj
b25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcik7Ci19Ci0KLVN0b3JhZ2VNYW5hZ2VyOjpMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UqIFN0b3JhZ2VNYW5hZ2VyOjpnZXRPckNyZWF0ZUxvY2FsU3RvcmFn
ZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpCi17Ci0gICAgaWYgKCFtX2xv
Y2FsU3RvcmFnZU5hbWVzcGFjZXMuaXNWYWxpZEtleShzdG9yYWdlTmFtZXNwYWNlSUQpKQotICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8mIHNsb3QgPSBtX2xvY2FsU3RvcmFnZU5h
bWVzcGFjZXMuYWRkKHN0b3JhZ2VOYW1lc3BhY2VJRCwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVl
OwotICAgIGlmICghc2xvdCkKLSAgICAgICAgc2xvdCA9IExvY2FsU3RvcmFnZU5hbWVzcGFjZTo6
Y3JlYXRlKHRoaXMsIHN0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0KLSAgICByZXR1cm4gc2xvdC5nZXQo
KTsKLX0KLQotU3RvcmFnZU1hbmFnZXI6OlRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSog
U3RvcmFnZU1hbmFnZXI6OmdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNl
KHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRh
JiYgdG9wTGV2ZWxPcmlnaW4pCi17Ci0gICAgaWYgKCFtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5h
bWVzcGFjZXMuaXNWYWxpZEtleSh7IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdG9wTGV2ZWxPcmlnaW4g
fSkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgYXV0byYgc2xvdCA9IG1fdHJhbnNp
ZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy5hZGQoeyBzdG9yYWdlTmFtZXNwYWNlSUQsIFdURk1v
dmUodG9wTGV2ZWxPcmlnaW4pIH0sIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKLSAgICBpZiAo
IXNsb3QpCi0gICAgICAgIHNsb3QgPSBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNy
ZWF0ZSgpOwotCi0gICAgcmV0dXJuIHNsb3QuZ2V0KCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdl
TWFuYWdlci5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdl
ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY2OWViNzA3M2EzY2E1ZjNiOGUy
N2Q5MzNkMWI4YWUyODFhMDliLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIu
aAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBv
bmNlCi0KLSNpbmNsdWRlICJDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4K
LSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luSGFzaC5oPgotI2luY2x1ZGUgPGNocm9u
bz4KLSNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgotI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgot
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3Vu
dGVkLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1jbGFzcyBTZWN1cml0eU9yaWdpbjsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0K
LWNsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjsKLWNsYXNzIFdlYlByb2Nlc3NQcm94
eTsKLQotY2xhc3MgU3RvcmFnZU1hbmFnZXIgOiBwdWJsaWMgSVBDOjpDb25uZWN0aW9uOjpXb3Jr
UXVldWVNZXNzYWdlUmVjZWl2ZXIgewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8U3RvcmFnZU1h
bmFnZXI+IGNyZWF0ZShjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7Ci0gICAg
flN0b3JhZ2VNYW5hZ2VyKCk7Ci0KLSAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNw
YWNlKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsK
LSAgICB2b2lkIGRlc3Ryb3lTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdl
TmFtZXNwYWNlSUQpOwotICAgIHZvaWQgc2V0QWxsb3dlZFNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
Q29ubmVjdGlvbih1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIElQQzo6Q29ubmVjdGlvbiog
YWxsb3dlZENvbm5lY3Rpb24pOwotICAgIHZvaWQgY2xvbmVTZXNzaW9uU3RvcmFnZU5hbWVzcGFj
ZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVpbnQ2NF90IG5ld1N0b3JhZ2VOYW1lc3Bh
Y2VJRCk7Ci0KLSAgICB2b2lkIHByb2Nlc3NXaWxsT3BlbkNvbm5lY3Rpb24oV2ViUHJvY2Vzc1By
b3h5JiwgSVBDOjpDb25uZWN0aW9uJik7Ci0gICAgdm9pZCBwcm9jZXNzRGlkQ2xvc2VDb25uZWN0
aW9uKFdlYlByb2Nlc3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYpOwotICAgIHZvaWQgYXBwbGlj
YXRpb25XaWxsVGVybWluYXRlKCk7Ci0KLSAgICB2b2lkIGdldFNlc3Npb25TdG9yYWdlT3JpZ2lu
cyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4m
JiBjb21wbGV0aW9uSGFuZGxlcik7Ci0gICAgdm9pZCBkZWxldGVTZXNzaW9uU3RvcmFnZU9yaWdp
bnMoRnVuY3Rpb248dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKLSAgICB2b2lkIGRlbGV0
ZVNlc3Npb25TdG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNl
Y3VyaXR5T3JpZ2luRGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
OwotCi0gICAgdm9pZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNl
dDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsK
LSAgICB2b2lkIGRlbGV0ZUxvY2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW4oV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhJiYpOwotCi0gICAgdm9pZCBkZWxldGVMb2NhbFN0b3JhZ2VPcmlnaW5z
TW9kaWZpZWRTaW5jZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50LCBGdW5j
dGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOwotICAgIHZvaWQgZGVsZXRlTG9jYWxT
dG9yYWdlRW50cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YT4mLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOwotCi0gICAg
dm9pZCBnZXRMb2NhbFN0b3JhZ2VPcmlnaW5EZXRhaWxzKEZ1bmN0aW9uPHZvaWQoVmVjdG9yPExv
Y2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBsZXRpb25I
YW5kbGVyKTsKLQotcHJpdmF0ZToKLSAgICBleHBsaWNpdCBTdG9yYWdlTWFuYWdlcihjb25zdCBT
dHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7Ci0KLSAgICAvLyBJUEM6OkNvbm5lY3Rpb246
OldvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlci4KLSAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQ
Qzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYpIG92ZXJyaWRlOwotICAgIHZvaWQgZGlkUmVj
ZWl2ZVN5bmNNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYsIHN0ZDo6dW5p
cXVlX3B0cjxJUEM6OkVuY29kZXI+JiByZXBseUVuY29kZXIpIG92ZXJyaWRlOwotCi0gICAgLy8g
TWVzc2FnZSBoYW5kbGVycy4KLSAgICB2b2lkIGNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNv
bm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3Bh
Y2VJRCwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYpOwotICAgIHZvaWQgY3JlYXRlVHJh
bnNpZW50TG9jYWxTdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VN
YXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGEmJiB0b3BMZXZlbE9yaWdpbkRhdGEsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYm
KTsKLSAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYsIHVp
bnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGEmJik7Ci0gICAgdm9pZCBkZXN0cm95U3RvcmFnZU1hcChJUEM6
OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOwotCi0gICAgdm9pZCBnZXRWYWx1
ZXMoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9y
YWdlTWFwU2VlZCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIHZhbHVlcyk7Ci0gICAgdm9pZCBz
ZXRJdGVtKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJp
bmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwot
ICAgIHZvaWQgcmVtb3ZlSXRlbShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFw
SUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVk
LCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOwotICAgIHZvaWQg
Y2xlYXIoSVBDOjpDb25uZWN0aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBz
b3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5n
JiB1cmxTdHJpbmcpOwotCi0gICAgY2xhc3MgU3RvcmFnZUFyZWE7Ci0gICAgU3RvcmFnZUFyZWEq
IGZpbmRTdG9yYWdlQXJlYShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCkgY29uc3Q7Ci0KLSAg
ICBjbGFzcyBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U7Ci0gICAgTG9jYWxTdG9yYWdlTmFtZXNwYWNl
KiBnZXRPckNyZWF0ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQpOwotCi0gICAgY2xhc3MgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOwotICAg
IFRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSogZ2V0T3JDcmVhdGVUcmFuc2llbnRMb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9yaWdpbik7Ci0KLSAgICBSZWY8V29ya1F1ZXVl
PiBtX3F1ZXVlOwotCi0gICAgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gbV9sb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI7Ci0gICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPExv
Y2FsU3RvcmFnZU5hbWVzcGFjZT4+IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlczsKLQotICAgIEhh
c2hNYXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+LCBS
ZWZQdHI8VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlPj4gbV90cmFuc2llbnRMb2NhbFN0
b3JhZ2VOYW1lc3BhY2VzOwotCi0gICAgY2xhc3MgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U7Ci0g
ICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPj4gbV9z
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXM7Ci0KLSAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQdHI8
SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBtX3N0b3Jh
Z2VBcmVhc0J5Q29ubmVjdGlvbjsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNz
YWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIu
bWVzc2FnZXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Nzg5Zjc0Y2MwODFi
MDc0YjU4ODUwZDJiN2Q3YmM0MTgwNDljOGEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9TdG9yYWdl
TWFuYWdlci5tZXNzYWdlcy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgQ29w
eXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0jICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIwot
IyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORAotIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotIyBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCi0jIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0jIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSMgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IKLSMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotbWVzc2FnZXMgLT4gU3RvcmFnZU1h
bmFnZXIgewotICAgIENyZWF0ZUxvY2FsU3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQs
IHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luRGF0YSBzZWN1cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgotICAgIENyZWF0ZVRy
YW5zaWVudExvY2FsU3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0
b3JhZ2VOYW1lc3BhY2VJRCwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSB0b3BM
ZXZlbFNlY3VyaXR5T3JpZ2luRGF0YSwgc3RydWN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0
YSBzZWN1cml0eU9yaWdpbkRhdGEpIFdhbnRzQ29ubmVjdGlvbgotICAgIENyZWF0ZVNlc3Npb25T
dG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFj
ZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luRGF0
YSkgV2FudHNDb25uZWN0aW9uCi0gICAgRGVzdHJveVN0b3JhZ2VNYXAodWludDY0X3Qgc3RvcmFn
ZU1hcElEKSBXYW50c0Nvbm5lY3Rpb24KLQotICAgIEdldFZhbHVlcyh1aW50NjRfdCBzdG9yYWdl
TWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKSAtPiAoSGFzaE1hcDxTdHJpbmcsIFN0cmlu
Zz4gdmFsdWVzKSBXYW50c0Nvbm5lY3Rpb24KLQotICAgIFNldEl0ZW0odWludDY0X3Qgc3RvcmFn
ZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFw
U2VlZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdXJsU3RyaW5nKSBXYW50c0Nv
bm5lY3Rpb24KLSAgICBSZW1vdmVJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qg
c291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXks
IFN0cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgotICAgIENsZWFyKHVpbnQ2NF90IHN0
b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFn
ZU1hcFNlZWQsIFN0cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgotfQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9pb3MvTG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VySU9TLm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvU3RvcmFnZS9pb3MvTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VySU9TLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBmZDkwOWVhNmIyNTAzMTliMDEzMDZjNDM2YmQwZjEzMmMwZjgyODU2Li4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9j
ZXNzL1N0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbQorKysgL2Rl
di9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCi0KLSNpZiBQTEFURk9S
TShJT1MpCi0KLSNpbmNsdWRlICJWZXJzaW9uQ2hlY2tzLmgiCi0KLW5hbWVzcGFjZSBXZWJLaXQg
ewotCi12b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6cGxhdGZvcm1NYXliZUV4Y2x1
ZGVGcm9tQmFja3VwKCkgY29uc3QKLXsKLSAgICBpZiAobV9oYXNFeGNsdWRlZEZyb21CYWNrdXAp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1faGFzRXhjbHVkZWRGcm9tQmFja3VwID0gdHJ1ZTsK
LQotICAgIGlmIChsaW5rZWRPbk9yQWZ0ZXIoU0RLVmVyc2lvbjo6Rmlyc3RUb0V4Y2x1ZGVMb2Nh
bFN0b3JhZ2VGcm9tQmFja3VwKSkKLSAgICAgICAgW1tOU1VSTCBmaWxlVVJMV2l0aFBhdGg6KE5T
U3RyaW5nICopbV9sb2NhbFN0b3JhZ2VEaXJlY3RvcnldIHNldFJlc291cmNlVmFsdWU6QFlFUyBm
b3JLZXk6TlNVUkxJc0V4Y2x1ZGVkRnJvbUJhY2t1cEtleSBlcnJvcjpuaWxdOwotfQotCi19IC8v
IG5hbWVzcGFjZSBXZWJLaXQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9TdG9yYWdlL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2VJT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9TdG9yYWdlL2lvcy9SZXNvdXJjZUxv
YWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDViNWNiZDI4ZTI0OTI5MTNhNDMyNzY0YzliYTkzNjUyNzdjOTc3MjEuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvU3RvcmFnZS9pb3MvUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9y
YWdlSU9TLm1tCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bXBvcnQgImNvbmZpZy5oIgotI2ltcG9ydCAiUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3Rl
bnRTdG9yYWdlLmgiCi0KLSNpZiBQTEFURk9STShJT1MpCi0KLW5hbWVzcGFjZSBXZWJLaXQgewot
Ci12b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZTo6ZXhjbHVkZUZy
b21CYWNrdXAoKSBjb25zdAotewotICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0cmlu
ZyAqKW1fc3RvcmFnZURpcmVjdG9yeVBhdGhdIHNldFJlc291cmNlVmFsdWU6QFlFUyBmb3JLZXk6
TlNVUkxJc0V4Y2x1ZGVkRnJvbUJhY2t1cEtleSBlcnJvcjpuaWxdOwotfQotCi19Ci0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xv
Y2FsU3RvcmFnZURhdGFiYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNDU0MDgxYjcwZWQwNTE5ZjQ0Mjkz
MTJlODMyNGE0MGVmZDk2NTRmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSwzNjcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTMgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgIkxvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgorI2lu
Y2x1ZGUgPFdlYkNvcmUvU1FMaXRlU3RhdGVtZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxp
dGVUcmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VNYXAuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N1ZGRlblRl
cm1pbmF0aW9uLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9Xb3Jr
UXVldWUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvV1RGU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitzdGF0aWMg
Y29uc3QgYXV0byBkYXRhYmFzZVVwZGF0ZUludGVydmFsID0gMV9zOworCitzdGF0aWMgY29uc3Qg
aW50IG1heGltdW1JdGVtc1RvVXBkYXRlID0gMTAwOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
UmVmPExvY2FsU3RvcmFnZURhdGFiYXNlPiBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6Y3JlYXRlKFJl
ZjxXb3JrUXVldWU+JiYgcXVldWUsIFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYg
dHJhY2tlciwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKK3sKKyAg
ICByZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VEYXRhYmFzZShXVEZNb3ZlKHF1ZXVl
KSwgV1RGTW92ZSh0cmFja2VyKSwgc2VjdXJpdHlPcmlnaW4pKTsKK30KKworTG9jYWxTdG9yYWdl
RGF0YWJhc2U6OkxvY2FsU3RvcmFnZURhdGFiYXNlKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIFJl
ZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYgdHJhY2tlciwgY29uc3QgU2VjdXJpdHlP
cmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKKyAgICA6IG1fcXVldWUoV1RGTW92ZShxdWV1ZSkp
CisgICAgLCBtX3RyYWNrZXIoV1RGTW92ZSh0cmFja2VyKSkKKyAgICAsIG1fc2VjdXJpdHlPcmln
aW4oc2VjdXJpdHlPcmlnaW4pCisgICAgLCBtX2RhdGFiYXNlUGF0aChtX3RyYWNrZXItPmRhdGFi
YXNlUGF0aChtX3NlY3VyaXR5T3JpZ2luKSkKKyAgICAsIG1fZmFpbGVkVG9PcGVuRGF0YWJhc2Uo
ZmFsc2UpCisgICAgLCBtX2RpZEltcG9ydEl0ZW1zKGZhbHNlKQorICAgICwgbV9pc0Nsb3NlZChm
YWxzZSkKKyAgICAsIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZShmYWxzZSkKKyAgICAsIG1f
c2hvdWxkQ2xlYXJJdGVtcyhmYWxzZSkKK3sKK30KKworTG9jYWxTdG9yYWdlRGF0YWJhc2U6On5M
b2NhbFN0b3JhZ2VEYXRhYmFzZSgpCit7CisgICAgQVNTRVJUKG1faXNDbG9zZWQpOworfQorCit2
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpvcGVuRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3Ry
YXRlZ3kgb3BlbmluZ1N0cmF0ZWd5KQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZS5pc09wZW4o
KSk7CisgICAgQVNTRVJUKCFtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlKTsKKworICAgIGlmICghdHJ5
VG9PcGVuRGF0YWJhc2Uob3BlbmluZ1N0cmF0ZWd5KSkgeworICAgICAgICBtX2ZhaWxlZFRvT3Bl
bkRhdGFiYXNlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2Rh
dGFiYXNlLmlzT3BlbigpKQorICAgICAgICBtX3RyYWNrZXItPmRpZE9wZW5EYXRhYmFzZVdpdGhP
cmlnaW4obV9zZWN1cml0eU9yaWdpbik7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6
OnRyeVRvT3BlbkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5IG9wZW5pbmdTdHJhdGVn
eSkKK3sKKyAgICBpZiAoIWZpbGVFeGlzdHMobV9kYXRhYmFzZVBhdGgpICYmIG9wZW5pbmdTdHJh
dGVneSA9PSBTa2lwSWZOb25FeGlzdGVudCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBp
ZiAobV9kYXRhYmFzZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19FUlJPUigiRmlsZW5h
bWUgZm9yIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgaXMgZW1wdHkgLSBjYW5ub3Qgb3BlbiBmb3Ig
cGVyc2lzdGVudCBzdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBpZiAoIW1fZGF0YWJhc2Uub3BlbihtX2RhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBmaWxlICVzIGZvciBsb2NhbCBzdG9yYWdlIiwg
bV9kYXRhYmFzZVBhdGgudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICAvLyBTaW5jZSBhIFdvcmtRdWV1ZSBpc24ndCBib3VuZCB0byBhIHNwZWNpZmlj
IHRocmVhZCwgd2UgaGF2ZSB0byBkaXNhYmxlIHRocmVhZGluZyBjaGVja3MKKyAgICAvLyBldmVu
IHRob3VnaCB3ZSBuZXZlciBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZyb20gZGlmZmVyZW50IHRocmVh
ZHMgc2ltdWx0YW5lb3VzbHkuCisgICAgbV9kYXRhYmFzZS5kaXNhYmxlVGhyZWFkaW5nQ2hlY2tz
KCk7CisKKyAgICBpZiAoIW1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgpKSB7CisgICAgICAgIC8v
IFdlIGZhaWxlZCB0byBtaWdyYXRlIHRoZSBpdGVtIHRhYmxlLiBJbiBvcmRlciB0byBhdm9pZCB0
cnlpbmcgdG8gbWlncmF0ZSB0aGUgdGFibGUgb3ZlciBhbmQgb3ZlciwKKyAgICAgICAgLy8ganVz
dCBkZWxldGUgaXQgYW5kIHN0YXJ0IGZyb20gc2NyYXRjaC4KKyAgICAgICAgaWYgKCFtX2RhdGFi
YXNlLmV4ZWN1dGVDb21tYW5kKCJEUk9QIFRBQkxFIEl0ZW1UYWJsZSIpKQorICAgICAgICAgICAg
TE9HX0VSUk9SKCJGYWlsZWQgdG8gZGVsZXRlIHRhYmxlIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3Rv
cmFnZSIpOworICAgIH0KKworICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JF
QVRFIFRBQkxFIElGIE5PVCBFWElTVFMgSXRlbVRhYmxlIChrZXkgVEVYVCBVTklRVUUgT04gQ09O
RkxJQ1QgUkVQTEFDRSwgdmFsdWUgQkxPQiBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKSIpKSB7
CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0YWJsZSBJdGVtVGFibGUgZm9y
IGxvY2FsIHN0b3JhZ2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIExvY2FsU3RvcmFnZURhdGFiYXNlOjptaWdyYXRlSXRlbVRh
YmxlSWZOZWVkZWQoKQoreworICAgIGlmICghbV9kYXRhYmFzZS50YWJsZUV4aXN0cygiSXRlbVRh
YmxlIikpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5
KG1fZGF0YWJhc2UsICJTRUxFQ1QgdmFsdWUgRlJPTSBJdGVtVGFibGUgTElNSVQgMSIpOworCisg
ICAgLy8gVGhpcyBxdWVyeSBpc24ndCBldmVyIGV4ZWN1dGVkLCBpdCdzIGp1c3QgdXNlZCB0byBj
aGVjayB0aGUgY29sdW1uIHR5cGUuCisgICAgaWYgKHF1ZXJ5LmlzQ29sdW1uRGVjbGFyZWRBc0Js
b2IoMCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IHRhYmxl
IHdpdGggdGhlIHJpZ2h0IHR5cGUsIGNvcHkgYWxsIHRoZSBkYXRhIG92ZXIgdG8gaXQgYW5kIHRo
ZW4gcmVwbGFjZSB0aGUgbmV3IHRhYmxlIHdpdGggdGhlIG9sZCB0YWJsZS4KKyAgICBzdGF0aWMg
Y29uc3QgY2hhciogY29tbWFuZHNbXSA9IHsKKyAgICAgICAgIkRST1AgVEFCTEUgSUYgRVhJU1RT
IEl0ZW1UYWJsZTIiLAorICAgICAgICAiQ1JFQVRFIFRBQkxFIEl0ZW1UYWJsZTIgKGtleSBURVhU
IFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCB2YWx1ZSBCTE9CIE5PVCBOVUxMIE9OIENPTkZM
SUNUIEZBSUwpIiwKKyAgICAgICAgIklOU0VSVCBJTlRPIEl0ZW1UYWJsZTIgU0VMRUNUICogZnJv
bSBJdGVtVGFibGUiLAorICAgICAgICAiRFJPUCBUQUJMRSBJdGVtVGFibGUiLAorICAgICAgICAi
QUxURVIgVEFCTEUgSXRlbVRhYmxlMiBSRU5BTUUgVE8gSXRlbVRhYmxlIiwKKyAgICAgICAgMCwK
KyAgICB9OworCisgICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYXRhYmFzZSwg
ZmFsc2UpOworICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgY29tbWFuZHNbaV07ICsraSkgeworICAgICAgICBpZiAobV9kYXRhYmFzZS5leGVjdXRlQ29t
bWFuZChjb21tYW5kc1tpXSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBMT0df
RVJST1IoIkZhaWxlZCB0byBtaWdyYXRlIHRhYmxlIEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFn
ZSB3aGVuIGV4ZWN1dGluZzogJXMiLCBjb21tYW5kc1tpXSk7CisgICAgICAgIHRyYW5zYWN0aW9u
LnJvbGxiYWNrKCk7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRyYW5z
YWN0aW9uLmNvbW1pdCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIExvY2FsU3RvcmFn
ZURhdGFiYXNlOjppbXBvcnRJdGVtcyhTdG9yYWdlTWFwJiBzdG9yYWdlTWFwKQoreworICAgIGlm
IChtX2RpZEltcG9ydEl0ZW1zKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRTogSWYg
aXQgY2FuJ3QgaW1wb3J0LCB0aGVuIHRoZSBkZWZhdWx0IFdlYktpdCBiZWhhdmlvciBzaG91bGQg
YmUgdGhhdCBvZiBwcml2YXRlIGJyb3dzaW5nLAorICAgIC8vIG5vdCBzaWxlbnRseSBpZ25vcmlu
ZyBpdC4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1ODk0CisKKyAg
ICAvLyBXZSBzZXQgdGhpcyB0byB0cnVlIGV2ZW4gaWYgd2UgZG9uJ3QgZW5kIHVwIGltcG9ydGlu
ZyBhbnkgaXRlbXMgZHVlIHRvIGZhaWx1cmUgYmVjYXVzZQorICAgIC8vIHRoZXJlJ3MgcmVhbGx5
IG5vIGdvb2Qgd2F5IHRvIHJlY292ZXIgb3RoZXIgdGhhbiBub3QgaW1wb3J0aW5nIGFueXRoaW5n
LgorICAgIG1fZGlkSW1wb3J0SXRlbXMgPSB0cnVlOworCisgICAgb3BlbkRhdGFiYXNlKFNraXBJ
Zk5vbkV4aXN0ZW50KTsKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RhdGFiYXNlLCAiU0VMRUNUIGtl
eSwgdmFsdWUgRlJPTSBJdGVtVGFibGUiKTsKKyAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNR
TElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBzZWxlY3QgaXRlbXMgZnJv
bSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW1zOworCisgICAgaW50IHJlc3VsdCA9
IHF1ZXJ5LnN0ZXAoKTsKKyAgICB3aGlsZSAocmVzdWx0ID09IFNRTElURV9ST1cpIHsKKyAgICAg
ICAgU3RyaW5nIGtleSA9IHF1ZXJ5LmdldENvbHVtblRleHQoMCk7CisgICAgICAgIFN0cmluZyB2
YWx1ZSA9IHF1ZXJ5LmdldENvbHVtbkJsb2JBc1N0cmluZygxKTsKKyAgICAgICAgaWYgKCFrZXku
aXNOdWxsKCkgJiYgIXZhbHVlLmlzTnVsbCgpKQorICAgICAgICAgICAgaXRlbXMuc2V0KGtleSwg
dmFsdWUpOworICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAgfQorCisgICAgaWYg
KHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgeworICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJlYWRp
bmcgaXRlbXMgZnJvbSBJdGVtVGFibGUgZm9yIGxvY2FsIHN0b3JhZ2UiKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIHN0b3JhZ2VNYXAuaW1wb3J0SXRlbXMoaXRlbXMpOworfQorCit2
b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpzZXRJdGVtKGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBTdHJpbmcmIHZhbHVlKQoreworICAgIGl0ZW1EaWRDaGFuZ2Uoa2V5LCB2YWx1ZSk7Cit9CisK
K3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnJlbW92ZUl0ZW0oY29uc3QgU3RyaW5nJiBrZXkp
Cit7CisgICAgaXRlbURpZENoYW5nZShrZXksIFN0cmluZygpKTsKK30KKwordm9pZCBMb2NhbFN0
b3JhZ2VEYXRhYmFzZTo6Y2xlYXIoKQoreworICAgIG1fY2hhbmdlZEl0ZW1zLmNsZWFyKCk7Cisg
ICAgbV9zaG91bGRDbGVhckl0ZW1zID0gdHJ1ZTsKKworICAgIHNjaGVkdWxlRGF0YWJhc2VVcGRh
dGUoKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6Y2xvc2UoKQoreworICAgIEFT
U0VSVCghbV9pc0Nsb3NlZCk7CisgICAgbV9pc0Nsb3NlZCA9IHRydWU7CisKKyAgICBpZiAobV9k
aWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKSB7CisgICAgICAgIHVwZGF0ZURhdGFiYXNlV2l0aENo
YW5nZWRJdGVtcyhtX2NoYW5nZWRJdGVtcyk7CisgICAgICAgIG1fY2hhbmdlZEl0ZW1zLmNsZWFy
KCk7CisgICAgfQorCisgICAgYm9vbCBpc0VtcHR5ID0gZGF0YWJhc2VJc0VtcHR5KCk7CisKKyAg
ICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOwor
CisgICAgaWYgKGlzRW1wdHkpCisgICAgICAgIG1fdHJhY2tlci0+ZGVsZXRlRGF0YWJhc2VXaXRo
T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pOworfQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNl
OjppdGVtRGlkQ2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQor
eworICAgIG1fY2hhbmdlZEl0ZW1zLnNldChrZXksIHZhbHVlKTsKKyAgICBzY2hlZHVsZURhdGFi
YXNlVXBkYXRlKCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OnNjaGVkdWxlRGF0
YWJhc2VVcGRhdGUoKQoreworICAgIGlmIChtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9kaXNhYmxlU3VkZGVuVGVybWluYXRpb25XaGls
ZVdyaXRpbmdUb0xvY2FsU3RvcmFnZSkKKyAgICAgICAgbV9kaXNhYmxlU3VkZGVuVGVybWluYXRp
b25XaGlsZVdyaXRpbmdUb0xvY2FsU3RvcmFnZSA9IHN0ZDo6bWFrZV91bmlxdWU8U3VkZGVuVGVy
bWluYXRpb25EaXNhYmxlcj4oKTsKKworICAgIG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSA9
IHRydWU7CisKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaEFmdGVyKGRhdGFiYXNlVXBkYXRlSW50ZXJ2
YWwsIFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyldIHsKKyAgICAgICAgcHJvdGVjdGVk
VGhpcy0+dXBkYXRlRGF0YWJhc2UoKTsKKyAgICB9KTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VE
YXRhYmFzZTo6dXBkYXRlRGF0YWJhc2UoKQoreworICAgIGlmIChtX2lzQ2xvc2VkKQorICAgICAg
ICByZXR1cm47CisKKyAgICBBU1NFUlQobV9kaWRTY2hlZHVsZURhdGFiYXNlVXBkYXRlKTsKKyAg
ICBtX2RpZFNjaGVkdWxlRGF0YWJhc2VVcGRhdGUgPSBmYWxzZTsKKworICAgIEhhc2hNYXA8U3Ry
aW5nLCBTdHJpbmc+IGNoYW5nZWRJdGVtczsKKyAgICBpZiAobV9jaGFuZ2VkSXRlbXMuc2l6ZSgp
IDw9IG1heGltdW1JdGVtc1RvVXBkYXRlKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBmZXcgZW5v
dWdoIGNoYW5nZWQgaXRlbXMgdGhhdCB3ZSBjYW4ganVzdCBhbHdheXMgd3JpdGUgYWxsIG9mIHRo
ZW0uCisgICAgICAgIG1fY2hhbmdlZEl0ZW1zLnN3YXAoY2hhbmdlZEl0ZW1zKTsKKyAgICAgICAg
dXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1zKGNoYW5nZWRJdGVtcyk7CisgICAgICAgIG1f
ZGlzYWJsZVN1ZGRlblRlcm1pbmF0aW9uV2hpbGVXcml0aW5nVG9Mb2NhbFN0b3JhZ2UgPSBudWxs
cHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4aW11bUl0
ZW1zVG9VcGRhdGU7ICsraSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1fY2hhbmdlZEl0ZW1z
LmJlZ2luKCk7CisgICAgICAgICAgICBjaGFuZ2VkSXRlbXMuYWRkKGl0LT5rZXksIGl0LT52YWx1
ZSk7CisKKyAgICAgICAgICAgIG1fY2hhbmdlZEl0ZW1zLnJlbW92ZShpdCk7CisgICAgICAgIH0K
KworICAgICAgICBBU1NFUlQoY2hhbmdlZEl0ZW1zLnNpemUoKSA8PSBtYXhpbXVtSXRlbXNUb1Vw
ZGF0ZSk7CisKKyAgICAgICAgLy8gUmVzY2hlZHVsZSB0aGUgdXBkYXRlIGZvciB0aGUgcmVtYWlu
aW5nIGl0ZW1zLgorICAgICAgICBzY2hlZHVsZURhdGFiYXNlVXBkYXRlKCk7CisgICAgICAgIHVw
ZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjaGFuZ2VkSXRlbXMpOworICAgIH0KK30KKwor
dm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6dXBkYXRlRGF0YWJhc2VXaXRoQ2hhbmdlZEl0ZW1z
KGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBjaGFuZ2VkSXRlbXMpCit7CisgICAgaWYg
KCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICBvcGVuRGF0YWJhc2UoQ3JlYXRlSWZOb25F
eGlzdGVudCk7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAobV9zaG91bGRDbGVhckl0ZW1zKSB7CisgICAgICAgIG1fc2hvdWxkQ2xlYXJJ
dGVtcyA9IGZhbHNlOworCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBjbGVhclN0YXRlbWVudCht
X2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxlIik7CisgICAgICAgIGlmIChjbGVhclN0
YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byBwcmVwYXJlIGNsZWFyIHN0YXRlbWVudCAtIGNhbm5vdCB3cml0ZSB0byBsb2Nh
bCBzdG9yYWdlIGRhdGFiYXNlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICBpbnQgcmVzdWx0ID0gY2xlYXJTdGF0ZW1lbnQuc3RlcCgpOworICAgICAgICBpZiAo
cmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBjbGVhciBhbGwgaXRlbXMgaW4gdGhlIGxvY2FsIHN0b3JhZ2UgZGF0YWJhc2UgLSAlaSIsIHJl
c3VsdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTUUxp
dGVTdGF0ZW1lbnQgaW5zZXJ0U3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBJdGVt
VGFibGUgVkFMVUVTICg/LCA/KSIpOworICAgIGlmIChpbnNlcnRTdGF0ZW1lbnQucHJlcGFyZSgp
ICE9IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIGlu
c2VydCBzdGF0ZW1lbnQgLSBjYW5ub3Qgd3JpdGUgdG8gbG9jYWwgc3RvcmFnZSBkYXRhYmFzZSIp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0ZVN0
YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gSXRlbVRhYmxlIFdIRVJFIGtleT0/Iik7
CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgZGVsZXRlIHN0YXRlbWVudCAtIGNhbm5v
dCB3cml0ZSB0byBsb2NhbCBzdG9yYWdlIGRhdGFiYXNlIik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2RhdGFiYXNlKTsKKyAg
ICB0cmFuc2FjdGlvbi5iZWdpbigpOworCisgICAgZm9yIChhdXRvIGl0ID0gY2hhbmdlZEl0ZW1z
LmJlZ2luKCksIGVuZCA9IGNoYW5nZWRJdGVtcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIC8vIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IHRoZSBrZXkvdmFsdWUgcGFpciBzaG91
bGQgYmUgZGVsZXRlZC4KKyAgICAgICAgU1FMaXRlU3RhdGVtZW50JiBzdGF0ZW1lbnQgPSBpdC0+
dmFsdWUuaXNOdWxsKCkgPyBkZWxldGVTdGF0ZW1lbnQgOiBpbnNlcnRTdGF0ZW1lbnQ7CisKKyAg
ICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIGl0LT5rZXkpOworCisgICAgICAgIC8vIElmIHdl
J3JlIGluc2VydGluZyBhIGtleS92YWx1ZSBwYWlyLCBiaW5kIHRoZSB2YWx1ZSBhcyB3ZWxsLgor
ICAgICAgICBpZiAoIWl0LT52YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgIHN0YXRlbWVudC5i
aW5kQmxvYigyLCBpdC0+dmFsdWUpOworCisgICAgICAgIGludCByZXN1bHQgPSBzdGF0ZW1lbnQu
c3RlcCgpOworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byB1cGRhdGUgaXRlbSBpbiB0aGUgbG9jYWwgc3RvcmFnZSBk
YXRhYmFzZSAtICVpIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisK
KyAgICAgICAgc3RhdGVtZW50LnJlc2V0KCk7CisgICAgfQorCisgICAgdHJhbnNhY3Rpb24uY29t
bWl0KCk7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OmRhdGFiYXNlSXNFbXB0eSgp
Cit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcXVlcnkobV9kYXRhYmFzZSwgIlNFTEVDVCBDT1VOVCgq
KSBGUk9NIEl0ZW1UYWJsZSIpOworICAgIGlmIChxdWVyeS5wcmVwYXJlKCkgIT0gU1FMSVRFX09L
KSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNvdW50IG51bWJlciBvZiByb3dzIGlu
IEl0ZW1UYWJsZSBmb3IgbG9jYWwgc3RvcmFnZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKKyAgICBpZiAocmVzdWx0ICE9
IFNRTElURV9ST1cpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJObyByZXN1bHRzIHdoZW4gY291bnRp
bmcgbnVtYmVyIG9mIHJvd3MgaW4gSXRlbVRhYmxlIGZvciBsb2NhbCBzdG9yYWdlIik7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIXF1ZXJ5LmdldENvbHVtbklu
dCgwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmggYi9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2FsU3RvcmFnZURhdGFiYXNlLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uOTk5MjAzMWY0NDhmYjNkOTE1ODAxODZkODg2MGExMmQ4NDg1OTU2MgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdl
RGF0YWJhc2UuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAy
MDA5LCAyMDEwLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDx3dGYvRm9y
d2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5o
PgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9X
b3JrUXVldWUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgU2VjdXJpdHlPcmlnaW47
CitjbGFzcyBTdG9yYWdlTWFwOworY2xhc3MgU3VkZGVuVGVybWluYXRpb25EaXNhYmxlcjsKK30K
KworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tl
cjsKKworY2xhc3MgTG9jYWxTdG9yYWdlRGF0YWJhc2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNv
dW50ZWQ8TG9jYWxTdG9yYWdlRGF0YWJhc2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPExv
Y2FsU3RvcmFnZURhdGFiYXNlPiBjcmVhdGUoUmVmPFdvcmtRdWV1ZT4mJiwgUmVmPExvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcj4mJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRh
Jik7CisgICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlKCk7CisKKyAgICAvLyBXaWxsIGJsb2NrIHVu
dGlsIHRoZSBpbXBvcnQgaXMgY29tcGxldGUuCisgICAgdm9pZCBpbXBvcnRJdGVtcyhXZWJDb3Jl
OjpTdG9yYWdlTWFwJik7CisKKyAgICB2b2lkIHNldEl0ZW0oY29uc3QgU3RyaW5nJiBrZXksIGNv
bnN0IFN0cmluZyYgdmFsdWUpOworICAgIHZvaWQgcmVtb3ZlSXRlbShjb25zdCBTdHJpbmcmIGtl
eSk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gV2lsbCBibG9jayB1bnRpbCBhbGwgcGVu
ZGluZyBjaGFuZ2VzIGhhdmUgYmVlbiB3cml0dGVuIHRvIGRpc2suCisgICAgdm9pZCBjbG9zZSgp
OworCitwcml2YXRlOgorICAgIExvY2FsU3RvcmFnZURhdGFiYXNlKFJlZjxXb3JrUXVldWU+JiYs
IFJlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+JiYsIGNvbnN0IFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luRGF0YSYpOworCisgICAgZW51bSBEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSB7Cisg
ICAgICAgIENyZWF0ZUlmTm9uRXhpc3RlbnQsCisgICAgICAgIFNraXBJZk5vbkV4aXN0ZW50Cisg
ICAgfTsKKyAgICBib29sIHRyeVRvT3BlbkRhdGFiYXNlKERhdGFiYXNlT3BlbmluZ1N0cmF0ZWd5
KTsKKyAgICB2b2lkIG9wZW5EYXRhYmFzZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSk7CisKKyAg
ICBib29sIG1pZ3JhdGVJdGVtVGFibGVJZk5lZWRlZCgpOworCisgICAgdm9pZCBpdGVtRGlkQ2hh
bmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKworICAgIHZvaWQg
c2NoZWR1bGVEYXRhYmFzZVVwZGF0ZSgpOworICAgIHZvaWQgdXBkYXRlRGF0YWJhc2UoKTsKKyAg
ICB2b2lkIHVwZGF0ZURhdGFiYXNlV2l0aENoYW5nZWRJdGVtcyhjb25zdCBIYXNoTWFwPFN0cmlu
ZywgU3RyaW5nPiYpOworCisgICAgYm9vbCBkYXRhYmFzZUlzRW1wdHkoKTsKKworICAgIFJlZjxX
b3JrUXVldWU+IG1fcXVldWU7CisgICAgUmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4g
bV90cmFja2VyOworICAgIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3Jp
Z2luOworCisgICAgU3RyaW5nIG1fZGF0YWJhc2VQYXRoOworICAgIFdlYkNvcmU6OlNRTGl0ZURh
dGFiYXNlIG1fZGF0YWJhc2U7CisgICAgYm9vbCBtX2ZhaWxlZFRvT3BlbkRhdGFiYXNlOworICAg
IGJvb2wgbV9kaWRJbXBvcnRJdGVtczsKKyAgICBib29sIG1faXNDbG9zZWQ7CisKKyAgICBib29s
IG1fZGlkU2NoZWR1bGVEYXRhYmFzZVVwZGF0ZTsKKyAgICBib29sIG1fc2hvdWxkQ2xlYXJJdGVt
czsKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtX2NoYW5nZWRJdGVtczsKKworICAgIHN0
ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTdWRkZW5UZXJtaW5hdGlvbkRpc2FibGVyPiBtX2Rpc2Fi
bGVTdWRkZW5UZXJtaW5hdGlvbldoaWxlV3JpdGluZ1RvTG9jYWxTdG9yYWdlOworfTsKKworCit9
IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNz
L1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcCBiL1NvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4xOWIyMjlmNmI1Mzc0YTc3NDYzYWFmOWI0NjRjZTkzNmEwNGFjYzJiCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0
b3JhZ2VEYXRhYmFzZVRyYWNrZXIuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDExLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlci5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9GaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9TUUxpdGVGaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0
ZW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRFbmNv
ZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL1J1bkxv
b3AuaD4KKyNpbmNsdWRlIDx3dGYvV29ya1F1ZXVlLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK1JlZjxMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI+IExvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlcjo6Y3JlYXRlKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9j
YWxTdG9yYWdlRGlyZWN0b3J5KQoreworICAgIHJldHVybiBhZG9wdFJlZigqbmV3IExvY2FsU3Rv
cmFnZURhdGFiYXNlVHJhY2tlcihXVEZNb3ZlKHF1ZXVlKSwgbG9jYWxTdG9yYWdlRGlyZWN0b3J5
KSk7Cit9CisKK0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6TG9jYWxTdG9yYWdlRGF0YWJh
c2VUcmFja2VyKFJlZjxXb3JrUXVldWU+JiYgcXVldWUsIGNvbnN0IFN0cmluZyYgbG9jYWxTdG9y
YWdlRGlyZWN0b3J5KQorICAgIDogbV9xdWV1ZShXVEZNb3ZlKHF1ZXVlKSkKKyAgICAsIG1fbG9j
YWxTdG9yYWdlRGlyZWN0b3J5KGxvY2FsU3RvcmFnZURpcmVjdG9yeS5pc29sYXRlZENvcHkoKSkK
K3sKKyAgICBBU1NFUlQoIW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5LmlzRW1wdHkoKSk7CisKKyAg
ICAvLyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIGlzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFy
dCBkaXNwYXRjaGluZyB0aGluZ3MgdG8gdGhlIHF1ZXVlLgorICAgIFVURjhFbmNvZGluZygpOwor
CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0o
KSBtdXRhYmxlIHsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+aW1wb3J0T3JpZ2luSWRlbnRpZmll
cnMoKTsKKyAgICB9KTsKK30KKworTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp+TG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyKCkKK3sKK30KKworU3RyaW5nIExvY2FsU3RvcmFnZURhdGFi
YXNlVHJhY2tlcjo6ZGF0YWJhc2VQYXRoKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJp
dHlPcmlnaW4pIGNvbnN0Cit7CisgICAgcmV0dXJuIGRhdGFiYXNlUGF0aChzZWN1cml0eU9yaWdp
bi5kYXRhYmFzZUlkZW50aWZpZXIoKSArICIubG9jYWxzdG9yYWdlIik7Cit9CisKK3ZvaWQgTG9j
YWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpkaWRPcGVuRGF0YWJhc2VXaXRoT3JpZ2luKGNvbnN0
IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgYWRkRGF0YWJhc2VX
aXRoT3JpZ2luSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbi5kYXRhYmFzZUlkZW50aWZpZXIoKSwg
ZGF0YWJhc2VQYXRoKHNlY3VyaXR5T3JpZ2luKSk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29uc3QgU2VjdXJpdHlPcmln
aW5EYXRhJiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5J
ZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmRhdGFiYXNlSWRlbnRpZmllcigpKTsKK30KKwordm9p
ZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcygpCit7Cisg
ICAgbV9vcmlnaW5zLmNsZWFyKCk7CisKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5v
bkV4aXN0ZW50KTsKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBv
cmlnaW4sIHBhdGggRlJPTSBPcmlnaW5zIik7CisgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkg
IT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3Rh
dGVtZW50LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHJlc3VsdDsKKyAg
ICB3aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTElURV9ST1cpIHsKKyAg
ICAgICAgZGVsZXRlRmlsZShzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKSk7CisKKyAgICAgICAg
Ly8gRklYTUU6IENhbGwgb3V0IHRvIHRoZSBjbGllbnQuCisgICAgfQorCisgICAgaWYgKHJlc3Vs
dCAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBpbiBh
bGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKKworICAgIGlmIChtX2RhdGFiYXNlLmlz
T3BlbigpKQorICAgICAgICBtX2RhdGFiYXNlLmNsb3NlKCk7CisKKyAgICBpZiAoIWRlbGV0ZUZp
bGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKSkgeworICAgICAgICAvLyBJbiB0aGUgY2FzZSB3aGVy
ZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlIChlLmcgc29t
ZSBvdGhlciBwcm9ncmFtCisgICAgICAgIC8vIGxpa2UgYSB2aXJ1cyBzY2FubmVyIGlzIGFjY2Vz
c2luZyBpdCksIG1ha2Ugc3VyZSB0byByZW1vdmUgYWxsIGVudHJpZXMuCisgICAgICAgIG9wZW5U
cmFja2VyRGF0YWJhc2UoU2tpcElmTm9uRXhpc3RlbnQpOworICAgICAgICBpZiAoIW1fZGF0YWJh
c2UuaXNPcGVuKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU1FMaXRlU3RhdGVt
ZW50IGRlbGV0ZVN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyIpOwor
ICAgICAgICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2YgYWxsIG9y
aWdpbnMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRl
bGV0ZVN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
IlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGFsbCBvcmlnaW5zIik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVFbXB0eURpcmVjdG9yeSht
X2xvY2FsU3RvcmFnZURpcmVjdG9yeSk7Cit9CisKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPHRpbWVf
dD4gZmlsZUNyZWF0aW9uVGltZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAgIHRpbWVf
dCB0aW1lOworICAgIHJldHVybiBnZXRGaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoLCB0aW1lKSA/
IHRpbWUgOiBzdGQ6Om9wdGlvbmFsPHRpbWVfdD4oc3RkOjpudWxsb3B0KTsKK30KKworc3RhdGlj
IHN0ZDo6b3B0aW9uYWw8dGltZV90PiBmaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcm
IGZpbGVQYXRoKQoreworICAgIHRpbWVfdCB0aW1lOworICAgIGlmICghZ2V0RmlsZU1vZGlmaWNh
dGlvblRpbWUoZmlsZVBhdGgsIHRpbWUpKQorICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0Owor
CisgICAgcmV0dXJuIHRpbWU7Cit9CisKK1ZlY3RvcjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShzdGQ6
OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUpCit7CisgICAgQVNTRVJUKCFS
dW5Mb29wOjppc01haW4oKSk7CisgICAgaW1wb3J0T3JpZ2luSWRlbnRpZmllcnMoKTsKKyAgICBW
ZWN0b3I8U3RyaW5nPiBvcmlnaW5JZGVudGlmaWVyc1RvRGVsZXRlOworCisgICAgZm9yIChjb25z
dCBTdHJpbmcmIG9yaWdpbiA6IG1fb3JpZ2lucykgeworICAgICAgICBTdHJpbmcgZmlsZVBhdGgg
PSBwYXRoRm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmlnaW4pOworCisgICAgICAg
IGF1dG8gbW9kaWZpY2F0aW9uVGltZSA9IGZpbGVNb2RpZmljYXRpb25UaW1lKGZpbGVQYXRoKTsK
KyAgICAgICAgaWYgKCFtb2RpZmljYXRpb25UaW1lKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgaWYgKG1vZGlmaWNhdGlvblRpbWUudmFsdWUoKSA+PSBzdGQ6OmNocm9ubzo6c3lz
dGVtX2Nsb2NrOjp0b190aW1lX3QodGltZSkpCisgICAgICAgICAgICBvcmlnaW5JZGVudGlmaWVy
c1RvRGVsZXRlLmFwcGVuZChvcmlnaW4pOworICAgIH0KKworICAgIFZlY3RvcjxTZWN1cml0eU9y
aWdpbkRhdGE+IGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7CisgICAgZGVsZXRlZERhdGFiYXNlT3Jp
Z2lucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG9yaWdpbklkZW50aWZpZXJzVG9EZWxldGUuc2l6
ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luSWRlbnRpZmllciA6IG9yaWdpbklk
ZW50aWZpZXJzVG9EZWxldGUpIHsKKyAgICAgICAgcmVtb3ZlRGF0YWJhc2VXaXRoT3JpZ2luSWRl
bnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKKworICAgICAgICBpZiAoYXV0byBvcmlnaW4gPSBT
ZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlkZW50aWZpZXIob3JpZ2luSWRlbnRpZmll
cikpCisgICAgICAgICAgICBkZWxldGVkRGF0YWJhc2VPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZCgq
b3JpZ2luKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZWREYXRhYmFzZU9yaWdpbnM7Cit9CisKK1ZlY3Rv
cjxTZWN1cml0eU9yaWdpbkRhdGE+IExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3JpZ2lu
cygpIGNvbnN0Cit7CisgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKyAg
ICBvcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9vcmlnaW5zLnNpemUoKSk7CisKKyAg
ICBmb3IgKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA6IG1fb3JpZ2lucykgeworICAg
ICAgICBpZiAoYXV0byBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21EYXRhYmFzZUlk
ZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAgICBvcmlnaW5zLnVuY2hlY2tl
ZEFwcGVuZCgqb3JpZ2luKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgfQorCisgICAgcmV0dXJuIG9yaWdpbnM7Cit9CisKK1ZlY3RvcjxMb2Nh
bFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6Ok9yaWdpbkRldGFpbHM+IExvY2FsU3RvcmFnZURhdGFi
YXNlVHJhY2tlcjo6b3JpZ2luRGV0YWlscygpCit7CisgICAgVmVjdG9yPE9yaWdpbkRldGFpbHM+
IHJlc3VsdDsKKyAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX29yaWdpbnMuc2l6
ZSgpKTsKKworICAgIGZvciAoY29uc3QgU3RyaW5nJiBvcmlnaW4gOiBtX29yaWdpbnMpIHsKKyAg
ICAgICAgU3RyaW5nIGZpbGVQYXRoID0gcGF0aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZp
ZXIob3JpZ2luKTsKKworICAgICAgICBPcmlnaW5EZXRhaWxzIGRldGFpbHM7CisgICAgICAgIGRl
dGFpbHMub3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi5pc29sYXRlZENvcHkoKTsKKyAgICAgICAg
ZGV0YWlscy5jcmVhdGlvblRpbWUgPSBmaWxlQ3JlYXRpb25UaW1lKGZpbGVQYXRoKTsKKyAgICAg
ICAgZGV0YWlscy5tb2RpZmljYXRpb25UaW1lID0gZmlsZU1vZGlmaWNhdGlvblRpbWUoZmlsZVBh
dGgpOworICAgICAgICByZXN1bHQudW5jaGVja2VkQXBwZW5kKGRldGFpbHMpOworICAgIH0KKwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZyBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNr
ZXI6OmRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVuYW1lKSBjb25zdAoreworICAgIGlm
ICghbWFrZUFsbERpcmVjdG9yaWVzKG1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5KSkgeworICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgTG9jYWxTdG9yYWdlIGRhdGFiYXNlIHBhdGgg
JXMiLCBtX2xvY2FsU3RvcmFnZURpcmVjdG9yeS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcmV0
dXJuIFN0cmluZygpOworICAgIH0KKworI2lmIFBMQVRGT1JNKElPUykKKyAgICBwbGF0Zm9ybU1h
eWJlRXhjbHVkZUZyb21CYWNrdXAoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHBhdGhCeUFwcGVu
ZGluZ0NvbXBvbmVudChtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgZmlsZW5hbWUpOworfQorCitT
dHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZGF0YWJhc2VQYXRoKCJTdG9yYWdlVHJhY2tlci5kYiIpOwor
fQorCit2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFz
ZShEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSBvcGVuaW5nU3RyYXRlZ3kpCit7CisgICAgaWYgKG1f
ZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBkYXRhYmFz
ZVBhdGggPSB0cmFja2VyRGF0YWJhc2VQYXRoKCk7CisKKyAgICBpZiAoIWZpbGVFeGlzdHMoZGF0
YWJhc2VQYXRoKSAmJiBvcGVuaW5nU3RyYXRlZ3kgPT0gU2tpcElmTm9uRXhpc3RlbnQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKGRhdGFiYXNlUGF0aCkpIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZVBhdGggJXMuIiwgZGF0
YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFNpbmNlIGEgV29ya1F1ZXVlIGlzbid0IGJvdW5kIHRvIGEgc3BlY2lmaWMgdGhyZWFkLCB3
ZSBoYXZlIHRvIGRpc2FibGUgdGhyZWFkaW5nIGNoZWNrcworICAgIC8vIGV2ZW4gdGhvdWdoIHdl
IG5ldmVyIGFjY2VzcyB0aGUgZGF0YWJhc2UgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRh
bmVvdXNseS4KKyAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJlYWRpbmdDaGVja3MoKTsKKworICAg
IGlmIChtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJPcmlnaW5zIikpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIE9yaWdp
bnMgKG9yaWdpbiBURVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBwYXRoIFRFWFQpOyIp
KQorICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgT3JpZ2lucyB0YWJsZS4iKTsK
K30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OmltcG9ydE9yaWdpbklkZW50
aWZpZXJzKCkKK3sKKyAgICBvcGVuVHJhY2tlckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsK
KworICAgIGlmIChtX2RhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVu
dCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4gRlJPTSBPcmlnaW5zIik7Cisg
ICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVzdWx0OworCisgICAgICAgIHdo
aWxlICgocmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMSVRFX1JPVykKKyAgICAgICAg
ICAgIG1fb3JpZ2lucy5hZGQoc3RhdGVtZW50LmdldENvbHVtblRleHQoMCkpOworCisgICAgICAg
IGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFp
bGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1cGRhdGVUcmFja2VyRGF0YWJh
c2VGcm9tTG9jYWxTdG9yYWdlRGF0YWJhc2VGaWxlcygpOworfQorCit2b2lkIExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcjo6dXBkYXRlVHJhY2tlckRhdGFiYXNlRnJvbUxvY2FsU3RvcmFnZURh
dGFiYXNlRmlsZXMoKQoreworICAgIFZlY3RvcjxTdHJpbmc+IHBhdGhzID0gbGlzdERpcmVjdG9y
eShtX2xvY2FsU3RvcmFnZURpcmVjdG9yeSwgIioubG9jYWxzdG9yYWdlIik7CisKKyAgICBIYXNo
U2V0PFN0cmluZz4gb3JpZ2lucyhtX29yaWdpbnMpOworICAgIEhhc2hTZXQ8U3RyaW5nPiBvcmln
aW5zRnJvbUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXM7CisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHBhdGhzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgcGF0aCA9
IHBhdGhzW2ldOworCisgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLmxvY2Fsc3RvcmFnZSIp
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0
aEdldEZpbGVOYW1lKHBhdGgpOworCisgICAgICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0g
ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gc3RybGVuKCIubG9jYWxz
dG9yYWdlIikpOworCisgICAgICAgIGlmICghbV9vcmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50
aWZpZXIpKQorICAgICAgICAgICAgYWRkRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihvcmln
aW5JZGVudGlmaWVyLCBwYXRoKTsKKworICAgICAgICBvcmlnaW5zRnJvbUxvY2FsU3RvcmFnZURh
dGFiYXNlRmlsZXMuYWRkKG9yaWdpbklkZW50aWZpZXIpOworICAgIH0KKworICAgIGZvciAoYXV0
byBpdCA9IG9yaWdpbnMuYmVnaW4oKSwgZW5kID0gb3JpZ2lucy5lbmQoKTsgaXQgIT0gZW5kOyAr
K2l0KSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciA9ICppdDsKKyAg
ICAgICAgaWYgKG9yaWdpbnMuY29udGFpbnMob3JpZ2luSWRlbnRpZmllcikpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICByZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVudGlmaWVy
KG9yaWdpbklkZW50aWZpZXIpOworICAgIH0KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFz
ZVRyYWNrZXI6OmFkZERhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBv
cmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0aCkKK3sKKyAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKENyZWF0ZUlmTm9uRXhpc3RlbnQpOworICAgIGlmICghbV9kYXRhYmFz
ZS5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRl
bWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gT3JpZ2lucyBWQUxVRVMgKD8sID8pIik7Cisg
ICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19F
UlJPUigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJyVzJyBpbiB0aGUgdHJhY2tlciIsIG9y
aWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7CisgICAgc3RhdGVt
ZW50LmJpbmRUZXh0KDIsIGRhdGFiYXNlUGF0aCk7CisKKyAgICBpZiAoc3RhdGVtZW50LnN0ZXAo
KSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNo
IG9yaWdpbiAnJXMnIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luSWRlbnRpZmllci51dGY4KCkuZGF0
YSgpKTsKKworICAgIG1fb3JpZ2lucy5hZGQob3JpZ2luSWRlbnRpZmllcik7CisKKyAgICAvLyBG
SVhNRTogVGVsbCBjbGllbnRzIHRoYXQgdGhlIG9yaWdpbiB3YXMgYWRkZWQuCit9CisKK3ZvaWQg
TG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVEYXRhYmFzZVdpdGhPcmlnaW5JZGVu
dGlmaWVyKGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllcikKK3sKKyAgICBvcGVuVHJhY2tl
ckRhdGFiYXNlKFNraXBJZk5vbkV4aXN0ZW50KTsKKyAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBwYXRoID0gcGF0aEZvckRhdGFiYXNl
V2l0aE9yaWdpbklkZW50aWZpZXIob3JpZ2luSWRlbnRpZmllcik7CisgICAgaWYgKHBhdGguaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgZGVsZXRlU3Rh
dGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIHdoZXJlIG9yaWdpbj0/Iik7
CisgICAgaWYgKGRlbGV0ZVN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAg
ICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICclcyci
LCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICBkZWxldGVTdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7Cisg
ICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICBMT0df
RVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIG9yaWdpbiAnJXMnIiwgb3JpZ2lu
SWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUocGF0aCk7CisKKyAgICBtX29y
aWdpbnMucmVtb3ZlKG9yaWdpbklkZW50aWZpZXIpOworICAgIGlmIChtX29yaWdpbnMuaXNFbXB0
eSgpKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBubyBvcmlnaW5zIGxlZnQ7IGRlbGV0ZSB0aGUg
dHJhY2tlciBkYXRhYmFzZS4KKyAgICAgICAgbV9kYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBT
UUxpdGVGaWxlU3lzdGVtOjpkZWxldGVEYXRhYmFzZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgp
KTsKKyAgICAgICAgZGVsZXRlRW1wdHlEaXJlY3RvcnkobV9sb2NhbFN0b3JhZ2VEaXJlY3Rvcnkp
OworICAgIH0KKworICAgIC8vIEZJWE1FOiBUZWxsIGNsaWVudHMgdGhhdCB0aGUgb3JpZ2luIHdh
cyByZW1vdmVkLgorfQorCitTdHJpbmcgTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyOjpwYXRo
Rm9yRGF0YWJhc2VXaXRoT3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50
aWZpZXIpCit7CisgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcGF0aFN0YXRlbWVudChtX2RhdGFiYXNl
LCAiU0VMRUNUIHBhdGggRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgaWYgKHBh
dGhTdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICBMT0dfRVJST1Io
IlVuYWJsZSB0byBwcmVwYXJlIHNlbGVjdGlvbiBvZiBwYXRoIGZvciBvcmlnaW4gJyVzJyIsIG9y
aWdpbklkZW50aWZpZXIudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KyAgICB9CisKKyAgICBwYXRoU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIp
OworCisgICAgaW50IHJlc3VsdCA9IHBhdGhTdGF0ZW1lbnQuc3RlcCgpOworICAgIGlmIChyZXN1
bHQgIT0gU1FMSVRFX1JPVykKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgcmV0dXJu
IHBhdGhTdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL0xvY2Fs
U3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3Rv
cmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43Y2ViMTkxNmQ5
MzRlNTZmMWY0YTI0MTU1N2Q3MzE4MzRiZTc3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXIu
aApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisj
aW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVEYXRhYmFzZS5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0
Lmg+CisjaW5jbHVkZSA8d3RmL09wdGlvbmFsLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9Xb3Jr
UXVldWUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFNlY3VyaXR5
T3JpZ2luOworc3RydWN0IFNlY3VyaXR5T3JpZ2luRGF0YTsKK30KKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK3N0cnVjdCBMb2NhbFN0b3JhZ2VEZXRhaWxzOworCitjbGFzcyBMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXIgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdl
RGF0YWJhc2VUcmFja2VyPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxMb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXI+IGNyZWF0ZShSZWY8V29ya1F1ZXVlPiYmLCBjb25zdCBTdHJpbmcmIGxv
Y2FsU3RvcmFnZURpcmVjdG9yeSk7CisgICAgfkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcigp
OworCisgICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGEmKSBjb25zdDsKKworICAgIHZvaWQgZGlkT3BlbkRhdGFiYXNlV2l0aE9yaWdpbihjb25z
dCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lkIGRlbGV0ZURhdGFiYXNl
V2l0aE9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKyAgICB2b2lk
IGRlbGV0ZUFsbERhdGFiYXNlcygpOworCisgICAgLy8gUmV0dXJucyBhIHZlY3RvciBvZiB0aGUg
b3JpZ2lucyB3aG9zZSBkYXRhYmFzZXMgaGF2ZSBiZWVuIGRlbGV0ZWQuCisgICAgVmVjdG9yPFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4gZGVsZXRlRGF0YWJhc2VzTW9kaWZpZWRTaW5jZShz
dGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50KTsKKworICAgIFZlY3RvcjxXZWJD
b3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnMoKSBjb25zdDsKKworICAgIHN0cnVjdCBP
cmlnaW5EZXRhaWxzIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXI7CisgICAgICAg
IHN0ZDo6b3B0aW9uYWw8dGltZV90PiBjcmVhdGlvblRpbWU7CisgICAgICAgIHN0ZDo6b3B0aW9u
YWw8dGltZV90PiBtb2RpZmljYXRpb25UaW1lOworICAgIH07CisgICAgVmVjdG9yPE9yaWdpbkRl
dGFpbHM+IG9yaWdpbkRldGFpbHMoKTsKKworcHJpdmF0ZToKKyAgICBMb2NhbFN0b3JhZ2VEYXRh
YmFzZVRyYWNrZXIoUmVmPFdvcmtRdWV1ZT4mJiwgY29uc3QgU3RyaW5nJiBsb2NhbFN0b3JhZ2VE
aXJlY3RvcnkpOworCisgICAgU3RyaW5nIGRhdGFiYXNlUGF0aChjb25zdCBTdHJpbmcmIGZpbGVu
YW1lKSBjb25zdDsKKyAgICBTdHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0OworCisg
ICAgZW51bSBEYXRhYmFzZU9wZW5pbmdTdHJhdGVneSB7CisgICAgICAgIENyZWF0ZUlmTm9uRXhp
c3RlbnQsCisgICAgICAgIFNraXBJZk5vbkV4aXN0ZW50CisgICAgfTsKKyAgICB2b2lkIG9wZW5U
cmFja2VyRGF0YWJhc2UoRGF0YWJhc2VPcGVuaW5nU3RyYXRlZ3kpOworCisgICAgdm9pZCBpbXBv
cnRPcmlnaW5JZGVudGlmaWVycygpOworICAgIHZvaWQgdXBkYXRlVHJhY2tlckRhdGFiYXNlRnJv
bUxvY2FsU3RvcmFnZURhdGFiYXNlRmlsZXMoKTsKKworICAgIHZvaWQgYWRkRGF0YWJhc2VXaXRo
T3JpZ2luSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0
cmluZyYgZGF0YWJhc2VQYXRoKTsKKyAgICB2b2lkIHJlbW92ZURhdGFiYXNlV2l0aE9yaWdpbklk
ZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBTdHJpbmcgcGF0
aEZvckRhdGFiYXNlV2l0aE9yaWdpbklkZW50aWZpZXIoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVu
dGlmaWVyKTsKKworICAgIFJlZlB0cjxXb3JrUXVldWU+IG1fcXVldWU7CisgICAgU3RyaW5nIG1f
bG9jYWxTdG9yYWdlRGlyZWN0b3J5OworCisgICAgV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9k
YXRhYmFzZTsKKyAgICBIYXNoU2V0PFN0cmluZz4gbV9vcmlnaW5zOworCisjaWYgUExBVEZPUk0o
SU9TKQorICAgIHZvaWQgcGxhdGZvcm1NYXliZUV4Y2x1ZGVGcm9tQmFja3VwKCkgY29uc3Q7CisK
KyAgICBtdXRhYmxlIGJvb2wgbV9oYXNFeGNsdWRlZEZyb21CYWNrdXAgeyBmYWxzZSB9OworI2Vu
ZGlmCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjM4
Y2E2Y2I1MjYyMWY3MjNiYTgwNDQxMDFlMGNkMDU5NGM5NGI5OQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuY3BwCkBA
IC0wLDAgKzEsODcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiU3RvcmFnZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkxvY2FsU3RvcmFnZURhdGFi
YXNlLmgiCisjaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVk
ZSAiU3RvcmFnZUFyZWFNYXBNZXNzYWdlcy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VNYW5hZ2VyTWVz
c2FnZXMuaCIKKyNpbmNsdWRlICJXZWJQcm9jZXNzUHJveHkuaCIKKyNpbmNsdWRlIDxXZWJDb3Jl
L1NlY3VyaXR5T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5I
YXNoLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9UZXh0RW5jb2RpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8d3RmL1dvcmtR
dWV1ZS5oPgorI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgorCit1c2lu
ZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFN0b3Jh
Z2VNYW5hZ2VyOjpTdG9yYWdlQXJlYSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxTdG9y
YWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFN0b3Jh
Z2VBcmVhPiBjcmVhdGUoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmln
aW5EYXRhJiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB+U3RvcmFnZUFyZWEoKTsKKwor
ICAgIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4oKSBj
b25zdCB7IHJldHVybiBtX3NlY3VyaXR5T3JpZ2luOyB9CisKKyAgICB2b2lkIGFkZExpc3RlbmVy
KElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCk7CisgICAgdm9pZCByZW1v
dmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQpOworCisg
ICAgUmVmPFN0b3JhZ2VBcmVhPiBjbG9uZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRJdGVtKElQ
Qzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFy
ZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmlu
ZyYgdXJsU3RyaW5nLCBib29sJiBxdW90YUV4Y2VwdGlvbik7CisgICAgdm9pZCByZW1vdmVJdGVt
KElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFn
ZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKKyAg
ICB2b2lkIGNsZWFyKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qg
c291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworCisgICAgY29u
c3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIGl0ZW1zKCkgY29uc3Q7CisgICAgdm9pZCBjbGVh
cigpOworCisgICAgYm9vbCBpc1Nlc3Npb25TdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gIW1fbG9j
YWxTdG9yYWdlTmFtZXNwYWNlOyB9CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU3RvcmFnZUFy
ZWEoTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiwgY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiwgdW5z
aWduZWQgcXVvdGFJbkJ5dGVzKTsKKworICAgIHZvaWQgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRl
bXNJZk5lZWRlZCgpIGNvbnN0OworCisgICAgdm9pZCBkaXNwYXRjaEV2ZW50cyhJUEM6OkNvbm5l
Y3Rpb24qIHNvdXJjZUNvbm5lY3Rpb24sIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNv
bnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5l
d1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykgY29uc3Q7CisKKyAgICAvLyBXaWxsIGJl
IG51bGwgaWYgdGhlIHN0b3JhZ2UgYXJlYSBiZWxvbmdzIHRvIGEgc2Vzc2lvbiBzdG9yYWdlIG5h
bWVzcGFjZS4KKyAgICBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIG1fbG9jYWxTdG9yYWdlTmFtZXNw
YWNlOworICAgIG11dGFibGUgUmVmUHRyPExvY2FsU3RvcmFnZURhdGFiYXNlPiBtX2xvY2FsU3Rv
cmFnZURhdGFiYXNlOworICAgIG11dGFibGUgYm9vbCBtX2RpZEltcG9ydEl0ZW1zRnJvbURhdGFi
YXNlIHsgZmFsc2UgfTsKKworICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2lu
OworICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisgICAgUmVmUHRyPFN0b3JhZ2VNYXA+
IG1fc3RvcmFnZU1hcDsKKyAgICBIYXNoU2V0PHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0
aW9uPiwgdWludDY0X3Q+PiBtX2V2ZW50TGlzdGVuZXJzOworfTsKKworY2xhc3MgU3RvcmFnZU1h
bmFnZXI6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRl
ZDxMb2NhbFN0b3JhZ2VOYW1lc3BhY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPExvY2Fs
U3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlKFN0b3JhZ2VNYW5hZ2VyKiwgdWludDY0X3Qgc3RvcmFn
ZU1hbmFnZXJJRCk7CisgICAgfkxvY2FsU3RvcmFnZU5hbWVzcGFjZSgpOworCisgICAgU3RvcmFn
ZU1hbmFnZXIqIHN0b3JhZ2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlTWFuYWdl
cjsgfQorCisgICAgUmVmPFN0b3JhZ2VBcmVhPiBnZXRPckNyZWF0ZVN0b3JhZ2VBcmVhKFNlY3Vy
aXR5T3JpZ2luRGF0YSYmKTsKKyAgICB2b2lkIGRpZERlc3Ryb3lTdG9yYWdlQXJlYShTdG9yYWdl
QXJlYSopOworCisgICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0
IFNlY3VyaXR5T3JpZ2luRGF0YSYpOworICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJlYXMoKTsK
KworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoU3RvcmFnZU1h
bmFnZXIqLCB1aW50NjRfdCBzdG9yYWdlTWFuYWdlcklEKTsKKworICAgIFN0b3JhZ2VNYW5hZ2Vy
KiBtX3N0b3JhZ2VNYW5hZ2VyOworICAgIHVpbnQ2NF90IG1fc3RvcmFnZU5hbWVzcGFjZUlEOwor
ICAgIHVuc2lnbmVkIG1fcXVvdGFJbkJ5dGVzOworCisgICAgLy8gV2UgZG9uJ3QgaG9sZCBhbiBl
eHBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIFN0b3JhZ2VBcmVhczsgdGhleSBhcmUga2VwdCBhbGl2
ZSBieSB0aGUgbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24gbWFwIGluIFN0b3JhZ2VNYW5hZ2Vy
LgorICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBTdG9yYWdlQXJlYSo+IG1fc3RvcmFn
ZUFyZWFNYXA7Cit9OworCitjbGFzcyBTdG9yYWdlTWFuYWdlcjo6VHJhbnNpZW50TG9jYWxTdG9y
YWdlTmFtZXNwYWNlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZT4geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8VHJhbnNpZW50TG9j
YWxTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKCpuZXcgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKCkpOworICAgIH0KKworICAg
IH5UcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQorICAgIHsKKyAgICB9CisKKyAgICBS
ZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFyZWEoU2VjdXJpdHlPcmlnaW5EYXRh
JiYgc2VjdXJpdHlPcmlnaW4pCisgICAgeworICAgICAgICByZXR1cm4gKm1fc3RvcmFnZUFyZWFN
YXAuZW5zdXJlKHNlY3VyaXR5T3JpZ2luLCBbdGhpcywgc2VjdXJpdHlPcmlnaW5dKCkgbXV0YWJs
ZSB7CisgICAgICAgICAgICByZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZN
b3ZlKHNlY3VyaXR5T3JpZ2luKSwgbV9xdW90YUluQnl0ZXMpOworICAgICAgICB9KS5pdGVyYXRv
ci0+dmFsdWUuY29weVJlZigpOworICAgIH0KKworICAgIFZlY3RvcjxTZWN1cml0eU9yaWdpbkRh
dGE+IG9yaWdpbnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgVmVjdG9yPFNlY3VyaXR5T3JpZ2lu
RGF0YT4gb3JpZ2luczsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0b3JhZ2VBcmVhIDog
bV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKCFzdG9yYWdlQXJl
YS0+aXRlbXMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQoc3Rv
cmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IG9yaWdpbnM7CisgICAgfQorCisgICAgdm9pZCBjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3Jp
Z2luKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCisgICAgeworICAg
ICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkg
eworICAgICAgICAgICAgaWYgKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpID09IHNlY3Vy
aXR5T3JpZ2luKQorICAgICAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOworICAgICAg
ICB9CisgICAgfQorCisgICAgdm9pZCBjbGVhckFsbFN0b3JhZ2VBcmVhcygpCisgICAgeworICAg
ICAgICBmb3IgKGF1dG8mIHN0b3JhZ2VBcmVhIDogbV9zdG9yYWdlQXJlYU1hcC52YWx1ZXMoKSkK
KyAgICAgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBleHBsaWNpdCBUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQorICAgIHsKKyAgICB9
CisKKyAgICBjb25zdCB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsK
KworICAgIEhhc2hNYXA8U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBt
X3N0b3JhZ2VBcmVhTWFwOworfTsKKworYXV0byBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6
OmNyZWF0ZShMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgY29u
c3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5
dGVzKSAtPiBSZWY8U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhPgoreworICAgIHJldHVybiBh
ZG9wdFJlZigqbmV3IFN0b3JhZ2VBcmVhKGxvY2FsU3RvcmFnZU5hbWVzcGFjZSwgc2VjdXJpdHlP
cmlnaW4sIHF1b3RhSW5CeXRlcykpOworfQorCitTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6
OlN0b3JhZ2VBcmVhKExvY2FsU3RvcmFnZU5hbWVzcGFjZSogbG9jYWxTdG9yYWdlTmFtZXNwYWNl
LCBjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luLCB1bnNpZ25lZCBxdW90
YUluQnl0ZXMpCisgICAgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZShsb2NhbFN0b3JhZ2VOYW1l
c3BhY2UpCisgICAgLCBtX3NlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKQorICAgICwgbV9x
dW90YUluQnl0ZXMocXVvdGFJbkJ5dGVzKQorICAgICwgbV9zdG9yYWdlTWFwKFN0b3JhZ2VNYXA6
OmNyZWF0ZShtX3F1b3RhSW5CeXRlcykpCit7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdl
QXJlYTo6flN0b3JhZ2VBcmVhKCkKK3sKKyAgICBBU1NFUlQobV9ldmVudExpc3RlbmVycy5pc0Vt
cHR5KCkpOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAgIG1fbG9j
YWxTdG9yYWdlRGF0YWJhc2UtPmNsb3NlKCk7CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VOYW1l
c3BhY2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFn
ZUFyZWEodGhpcyk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjphZGRM
aXN0ZW5lcihJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJ
RCkKK3sKKyAgICBBU1NFUlQoIW1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3Bh
aXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJzLmFk
ZChzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Cit9CisKK3ZvaWQg
U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpyZW1vdmVMaXN0ZW5lcihJUEM6OkNvbm5lY3Rp
b24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAgICBBU1NFUlQoaXNT
ZXNzaW9uU3RvcmFnZSgpIHx8IG1fZXZlbnRMaXN0ZW5lcnMuY29udGFpbnMoc3RkOjptYWtlX3Bh
aXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCkpKTsKKyAgICBtX2V2ZW50TGlzdGVuZXJzLnJl
bW92ZShzdGQ6Om1ha2VfcGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKSk7Cit9CisKK1Jl
ZjxTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE+IFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJl
YTo6Y2xvbmUoKSBjb25zdAoreworICAgIEFTU0VSVCghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2Up
OworCisgICAgYXV0byBzdG9yYWdlQXJlYSA9IFN0b3JhZ2VBcmVhOjpjcmVhdGUobnVsbHB0ciwg
bV9zZWN1cml0eU9yaWdpbiwgbV9xdW90YUluQnl0ZXMpOworICAgIHN0b3JhZ2VBcmVhLT5tX3N0
b3JhZ2VNYXAgPSBtX3N0b3JhZ2VNYXA7CisKKyAgICByZXR1cm4gc3RvcmFnZUFyZWE7Cit9CisK
K3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhOjpzZXRJdGVtKElQQzo6Q29ubmVjdGlv
biogc291cmNlQ29ubmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3Qg
U3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5n
LCBib29sJiBxdW90YUV4Y2VwdGlvbikKK3sKKyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVt
c0lmTmVlZGVkKCk7CisKKyAgICBTdHJpbmcgb2xkVmFsdWU7CisKKyAgICBhdXRvIG5ld1N0b3Jh
Z2VNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2YWx1ZSwgb2xkVmFsdWUsIHF1b3Rh
RXhjZXB0aW9uKTsKKyAgICBpZiAobmV3U3RvcmFnZU1hcCkKKyAgICAgICAgbV9zdG9yYWdlTWFw
ID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKKworICAgIGlmIChxdW90YUV4Y2VwdGlvbikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAg
IG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnNldEl0ZW0oa2V5LCB2YWx1ZSk7CisKKyAgICBkaXNw
YXRjaEV2ZW50cyhzb3VyY2VDb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9s
ZFZhbHVlLCB2YWx1ZSwgdXJsU3RyaW5nKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3Rv
cmFnZUFyZWE6OnJlbW92ZUl0ZW0oSVBDOjpDb25uZWN0aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1
aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB1cmxTdHJpbmcpCit7CisgICAgb3BlbkRhdGFiYXNlQW5kSW1wb3J0SXRlbXNJZk5lZWRl
ZCgpOworCisgICAgU3RyaW5nIG9sZFZhbHVlOworICAgIGF1dG8gbmV3U3RvcmFnZU1hcCA9IG1f
c3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKKyAgICBpZiAobmV3U3RvcmFn
ZU1hcCkKKyAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsKKwor
ICAgIGlmIChvbGRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2UpCisgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2UtPnJl
bW92ZUl0ZW0oa2V5KTsKKworICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNvbm5lY3Rpb24sIHNv
dXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUsIFN0cmluZygpLCB1cmxTdHJpbmcpOwor
fQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoSVBDOjpDb25uZWN0
aW9uKiBzb3VyY2VDb25uZWN0aW9uLCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBvcGVuRGF0YWJhc2VBbmRJbXBvcnRJdGVtc0lm
TmVlZGVkKCk7CisKKyAgICBpZiAoIW1fc3RvcmFnZU1hcC0+bGVuZ3RoKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5C
eXRlcyk7CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKKyAgICAgICAgbV9sb2Nh
bFN0b3JhZ2VEYXRhYmFzZS0+Y2xlYXIoKTsKKworICAgIGRpc3BhdGNoRXZlbnRzKHNvdXJjZUNv
bm5lY3Rpb24sIHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmluZygpLCBTdHJpbmcoKSwgU3RyaW5n
KCksIHVybFN0cmluZyk7Cit9CisKK2NvbnN0IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBTdG9y
YWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6Oml0ZW1zKCkgY29uc3QKK3sKKyAgICBvcGVuRGF0YWJh
c2VBbmRJbXBvcnRJdGVtc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5p
dGVtcygpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpTdG9yYWdlQXJlYTo6Y2xlYXIoKQor
eworICAgIG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7
CisKKyAgICBpZiAobV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkgeworICAgICAgICBtX2xvY2FsU3Rv
cmFnZURhdGFiYXNlLT5jbG9zZSgpOworICAgICAgICBtX2xvY2FsU3RvcmFnZURhdGFiYXNlID0g
bnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gaXQgPSBtX2V2ZW50TGlzdGVuZXJzLmJl
Z2luKCksIGVuZCA9IG1fZXZlbnRMaXN0ZW5lcnMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAg
ICAgICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6Q2xlYXJDYWNo
ZSgpLCBpdC0+c2Vjb25kKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZUFyZWE6
Om9wZW5EYXRhYmFzZUFuZEltcG9ydEl0ZW1zSWZOZWVkZWQoKSBjb25zdAoreworICAgIGlmICgh
bV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG9w
ZW4gdGhlIGRhdGFiYXNlIGhlcmUgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGltcG9ydGVkIG91ciBp
dGVtcyB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YWJhc2UgaXMgb3BlbiBpZiB3ZSBuZWVkIHRvIHdy
aXRlIHRvIGl0LgorICAgIGlmICghbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZSkKKyAgICAgICAgbV9s
b2NhbFN0b3JhZ2VEYXRhYmFzZSA9IExvY2FsU3RvcmFnZURhdGFiYXNlOjpjcmVhdGUobV9sb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VNYW5hZ2VyKCktPm1fcXVldWUuY29weVJlZigpLCBt
X2xvY2FsU3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU1hbmFnZXIoKS0+bV9sb2NhbFN0b3JhZ2VE
YXRhYmFzZVRyYWNrZXIuY29weVJlZigpLCBtX3NlY3VyaXR5T3JpZ2luKTsKKworICAgIGlmICht
X2RpZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2xv
Y2FsU3RvcmFnZURhdGFiYXNlLT5pbXBvcnRJdGVtcygqbV9zdG9yYWdlTWFwKTsKKyAgICBtX2Rp
ZEltcG9ydEl0ZW1zRnJvbURhdGFiYXNlID0gdHJ1ZTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdl
cjo6U3RvcmFnZUFyZWE6OmRpc3BhdGNoRXZlbnRzKElQQzo6Q29ubmVjdGlvbiogc291cmNlQ29u
bmVjdGlvbiwgdWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXks
IGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0
cmluZyYgdXJsU3RyaW5nKSBjb25zdAoreworICAgIGZvciAoSGFzaFNldDxzdGQ6OnBhaXI8UmVm
UHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90Pj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9l
dmVudExpc3RlbmVycy5iZWdpbigpLCBlbmQgPSBtX2V2ZW50TGlzdGVuZXJzLmVuZCgpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKKyAgICAgICAgdWludDY0X3Qgc3RvcmFnZUFyZWFJRCA9IGl0LT5maXJz
dCA9PSBzb3VyY2VDb25uZWN0aW9uID8gc291cmNlU3RvcmFnZUFyZWFJRCA6IDA7CisKKyAgICAg
ICAgaXQtPmZpcnN0LT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlzcGF0Y2hTdG9y
YWdlRXZlbnQoc3RvcmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmlu
ZyksIGl0LT5zZWNvbmQpOworICAgIH0KK30KKworUmVmPFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0
b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNy
ZWF0ZShTdG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1l
c3BhY2VJRCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2Uoc3RvcmFnZU1hbmFnZXIsIHN0b3JhZ2VOYW1lc3BhY2VJRCkpOworfQorCisvLyBGSVhNRTog
VGhlIHF1b3RhIHZhbHVlIGlzIGNvcGllZCBmcm9tIEdyb3VwU2V0dGluZ3MuY3BwLgorLy8gV2Ug
c2hvdWxkIGludmVzdGlnYXRlIGEgd2F5IHRvIHNoYXJlIGl0IHdpdGggV2ViQ29yZS4KK1N0b3Jh
Z2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OkxvY2FsU3RvcmFnZU5hbWVzcGFjZShT
dG9yYWdlTWFuYWdlciogc3RvcmFnZU1hbmFnZXIsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJ
RCkKKyAgICA6IG1fc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU1hbmFnZXIpCisgICAgLCBtX3N0b3Jh
Z2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCisgICAgLCBtX3F1b3RhSW5CeXRlcyg1
ICogMTAyNCAqIDEwMjQpCit7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpMb2NhbFN0b3JhZ2VOYW1l
c3BhY2U6On5Mb2NhbFN0b3JhZ2VOYW1lc3BhY2UoKQoreworICAgIEFTU0VSVChtX3N0b3JhZ2VB
cmVhTWFwLmlzRW1wdHkoKSk7Cit9CisKK2F1dG8gU3RvcmFnZU1hbmFnZXI6OkxvY2FsU3RvcmFn
ZU5hbWVzcGFjZTo6Z2V0T3JDcmVhdGVTdG9yYWdlQXJlYShTZWN1cml0eU9yaWdpbkRhdGEmJiBz
ZWN1cml0eU9yaWdpbikgLT4gUmVmPFN0b3JhZ2VBcmVhPgoreworICAgIGF1dG8mIHNsb3QgPSBt
X3N0b3JhZ2VBcmVhTWFwLmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZh
bHVlOworICAgIGlmIChzbG90KQorICAgICAgICByZXR1cm4gKnNsb3Q7CisKKyAgICBhdXRvIHN0
b3JhZ2VBcmVhID0gU3RvcmFnZUFyZWE6OmNyZWF0ZSh0aGlzLCBXVEZNb3ZlKHNlY3VyaXR5T3Jp
Z2luKSwgbV9xdW90YUluQnl0ZXMpOworICAgIHNsb3QgPSAmc3RvcmFnZUFyZWEuZ2V0KCk7CisK
KyAgICByZXR1cm4gc3RvcmFnZUFyZWE7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OkxvY2Fs
U3RvcmFnZU5hbWVzcGFjZTo6ZGlkRGVzdHJveVN0b3JhZ2VBcmVhKFN0b3JhZ2VBcmVhKiBzdG9y
YWdlQXJlYSkKK3sKKyAgICBBU1NFUlQobV9zdG9yYWdlQXJlYU1hcC5jb250YWlucyhzdG9yYWdl
QXJlYS0+c2VjdXJpdHlPcmlnaW4oKSkpOworCisgICAgbV9zdG9yYWdlQXJlYU1hcC5yZW1vdmUo
c3RvcmFnZUFyZWEtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgIGlmICghbV9zdG9yYWdlQXJlYU1h
cC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX3N0b3JhZ2VNYW5h
Z2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMuY29udGFpbnMobV9zdG9yYWdlTmFtZXNwYWNl
SUQpKTsKKyAgICBtX3N0b3JhZ2VNYW5hZ2VyLT5tX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMucmVt
b3ZlKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6TG9j
YWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKGNvbnN0
IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgZm9yIChjb25zdCBh
dXRvJiBvcmlnaW5BbmRTdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXApIHsKKyAgICAgICAg
aWYgKG9yaWdpbkFuZFN0b3JhZ2VBcmVhLmtleSA9PSBzZWN1cml0eU9yaWdpbikKKyAgICAgICAg
ICAgIG9yaWdpbkFuZFN0b3JhZ2VBcmVhLnZhbHVlLT5jbGVhcigpOworICAgIH0KK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjbGVhckFsbFN0b3JhZ2VB
cmVhcygpCit7CisgICAgZm9yIChhdXRvKiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAu
dmFsdWVzKCkpCisgICAgICAgIHN0b3JhZ2VBcmVhLT5jbGVhcigpOworfQorCitjbGFzcyBTdG9y
YWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgOiBwdWJsaWMgVGhyZWFkU2FmZVJl
ZkNvdW50ZWQ8U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UmVmPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGUodW5zaWduZWQgcXVvdGFJbkJ5dGVz
KTsKKyAgICB+U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoKTsKKworICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAuaXNFbXB0eSgpOyB9CisKKyAgICBJUEM6
OkNvbm5lY3Rpb24qIGFsbG93ZWRDb25uZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hbGxvd2Vk
Q29ubmVjdGlvbi5nZXQoKTsgfQorICAgIHZvaWQgc2V0QWxsb3dlZENvbm5lY3Rpb24oSVBDOjpD
b25uZWN0aW9uKik7CisKKyAgICBSZWY8U3RvcmFnZUFyZWE+IGdldE9yQ3JlYXRlU3RvcmFnZUFy
ZWEoU2VjdXJpdHlPcmlnaW5EYXRhJiYpOworCisgICAgdm9pZCBjbG9uZVRvKFNlc3Npb25TdG9y
YWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSk7CisKKyAgICBWZWN0b3I8
U2VjdXJpdHlPcmlnaW5EYXRhPiBvcmlnaW5zKCkgY29uc3QKKyAgICB7CisgICAgICAgIFZlY3Rv
cjxTZWN1cml0eU9yaWdpbkRhdGE+IG9yaWdpbnM7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRv
JiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFyZWFNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAg
IGlmICghc3RvcmFnZUFyZWEtPml0ZW1zKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG9y
aWdpbnMuYXBwZW5kKHN0b3JhZ2VBcmVhLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAgfQor
CisgICAgICAgIHJldHVybiBvcmlnaW5zOworICAgIH0KKworICAgIHZvaWQgY2xlYXJTdG9yYWdl
QXJlYXNNYXRjaGluZ09yaWdpbihjb25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3Jp
Z2luKQorICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFy
ZWFNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS0+c2VjdXJpdHlP
cmlnaW4oKSA9PSBzZWN1cml0eU9yaWdpbikKKyAgICAgICAgICAgICAgICBzdG9yYWdlQXJlYS0+
Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xlYXJBbGxTdG9yYWdlQXJl
YXMoKQorICAgIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFy
ZWFNYXAudmFsdWVzKCkpCisgICAgICAgICAgICBzdG9yYWdlQXJlYS0+Y2xlYXIoKTsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodW5zaWdu
ZWQgcXVvdGFJbkJ5dGVzKTsKKworICAgIFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+IG1fYWxsb3dl
ZENvbm5lY3Rpb247CisgICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7CisKKyAgICBIYXNoTWFw
PFNlY3VyaXR5T3JpZ2luRGF0YSwgUmVmUHRyPFN0b3JhZ2VBcmVhPj4gbV9zdG9yYWdlQXJlYU1h
cDsKK307CisKK1JlZjxTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U+IFN0
b3JhZ2VNYW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHVuc2lnbmVkIHF1
b3RhSW5CeXRlcykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZShxdW90YUluQnl0ZXMpKTsKK30KKworU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9y
YWdlTmFtZXNwYWNlOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1bnNpZ25lZCBxdW90YUluQnl0
ZXMpCisgICAgOiBtX3F1b3RhSW5CeXRlcyhxdW90YUluQnl0ZXMpCit7Cit9CisKK1N0b3JhZ2VN
YW5hZ2VyOjpTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6flNlc3Npb25TdG9yYWdlTmFtZXNwYWNl
KCkKK3sKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U6
OnNldEFsbG93ZWRDb25uZWN0aW9uKElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24p
Cit7CisgICAgQVNTRVJUKCFhbGxvd2VkQ29ubmVjdGlvbiB8fCAhbV9hbGxvd2VkQ29ubmVjdGlv
bik7CisKKyAgICBtX2FsbG93ZWRDb25uZWN0aW9uID0gYWxsb3dlZENvbm5lY3Rpb247Cit9CisK
K2F1dG8gU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpnZXRPckNyZWF0
ZVN0b3JhZ2VBcmVhKFNlY3VyaXR5T3JpZ2luRGF0YSYmIHNlY3VyaXR5T3JpZ2luKSAtPiBSZWY8
U3RvcmFnZUFyZWE+Cit7CisgICAgcmV0dXJuICptX3N0b3JhZ2VBcmVhTWFwLmVuc3VyZShzZWN1
cml0eU9yaWdpbiwgW3RoaXMsIHNlY3VyaXR5T3JpZ2luXSgpIG11dGFibGUgeworICAgICAgICBy
ZXR1cm4gU3RvcmFnZUFyZWE6OmNyZWF0ZShudWxscHRyLCBXVEZNb3ZlKHNlY3VyaXR5T3JpZ2lu
KSwgbV9xdW90YUluQnl0ZXMpOworICAgIH0pLml0ZXJhdG9yLT52YWx1ZS5jb3B5UmVmKCk7Cit9
CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OlNlc3Npb25TdG9yYWdlTmFtZXNwYWNlOjpjbG9uZVRv
KFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlJiBuZXdTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSkKK3sK
KyAgICBBU1NFUlRfVU5VU0VEKG5ld1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlLCBuZXdTZXNzaW9u
U3RvcmFnZU5hbWVzcGFjZS5pc0VtcHR5KCkpOworCisgICAgZm9yIChhdXRvJiBwYWlyIDogbV9z
dG9yYWdlQXJlYU1hcCkKKyAgICAgICAgbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UubV9zdG9y
YWdlQXJlYU1hcC5hZGQocGFpci5rZXksIHBhaXIudmFsdWUtPmNsb25lKCkpOworfQorCitSZWY8
U3RvcmFnZU1hbmFnZXI+IFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGUoY29uc3QgU3RyaW5nJiBsb2Nh
bFN0b3JhZ2VEaXJlY3RvcnkpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFnZU1h
bmFnZXIobG9jYWxTdG9yYWdlRGlyZWN0b3J5KSk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjpTdG9y
YWdlTWFuYWdlcihjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSkKKyAgICA6IG1f
cXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuU3RvcmFnZU1hbmFnZXIi
KSkKKyAgICAsIG1fbG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyKExvY2FsU3RvcmFnZURhdGFi
YXNlVHJhY2tlcjo6Y3JlYXRlKG1fcXVldWUuY29weVJlZigpLCBsb2NhbFN0b3JhZ2VEaXJlY3Rv
cnkpKQoreworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgaXMgaW5pdGlhbGl6ZWQgYmVm
b3JlIHdlIHN0YXJ0IGRpc3BhdGNoaW5nIHRoaW5ncyB0byB0aGUgcXVldWUuCisgICAgVVRGOEVu
Y29kaW5nKCk7Cit9CisKK1N0b3JhZ2VNYW5hZ2VyOjp+U3RvcmFnZU1hbmFnZXIoKQoreworfQor
Cit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50
NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICBt
X3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBz
dG9yYWdlTmFtZXNwYWNlSUQsIHF1b3RhSW5CeXRlc10oKSBtdXRhYmxlIHsKKyAgICAgICAgQVNT
RVJUKCFtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFtZXNwYWNl
SUQpKTsKKworICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5zZXQoc3RvcmFnZU5h
bWVzcGFjZUlELCBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZTo6Y3JlYXRlKHF1b3RhSW5CeXRlcykp
OworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlEKQoreworICAgIG1fcXVldWUt
PmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHN0b3JhZ2VO
YW1lc3BhY2VJRF0geworICAgICAgICBBU1NFUlQobV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMu
Y29udGFpbnMoc3RvcmFnZU5hbWVzcGFjZUlEKSk7CisgICAgICAgIG1fc2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2VzLnJlbW92ZShzdG9yYWdlTmFtZXNwYWNlSUQpOworICAgIH0pOworfQorCit2b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpzZXRBbGxvd2VkU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VDb25uZWN0
aW9uKHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgSVBDOjpDb25uZWN0aW9uKiBhbGxvd2Vk
Q29ubmVjdGlvbikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhp
cyA9IG1ha2VSZWYoKnRoaXMpLCBjb25uZWN0aW9uID0gUmVmUHRyPElQQzo6Q29ubmVjdGlvbj4o
YWxsb3dlZENvbm5lY3Rpb24pLCBzdG9yYWdlTmFtZXNwYWNlSURdKCkgbXV0YWJsZSB7CisgICAg
ICAgIEFTU0VSVChtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5jb250YWlucyhzdG9yYWdlTmFt
ZXNwYWNlSUQpKTsKKworICAgICAgICBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3Rv
cmFnZU5hbWVzcGFjZUlEKS0+c2V0QWxsb3dlZENvbm5lY3Rpb24oY29ubmVjdGlvbi5nZXQoKSk7
CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmNsb25lU2Vzc2lvblN0b3JhZ2VO
YW1lc3BhY2UodWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCB1aW50NjRfdCBuZXdTdG9yYWdl
TmFtZXNwYWNlSUQpCit7CisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRo
aXMgPSBtYWtlUmVmKCp0aGlzKSwgc3RvcmFnZU5hbWVzcGFjZUlELCBuZXdTdG9yYWdlTmFtZXNw
YWNlSURdIHsKKyAgICAgICAgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UqIHNlc3Npb25TdG9yYWdl
TmFtZXNwYWNlID0gbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMuZ2V0KHN0b3JhZ2VOYW1lc3Bh
Y2VJRCk7CisgICAgICAgIGlmICghc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpIHsKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSBjYW4gZ2V0IGludG8gdGhpcyBzaXR1YXRpb24gaWYgc29tZW9uZSBj
bG9zZXMgdGhlIG9yaWdpbmF0aW5nIHBhZ2UgZnJvbSB3aXRoaW4gYQorICAgICAgICAgICAgLy8g
Y3JlYXRlTmV3UGFnZSBjYWxsYmFjay4gV2UgYmFpbCBmb3Igbm93LCBidXQgd2Ugc2hvdWxkIHJl
YWxseSBmaW5kIGEgd2F5IHRvIGtlZXAgdGhlIHNlc3Npb24gc3RvcmFnZSBhbGl2ZQorICAgICAg
ICAgICAgLy8gc28gd2Ugd2UnbGwgY2xvbmUgdGhlIHNlc3Npb24gc3RvcmFnZSBjb3JyZWN0bHku
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXNzaW9uU3RvcmFn
ZU5hbWVzcGFjZSogbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdl
TmFtZXNwYWNlcy5nZXQobmV3U3RvcmFnZU5hbWVzcGFjZUlEKTsKKyAgICAgICAgQVNTRVJUKG5l
d1Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlKTsKKworICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZS0+Y2xvbmVUbygqbmV3U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UpOworICAgIH0pOworfQor
Cit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpwcm9jZXNzV2lsbE9wZW5Db25uZWN0aW9uKFdlYlByb2Nl
c3NQcm94eSYsIElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbikKK3sKKyAgICBjb25uZWN0aW9u
LmFkZFdvcmtRdWV1ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6Om1l
c3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9xdWV1ZS5nZXQoKSwgdGhpcyk7Cit9CisKK3ZvaWQgU3Rv
cmFnZU1hbmFnZXI6OnByb2Nlc3NEaWRDbG9zZUNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5Jiwg
SVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uKQoreworICAgIGNvbm5lY3Rpb24ucmVtb3ZlV29y
a1F1ZXVlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6bWVzc2FnZVJl
Y2VpdmVyTmFtZSgpKTsKKworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIGNvbm5lY3Rpb24gPSBSZWY8SVBDOjpDb25uZWN0aW9uPihj
b25uZWN0aW9uKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxSZWZQdHI8
SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+PiBjb25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFp
cnNUb1JlbW92ZTsKKyAgICAgICAgZm9yIChhdXRvJiBzdG9yYWdlQXJlYSA6IG1fc3RvcmFnZUFy
ZWFzQnlDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoc3RvcmFnZUFyZWEua2V5LmZpcnN0
ICE9IGNvbm5lY3Rpb24ucHRyKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgICAgIHN0b3JhZ2VBcmVhLnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqc3RvcmFnZUFyZWEua2V5
LmZpcnN0LCBzdG9yYWdlQXJlYS5rZXkuc2Vjb25kKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25B
bmRTdG9yYWdlTWFwSURQYWlyc1RvUmVtb3ZlLmFwcGVuZChzdG9yYWdlQXJlYS5rZXkpOworICAg
ICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VN
YXBJRFBhaXJzVG9SZW1vdmUpCisgICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlv
bi5yZW1vdmUocGFpcik7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmdldFNl
c3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhhc2hTZXQ8V2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5k
aXNwYXRjaChbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9u
SGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAg
ICBIYXNoU2V0PFNlY3VyaXR5T3JpZ2luRGF0YT4gb3JpZ2luczsKKworICAgICAgICBmb3IgKGNv
bnN0IGF1dG8mIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogc2Vzc2lv
blN0b3JhZ2VOYW1lc3BhY2UtPm9yaWdpbnMoKSkKKyAgICAgICAgICAgICAgICBvcmlnaW5zLmFk
ZChvcmlnaW4pOworICAgICAgICB9CisKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNo
KFtvcmlnaW5zID0gV1RGTW92ZShvcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3Zl
KGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25I
YW5kbGVyKFdURk1vdmUob3JpZ2lucykpOworICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlU2Vzc2lvblN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZv
aWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhp
cywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdU
Rk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBmb3IgKGF1dG8m
IHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlIDogbV9zZXNzaW9uU3RvcmFnZU5hbWVzcGFjZXMudmFs
dWVzKCkpCisgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJBbGxTdG9y
YWdlQXJlYXMoKTsKKworICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShj
b21wbGV0aW9uSGFuZGxlcikpOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpk
ZWxldGVTZXNzaW9uU3RvcmFnZUVudHJpZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE+JiBvcmlnaW5zLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxl
dGlvbkhhbmRsZXIpCit7CisgICAgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4g
Y29waWVkT3JpZ2luczsKKyAgICBjb3BpZWRPcmlnaW5zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHko
b3JpZ2lucy5zaXplKCkpOworCisgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBvcmlnaW5zKQorICAg
ICAgICBjb3BpZWRPcmlnaW5zLnVuY2hlY2tlZEFwcGVuZChvcmlnaW4uaXNvbGF0ZWRDb3B5KCkp
OworCisgICAgbV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVm
KCp0aGlzKSwgY29waWVkT3JpZ2lucyA9IFdURk1vdmUoY29waWVkT3JpZ2lucyksIGNvbXBsZXRp
b25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAg
ICAgIGZvciAoYXV0byYgb3JpZ2luIDogY29waWVkT3JpZ2lucykgeworICAgICAgICAgICAgZm9y
IChhdXRvJiBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSA6IG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3Bh
Y2VzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlTmFtZXNwYWNlLT5j
bGVhclN0b3JhZ2VBcmVhc01hdGNoaW5nT3JpZ2luKG9yaWdpbik7CisgICAgICAgIH0KKworICAg
ICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikp
OworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpnZXRMb2NhbFN0b3JhZ2VPcmln
aW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+JiYp
PiYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBw
cm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIEhhc2hTZXQ8U2VjdXJp
dHlPcmlnaW5EYXRhPiBvcmlnaW5zOworCisgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogbV9s
b2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXItPm9yaWdpbnMoKSkKKyAgICAgICAgICAgIG9yaWdp
bnMuYWRkKG9yaWdpbik7CisKKyAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkp
IHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgb3JpZ2luIDogdHJhbnNpZW50TG9jYWxTdG9yYWdl
TmFtZXNwYWNlLT5vcmlnaW5zKCkpCisgICAgICAgICAgICAgICAgb3JpZ2lucy5hZGQob3JpZ2lu
KTsKKyAgICAgICAgfQorCisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbb3JpZ2lu
cyA9IFdURk1vdmUob3JpZ2lucyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0
aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihX
VEZNb3ZlKG9yaWdpbnMpKTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFn
ZU1hbmFnZXI6OmdldExvY2FsU3RvcmFnZU9yaWdpbkRldGFpbHMoRnVuY3Rpb248dm9pZCAoVmVj
dG9yPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBs
ZXRpb25IYW5kbGVyKQoreworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0
aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAgICAgIGF1dG8gb3JpZ2luRGV0YWlscyA9IG1f
bG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLT5vcmlnaW5EZXRhaWxzKCk7CisKKyAgICAgICAg
UnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtvcmlnaW5EZXRhaWxzID0gV1RGTW92ZShvcmlnaW5E
ZXRhaWxzKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
KSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFdURk1vdmUob3JpZ2lu
RGV0YWlscykpOworICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdl
cjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbkRhdGEm
JiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhpcywgcHJvdGVj
dGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW4gPSBzZWN1cml0eU9yaWdpbi5p
c29sYXRlZENvcHkoKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgZm9yIChhdXRvJiBsb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UgOiBtX2xvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAg
ICAgICBsb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmln
aW4oY29waWVkT3JpZ2luKTsKKworICAgICAgICBmb3IgKGF1dG8mIHRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSA6IG1fdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMo
KSkKKyAgICAgICAgICAgIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Y2xlYXJTdG9y
YWdlQXJlYXNNYXRjaGluZ09yaWdpbihjb3BpZWRPcmlnaW4pOworCisgICAgICAgIG1fbG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4oY29waWVkT3Jp
Z2luKTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9y
YWdlT3JpZ2luc01vZGlmaWVkU2luY2Uoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9w
b2ludCB0aW1lLCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAg
bV9xdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwg
dGltZSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBt
dXRhYmxlIHsKKyAgICAgICAgYXV0byBkZWxldGVkT3JpZ2lucyA9IG1fbG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZXNNb2RpZmllZFNpbmNlKHRpbWUpOworCisgICAg
ICAgIGZvciAoY29uc3QgYXV0byYgb3JpZ2luIDogZGVsZXRlZE9yaWdpbnMpIHsKKyAgICAgICAg
ICAgIGZvciAoYXV0byYgbG9jYWxTdG9yYWdlTmFtZXNwYWNlIDogbV9sb2NhbFN0b3JhZ2VOYW1l
c3BhY2VzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+
Y2xlYXJTdG9yYWdlQXJlYXNNYXRjaGluZ09yaWdpbihvcmlnaW4pOworICAgICAgICB9CisKKyAg
ICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UgOiBtX3RyYW5z
aWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAgICAgICB0cmFuc2ll
bnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyQWxsU3RvcmFnZUFyZWFzKCk7CisKKyAgICAg
ICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsK
KyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6ZGVsZXRlTG9jYWxTdG9yYWdlRW50
cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4m
IG9yaWdpbnMsIEZ1bmN0aW9uPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBW
ZWN0b3I8U2VjdXJpdHlPcmlnaW5EYXRhPiBjb3BpZWRPcmlnaW5zOworICAgIGNvcGllZE9yaWdp
bnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShvcmlnaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGF1
dG8mIG9yaWdpbiA6IG9yaWdpbnMpCisgICAgICAgIGNvcGllZE9yaWdpbnMudW5jaGVja2VkQXBw
ZW5kKG9yaWdpbi5pc29sYXRlZENvcHkoKSk7CisKKyAgICBtX3F1ZXVlLT5kaXNwYXRjaChbdGhp
cywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBjb3BpZWRPcmlnaW5zID0gV1RGTW92
ZShjb3BpZWRPcmlnaW5zKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25I
YW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgZm9yIChhdXRvJiBvcmlnaW4gOiBjb3BpZWRP
cmlnaW5zKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA6
IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBsb2Nh
bFN0b3JhZ2VOYW1lc3BhY2UtPmNsZWFyU3RvcmFnZUFyZWFzTWF0Y2hpbmdPcmlnaW4ob3JpZ2lu
KTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UgOiBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZXMudmFsdWVzKCkpCisgICAgICAg
ICAgICAgICAgdHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlLT5jbGVhclN0b3JhZ2VBcmVh
c01hdGNoaW5nT3JpZ2luKG9yaWdpbik7CisKKyAgICAgICAgICAgIG1fbG9jYWxTdG9yYWdlRGF0
YWJhc2VUcmFja2VyLT5kZWxldGVEYXRhYmFzZVdpdGhPcmlnaW4ob3JpZ2luKTsKKyAgICAgICAg
fQorCisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChXVEZNb3ZlKGNvbXBsZXRpb25I
YW5kbGVyKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OmNyZWF0ZUxvY2Fs
U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VN
YXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBTZWN1cml0eU9yaWdpbkRhdGEmJiBz
ZWN1cml0eU9yaWdpbkRhdGEpCit7CisgICAgc3RkOjpwYWlyPFJlZlB0cjxJUEM6OkNvbm5lY3Rp
b24+LCB1aW50NjRfdD4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24s
IHN0b3JhZ2VNYXBJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtZXNzYWdl
IGNoZWNrLgorICAgIEFTU0VSVCgoSGFzaE1hcDxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVj
dGlvbj4sIHVpbnQ2NF90PiwgUmVmUHRyPFN0b3JhZ2VBcmVhPj46OmlzVmFsaWRLZXkoY29ubmVj
dGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpKSk7CisKKyAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQ
dHI8SVBDOjpDb25uZWN0aW9uPiwgdWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+Pjo6QWRk
UmVzdWx0IHJlc3VsdCA9IG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZChjb25uZWN0aW9u
QW5kU3RvcmFnZU1hcElEUGFpciwgbnVsbHB0cik7CisKKyAgICAvLyBGSVhNRTogVGhlc2Ugc2hv
dWxkIGJlIGEgbWVzc2FnZSBjaGVja3MuCisgICAgQVNTRVJUKHJlc3VsdC5pc05ld0VudHJ5KTsK
KyAgICBBU1NFUlQoKEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxMb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2U+Pjo6aXNWYWxpZEtleShzdG9yYWdlTmFtZXNwYWNlSUQpKSk7CisKKyAgICBMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2UqIGxvY2FsU3RvcmFnZU5hbWVzcGFjZSA9IGdldE9yQ3JlYXRlTG9jYWxTdG9y
YWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1lc3BhY2VJRCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVChsb2NhbFN0b3JhZ2VOYW1lc3Bh
Y2UpOworCisgICAgYXV0byBzdG9yYWdlQXJlYSA9IGxvY2FsU3RvcmFnZU5hbWVzcGFjZS0+Z2V0
T3JDcmVhdGVTdG9yYWdlQXJlYShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOworICAgIHN0
b3JhZ2VBcmVhLT5hZGRMaXN0ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworCisgICAg
cmVzdWx0Lml0ZXJhdG9yLT52YWx1ZSA9IFdURk1vdmUoc3RvcmFnZUFyZWEpOworfQorCit2b2lk
IFN0b3JhZ2VNYW5hZ2VyOjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VNYXAoSVBDOjpDb25u
ZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgdG9wTGV2ZWxPcmlnaW5EYXRhLCBT
ZWN1cml0eU9yaWdpbkRhdGEmJiBvcmlnaW4pCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
IGJlIGEgbWVzc2FnZSBjaGVjay4KKyAgICBBU1NFUlQobV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rp
b24uaXNWYWxpZEtleSh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSkpOworCisgICAgLy8g
U2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBzZXNzaW9uIHN0b3JhZ2UgZm9yIHRoaXMgY29ubmVjdGlv
bi9vcmlnaW4gY29tYm8uCisgICAgLy8gSWYgc28sIHVwZGF0ZSB0aGUgbWFwIHdpdGggdGhlIG5l
dyBJRCwgb3RoZXJ3aXNlIGtlZXAgb24gdHJ1Y2tpbmcuCisgICAgZm9yIChhdXRvIGl0ID0gbV9z
dG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYmVnaW4oKSwgZW5kID0gbV9zdG9yYWdlQXJlYXNCeUNv
bm5lY3Rpb24uZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoaXQtPmtleS5m
aXJzdCAhPSAmY29ubmVjdGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBSZWY8
U3RvcmFnZUFyZWE+IGFyZWEgPSAqaXQtPnZhbHVlOworICAgICAgICBpZiAoIWFyZWEtPmlzU2Vz
c2lvblN0b3JhZ2UoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIW9yaWdp
bi5zZWN1cml0eU9yaWdpbigpLT5pc1NhbWVTY2hlbWVIb3N0UG9ydChhcmVhLT5zZWN1cml0eU9y
aWdpbigpLnNlY3VyaXR5T3JpZ2luKCkuZ2V0KCkpKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGFyZWEtPmFkZExpc3RlbmVyKGNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisgICAg
ICAgIG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLnJlbW92ZShpdCk7CisgICAgICAgIG1fc3Rv
cmFnZUFyZWFzQnlDb25uZWN0aW9uLmFkZCh7ICZjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQgfSwg
V1RGTW92ZShhcmVhKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvJiBzbG90
ID0gbV9zdG9yYWdlQXJlYXNCeUNvbm5lY3Rpb24uYWRkKHsgJmNvbm5lY3Rpb24sIHN0b3JhZ2VN
YXBJRCB9LCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisKKyAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGQgYmUgYSBtZXNzYWdlIGNoZWNrLgorICAgIEFTU0VSVCghc2xvdCk7CisKKyAgICBUcmFu
c2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIHRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFj
ZSA9IGdldE9yQ3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHN0b3JhZ2VOYW1l
c3BhY2VJRCwgV1RGTW92ZSh0b3BMZXZlbE9yaWdpbkRhdGEpKTsKKworICAgIGF1dG8gc3RvcmFn
ZUFyZWEgPSB0cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UtPmdldE9yQ3JlYXRlU3RvcmFn
ZUFyZWEoV1RGTW92ZShvcmlnaW4pKTsKKyAgICBzdG9yYWdlQXJlYS0+YWRkTGlzdGVuZXIoY29u
bmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIHNsb3QgPSBXVEZNb3ZlKHN0b3JhZ2VBcmVh
KTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6Y3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAoSVBD
OjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90
IHN0b3JhZ2VOYW1lc3BhY2VJRCwgU2VjdXJpdHlPcmlnaW5EYXRhJiYgc2VjdXJpdHlPcmlnaW5E
YXRhKQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisg
ICAgQVNTRVJUKG1fc2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoc3RvcmFnZU5h
bWVzcGFjZUlEKSk7CisKKyAgICBTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSogc2Vzc2lvblN0b3Jh
Z2VOYW1lc3BhY2UgPSBtX3Nlc3Npb25TdG9yYWdlTmFtZXNwYWNlcy5nZXQoc3RvcmFnZU5hbWVz
cGFjZUlEKTsKKyAgICBpZiAoIXNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKSB7CisgICAgICAgIC8v
IFdlJ3JlIGdldHRpbmcgYW4gaW5jb21pbmcgbWVzc2FnZSBmcm9tIHRoZSB3ZWIgcHJvY2VzcyB0
aGF0J3MgZm9yIHNlc3Npb24gc3RvcmFnZSBmb3IgYSB3ZWIgcGFnZQorICAgICAgICAvLyB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLCBqdXN0IGlnbm9yZSBpdC4KKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2su
CisgICAgQVNTRVJUKG1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoeyAmY29u
bmVjdGlvbiwgc3RvcmFnZU1hcElEIH0pKTsKKworICAgIGF1dG8mIHNsb3QgPSBtX3N0b3JhZ2VB
cmVhc0J5Q29ubmVjdGlvbi5hZGQoeyAmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEIH0sIG51bGxw
dHIpLml0ZXJhdG9yLT52YWx1ZTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1l
c3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKCFzbG90KTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNo
b3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKCZjb25uZWN0aW9uID09IHNlc3Np
b25TdG9yYWdlTmFtZXNwYWNlLT5hbGxvd2VkQ29ubmVjdGlvbigpKTsKKworICAgIGF1dG8gc3Rv
cmFnZUFyZWEgPSBzZXNzaW9uU3RvcmFnZU5hbWVzcGFjZS0+Z2V0T3JDcmVhdGVTdG9yYWdlQXJl
YShXVEZNb3ZlKHNlY3VyaXR5T3JpZ2luRGF0YSkpOworICAgIHN0b3JhZ2VBcmVhLT5hZGRMaXN0
ZW5lcihjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworCisgICAgc2xvdCA9IFdURk1vdmUoc3Rv
cmFnZUFyZWEpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpkZXN0cm95U3RvcmFnZU1hcChJ
UEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCkKK3sKKyAg
ICBzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlvbj4sIHVpbnQ2NF90PiBjb25uZWN0aW9u
QW5kU3RvcmFnZU1hcElEUGFpcigmY29ubmVjdGlvbiwgc3RvcmFnZU1hcElEKTsKKworICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1lc3NhZ2UgY2hlY2suCisgICAgQVNTRVJUKG1fc3Rv
cmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJ
RFBhaXIpKTsKKworICAgIGF1dG8gaXQgPSBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5maW5k
KGNvbm5lY3Rpb25BbmRTdG9yYWdlTWFwSURQYWlyKTsKKyAgICBpZiAoaXQgPT0gbV9zdG9yYWdl
QXJlYXNCeUNvbm5lY3Rpb24uZW5kKCkpIHsKKyAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gaGFz
IGJlZW4gcmVtb3ZlZCBiZWNhdXNlIHRoZSBsYXN0IHBhZ2Ugd2FzIGNsb3NlZC4KKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGl0LT52YWx1ZS0+cmVtb3ZlTGlzdGVuZXIoY29ubmVjdGlv
biwgc3RvcmFnZU1hcElEKTsKKworICAgIC8vIERvbid0IHJlbW92ZSBzZXNzaW9uIHN0b3JhZ2Ug
bWFwcy4gVGhlIHdlYiBwcm9jZXNzIG1heSByZWNvbm5lY3QgYW5kIGV4cGVjdCB0aGUgZGF0YSB0
byBzdGlsbCBiZSBhcm91bmQuCisgICAgaWYgKGl0LT52YWx1ZS0+aXNTZXNzaW9uU3RvcmFnZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1v
dmUoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIpOworfQorCit2b2lkIFN0b3JhZ2VNYW5h
Z2VyOjpnZXRWYWx1ZXMoSVBDOjpDb25uZWN0aW9uJiBjb25uZWN0aW9uLCB1aW50NjRfdCBzdG9y
YWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiYgdmFsdWVzKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdl
QXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsK
KyAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhh
dCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgdmFsdWVzID0gc3RvcmFnZUFyZWEtPml0ZW1zKCk7CisgICAgY29ubmVjdGlv
bi5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6RGlkR2V0VmFsdWVzKHN0b3JhZ2VNYXBT
ZWVkKSwgc3RvcmFnZU1hcElEKTsKK30KKwordm9pZCBTdG9yYWdlTWFuYWdlcjo6c2V0SXRlbShJ
UEM6OkNvbm5lY3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0
X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0
cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZykK
K3sKKyAgICBTdG9yYWdlQXJlYSogc3RvcmFnZUFyZWEgPSBmaW5kU3RvcmFnZUFyZWEoY29ubmVj
dGlvbiwgc3RvcmFnZU1hcElEKTsKKyAgICBpZiAoIXN0b3JhZ2VBcmVhKSB7CisgICAgICAgIC8v
IFRoaXMgaXMgYSBzZXNzaW9uIHN0b3JhZ2UgYXJlYSBmb3IgYSBwYWdlIHRoYXQgaGFzIGFscmVh
ZHkgYmVlbiBjbG9zZWQuIElnbm9yZSBpdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGJvb2wgcXVvdGFFcnJvcjsKKyAgICBzdG9yYWdlQXJlYS0+c2V0SXRlbSgmY29ubmVjdGlvbiwg
c291cmNlU3RvcmFnZUFyZWFJRCwga2V5LCB2YWx1ZSwgdXJsU3RyaW5nLCBxdW90YUVycm9yKTsK
KyAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRTZXRJdGVt
KHN0b3JhZ2VNYXBTZWVkLCBrZXksIHF1b3RhRXJyb3IpLCBzdG9yYWdlTWFwSUQpOworfQorCit2
b2lkIFN0b3JhZ2VNYW5hZ2VyOjpyZW1vdmVJdGVtKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlv
biwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1
aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYg
dXJsU3RyaW5nKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdl
QXJlYShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsK
KyAgICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhh
dCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgc3RvcmFnZUFyZWEtPnJlbW92ZUl0ZW0oJmNvbm5lY3Rpb24sIHNvdXJjZVN0
b3JhZ2VBcmVhSUQsIGtleSwgdXJsU3RyaW5nKTsKKyAgICBjb25uZWN0aW9uLnNlbmQoTWVzc2Fn
ZXM6OlN0b3JhZ2VBcmVhTWFwOjpEaWRSZW1vdmVJdGVtKHN0b3JhZ2VNYXBTZWVkLCBrZXkpLCBz
dG9yYWdlTWFwSUQpOworfQorCit2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpjbGVhcihJUEM6OkNvbm5l
Y3Rpb24mIGNvbm5lY3Rpb24sIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc291cmNl
U3RvcmFnZUFyZWFJRCwgdWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYgdXJs
U3RyaW5nKQoreworICAgIFN0b3JhZ2VBcmVhKiBzdG9yYWdlQXJlYSA9IGZpbmRTdG9yYWdlQXJl
YShjb25uZWN0aW9uLCBzdG9yYWdlTWFwSUQpOworICAgIGlmICghc3RvcmFnZUFyZWEpIHsKKyAg
ICAgICAgLy8gVGhpcyBpcyBhIHNlc3Npb24gc3RvcmFnZSBhcmVhIGZvciBhIHBhZ2UgdGhhdCBo
YXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4gSWdub3JlIGl0LgorICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgc3RvcmFnZUFyZWEtPmNsZWFyKCZjb25uZWN0aW9uLCBzb3VyY2VTdG9yYWdlQXJl
YUlELCB1cmxTdHJpbmcpOworICAgIGNvbm5lY3Rpb24uc2VuZChNZXNzYWdlczo6U3RvcmFnZUFy
ZWFNYXA6OkRpZENsZWFyKHN0b3JhZ2VNYXBTZWVkKSwgc3RvcmFnZU1hcElEKTsKK30KKwordm9p
ZCBTdG9yYWdlTWFuYWdlcjo6YXBwbGljYXRpb25XaWxsVGVybWluYXRlKCkKK3sKKyAgICBCaW5h
cnlTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIG1fcXVldWUtPmRpc3BhdGNoKFt0aGlzLCAmc2Vt
YXBob3JlXSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8UmVmUHRyPElQQzo6Q29ubmVjdGlv
bj4sIHVpbnQ2NF90Pj4gY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9SZW1vdmU7Cisg
ICAgICAgIGZvciAoYXV0byYgY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpciA6IG1fc3RvcmFnZUFy
ZWFzQnlDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uU3RvcmFnZUFyZWFQYWly
LnZhbHVlLT5yZW1vdmVMaXN0ZW5lcigqY29ubmVjdGlvblN0b3JhZ2VBcmVhUGFpci5rZXkuZmly
c3QsIGNvbm5lY3Rpb25TdG9yYWdlQXJlYVBhaXIua2V5LnNlY29uZCk7CisgICAgICAgICAgICBj
b25uZWN0aW9uQW5kU3RvcmFnZU1hcElEUGFpcnNUb1JlbW92ZS5hcHBlbmQoY29ubmVjdGlvblN0
b3JhZ2VBcmVhUGFpci5rZXkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBjb25u
ZWN0aW9uU3RvcmFnZUFyZWFQYWlyIDogY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXJzVG9S
ZW1vdmUpCisgICAgICAgICAgICBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5yZW1vdmUoY29u
bmVjdGlvblN0b3JhZ2VBcmVhUGFpcik7CisKKyAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOwor
ICAgIH0pOworICAgIHNlbWFwaG9yZS53YWl0KFdhbGxUaW1lOjppbmZpbml0eSgpKTsKK30KKwor
U3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VBcmVhKiBTdG9yYWdlTWFuYWdlcjo6ZmluZFN0b3JhZ2VB
cmVhKElQQzo6Q29ubmVjdGlvbiYgY29ubmVjdGlvbiwgdWludDY0X3Qgc3RvcmFnZU1hcElEKSBj
b25zdAoreworICAgIHN0ZDo6cGFpcjxJUEM6OkNvbm5lY3Rpb24qLCB1aW50NjRfdD4gY29ubmVj
dGlvbkFuZFN0b3JhZ2VNYXBJRFBhaXIoJmNvbm5lY3Rpb24sIHN0b3JhZ2VNYXBJRCk7CisKKyAg
ICBpZiAoIW1fc3RvcmFnZUFyZWFzQnlDb25uZWN0aW9uLmlzVmFsaWRLZXkoY29ubmVjdGlvbkFu
ZFN0b3JhZ2VNYXBJRFBhaXIpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVy
biBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlvbi5nZXQoY29ubmVjdGlvbkFuZFN0b3JhZ2VNYXBJ
RFBhaXIpOworfQorCitTdG9yYWdlTWFuYWdlcjo6TG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBTdG9y
YWdlTWFuYWdlcjo6Z2V0T3JDcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlEKQoreworICAgIGlmICghbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlz
VmFsaWRLZXkoc3RvcmFnZU5hbWVzcGFjZUlEKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICBhdXRvJiBzbG90ID0gbV9sb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmFkZChzdG9yYWdlTmFt
ZXNwYWNlSUQsIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICBpZiAoIXNsb3QpCisgICAg
ICAgIHNsb3QgPSBMb2NhbFN0b3JhZ2VOYW1lc3BhY2U6OmNyZWF0ZSh0aGlzLCBzdG9yYWdlTmFt
ZXNwYWNlSUQpOworCisgICAgcmV0dXJuIHNsb3QuZ2V0KCk7Cit9CisKK1N0b3JhZ2VNYW5hZ2Vy
OjpUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UqIFN0b3JhZ2VNYW5hZ2VyOjpnZXRPckNy
ZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNw
YWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmIHRvcExldmVsT3JpZ2luKQorewor
ICAgIGlmICghbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzLmlzVmFsaWRLZXkoeyBz
dG9yYWdlTmFtZXNwYWNlSUQsIHRvcExldmVsT3JpZ2luIH0pKQorICAgICAgICByZXR1cm4gbnVs
bHB0cjsKKworICAgIGF1dG8mIHNsb3QgPSBtX3RyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFj
ZXMuYWRkKHsgc3RvcmFnZU5hbWVzcGFjZUlELCBXVEZNb3ZlKHRvcExldmVsT3JpZ2luKSB9LCBu
dWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKCFzbG90KQorICAgICAgICBzbG90ID0g
VHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOjpjcmVhdGUoKTsKKworICAgIHJldHVybiBz
bG90LmdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaCBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5h
MWY2OWViNzA3M2EzY2E1ZjNiOGUyN2Q5MzNkMWI4YWUyODFhMDliCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5oCkBA
IC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJD
b25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmgiCisj
aW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJDb3Jl
L1NlY3VyaXR5T3JpZ2luSGFzaC5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx3dGYv
Rm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9GdW5jdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNo
U2V0Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8
d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBTZWN1
cml0eU9yaWdpbjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIExvY2FsU3RvcmFn
ZURhdGFiYXNlVHJhY2tlcjsKK2NsYXNzIFdlYlByb2Nlc3NQcm94eTsKKworY2xhc3MgU3RvcmFn
ZU1hbmFnZXIgOiBwdWJsaWMgSVBDOjpDb25uZWN0aW9uOjpXb3JrUXVldWVNZXNzYWdlUmVjZWl2
ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBSZWY8U3RvcmFnZU1hbmFnZXI+IGNyZWF0ZShjb25z
dCBTdHJpbmcmIGxvY2FsU3RvcmFnZURpcmVjdG9yeSk7CisgICAgflN0b3JhZ2VNYW5hZ2VyKCk7
CisKKyAgICB2b2lkIGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKKyAgICB2b2lkIGRlc3Ryb3lT
ZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpOworICAg
IHZvaWQgc2V0QWxsb3dlZFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlQ29ubmVjdGlvbih1aW50NjRf
dCBzdG9yYWdlTmFtZXNwYWNlSUQsIElQQzo6Q29ubmVjdGlvbiogYWxsb3dlZENvbm5lY3Rpb24p
OworICAgIHZvaWQgY2xvbmVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdl
TmFtZXNwYWNlSUQsIHVpbnQ2NF90IG5ld1N0b3JhZ2VOYW1lc3BhY2VJRCk7CisKKyAgICB2b2lk
IHByb2Nlc3NXaWxsT3BlbkNvbm5lY3Rpb24oV2ViUHJvY2Vzc1Byb3h5JiwgSVBDOjpDb25uZWN0
aW9uJik7CisgICAgdm9pZCBwcm9jZXNzRGlkQ2xvc2VDb25uZWN0aW9uKFdlYlByb2Nlc3NQcm94
eSYsIElQQzo6Q29ubmVjdGlvbiYpOworICAgIHZvaWQgYXBwbGljYXRpb25XaWxsVGVybWluYXRl
KCk7CisKKyAgICB2b2lkIGdldFNlc3Npb25TdG9yYWdlT3JpZ2lucyhGdW5jdGlvbjx2b2lkKEhh
c2hTZXQ8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYmKT4mJiBjb21wbGV0aW9uSGFuZGxl
cik7CisgICAgdm9pZCBkZWxldGVTZXNzaW9uU3RvcmFnZU9yaWdpbnMoRnVuY3Rpb248dm9pZCgp
PiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICB2b2lkIGRlbGV0ZVNlc3Npb25TdG9yYWdlRW50
cmllc0Zvck9yaWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4m
LCBGdW5jdGlvbjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOworCisgICAgdm9pZCBnZXRM
b2NhbFN0b3JhZ2VPcmlnaW5zKEZ1bmN0aW9uPHZvaWQoSGFzaFNldDxXZWJDb3JlOjpTZWN1cml0
eU9yaWdpbkRhdGE+JiYpPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICB2b2lkIGRlbGV0ZUxv
Y2FsU3RvcmFnZUVudHJpZXNGb3JPcmlnaW4oV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiYp
OworCisgICAgdm9pZCBkZWxldGVMb2NhbFN0b3JhZ2VPcmlnaW5zTW9kaWZpZWRTaW5jZShzdGQ6
OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50LCBGdW5jdGlvbjx2b2lkKCk+JiYgY29t
cGxldGlvbkhhbmRsZXIpOworICAgIHZvaWQgZGVsZXRlTG9jYWxTdG9yYWdlRW50cmllc0Zvck9y
aWdpbnMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mLCBGdW5jdGlv
bjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpOworCisgICAgdm9pZCBnZXRMb2NhbFN0b3Jh
Z2VPcmlnaW5EZXRhaWxzKEZ1bmN0aW9uPHZvaWQoVmVjdG9yPExvY2FsU3RvcmFnZURhdGFiYXNl
VHJhY2tlcjo6T3JpZ2luRGV0YWlscz4pPiYmIGNvbXBsZXRpb25IYW5kbGVyKTsKKworcHJpdmF0
ZToKKyAgICBleHBsaWNpdCBTdG9yYWdlTWFuYWdlcihjb25zdCBTdHJpbmcmIGxvY2FsU3RvcmFn
ZURpcmVjdG9yeSk7CisKKyAgICAvLyBJUEM6OkNvbm5lY3Rpb246OldvcmtRdWV1ZU1lc3NhZ2VS
ZWNlaXZlci4KKyAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQ
Qzo6RGVjb2RlciYpIG92ZXJyaWRlOworICAgIHZvaWQgZGlkUmVjZWl2ZVN5bmNNZXNzYWdlKElQ
Qzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYsIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29k
ZXI+JiByZXBseUVuY29kZXIpIG92ZXJyaWRlOworCisgICAgLy8gTWVzc2FnZSBoYW5kbGVycy4K
KyAgICB2b2lkIGNyZWF0ZUxvY2FsU3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRf
dCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHN0b3JhZ2VOYW1lc3BhY2VJRCwgV2ViQ29yZTo6U2Vj
dXJpdHlPcmlnaW5EYXRhJiYpOworICAgIHZvaWQgY3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdl
TWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmJiB0b3BMZXZlbE9y
aWdpbkRhdGEsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYmKTsKKyAgICB2b2lkIGNyZWF0
ZVNlc3Npb25TdG9yYWdlTWFwKElQQzo6Q29ubmVjdGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VNYXBJ
RCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRh
dGEmJik7CisgICAgdm9pZCBkZXN0cm95U3RvcmFnZU1hcChJUEM6OkNvbm5lY3Rpb24mLCB1aW50
NjRfdCBzdG9yYWdlTWFwSUQpOworCisgICAgdm9pZCBnZXRWYWx1ZXMoSVBDOjpDb25uZWN0aW9u
JiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgSGFzaE1h
cDxTdHJpbmcsIFN0cmluZz4mIHZhbHVlcyk7CisgICAgdm9pZCBzZXRJdGVtKElQQzo6Q29ubmVj
dGlvbiYsIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVh
SUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgcmVtb3ZlSXRl
bShJUEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2NF90IHNvdXJj
ZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtl
eSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgY2xlYXIoSVBDOjpDb25uZWN0
aW9uJiwgdWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlE
LCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworCisg
ICAgY2xhc3MgU3RvcmFnZUFyZWE7CisgICAgU3RvcmFnZUFyZWEqIGZpbmRTdG9yYWdlQXJlYShJ
UEM6OkNvbm5lY3Rpb24mLCB1aW50NjRfdCkgY29uc3Q7CisKKyAgICBjbGFzcyBMb2NhbFN0b3Jh
Z2VOYW1lc3BhY2U7CisgICAgTG9jYWxTdG9yYWdlTmFtZXNwYWNlKiBnZXRPckNyZWF0ZUxvY2Fs
U3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAgY2xh
c3MgVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlOworICAgIFRyYW5zaWVudExvY2FsU3Rv
cmFnZU5hbWVzcGFjZSogZ2V0T3JDcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
dWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEm
JiB0b3BMZXZlbE9yaWdpbik7CisKKyAgICBSZWY8V29ya1F1ZXVlPiBtX3F1ZXVlOworCisgICAg
UmVmPExvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcj4gbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVRy
YWNrZXI7CisgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPExvY2FsU3RvcmFnZU5hbWVzcGFj
ZT4+IG1fbG9jYWxTdG9yYWdlTmFtZXNwYWNlczsKKworICAgIEhhc2hNYXA8c3RkOjpwYWlyPHVp
bnQ2NF90LCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGE+LCBSZWZQdHI8VHJhbnNpZW50TG9j
YWxTdG9yYWdlTmFtZXNwYWNlPj4gbV90cmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2VzOwor
CisgICAgY2xhc3MgU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2U7CisgICAgSGFzaE1hcDx1aW50NjRf
dCwgUmVmUHRyPFNlc3Npb25TdG9yYWdlTmFtZXNwYWNlPj4gbV9zZXNzaW9uU3RvcmFnZU5hbWVz
cGFjZXM7CisKKyAgICBIYXNoTWFwPHN0ZDo6cGFpcjxSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiwg
dWludDY0X3Q+LCBSZWZQdHI8U3RvcmFnZUFyZWE+PiBtX3N0b3JhZ2VBcmVhc0J5Q29ubmVjdGlv
bjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTWFuYWdlci5tZXNzYWdlcy5pbiBiL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU1hbmFnZXIubWVzc2FnZXMuaW4K
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMjU3ODlmNzRjYzA4MWIwNzRiNTg4NTBkMmI3ZDdiYzQxODA0OWM4YQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFn
ZU1hbmFnZXIubWVzc2FnZXMuaW4KQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIw
MTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIyBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorCittZXNzYWdlcyAtPiBTdG9yYWdlTWFuYWdlciB7CisgICAg
Q3JlYXRlTG9jYWxTdG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3Vy
aXR5T3JpZ2luRGF0YSkgV2FudHNDb25uZWN0aW9uCisgICAgQ3JlYXRlVHJhbnNpZW50TG9jYWxT
dG9yYWdlTWFwKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFj
ZUlELCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHRvcExldmVsU2VjdXJpdHlP
cmlnaW5EYXRhLCBzdHJ1Y3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIHNlY3VyaXR5T3Jp
Z2luRGF0YSkgV2FudHNDb25uZWN0aW9uCisgICAgQ3JlYXRlU2Vzc2lvblN0b3JhZ2VNYXAodWlu
dDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIHN0cnVjdCBX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlPcmlnaW5EYXRhKSBXYW50c0Nvbm5l
Y3Rpb24KKyAgICBEZXN0cm95U3RvcmFnZU1hcCh1aW50NjRfdCBzdG9yYWdlTWFwSUQpIFdhbnRz
Q29ubmVjdGlvbgorCisgICAgR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBJRCwgdWludDY0
X3Qgc3RvcmFnZU1hcFNlZWQpIC0+IChIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMpIFdh
bnRzQ29ubmVjdGlvbgorCisgICAgU2V0SXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwSUQsIHVpbnQ2
NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBTdHJpbmcg
a2V5LCBTdHJpbmcgdmFsdWUsIFN0cmluZyB1cmxTdHJpbmcpIFdhbnRzQ29ubmVjdGlvbgorICAg
IFJlbW92ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcElELCB1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtleSwgU3RyaW5nIHVybFN0
cmluZykgV2FudHNDb25uZWN0aW9uCisgICAgQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcElELCB1
aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCB1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3Ry
aW5nIHVybFN0cmluZykgV2FudHNDb25uZWN0aW9uCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXJJ
T1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9XZWJTdG9yYWdlL2lvcy9Mb2NhbFN0b3Jh
Z2VEYXRhYmFzZVRyYWNrZXJJT1MubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmQ5MDllYTZiMjUwMzE5YjAxMzA2
YzQzNmJkMGYxMzJjMGY4Mjg1NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL1dlYlN0b3JhZ2UvaW9zL0xvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlcklPUy5tbQpA
QCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkxvY2FsU3RvcmFnZURhdGFiYXNlVHJhY2tlci5oIgorCisjaWYgUExBVEZPUk0oSU9TKQor
CisjaW5jbHVkZSAiVmVyc2lvbkNoZWNrcy5oIgorCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9p
ZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZVRyYWNrZXI6OnBsYXRmb3JtTWF5YmVFeGNsdWRlRnJvbUJh
Y2t1cCgpIGNvbnN0Cit7CisgICAgaWYgKG1faGFzRXhjbHVkZWRGcm9tQmFja3VwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2hhc0V4Y2x1ZGVkRnJvbUJhY2t1cCA9IHRydWU7CisKKyAgICBp
ZiAobGlua2VkT25PckFmdGVyKFNES1ZlcnNpb246OkZpcnN0VG9FeGNsdWRlTG9jYWxTdG9yYWdl
RnJvbUJhY2t1cCkpCisgICAgICAgIFtbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOihOU1N0cmluZyAq
KW1fbG9jYWxTdG9yYWdlRGlyZWN0b3J5XSBzZXRSZXNvdXJjZVZhbHVlOkBZRVMgZm9yS2V5Ok5T
VVJMSXNFeGNsdWRlZEZyb21CYWNrdXBLZXkgZXJyb3I6bmlsXTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViS2l0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
aW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZUlPUy5tbSBiL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9SZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0
b3JhZ2VJT1MubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWI1Y2JkMjhlMjQ5MjkxM2E0MzI3NjRjOWJhOTM2NTI3
N2M5NzcyMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9S
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0KQEAgLTAsMCArMSw0
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmgiCisKKyNpZiBQTEFURk9STShJT1MpCisK
K25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0
ZW50U3RvcmFnZTo6ZXhjbHVkZUZyb21CYWNrdXAoKSBjb25zdAoreworICAgIFtbTlNVUkwgZmls
ZVVSTFdpdGhQYXRoOihOU1N0cmluZyAqKW1fc3RvcmFnZURpcmVjdG9yeVBhdGhdIHNldFJlc291
cmNlVmFsdWU6QFlFUyBmb3JLZXk6TlNVUkxJc0V4Y2x1ZGVkRnJvbUJhY2t1cEtleSBlcnJvcjpu
aWxdOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJLaXQu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKaW5kZXggYWVjOGQzN2FmZDg2YjViMDRkYTQ3MDZlY2NlZjRlMmNh
NGE3MTY3OS4uOTg5NTY2Yjg1ZWYyMzk5MzcyY2M3ZmNjOTQxY2JmODU4MDNjZDM4MSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysg
Yi9Tb3VyY2UvV2ViS2l0L1dlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0xMDc5
LDYgKzEwNzksOSBAQAogCQk1MUUzNTIwMjE4MEY1RDFFMDBFNTNCRTkgLyogRGF0YWJhc2VQcm9j
ZXNzTWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
NTFFMzUyMDExODBGNUQxRTAwRTUzQkU5IC8qIERhdGFiYXNlUHJvY2Vzc01hYy5tbSAqLzsgfTsK
IAkJNTFFMzUyMDkxODBGNUQ2QjAwRTUzQkU5IC8qIERhdGFiYXNlU2VydmljZUVudHJ5UG9pbnQu
bW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MUUzNTIw
ODE4MEY1RDZCMDBFNTNCRTkgLyogRGF0YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbSAqLzsgfTsK
IAkJNTFFMzk5MDYxRDZGNTRDNzAwOUM4ODMxIC8qIFVJR2FtZXBhZFByb3ZpZGVyQ29jb2EubW0g
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MUUzOTkwNTFE
NkY1NEM1MDA5Qzg4MzEgLyogVUlHYW1lcGFkUHJvdmlkZXJDb2NvYS5tbSAqLzsgfTsKKwkJNTFF
NkMxNjAxRjI5MzU2MDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZUlPUy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDUxRTZDMTVGMUYyOTM1NTEwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2VJT1MubW0gKi87IH07CisJCTUxRTZDMTYzMUYyOTM1RDgwMEZEMzQzNyAv
KiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFFNkMxNjIxRjI5MzVDRDAwRkQz
NDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi87IH07
CisJCTUxRTZDMTY0MUYyOTM1REQwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVy
c2lzdGVudFN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDUxRTZDMTYxMUYyOTM1Q0QwMEZEMzQzNyAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNz
UGVyc2lzdGVudFN0b3JhZ2UuaCAqLzsgfTsKIAkJNTFFOEI2OEUxRTcxMjg3NzAwMUI3MTMyIC8q
IFdlYlVSTFNjaGVtZVRhc2suY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gNTFFOEI2OEQxRTcxMjg3MzAwMUI3MTMyIC8qIFdlYlVSTFNjaGVtZVRhc2su
Y3BwICovOyB9OwogCQk1MUU5NDk5NzFENzYyMTEzMDBFQzlFQjkgLyogVUlHYW1lcGFkUHJvdmlk
ZXJJT1MubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1
MUU5NDk5NjFENzYxQ0M3MDBFQzlFQjkgLyogVUlHYW1lcGFkUHJvdmlkZXJJT1MubW0gKi87IH07
CiAJCTUxRUZDMUNGMTUyNEU2MjUwMEM5QTkzOCAvKiBXS0J1bmRsZURPTVdpbmRvd0V4dGVuc2lv
bi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTFGQTJE
NTQxNTIxMTE4NjAwQzFCQTBCIC8qIFdLQnVuZGxlRE9NV2luZG93RXh0ZW5zaW9uLmggKi87IHNl
dHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTEzMjUsNyArMTMy
OCw2IEBACiAJCTgzMTA0MjhDMUJENkI2NkYwMEE3MTVFNCAvKiBOZXR3b3JrQ2FjaGVTdWJyZXNv
dXJjZXNFbnRyeS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA4MzEwNDI4QTFCRDZCNjZGMDBBNzE1RTQgLyogTmV0d29ya0NhY2hlU3VicmVzb3VyY2Vz
RW50cnkuY3BwICovOyB9OwogCQk4MzFFRUJCRDFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0Nh
Y2hlU3BlY3VsYXRpdmVMb2FkLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSA4MzFFRUJCQjFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3Vs
YXRpdmVMb2FkLmggKi87IH07CiAJCTgzMUVFQkJFMUJEODVDNDMwMEJCNjRDMyAvKiBOZXR3b3Jr
Q2FjaGVTcGVjdWxhdGl2ZUxvYWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gODMxRUVCQkMxQkQ4NUM0MzAwQkI2NEMzIC8qIE5ldHdvcmtDYWNoZVNw
ZWN1bGF0aXZlTG9hZC5jcHAgKi87IH07Ci0JCTgzMjQzNTVDMUYxNzE0NjcwMDM1QUEzQSAvKiBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzI0MzU1QjFGMTcxNDYxMDAzNUFB
M0EgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovOyB9
OwogCQk4MzJBRTI1MjFCRTJFOENEMDBGQUFFMTAgLyogTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVM
b2FkTWFuYWdlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gODMyQUUyNTAxQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9h
ZE1hbmFnZXIuaCAqLzsgfTsKIAkJODMyQUUyNTMxQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtD
YWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gODMyQUUyNTExQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtD
YWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwICovOyB9OwogCQk4MzJFRDE4QjFFMkZFMTU3
MDA2QkE2NEEgLyogUGVyQWN0aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzJFRDE4OTFFMkZFMTNCMDA2
QkE2NEEgLyogUGVyQWN0aXZpdHlTdGF0ZUNQVVVzYWdlU2FtcGxlci5jcHAgKi87IH07CkBAIC0x
MzM5LDggKzEzNDEsNiBAQAogCQk4MzcyREIyODFBNjc1NjI4MDBDNjk3QzUgLyogV2ViUGFnZURp
YWdub3N0aWNMb2dnaW5nQ2xpZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDgzNzJEQjI2MUE2NzU2MjgwMEM2OTdDNSAvKiBXZWJQYWdlRGlhZ25v
c3RpY0xvZ2dpbmdDbGllbnQuY3BwICovOyB9OwogCQk4MzcyREIyOTFBNjc1NjI4MDBDNjk3QzUg
LyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzcyREIyNzFBNjc1NjI4MDBDNjk3QzUgLyogV2Vi
UGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggKi87IH07CiAJCTgzNzJEQjJGMUE2NzdENEEw
MEM2OTdDNSAvKiBXS0RpYWdub3N0aWNMb2dnaW5nUmVzdWx0VHlwZS5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODM3MkRCMkUxQTY3N0Q0QTAwQzY5N0M1
IC8qIFdLRGlhZ25vc3RpY0xvZ2dpbmdSZXN1bHRUeXBlLmggKi87IHNldHRpbmdzID0ge0FUVFJJ
QlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKLQkJODM4NTBDMEMxRjE2QkE5MDAwQzE1RTUyIC8q
IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4Mzg1MEMwQTFGMTZCQTZDMDBDMTVF
NTIgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCAqLzsgfTsK
LQkJODM4NTBDMEQxRjE2QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJz
aXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gODM4NTBDMEIxRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQ
ZXJzaXN0ZW50U3RvcmFnZS5oICovOyB9OwogCQk4Mzg5MUI2MzFBNjhCMzQyMDAzMEYzODYgLyog
QVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDgzODkxQjYyMUE2OEIzNDIwMDMwRjM4NiAvKiBBUElEaWFnbm9z
dGljTG9nZ2luZ0NsaWVudC5oICovOyB9OwogCQk4Mzg5MUI2OTFBNjhCRUJDMDAzMEYzODYgLyog
X1dLRGlhZ25vc3RpY0xvZ2dpbmdEZWxlZ2F0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gODM4OTFCNjgxQTY4QkVCQzAwMzBGMzg2IC8qIF9XS0RpYWdu
b3N0aWNMb2dnaW5nRGVsZWdhdGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQk4Mzg5MUI2QzFBNjhDMzBCMDAzMEYzODYgLyogRGlhZ25vc3RpY0xv
Z2dpbmdDbGllbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDgzODkxQjZBMUE2OEMzMEIwMDMwRjM4NiAvKiBEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5o
ICovOyB9OwpAQCAtMzM0Miw2ICszMzQyLDkgQEAKIAkJNTFFMzUyMDcxODBGNUQ2MTAwRTUzQkU5
IC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTUxRTM1MjA4MTgwRjVENkIwMEU1M0JFOSAvKiBEYXRhYmFzZVNlcnZp
Y2VFbnRyeVBvaW50Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
RGF0YWJhc2VTZXJ2aWNlRW50cnlQb2ludC5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJNTFFMzk5MDUxRDZGNTRDNTAwOUM4ODMxIC8qIFVJR2FtZXBhZFByb3ZpZGVyQ29jb2EubW0g
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBVSUdhbWVwYWRQcm92aWRl
ckNvY29hLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk1MUU2QzE1RjFGMjkzNTUx
MDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1t
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAub2JqY3BwOyBuYW1lID0gUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRT
dG9yYWdlSU9TLm1tOyBwYXRoID0gaW9zL1Jlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50
U3RvcmFnZUlPUy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTFFNkMxNjExRjI5
MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2Uu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTFFNkMxNjIxRjI5MzVDRDAwRkQzNDM3
IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MUU4QjY4RDFFNzEyODczMDAxQjcxMzIgLyog
V2ViVVJMU2NoZW1lVGFzay5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBXZWJVUkxTY2hlbWVUYXNrLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTFF
OTQ5OTYxRDc2MUNDNzAwRUM5RUI5IC8qIFVJR2FtZXBhZFByb3ZpZGVySU9TLm1tICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gVUlHYW1lcGFkUHJvdmlkZXJJT1MubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTUxRjA2MEREMTY1NDMxNzUwMEYzMjgxQiAv
KiBXZWJSZXNvdXJjZUxvYWRlck1lc3NhZ2VSZWNlaXZlci5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBXZWJSZXNvdXJjZUxvYWRlck1lc3NhZ2VSZWNlaXZlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CkBAIC0zNjE0LDcgKzM2MTcsNiBAQAogCQk4MzEwNDI4QTFCRDZCNjZGMDBBNzE1
RTQgLyogTmV0d29ya0NhY2hlU3VicmVzb3VyY2VzRW50cnkuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlU3VicmVzb3VyY2VzRW50cnkuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzFFRUJCQjFCRDg1QzQzMDBCQjY0QzMgLyog
TmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk4MzFFRUJCQzFCRDg1QzQzMDBCQjY0QzMgLyogTmV0d29ya0NhY2hlU3BlY3Vs
YXRpdmVMb2FkLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE5ldHdv
cmtDYWNoZVNwZWN1bGF0aXZlTG9hZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0J
CTgzMjQzNTVCMUYxNzE0NjEwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lz
dGVudFN0b3JhZ2VJT1MubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGgg
PSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW07IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzMkFFMjUwMUJFMkU4Q0QwMEZBQUUxMCAvKiBOZXR3b3Jr
Q2FjaGVTcGVjdWxhdGl2ZUxvYWRNYW5hZ2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IE5ldHdvcmtDYWNoZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJODMyQUUyNTExQkUyRThDRDAwRkFBRTEwIC8qIE5ldHdvcmtDYWNo
ZVNwZWN1bGF0aXZlTG9hZE1hbmFnZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gTmV0d29ya0NhY2hlU3BlY3VsYXRpdmVMb2FkTWFuYWdlci5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTgzMkVEMTg5MUUyRkUxM0IwMDZCQTY0QSAvKiBQZXJBY3Rp
dml0eVN0YXRlQ1BVVXNhZ2VTYW1wbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFBlckFjdGl2aXR5U3RhdGVDUFVVc2FnZVNhbXBsZXIuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwpAQCAtMzYyOCw4ICszNjMwLDYgQEAKIAkJODM3MkRCMjYxQTY3NTYy
ODAwQzY5N0M1IC8qIFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJQYWdlRGlhZ25vc3RpY0xvZ2dpbmdDbGll
bnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzcyREIyNzFBNjc1NjI4MDBD
Njk3QzUgLyogV2ViUGFnZURpYWdub3N0aWNMb2dnaW5nQ2xpZW50LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IFdlYlBhZ2VEaWFnbm9zdGljTG9nZ2luZ0NsaWVudC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4MzcyREIyRTFBNjc3RDRBMDBDNjk3QzUgLyogV0tE
aWFnbm9zdGljTG9nZ2luZ1Jlc3VsdFR5cGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gV0tEaWFnbm9zdGljTG9nZ2luZ1Jlc3VsdFR5cGUuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKLQkJODM4NTBDMEExRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2UuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk4Mzg1MEMwQjFGMTZCQTZDMDBDMTVFNTIgLyogUmVz
b3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4Mzg5MUI2MjFBNjhCMzQyMDAzMEYzODYg
LyogQVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gQVBJRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJODM4OTFCNjgxQTY4QkVCQzAwMzBGMzg2IC8qIF9XS0RpYWdub3N0aWNMb2dn
aW5nRGVsZWdhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gX1dLRGlhZ25v
c3RpY0xvZ2dpbmdEZWxlZ2F0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4Mzg5
MUI2QTFBNjhDMzBCMDAzMEYzODYgLyogRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRGlhZ25vc3RpY0xvZ2dpbmdDbGllbnQuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTQ2NzksNyArNDY3OSw3IEBACiAJCQluYW1lID0g
RGVwcmVjYXRlZDsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07Ci0JCTFBNDRCOTU4
MTZCNzNGOEMwMEI3QkJEOCAvKiBTdG9yYWdlICovID0geworCQkxQTQ0Qjk1ODE2QjczRjhDMDBC
N0JCRDggLyogV2ViU3RvcmFnZSAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRy
ZW4gPSAoCiAJCQkJNTEyMEM4MkQxRTU0RTIwNDAwMjVCMjUwIC8qIGlvcyAqLywKQEAgLTQ2ODcs
MTMgKzQ2ODcsMTEgQEAKIAkJCQkxQTFEOEJBMDE3MzFBMzYzMDAxNDFEQTQgLyogTG9jYWxTdG9y
YWdlRGF0YWJhc2UuaCAqLywKIAkJCQkxQThDNzI4QTE3Mzg0NzdDMDAwQTY1NTQgLyogTG9jYWxT
dG9yYWdlRGF0YWJhc2VUcmFja2VyLmNwcCAqLywKIAkJCQkxQThDNzI4QjE3Mzg0NzdDMDAwQTY1
NTQgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VyLmggKi8sCi0JCQkJODM4NTBDMEExRjE2
QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5j
cHAgKi8sCi0JCQkJODM4NTBDMEIxRjE2QkE2QzAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRp
c3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovLAogCQkJCTFBNDRCOTU5MTZCNzNGOUYwMEI3QkJE
OCAvKiBTdG9yYWdlTWFuYWdlci5jcHAgKi8sCiAJCQkJMUE0NEI5NUExNkI3M0Y5RjAwQjdCQkQ4
IC8qIFN0b3JhZ2VNYW5hZ2VyLmggKi8sCiAJCQkJMUFCMzFBOTMxNkJDNjVBQjAwRjZEQkM5IC8q
IFN0b3JhZ2VNYW5hZ2VyLm1lc3NhZ2VzLmluICovLAogCQkJKTsKLQkJCXBhdGggPSBTdG9yYWdl
OworCQkJcGF0aCA9IFdlYlN0b3JhZ2U7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9
OwogCQkxQTQ4MzJDMDFBOTY1QTMzMDA4QjRERkUgLyogQ29jb2EgKi8gPSB7CkBAIC00ODYxLDcg
KzQ4NTksNyBAQAogCQkJcGF0aCA9IGNnOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJ
fTsKLQkJMUFBQzREREUxNkIxQ0JGNjAwOTQyNUUzIC8qIFN0b3JhZ2UgKi8gPSB7CisJCTFBQUM0
RERFMTZCMUNCRjYwMDk0MjVFMyAvKiBXZWJTdG9yYWdlICovID0gewogCQkJaXNhID0gUEJYR3Jv
dXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQkxQUQzMzA2QzE2QjFEOTkxMDA0RjYwRTcgLyogU3Rv
cmFnZUFyZWFJbXBsLmNwcCAqLywKQEAgLTQ4NzQsNyArNDg3Miw3IEBACiAJCQkJMUE1MkMwRjUx
QTM4Q0RDNzAwMTYxNjBBIC8qIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAgKi8sCiAJ
CQkJMUE1MkMwRjYxQTM4Q0RDNzAwMTYxNjBBIC8qIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRl
ci5oICovLAogCQkJKTsKLQkJCXBhdGggPSBTdG9yYWdlOworCQkJcGF0aCA9IFdlYlN0b3JhZ2U7
CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OwogCQkxQUFEREY0QjEwRDgyQUYwMDBE
M0Q2M0QgLyogU2hhcmVkICovID0gewpAQCAtNTQwMiw2ICs1NDAwLDcgQEAKIAkJCQk4NkY5NTM2
MjE4RkY1NTBCMDAxREIyRUYgLyogUHJvY2Vzc0Fzc2VydGlvbklPUy5tbSAqLywKIAkJCQkwRjBD
MzY1NzE4QzA1MUJBMDBGNjA3RDcgLyogUmVtb3RlTGF5ZXJUcmVlSG9zdElPUy5tbSAqLywKIAkJ
CQkwRjBDMzY1QjE4QzA1Q0ExMDBGNjA3RDcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JQ
cm94eUlPUy5tbSAqLywKKwkJCQk1MUU2QzE1RjFGMjkzNTUxMDBGRDM0MzcgLyogUmVzb3VyY2VM
b2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlSU9TLm1tICovLAogCQkJCTJEQUYwNkQ0MThC
RDFBNDcwMDgxQ0VCMSAvKiBTbWFydE1hZ25pZmljYXRpb25Db250cm9sbGVyLmggKi8sCiAJCQkJ
MkRBRjA2RDgxOEJEMjNCQTAwODFDRUIxIC8qIFNtYXJ0TWFnbmlmaWNhdGlvbkNvbnRyb2xsZXIu
bWVzc2FnZXMuaW4gKi8sCiAJCQkJMkRBRjA2RDUxOEJEMUE0NzAwODFDRUIxIC8qIFNtYXJ0TWFn
bmlmaWNhdGlvbkNvbnRyb2xsZXIubW0gKi8sCkBAIC02MDAwLDcgKzU5OTksNiBAQAogCQkJaXNh
ID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQk1MTIwQzgzMDFFNTRFMjY1MDAyNUIy
NTAgLyogTG9jYWxTdG9yYWdlRGF0YWJhc2VUcmFja2VySU9TLm1tICovLAotCQkJCTgzMjQzNTVC
MUYxNzE0NjEwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3Jh
Z2VJT1MubW0gKi8sCiAJCQkpOwogCQkJcGF0aCA9IGlvczsKIAkJCXNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7CkBAIC02NTM5LDEwICs2NTM3LDEwIEBACiAJCQkJMzEwOTk5NzQxNDZDOEFBODAwMjlE
RUI5IC8qIE5vdGlmaWNhdGlvbnMgKFVzZXIpICovLAogCQkJCTFBNkZCN0FBMTFFNjRCNDkwMERC
MTM3MSAvKiBQbHVnaW5zICovLAogCQkJCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1NyAvKiBTY3Jv
bGxpbmcgKi8sCi0JCQkJMUFBQzREREUxNkIxQ0JGNjAwOTQyNUUzIC8qIFN0b3JhZ2UgKi8sCiAJ
CQkJMUFBRjA4QUExOTI2OTMwQjAwQjYzOTBDIC8qIFVzZXJDb250ZW50ICovLAogCQkJCUJDMDMy
RDVEMTBGNDM3MjIwMDU4QzE1QSAvKiBXZWJDb3JlU3VwcG9ydCAqLywKIAkJCQlCQzAzMkQ1RTEw
RjQzNzJCMDA1OEMxNUEgLyogV2ViUGFnZSAqLywKKwkJCQkxQUFDNERERTE2QjFDQkY2MDA5NDI1
RTMgLyogV2ViU3RvcmFnZSAqLywKIAkJCQlCQ0U5QzBDRjE0ODU5NjVEMDBFMzNENjEgLyogV2Vi
Q29ubmVjdGlvblRvVUlQcm9jZXNzLmNwcCAqLywKIAkJCQlCQ0U5QzBEMDE0ODU5NjVEMDBFMzNE
NjEgLyogV2ViQ29ubmVjdGlvblRvVUlQcm9jZXNzLmggKi8sCiAJCQkJQkMxMTFBRTMxMTJGNUMy
NjAwMzM3QkFCIC8qIFdlYlByb2Nlc3MuY3BwICovLApAQCAtNjY4OSw4ICs2Njg3LDggQEAKIAkJ
CQkzMUEyRUM0MDE0ODk5NzM3MDA4MTBENzEgLyogTm90aWZpY2F0aW9ucyAqLywKIAkJCQkxQUVG
Q0MwNTExRDAxRjM0MDA4MjE5RDMgLyogUGx1Z2lucyAqLywKIAkJCQkwRjU5NDc5MzE4N0IzQjRD
MDA0Mzc4NTcgLyogU2Nyb2xsaW5nICovLAotCQkJCTFBNDRCOTU4MTZCNzNGOEMwMEI3QkJEOCAv
KiBTdG9yYWdlICovLAogCQkJCTFBQUYwODlFMTkyNjgxQUMwMEI2MzkwQyAvKiBVc2VyQ29udGVu
dCAqLywKKwkJCQkxQTQ0Qjk1ODE2QjczRjhDMDBCN0JCRDggLyogV2ViU3RvcmFnZSAqLywKIAkJ
CQkxQTUzQzJBMzFBMzI1NjkxMDA0RThDNzAgLyogV2Vic2l0ZURhdGEgKi8sCiAJCQkJN0NEMTAy
RDkxODY2NzcwNjAwRUQ0MjlEIC8qIEF1dG9Db3JyZWN0aW9uQ2FsbGJhY2suaCAqLywKIAkJCQk0
NkEyQjYwNjFFNTY3NUEyMDBDM0RFREEgLyogQmFja2dyb3VuZFByb2Nlc3NSZXNwb25zaXZlbmVz
c1RpbWVyLmNwcCAqLywKQEAgLTY3MjQsNiArNjcyMiw4IEBACiAJCQkJQTU1QkE4MUIxQkEyNUIx
RTAwN0NEMzNEIC8qIFJlbW90ZVdlYkluc3BlY3RvclByb3h5LmNwcCAqLywKIAkJCQlBNTVCQTgx
OTFCQTI1QjFFMDA3Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVjdG9yUHJveHkuaCAqLywKIAkJCQlB
NTVCQTgxQTFCQTI1QjFFMDA3Q0QzM0QgLyogUmVtb3RlV2ViSW5zcGVjdG9yUHJveHkubWVzc2Fn
ZXMuaW4gKi8sCisJCQkJNTFFNkMxNjIxRjI5MzVDRDAwRkQzNDM3IC8qIFJlc291cmNlTG9hZFN0
YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5jcHAgKi8sCisJCQkJNTFFNkMxNjExRjI5MzVDRDAw
RkQzNDM3IC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oICovLAog
CQkJCUJDMTExQjA4MTEyRjVFM0MwMDMzN0JBQiAvKiBSZXNwb25zaXZlbmVzc1RpbWVyLmNwcCAq
LywKIAkJCQkxQTMwMDY2QzExMTBGNEY3MDAzMTkzN0MgLyogUmVzcG9uc2l2ZW5lc3NUaW1lci5o
ICovLAogCQkJCTUxQTRENUE4MTZDQUM0RkYwMDBFNjE1RSAvKiBTdGF0aXN0aWNzUmVxdWVzdC5j
cHAgKi8sCkBAIC04NTMyLDcgKzg1MzIsNiBAQAogCQkJCUE1NUJBODE3MUJBMjNFMTIwMDdDRDMz
RCAvKiBSZW1vdGVXZWJJbnNwZWN0b3JVSS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNkJFOTY5Q0Qx
RTU0RTA1NDAwOEI3NDgzIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NDbGFzc2lmaWVyLmggaW4g
SGVhZGVycyAqLywKIAkJCQk2QkU5NjlDQjFFNTRENENGMDA4Qjc0ODMgLyogUmVzb3VyY2VMb2Fk
U3RhdGlzdGljc0NsYXNzaWZpZXJDb2NvYS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJODM4NTBDMEQx
RjE2QkE5MDAwQzE1RTUyIC8qIFJlc291cmNlTG9hZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFn
ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMUEzMDA2NkUxMTEwRjRGNzAwMzE5MzdDIC8qIFJlc3Bv
bnNpdmVuZXNzVGltZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTQxMDQ4MkNFMURERDMyNEYwMEYw
MDZEMCAvKiBSVENOZXR3b3JrLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzJEMDIxNzEyQUM0MUNC
MDBFNzMyQTMgLyogU2FtZURvY3VtZW50TmF2aWdhdGlvblR5cGUuaCBpbiBIZWFkZXJzICovLApA
QCAtODk1Nyw2ICs4OTU2LDcgQEAKIAkJCQkxQUJDM0RGQzE4OTlGNTFDMDA0RjA2MjYgLyogV0tO
YXZpZ2F0aW9uRGVsZWdhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTFBQTIwRDUxMThBRDUwRTAw
MDVEMUVENCAvKiBXS05hdmlnYXRpb25EZWxlZ2F0ZVByaXZhdGUuaCBpbiBIZWFkZXJzICovLAog
CQkJCTFBQkMzREYxMTg5OUM2QjYwMDRGMDYyNiAvKiBXS05hdmlnYXRpb25JbnRlcm5hbC5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJNTFFNkMxNjQxRjI5MzVERDAwRkQzNDM3IC8qIFJlc291cmNlTG9h
ZFN0YXRpc3RpY3NQZXJzaXN0ZW50U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMUFDQzg3
QkExOTgxQzM0MTAwM0QxQUY0IC8qIFdLTmF2aWdhdGlvblByaXZhdGUuaCBpbiBIZWFkZXJzICov
LAogCQkJCTJEM0E2NUUzMUE3QzNBOTMwMENBQzYzNyAvKiBXS05hdmlnYXRpb25SZWYuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTFBMUIwRUI2MThBNDI0OTUwMDM4NDgxQSAvKiBXS05hdmlnYXRpb25S
ZXNwb25zZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0xMDEwMiw4ICsxMDEwMiw2IEBACiAJCQkJMUJC
QkU0QTAxOUI2NkM1MzAwNkI3RDgxIC8qIFJlbW90ZVdlYkluc3BlY3RvclVJTWVzc2FnZVJlY2Vp
dmVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTZCRTk2OUM3MUU1NEQ0QjYwMDhCNzQ4MyAvKiBS
ZXNvdXJjZUxvYWRTdGF0aXN0aWNzQ2xhc3NpZmllci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk2
QkU5NjlDQTFFNTRENENGMDA4Qjc0ODMgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc0NsYXNzaWZp
ZXJDb2NvYS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQk4Mzg1MEMwQzFGMTZCQTkwMDBDMTVFNTIg
LyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdlLmNwcCBpbiBTb3VyY2Vz
ICovLAotCQkJCTgzMjQzNTVDMUYxNzE0NjcwMDM1QUEzQSAvKiBSZXNvdXJjZUxvYWRTdGF0aXN0
aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLywKIAkJCQlCQzExMUIwOTEx
MkY1RTNDMDAzMzdCQUIgLyogUmVzcG9uc2l2ZW5lc3NUaW1lci5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk0MTA0ODJDRDFEREQzMjRDMDBGMDA2RDAgLyogUlRDTmV0d29yay5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQkxQUFCNEFBQTEyOTZGMTU0MDAyMzk1MkYgLyogU2FuZGJveEV4dGVuc2lvbk1h
Yy5tbSBpbiBTb3VyY2VzICovLApAQCAtMTAzMTUsNiArMTAzMTMsNyBAQAogCQkJCUJDOTYzRDZF
MTEzREQxQTUwMDU3NEJFMiAvKiBXZWJQYWdlTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQzBD
RTcyQTAxMjQ3RTcxRDAwQkMwRUM0IC8qIFdlYlBhZ2VNZXNzYWdlUmVjZWl2ZXIuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJMkQ1QzlEMDUxOUM4MUQ4RjAwQjNDNUMxIC8qIFdlYlBhZ2VPdmVybGF5
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTUxRTZDMTYwMUYyOTM1NjAwMEZEMzQzNyAvKiBSZXNv
dXJjZUxvYWRTdGF0aXN0aWNzUGVyc2lzdGVudFN0b3JhZ2VJT1MubW0gaW4gU291cmNlcyAqLywK
IAkJCQlCQzExMUIwRjExMkY1RTRGMDAzMzdCQUIgLyogV2ViUGFnZVByb3h5LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTFBQzAyNzNGMTk2NjIyRDYwMEMxMkI3NSAvKiBXZWJQYWdlUHJveHlDb2Nv
YS5tbSBpbiBTb3VyY2VzICovLAogCQkJCTJEQTk0NEFGMTg4NEU5QkEwMEVEODZEQiAvKiBXZWJQ
YWdlUHJveHlJT1MubW0gaW4gU291cmNlcyAqLywKQEAgLTEwNTI3LDYgKzEwNTI2LDcgQEAKIAkJ
CQkyRDNBNjVFMjFBN0MzQTkzMDBDQUM2MzcgLyogV0tOYXZpZ2F0aW9uUmVmLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTFBMUIwRUI1MThBNDI0OTUwMDM4NDgxQSAvKiBXS05hdmlnYXRpb25SZXNw
b25zZS5tbSBpbiBTb3VyY2VzICovLAogCQkJCTJEM0E2NURFMUE3QzNBN0QwMENBQzYzNyAvKiBX
S05hdmlnYXRpb25SZXNwb25zZVJlZi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk1MUU2QzE2MzFG
MjkzNUQ4MDBGRDM0MzcgLyogUmVzb3VyY2VMb2FkU3RhdGlzdGljc1BlcnNpc3RlbnRTdG9yYWdl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTMxOEJFMTc3MTQ3NDNFNjAwMEE4RkJCMiAvKiBXS05v
dGlmaWNhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzMThCRTE3NTE0NzQzREQ3MDBBOEZC
QjIgLyogV0tOb3RpZmljYXRpb25NYW5hZ2VyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTMxQTJF
Qzc3MTQ4RDY2MkUwMDgxMEQ3MSAvKiBXS05vdGlmaWNhdGlvblBlcm1pc3Npb25SZXF1ZXN0LmNw
cCBpbiBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9y
YWdlL1N0b3JhZ2VBcmVhSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJl
ODUwN2EzMTMyNjQyZGJkYzBmMThhNjk5ZDFlN2NmM2JhNDg2MWQuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0
b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBA
Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVh
SW1wbC5oIgotCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXAuaCIKLSNpbmNsdWRlIDxXZWJDb3Jl
L0RvY3VtZW50Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgotI2luY2x1ZGUgPFdlYkNv
cmUvUGFnZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2NoZW1lUmVnaXN0cnkuaD4KLSNpbmNsdWRl
IDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2V0dGlu
Z3MuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewot
Ci1zdGF0aWMgdWludDY0X3QgZ2VuZXJhdGVTdG9yYWdlQXJlYUlEKCkKLXsKLSAgICBzdGF0aWMg
dWludDY0X3Qgc3RvcmFnZUFyZWFJRDsKLSAgICByZXR1cm4gKytzdG9yYWdlQXJlYUlEOwotfQot
Ci1SZWY8U3RvcmFnZUFyZWFJbXBsPiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShSZWY8U3RvcmFn
ZUFyZWFNYXA+JiYgc3RvcmFnZUFyZWFNYXApCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcg
U3RvcmFnZUFyZWFJbXBsKFdURk1vdmUoc3RvcmFnZUFyZWFNYXApKSk7Ci19Ci0KLVN0b3JhZ2VB
cmVhSW1wbDo6U3RvcmFnZUFyZWFJbXBsKFJlZjxTdG9yYWdlQXJlYU1hcD4mJiBzdG9yYWdlQXJl
YU1hcCkKLSAgICA6IG1fc3RvcmFnZUFyZWFJRChnZW5lcmF0ZVN0b3JhZ2VBcmVhSUQoKSkKLSAg
ICAsIG1fc3RvcmFnZUFyZWFNYXAoV1RGTW92ZShzdG9yYWdlQXJlYU1hcCkpCi17Ci19Ci0KLVN0
b3JhZ2VBcmVhSW1wbDo6flN0b3JhZ2VBcmVhSW1wbCgpCi17Ci19Ci0KLXVuc2lnbmVkIFN0b3Jh
Z2VBcmVhSW1wbDo6bGVuZ3RoKCkKLXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+bGVu
Z3RoKCk7Ci19Ci0KLVN0cmluZyBTdG9yYWdlQXJlYUltcGw6OmtleSh1bnNpZ25lZCBpbmRleCkK
LXsKLSAgICByZXR1cm4gbV9zdG9yYWdlQXJlYU1hcC0+a2V5KGluZGV4KTsKLX0KLQotU3RyaW5n
IFN0b3JhZ2VBcmVhSW1wbDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICByZXR1cm4g
bV9zdG9yYWdlQXJlYU1hcC0+aXRlbShrZXkpOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhSW1wbDo6
c2V0SXRlbShGcmFtZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJp
bmcmIHZhbHVlLCBib29sJiBxdW90YUV4Y2VwdGlvbikKLXsKLSAgICBBU1NFUlQoIXZhbHVlLmlz
TnVsbCgpKTsKLQotICAgIG1fc3RvcmFnZUFyZWFNYXAtPnNldEl0ZW0oc291cmNlRnJhbWUsIHRo
aXMsIGtleSwgdmFsdWUsIHF1b3RhRXhjZXB0aW9uKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYUlt
cGw6OnJlbW92ZUl0ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSkKLXsK
LSAgICBtX3N0b3JhZ2VBcmVhTWFwLT5yZW1vdmVJdGVtKHNvdXJjZUZyYW1lLCB0aGlzLCBrZXkp
OwotfQotCi12b2lkIFN0b3JhZ2VBcmVhSW1wbDo6Y2xlYXIoRnJhbWUqIHNvdXJjZUZyYW1lKQot
ewotICAgIG1fc3RvcmFnZUFyZWFNYXAtPmNsZWFyKHNvdXJjZUZyYW1lLCB0aGlzKTsKLX0KLQot
Ym9vbCBTdG9yYWdlQXJlYUltcGw6OmNvbnRhaW5zKGNvbnN0IFN0cmluZyYga2V5KQotewotICAg
IHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5jb250YWlucyhrZXkpOwotfQotCi1ib29sIFN0b3Jh
Z2VBcmVhSW1wbDo6Y2FuQWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCi17Ci0gICAgcmV0dXJu
IGZyYW1lICYmIGZyYW1lLT5wYWdlKCk7Ci19Ci0KLVN0b3JhZ2VUeXBlIFN0b3JhZ2VBcmVhSW1w
bDo6c3RvcmFnZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5z
dG9yYWdlVHlwZSgpOwotfQotCi1zaXplX3QgU3RvcmFnZUFyZWFJbXBsOjptZW1vcnlCeXRlc1Vz
ZWRCeUNhY2hlKCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6
OmluY3JlbWVudEFjY2Vzc0NvdW50KCkKLXsKLSAgICAvLyBTdG9yYWdlIGFjY2VzcyBpcyBoYW5k
bGVkIGluIHRoZSBVSSBwcm9jZXNzLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS4KLX0K
LQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmRlY3JlbWVudEFjY2Vzc0NvdW50KCkKLXsKLSAgICAv
LyBTdG9yYWdlIGFjY2VzcyBpcyBoYW5kbGVkIGluIHRoZSBVSSBwcm9jZXNzLCBzbyB0aGVyZSdz
IG5vdGhpbmcgdG8gZG8gaGVyZS4KLX0KLQotdm9pZCBTdG9yYWdlQXJlYUltcGw6OmNsb3NlRGF0
YWJhc2VJZklkbGUoKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhpcy4KLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLX0KLQotV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhIFN0b3Jh
Z2VBcmVhSW1wbDo6c2VjdXJpdHlPcmlnaW4oKSBjb25zdAotewotICAgIHJldHVybiBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3N0b3JhZ2VBcmVhTWFw
LT5zZWN1cml0eU9yaWdpbigpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlQXJlYUltcGwuaCBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE0N2M4ZDgzOGU4ZmJkYzVkNDdiZjc4Y2Y3NmUx
OWEwMTk4YjMyLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCisrKyAv
ZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
LSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgU3RvcmFnZUFy
ZWFJbXBsX2gKLSNkZWZpbmUgU3RvcmFnZUFyZWFJbXBsX2gKLQotI2luY2x1ZGUgIk1lc3NhZ2VS
ZWNlaXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEuaD4KLSNpbmNsdWRlIDx3
dGYvSGFzaENvdW50ZWRTZXQuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci1jbGFzcyBTZWN1cml0eU9yaWdpbjsKLX0KLQotbmFtZXNwYWNlIFdlYktp
dCB7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwOwotCi1jbGFzcyBTdG9yYWdlQXJlYUltcGwgZmlu
YWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZUFyZWEgewotcHVibGljOgotICAgIHN0YXRpYyBS
ZWY8U3RvcmFnZUFyZWFJbXBsPiBjcmVhdGUoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKLSAgICB2
aXJ0dWFsIH5TdG9yYWdlQXJlYUltcGwoKTsKLQotICAgIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQo
KSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VBcmVhSUQ7IH0KLQotcHJpdmF0ZToKLSAgICBTdG9y
YWdlQXJlYUltcGwoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKLQotICAgIC8vIFdlYkNvcmU6OlN0
b3JhZ2VBcmVhLgotICAgIHVuc2lnbmVkIGxlbmd0aCgpIG92ZXJyaWRlOwotICAgIFN0cmluZyBr
ZXkodW5zaWduZWQgaW5kZXgpIG92ZXJyaWRlOwotICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmlu
ZyYga2V5KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldEl0ZW0oV2ViQ29yZTo6RnJhbWUqIHNvdXJj
ZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVv
dGFFeGNlcHRpb24pIG92ZXJyaWRlOwotICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFt
ZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKLSAgICB2b2lkIGNs
ZWFyKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBjb250
YWlucyhjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBjYW5BY2Nlc3NTdG9y
YWdlKFdlYkNvcmU6OkZyYW1lKikgb3ZlcnJpZGU7Ci0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUg
c3RvcmFnZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICBzaXplX3QgbWVtb3J5Qnl0ZXNVc2Vk
QnlDYWNoZSgpIG92ZXJyaWRlOwotICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQoKSBvdmVy
cmlkZTsKLSAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkgb3ZlcnJpZGU7Ci0gICAgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB1aW50NjRf
dCBtX3N0b3JhZ2VBcmVhSUQ7Ci0gICAgUmVmPFN0b3JhZ2VBcmVhTWFwPiBtX3N0b3JhZ2VBcmVh
TWFwOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAvLyBTdG9yYWdlQXJl
YUltcGxfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3Rv
cmFnZUFyZWFNYXAuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFn
ZUFyZWFNYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY1MGQxYjNlYmZj
NzI4YzI3NWVlMDEwYmZlYTNhMjY4YjBiODg2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3Jh
Z2VBcmVhTWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhTWFwLmgiCi0KLSNp
bmNsdWRlICJTdG9yYWdlQXJlYUltcGwuaCIKLSNpbmNsdWRlICJTdG9yYWdlQXJlYU1hcE1lc3Nh
Z2VzLmgiCi0jaW5jbHVkZSAiU3RvcmFnZU1hbmFnZXJNZXNzYWdlcy5oIgotI2luY2x1ZGUgIlN0
b3JhZ2VOYW1lc3BhY2VJbXBsLmgiCi0jaW5jbHVkZSAiV2ViUGFnZS5oIgotI2luY2x1ZGUgIldl
YlBhZ2VHcm91cFByb3h5LmgiCi0jaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgotI2luY2x1ZGUgPFdl
YkNvcmUvRE9NV2luZG93Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9Eb2N1bWVudC5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvTWFpbkZyYW1lLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9QYWdlLmg+Ci0jaW5j
bHVkZSA8V2ViQ29yZS9QYWdlR3JvdXAuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3Jp
Z2luRGF0YS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZS5oPgotI2luY2x1ZGUgPFdlYkNv
cmUvU3RvcmFnZUV2ZW50RGlzcGF0Y2hlci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1h
cC5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZVR5cGUuaD4KLQotdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdGF0aWMgdWludDY0X3QgZ2VuZXJh
dGVTdG9yYWdlTWFwSUQoKQotewotICAgIHN0YXRpYyB1aW50NjRfdCBzdG9yYWdlTWFwSUQ7Ci0g
ICAgcmV0dXJuICsrc3RvcmFnZU1hcElEOwotfQotCi1SZWY8U3RvcmFnZUFyZWFNYXA+IFN0b3Jh
Z2VBcmVhTWFwOjpjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2Us
IFJlZjxXZWJDb3JlOjpTZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKLXsKLSAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYU1hcChzdG9yYWdlTmFtZXNwYWNlLCBXVEZN
b3ZlKHNlY3VyaXR5T3JpZ2luKSkpOwotfQotCi1TdG9yYWdlQXJlYU1hcDo6U3RvcmFnZUFyZWFN
YXAoU3RvcmFnZU5hbWVzcGFjZUltcGwqIHN0b3JhZ2VOYW1lc3BhY2UsIFJlZjxXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbj4mJiBzZWN1cml0eU9yaWdpbikKLSAgICA6IG1fc3RvcmFnZU5hbWVzcGFj
ZSgqc3RvcmFnZU5hbWVzcGFjZSkKLSAgICAsIG1fc3RvcmFnZU1hcElEKGdlbmVyYXRlU3RvcmFn
ZU1hcElEKCkpCi0gICAgLCBtX3N0b3JhZ2VUeXBlKHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VU
eXBlKCkpCi0gICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlLT5zdG9y
YWdlTmFtZXNwYWNlSUQoKSkKLSAgICAsIG1fcXVvdGFJbkJ5dGVzKHN0b3JhZ2VOYW1lc3BhY2Ut
PnF1b3RhSW5CeXRlcygpKQotICAgICwgbV9zZWN1cml0eU9yaWdpbihXVEZNb3ZlKHNlY3VyaXR5
T3JpZ2luKSkKLSAgICAsIG1fY3VycmVudFNlZWQoMCkKLSAgICAsIG1faGFzUGVuZGluZ0NsZWFy
KGZhbHNlKQotICAgICwgbV9oYXNQZW5kaW5nR2V0VmFsdWVzKGZhbHNlKQotewotICAgIHN3aXRj
aCAobV9zdG9yYWdlVHlwZSkgewotICAgIGNhc2UgU3RvcmFnZVR5cGU6OkxvY2FsOgotICAgIGNh
c2UgU3RvcmFnZVR5cGU6OlRyYW5zaWVudExvY2FsOgotICAgICAgICBpZiAoU2VjdXJpdHlPcmln
aW4qIHRvcExldmVsT3JpZ2luID0gc3RvcmFnZU5hbWVzcGFjZS0+dG9wTGV2ZWxPcmlnaW4oKSkK
LSAgICAgICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0
aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpDcmVhdGVUcmFuc2llbnRMb2Nh
bFN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VOYW1l
c3BhY2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbigqdG9wTGV2
ZWxPcmlnaW4pLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3Vy
aXR5T3JpZ2luKSksIDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBXZWJQcm9jZXNzOjpz
aW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9y
YWdlTWFuYWdlcjo6Q3JlYXRlTG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElELCBzdG9yYWdl
TmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9t
U2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpLCAwKTsKLQotICAgICAgICBicmVhazsK
LQotICAgIGNhc2UgU3RvcmFnZVR5cGU6OlNlc3Npb246Ci0gICAgICAgIFdlYlByb2Nlc3M6OnNp
bmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3Jh
Z2VNYW5hZ2VyOjpDcmVhdGVTZXNzaW9uU3RvcmFnZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3RvcmFn
ZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJv
bVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlPcmlnaW4pKSwgMCk7Ci0gICAgICAgIGJyZWFrOwot
Ci0gICAgY2FzZSBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWw6Ci0gICAgICAgIC8vIFRoZSBV
SSBwcm9jZXNzIGlzIG5vdCBpbnZvbHZlZCBmb3IgRXBoZW1lcmFsTG9jYWwgc3RvcmFnZXMuCi0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRN
ZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlN0b3JhZ2VBcmVhTWFwOjptZXNzYWdlUmVjZWl2ZXJO
YW1lKCksIG1fc3RvcmFnZU1hcElELCAqdGhpcyk7Ci19Ci0KLVN0b3JhZ2VBcmVhTWFwOjp+U3Rv
cmFnZUFyZWFNYXAoKQotewotICAgIGlmIChtX3N0b3JhZ2VUeXBlICE9IFN0b3JhZ2VUeXBlOjpF
cGhlbWVyYWxMb2NhbCkgewotICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQ
cm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6RGVzdHJv
eVN0b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQpLCAwKTsKLSAgICAgICAgV2ViUHJvY2Vzczo6c2lu
Z2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpTdG9yYWdlQXJlYU1hcDo6
bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3JhZ2VNYXBJRCk7Ci0gICAgfQotCi0gICAgbV9z
dG9yYWdlTmFtZXNwYWNlLT5kaWREZXN0cm95U3RvcmFnZUFyZWFNYXAoKnRoaXMpOwotfQotCi11
bnNpZ25lZCBTdG9yYWdlQXJlYU1hcDo6bGVuZ3RoKCkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVk
ZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmxlbmd0aCgpOwotfQotCi1TdHJpbmcg
U3RvcmFnZUFyZWFNYXA6OmtleSh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICBsb2FkVmFsdWVzSWZO
ZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRleCk7Ci19Ci0KLVN0
cmluZyBTdG9yYWdlQXJlYU1hcDo6aXRlbShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBsb2Fk
VmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5
KTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6c2V0SXRlbShGcmFtZSogc291cmNlRnJhbWUs
IFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0
cmluZyYgdmFsdWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQotewotICAgIGxvYWRWYWx1ZXNJZk5l
ZWRlZCgpOwotCi0gICAgQVNTRVJUKG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOwotCi0gICAg
U3RyaW5nIG9sZFZhbHVlOwotICAgIHF1b3RhRXhjZXB0aW9uID0gZmFsc2U7Ci0gICAgbV9zdG9y
YWdlTWFwLT5zZXRJdGVtKGtleSwgdmFsdWUsIG9sZFZhbHVlLCBxdW90YUV4Y2VwdGlvbik7Ci0g
ICAgaWYgKHF1b3RhRXhjZXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAob2xkVmFs
dWUgPT0gdmFsdWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdl
cy5hZGQoa2V5KTsKLQotICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3ND
b25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpTZXRJdGVtKG1fc3Rv
cmFnZU1hcElELCBzb3VyY2VBcmVhLT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQsIGtl
eSwgdmFsdWUsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSksIDApOwotfQotCi12b2lk
IFN0b3JhZ2VBcmVhTWFwOjpyZW1vdmVJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwg
U3RvcmFnZUFyZWFJbXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBs
b2FkVmFsdWVzSWZOZWVkZWQoKTsKLSAgICBBU1NFUlQobV9zdG9yYWdlTWFwLT5oYXNPbmVSZWYo
KSk7Ci0KLSAgICBTdHJpbmcgb2xkVmFsdWU7Ci0gICAgbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVt
KGtleSwgb2xkVmFsdWUpOwotCi0gICAgaWYgKG9sZFZhbHVlLmlzTnVsbCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuYWRkKGtleSk7Ci0KLSAgICBXZWJQ
cm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3Nh
Z2VzOjpTdG9yYWdlTWFuYWdlcjo6UmVtb3ZlSXRlbShtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJl
YS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBrZXksIHNvdXJjZUZyYW1lLT5kb2N1
bWVudCgpLT51cmwoKSksIDApOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpjbGVhcihXZWJD
b3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSkKLXsK
LSAgICByZXNldFZhbHVlcygpOwotCi0gICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSB0cnVlOwotICAg
IG1fc3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0gICAg
V2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChN
ZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkNsZWFyKG1fc3RvcmFnZU1hcElELCBzb3VyY2VBcmVh
LT5zdG9yYWdlQXJlYUlEKCksIG1fY3VycmVudFNlZWQsIHNvdXJjZUZyYW1lLT5kb2N1bWVudCgp
LT51cmwoKSksIDApOwotfQotCi1ib29sIFN0b3JhZ2VBcmVhTWFwOjpjb250YWlucyhjb25zdCBT
dHJpbmcmIGtleSkKLXsKLSAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBt
X3N0b3JhZ2VNYXAtPmNvbnRhaW5zKGtleSk7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OnJl
c2V0VmFsdWVzKCkKLXsKLSAgICBtX3N0b3JhZ2VNYXAgPSBudWxscHRyOwotCi0gICAgbV9wZW5k
aW5nVmFsdWVDaGFuZ2VzLmNsZWFyKCk7Ci0gICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxzZTsK
LSAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRTZWVkKys7
Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmxvYWRWYWx1ZXNJZk5lZWRlZCgpCi17Ci0gICAg
aWYgKG1fc3RvcmFnZU1hcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSGFzaE1hcDxTdHJpbmcs
IFN0cmluZz4gdmFsdWVzOwotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgYSBzcGVjaWFs
IHNlbmRTeW5jIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3Mg
aW5jb21pbmcgbWVzc2FnZXMgd2hpbGUgd2FpdGluZyBmb3IgYSByZXBseS4KLSAgICAvLyAoVGhp
cyBmbGFnIGRvZXMgbm90IHlldCBleGlzdCkuIFNpbmNlIGxvYWRWYWx1ZXNJZk5lZWRlZCgpIGVu
ZHMgdXAgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIEphdmFTY3JpcHQgY29kZSwgcHJvY2Vzc2lu
ZyBpbmNvbWluZyBzeW5jaHJvbm91cyBtZXNzYWdlcwotICAgIC8vIGNvdWxkIGxlYWQgdG8gd2Vp
cmQgcmVlbnRyZW5jeSBidWdzIG90aGVyd2lzZS4KLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24o
KS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kU3luYyhNZXNzYWdlczo6U3RvcmFnZU1h
bmFnZXI6OkdldFZhbHVlcyhtX3N0b3JhZ2VNYXBJRCwgbV9jdXJyZW50U2VlZCksIE1lc3NhZ2Vz
OjpTdG9yYWdlTWFuYWdlcjo6R2V0VmFsdWVzOjpSZXBseSh2YWx1ZXMpLCAwKTsKLQotICAgIG1f
c3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0gICAgbV9z
dG9yYWdlTWFwLT5pbXBvcnRJdGVtcyh2YWx1ZXMpOwotCi0gICAgLy8gV2Ugd2FudCB0byBpZ25v
cmUgYWxsIGNoYW5nZXMgdW50aWwgd2UgZ2V0IHRoZSBEaWRHZXRWYWx1ZXMgbWVzc2FnZS4KLSAg
ICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSB0cnVlOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFw
OjpkaWRHZXRWYWx1ZXModWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCi17Ci0gICAgaWYgKG1fY3Vy
cmVudFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VS
VChtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpOwotICAgIG1faGFzUGVuZGluZ0dldFZhbHVlcyA9IGZh
bHNlOwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3Jh
Z2VNYXBTZWVkLCBjb25zdCBTdHJpbmcmIGtleSwgYm9vbCBxdW90YUVycm9yKQotewotICAgIGlm
IChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpOwotCi0gICAgaWYg
KHF1b3RhRXJyb3IpIHsKLSAgICAgICAgcmVzZXRWYWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUoa2V5KTsKLX0KLQotdm9p
ZCBTdG9yYWdlQXJlYU1hcDo6ZGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwg
Y29uc3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgaWYgKG1fY3VycmVudFNlZWQgIT0gc3RvcmFnZU1h
cFNlZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChtX3BlbmRpbmdWYWx1ZUNoYW5n
ZXMuY29udGFpbnMoa2V5KSk7Ci0gICAgbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLnJlbW92ZShrZXkp
OwotfQotCi12b2lkIFN0b3JhZ2VBcmVhTWFwOjpkaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFw
U2VlZCkKLXsKLSAgICBpZiAobV9jdXJyZW50U2VlZCAhPSBzdG9yYWdlTWFwU2VlZCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKG1faGFzUGVuZGluZ0NsZWFyKTsKLSAgICBtX2hhc1Bl
bmRpbmdDbGVhciA9IGZhbHNlOwotfQotCi1ib29sIFN0b3JhZ2VBcmVhTWFwOjpzaG91bGRBcHBs
eUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtleSkgY29uc3QKLXsKLSAgICAvLyBXZSBoYXZl
IG5vdCB5ZXQgbG9hZGVkIGFueXRoaW5nIGZyb20gdGhpcyBzdG9yYWdlIG1hcC4KLSAgICBpZiAo
IW1fc3RvcmFnZU1hcCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gQ2hlY2sgaWYg
dGhpcyBzdG9yYWdlIGFyZWEgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZSBzdG9yYWdlIG1h
bmFnZXIgdG8gdXBkYXRlIHRoZSBnaXZlbiBrZXkuCi0gICAgLy8gSWYgdGhhdCBpcyB0aGUgY2Fz
ZSwgd2UgZG9uJ3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyBtYWRlIGJ5IG90aGVyIHN0b3Jh
Z2UgYXJlYXMsIHNpbmNlCi0gICAgLy8gb3VyIGNoYW5nZSB3YXMgbWFkZSBsYXN0LgotICAgIGlm
IChtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuY29udGFpbnMoa2V5KSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFnZUFyZWFNYXA6OmFwcGx5
Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKQotewotICAg
IEFTU0VSVCghbV9zdG9yYWdlTWFwIHx8IG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOwotCi0g
ICAgLy8gVGhlcmUncyBhIGNsZWFyIHBlbmRpbmcgb3IgZ2V0VmFsdWVzIHBlbmRpbmcgd2UgZG9u
J3Qgd2FudCB0byBhcHBseSBhbnkgY2hhbmdlcyB1bnRpbCB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRp
bmcgRGlkQ2xlYXIvRGlkR2V0VmFsdWVzIG1lc3NhZ2VzLgotICAgIGlmIChtX2hhc1BlbmRpbmdD
bGVhciB8fCBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlm
ICgha2V5KSB7Ci0gICAgICAgIC8vIEEgbnVsbCBrZXkgbWVhbnMgY2xlYXIuCi0gICAgICAgIGF1
dG8gbmV3U3RvcmFnZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3F1b3RhSW5CeXRlcyk7Ci0K
LSAgICAgICAgLy8gQW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgbG9jYWxseSBhZnRlciB0aGUg
Y2xlYXIgbXVzdCBzdGlsbCBiZSBrZXB0IGFyb3VuZCBpbiB0aGUgbmV3IG1hcC4KLSAgICAgICAg
Zm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmJlZ2luKCkua2V5cygpLCBlbmQg
PSBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuZW5kKCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
LSAgICAgICAgICAgIGNvbnN0IFN0cmluZyYga2V5ID0gKml0OwotCi0gICAgICAgICAgICBTdHJp
bmcgdmFsdWUgPSBtX3N0b3JhZ2VNYXAtPmdldEl0ZW0oa2V5KTsKLSAgICAgICAgICAgIGlmICgh
dmFsdWUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNoYW5nZSBtdXN0IGhhdmUgYmVlbiBh
IHBlbmRpbmcgcmVtb3ZlLCBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICAgICAgICAg
IG5ld1N0b3JhZ2VNYXAtPnNldEl0ZW1JZ25vcmluZ1F1b3RhKGtleSwgb2xkVmFsdWUpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdTdG9yYWdlTWFwKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghc2hvdWxkQXBwbHlDaGFuZ2VGb3JL
ZXkoa2V5KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFuZXdWYWx1ZSkgewotICAgICAg
ICAvLyBBIG51bGwgbmV3IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGl0ZW0gc2hvdWxkIGJlIHJlbW92
ZWQuCi0gICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAgICAgICAgbV9zdG9yYWdlTWFwLT5yZW1v
dmVJdGVtKGtleSwgb2xkVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9z
dG9yYWdlTWFwLT5zZXRJdGVtSWdub3JpbmdRdW90YShrZXksIG5ld1ZhbHVlKTsKLX0KLQotdm9p
ZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNlU3Rv
cmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUsIGNv
bnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAgIGlm
ICghc291cmNlU3RvcmFnZUFyZWFJRCkgewotICAgICAgICAvLyBUaGlzIHN0b3JhZ2UgZXZlbnQg
b3JpZ2luYXRlcyBmcm9tIGFub3RoZXIgcHJvY2VzcyBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBj
aGFuZ2UgdG8gb3VyIHN0b3JhZ2UgYXJlYSBtYXAuCi0gICAgICAgIGFwcGx5Q2hhbmdlKGtleSwg
bmV3VmFsdWUpOwotICAgIH0KLQotICAgIGlmIChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBl
OjpTZXNzaW9uKQotICAgICAgICBkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQoc291cmNlU3Rv
cmFnZUFyZWFJRCwga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0cmluZyk7Ci0gICAgZWxz
ZQotICAgICAgICBkaXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHNvdXJjZVN0b3JhZ2VBcmVhSUQs
IGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCB1cmxTdHJpbmcpOwotfQotCi12b2lkIFN0b3JhZ2VB
cmVhTWFwOjpjbGVhckNhY2hlKCkKLXsKLSAgICByZXNldFZhbHVlcygpOwotfQotCi12b2lkIFN0
b3JhZ2VBcmVhTWFwOjpkaXNwYXRjaFNlc3Npb25TdG9yYWdlRXZlbnQodWludDY0X3Qgc291cmNl
U3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUs
IGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQotewotICAg
IEFTU0VSVChzdG9yYWdlVHlwZSgpID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKTsKLQotICAgIC8v
IE5hbWVzcGFjZSBJRHMgZm9yIHNlc3Npb24gc3RvcmFnZSBuYW1lc3BhY2VzIGFyZSBlcXVpdmFs
ZW50IHRvIHdlYiBwYWdlIElEcwotICAgIC8vIHNvIHdlIGNhbiBnZXQgdGhlIHJpZ2h0IHBhZ2Ug
aGVyZS4KLSAgICBXZWJQYWdlKiB3ZWJQYWdlID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2Vi
UGFnZShtX3N0b3JhZ2VOYW1lc3BhY2VJRCk7Ci0gICAgaWYgKCF3ZWJQYWdlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVzOwotCi0gICAgUGFnZSog
cGFnZSA9IHdlYlBhZ2UtPmNvcmVQYWdlKCk7Ci0gICAgZm9yIChGcmFtZSogZnJhbWUgPSAmcGFn
ZS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCkudHJhdmVyc2VOZXh0
KCkpIHsKLSAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7Ci0g
ICAgICAgIGlmICghZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCkuZXF1YWwobV9zZWN1cml0eU9y
aWdpbi5wdHIoKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBTdG9yYWdlKiBz
dG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5vcHRpb25hbFNlc3Npb25TdG9yYWdlKCk7
Ci0gICAgICAgIGlmICghc3RvcmFnZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAg
IFN0b3JhZ2VBcmVhSW1wbCYgc3RvcmFnZUFyZWEgPSBzdGF0aWNfY2FzdDxTdG9yYWdlQXJlYUlt
cGwmPihzdG9yYWdlLT5hcmVhKCkpOwotICAgICAgICBpZiAoc3RvcmFnZUFyZWEuc3RvcmFnZUFy
ZWFJRCgpID09IHNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMg
dGhlIHN0b3JhZ2UgYXJlYSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4K
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJhbWVzLmFwcGVu
ZChmcmFtZSk7Ci0gICAgfQotCi0gICAgU3RvcmFnZUV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hT
ZXNzaW9uU3RvcmFnZUV2ZW50c1RvRnJhbWVzKCpwYWdlLCBmcmFtZXMsIGtleSwgb2xkVmFsdWUs
IG5ld1ZhbHVlLCB1cmxTdHJpbmcsIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3Jp
Z2luKG1fc2VjdXJpdHlPcmlnaW4pKTsKLX0KLQotdm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0
Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBT
dHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1
ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCi17Ci0gICAgQVNTRVJUKGlzTG9jYWxTdG9yYWdl
KHN0b3JhZ2VUeXBlKCkpKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8RnJhbWU+PiBmcmFtZXM7Ci0K
LSAgICBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9ICpXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53ZWJQ
YWdlR3JvdXAobV9zdG9yYWdlTmFtZXNwYWNlSUQpLT5jb3JlUGFnZUdyb3VwKCk7Ci0gICAgY29u
c3QgSGFzaFNldDxQYWdlKj4mIHBhZ2VzID0gcGFnZUdyb3VwLnBhZ2VzKCk7Ci0gICAgZm9yIChI
YXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwYWdlcy5iZWdpbigpLCBlbmQgPSBw
YWdlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGZvciAoRnJhbWUqIGZyYW1l
ID0gJigqaXQpLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS50cmF2
ZXJzZU5leHQoKSkgewotICAgICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRv
Y3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIWRvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpLmVx
dWFsKG1fc2VjdXJpdHlPcmlnaW4ucHRyKCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgICAgICBTdG9yYWdlKiBzdG9yYWdlID0gZG9jdW1lbnQtPmRvbVdpbmRvdygpLT5v
cHRpb25hbExvY2FsU3RvcmFnZSgpOwotICAgICAgICAgICAgaWYgKCFzdG9yYWdlKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTdG9yYWdlQXJlYUltcGwmIHN0b3Jh
Z2VBcmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFyZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgpKTsK
LSAgICAgICAgICAgIGlmIChzdG9yYWdlQXJlYS5zdG9yYWdlQXJlYUlEKCkgPT0gc291cmNlU3Rv
cmFnZUFyZWFJRCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0b3JhZ2UgYXJl
YSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC4KLSAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWVzLmFwcGVuZChm
cmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdG9yYWdlRXZlbnREaXNwYXRjaGVyOjpk
aXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50c1RvRnJhbWVzKHBhZ2VHcm91cCwgZnJhbWVzLCBrZXks
IG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21T
ZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFn
ZUFyZWFNYXAuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVh
TWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTQzZTgwNzdmMGRlNDU4YjEw
Njk3ZDk5NmYxY2U2NmFiNzFjYzguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZUFyZWFN
YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRl
ZiBTdG9yYWdlQXJlYU1hcF9oCi0jZGVmaW5lIFN0b3JhZ2VBcmVhTWFwX2gKLQotI2luY2x1ZGUg
Ik1lc3NhZ2VSZWNlaXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW4uaD4K
LSNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+Ci0jaW5jbHVkZSA8d3RmL0ZvcndhcmQu
aD4KLSNpbmNsdWRlIDx3dGYvSGFzaENvdW50ZWRTZXQuaD4KLSNpbmNsdWRlIDx3dGYvUmVmQ291
bnRlZC5oPgotI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
Y2xhc3MgU2VjdXJpdHlPcmlnaW47Ci1jbGFzcyBTdG9yYWdlTWFwOwotfQotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotY2xhc3MgU3RvcmFnZUFyZWFJbXBsOwotY2xhc3MgU3RvcmFnZU5hbWVzcGFj
ZUltcGw7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwIDogcHVibGljIFJlZkNvdW50ZWQ8U3RvcmFn
ZUFyZWFNYXA+LCBwcml2YXRlIElQQzo6TWVzc2FnZVJlY2VpdmVyIHsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUmVmPFN0b3JhZ2VBcmVhTWFwPiBjcmVhdGUoU3RvcmFnZU5hbWVzcGFjZUltcGwqLCBS
ZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYpOwotICAgIH5TdG9yYWdlQXJlYU1hcCgpOwot
Ci0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgc3RvcmFnZVR5cGUoKSBjb25zdCB7IHJldHVybiBt
X3N0b3JhZ2VUeXBlOyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKTsKLSAgICBTdHJpbmcga2V5
KHVuc2lnbmVkIGluZGV4KTsKLSAgICBTdHJpbmcgaXRlbShjb25zdCBTdHJpbmcmIGtleSk7Ci0g
ICAgdm9pZCBzZXRJdGVtKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFnZUFyZWFJ
bXBsKiBzb3VyY2VBcmVhLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwg
Ym9vbCYgcXVvdGFFeGNlcHRpb24pOwotICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFt
ZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5n
JiBrZXkpOwotICAgIHZvaWQgY2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9y
YWdlQXJlYUltcGwqIHNvdXJjZUFyZWEpOwotICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5n
JiBrZXkpOwotCi0gICAgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHNlY3VyaXR5T3Jp
Z2luKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbi5nZXQoKTsgfQotCi1wcml2YXRl
OgotICAgIFN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiwgUmVmPFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luPiYmKTsKLQotICAgIC8vIElQQzo6TWVzc2FnZVJlY2VpdmVyCi0gICAg
dm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImKSBv
dmVycmlkZTsKLQotICAgIHZvaWQgZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVk
KTsKLSAgICB2b2lkIGRpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0
cmluZyYga2V5LCBib29sIHF1b3RhRXJyb3IpOwotICAgIHZvaWQgZGlkUmVtb3ZlSXRlbSh1aW50
NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBrZXkpOwotICAgIHZvaWQgZGlkQ2xl
YXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpOwotCi0gICAgdm9pZCBkaXNwYXRjaFN0b3JhZ2VF
dmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29u
c3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5n
JiB1cmxTdHJpbmcpOwotICAgIHZvaWQgY2xlYXJDYWNoZSgpOwotCi0gICAgdm9pZCByZXNldFZh
bHVlcygpOwotICAgIHZvaWQgbG9hZFZhbHVlc0lmTmVlZGVkKCk7Ci0KLSAgICBib29sIHNob3Vs
ZEFwcGx5Q2hhbmdlRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBjb25zdDsKLSAgICB2b2lkIGFw
cGx5Q2hhbmdlKGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlKTsKLQot
ICAgIHZvaWQgZGlzcGF0Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3Jh
Z2VBcmVhSUQsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25z
dCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0gICAgdm9pZCBk
aXNwYXRjaExvY2FsU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNv
bnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5l
d1ZhbHVlLCBjb25zdCBTdHJpbmcmIHVybFN0cmluZyk7Ci0KLSAgICBSZWY8U3RvcmFnZU5hbWVz
cGFjZUltcGw+IG1fc3RvcmFnZU5hbWVzcGFjZTsKLQotICAgIHVpbnQ2NF90IG1fc3RvcmFnZU1h
cElEOwotCi0gICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdlVHlwZTsKLSAgICB1aW50
NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKLSAgICB1bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsK
LSAgICBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fc2VjdXJpdHlPcmlnaW47Ci0KLSAg
ICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwotCi0gICAgdWludDY0
X3QgbV9jdXJyZW50U2VlZDsKLSAgICBib29sIG1faGFzUGVuZGluZ0NsZWFyOwotICAgIGJvb2wg
bV9oYXNQZW5kaW5nR2V0VmFsdWVzOwotICAgIEhhc2hDb3VudGVkU2V0PFN0cmluZz4gbV9wZW5k
aW5nVmFsdWVDaGFuZ2VzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAv
LyBTdG9yYWdlQXJlYU1hcF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
U3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5tZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCBiMTU5MDRmMTZiZWMxNDJiMTBiNDgwMGQxMDY0NTAwOTMzODMwMGQ1Li4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLm1lc3NhZ2VzLmluCisrKyAvZGV2
L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBt
ZXQ6Ci0jIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0jIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECi0jIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSMg
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTAotIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIyBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgot
IyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotCi1tZXNzYWdlcyAtPiBTdG9yYWdlQXJlYU1hcCB7Ci0gICAgRGlkR2V0VmFsdWVzKHVp
bnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQotICAgIERpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1h
cFNlZWQsIFN0cmluZyBrZXksIGJvb2wgcXVvdGFFeGNlcHRpb24pCi0gICAgRGlkUmVtb3ZlSXRl
bSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgU3RyaW5nIGtleSkKLSAgICBEaWRDbGVhcih1aW50
NjRfdCBzdG9yYWdlTWFwU2VlZCkKLQotICAgIERpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90
IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmluZyBrZXksIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5n
IG5ld1ZhbHVlLCBTdHJpbmcgdXJsU3RyaW5nKQotICAgIENsZWFyQ2FjaGUoKQotfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUlt
cGwuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvU3RvcmFnZU5hbWVzcGFj
ZUltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWJiYzVjMjFjMTgxMDg4
ZmY1ODYwNDVmMDI3MTllMDI0MjY4NzI1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VO
YW1lc3BhY2VJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU3RvcmFnZU5hbWVzcGFj
ZUltcGwuaCIKLQotI2luY2x1ZGUgIlN0b3JhZ2VBcmVhSW1wbC5oIgotI2luY2x1ZGUgIlN0b3Jh
Z2VBcmVhTWFwLmgiCi0jaW5jbHVkZSAiV2ViUGFnZS5oIgotI2luY2x1ZGUgIldlYlBhZ2VHcm91
cFByb3h5LmgiCi0jaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgotI2luY2x1ZGUgPFdlYkNvcmUvRnJh
bWUuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BhZ2VHcm91cC5oPgotI2luY2x1ZGUgPFdlYkNvcmUv
U2VjdXJpdHlPcmlnaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1NldHRpbmdzLmg+Ci0jaW5jbHVk
ZSA8V2ViQ29yZS9TdG9yYWdlVHlwZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQot
bmFtZXNwYWNlIFdlYktpdCB7Ci0KLVJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFn
ZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlk
ZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpTZXNzaW9uLCBpZGVudGlmaWVy
LCBudWxscHRyLCBxdW90YUluQnl0ZXMpKTsKLX0KLQotUmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLXsKLSAg
ICByZXR1cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpF
cGhlbWVyYWxMb2NhbCwgaWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0K
LVJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0
ZUxvY2FsU3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCB1bnNpZ25lZCBxdW90
YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1w
bChTdG9yYWdlVHlwZTo6TG9jYWwsIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5CeXRlcykp
OwotfQotCi1SZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJbXBs
OjpjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmll
ciwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRvcExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90
YUluQnl0ZXMpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNlSW1w
bChTdG9yYWdlVHlwZTo6VHJhbnNpZW50TG9jYWwsIGlkZW50aWZpZXIsICZ0b3BMZXZlbE9yaWdp
biwgcXVvdGFJbkJ5dGVzKSk7Ci19Ci0KLVN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpTdG9yYWdlTmFt
ZXNwYWNlSW1wbChXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSwgdWludDY0X3Qgc3Rv
cmFnZU5hbWVzcGFjZUlELCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2ZWxPcmlnaW4s
IHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKLSAgICA6IG1fc3RvcmFnZVR5cGUoc3RvcmFnZVR5cGUp
Ci0gICAgLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRChzdG9yYWdlTmFtZXNwYWNlSUQpCi0gICAgLCBt
X3RvcExldmVsT3JpZ2luKHRvcExldmVsT3JpZ2luKQotICAgICwgbV9xdW90YUluQnl0ZXMocXVv
dGFJbkJ5dGVzKQotewotfQotCi1TdG9yYWdlTmFtZXNwYWNlSW1wbDo6flN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsKCkKLXsKLX0KLQotdm9pZCBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZGlkRGVzdHJveVN0
b3JhZ2VBcmVhTWFwKFN0b3JhZ2VBcmVhTWFwJiBtYXApCi17Ci0gICAgbV9zdG9yYWdlQXJlYU1h
cHMucmVtb3ZlKFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1hcC5zZWN1
cml0eU9yaWdpbigpKSk7Ci19Ci0KLVJlZlB0cjxTdG9yYWdlQXJlYT4gU3RvcmFnZU5hbWVzcGFj
ZUltcGw6OnN0b3JhZ2VBcmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgc2VjdXJpdHlPcmln
aW4pCi17Ci0gICAgaWYgKG1fc3RvcmFnZVR5cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExv
Y2FsKQotICAgICAgICByZXR1cm4gZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShzZWN1cml0eU9y
aWdpbik7Ci0KLSAgICBSZWZQdHI8U3RvcmFnZUFyZWFNYXA+IG1hcDsKLQotICAgIGF1dG8mIHNs
b3QgPSBtX3N0b3JhZ2VBcmVhTWFwcy5hZGQoc2VjdXJpdHlPcmlnaW4sIG51bGxwdHIpLml0ZXJh
dG9yLT52YWx1ZTsKLSAgICBpZiAoIXNsb3QpIHsKLSAgICAgICAgbWFwID0gU3RvcmFnZUFyZWFN
YXA6OmNyZWF0ZSh0aGlzLCBzZWN1cml0eU9yaWdpbi5zZWN1cml0eU9yaWdpbigpKTsKLSAgICAg
ICAgc2xvdCA9IG1hcC5nZXQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbWFwID0gc2xvdDsKLQot
ICAgIHJldHVybiBTdG9yYWdlQXJlYUltcGw6OmNyZWF0ZShtYXAucmVsZWFzZU5vbk51bGwoKSk7
Ci19Ci0KLWNsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYSBm
aW5hbCA6IHB1YmxpYyBTdG9yYWdlQXJlYSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxFcGhl
bWVyYWxTdG9yYWdlQXJlYT4gY3JlYXRlKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgb3JpZ2lu
LCB1bnNpZ25lZCBxdW90YUluQnl0ZXMpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
Km5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYShvcmlnaW4sIHF1b3RhSW5CeXRlcykpOwotICAgIH0K
LQotICAgIFJlZjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4gY29weSgpCi0gICAgewotICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBFcGhlbWVyYWxTdG9yYWdlQXJlYSgqdGhpcykpOwotICAgIH0K
LQotcHJpdmF0ZToKLSAgICBFcGhlbWVyYWxTdG9yYWdlQXJlYShjb25zdCBTZWN1cml0eU9yaWdp
bkRhdGEmIG9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQotICAgICAgICA6IG1fc2VjdXJp
dHlPcmlnaW5EYXRhKG9yaWdpbikKLSAgICAgICAgLCBtX3N0b3JhZ2VNYXAoU3RvcmFnZU1hcDo6
Y3JlYXRlKHF1b3RhSW5CeXRlcykpCi0gICAgewotICAgIH0KLQotICAgIEVwaGVtZXJhbFN0b3Jh
Z2VBcmVhKEVwaGVtZXJhbFN0b3JhZ2VBcmVhJiBvdGhlcikKLSAgICAgICAgOiBtX3NlY3VyaXR5
T3JpZ2luRGF0YShvdGhlci5tX3NlY3VyaXR5T3JpZ2luRGF0YSkKLSAgICAgICAgLCBtX3N0b3Jh
Z2VNYXAob3RoZXIubV9zdG9yYWdlTWFwKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBXZWJDb3Jl
OjpTdG9yYWdlQXJlYS4KLSAgICB1bnNpZ25lZCBsZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIG1fc3RvcmFnZU1hcC0+bGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGtleSh1bnNp
Z25lZCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmtleShpbmRl
eCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5nJiBrZXkpCi0gICAgewot
ICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7Ci0gICAgfQotCi0gICAg
dm9pZCBzZXRJdGVtKEZyYW1lKiwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFs
dWUsIGJvb2wmIHF1b3RhRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG9sZFZhbHVl
OwotICAgICAgICBpZiAoYXV0byBuZXdNYXAgPSBtX3N0b3JhZ2VNYXAtPnNldEl0ZW0oa2V5LCB2
YWx1ZSwgb2xkVmFsdWUsIHF1b3RhRXhjZXB0aW9uKSkKLSAgICAgICAgICAgIG1fc3RvcmFnZU1h
cCA9IFdURk1vdmUobmV3TWFwKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZUl0ZW0oRnJhbWUq
LCBjb25zdCBTdHJpbmcmIGtleSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBvbGRWYWx1ZTsKLSAg
ICAgICAgaWYgKGF1dG8gbmV3TWFwID0gbV9zdG9yYWdlTWFwLT5yZW1vdmVJdGVtKGtleSwgb2xk
VmFsdWUpKQotICAgICAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdNYXApOwotICAg
IH0KLQotICAgIHZvaWQgY2xlYXIoRnJhbWUqKQotICAgIHsKLSAgICAgICAgaWYgKCFtX3N0b3Jh
Z2VNYXAtPmxlbmd0aCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fc3RvcmFn
ZU1hcCA9IFN0b3JhZ2VNYXA6OmNyZWF0ZShtX3N0b3JhZ2VNYXAtPnF1b3RhKCkpOwotICAgIH0K
LQotICAgIGJvb2wgY29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCi0gICAgewotICAgICAgICBy
ZXR1cm4gbV9zdG9yYWdlTWFwLT5jb250YWlucyhrZXkpOwotICAgIH0KLQotICAgIGJvb2wgY2Fu
QWNjZXNzU3RvcmFnZShGcmFtZSogZnJhbWUpCi0gICAgewotICAgICAgICByZXR1cm4gZnJhbWUg
JiYgZnJhbWUtPnBhZ2UoKTsKLSAgICB9Ci0KLSAgICBTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSgp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2Fs
OwotICAgIH0KLQotICAgIHNpemVfdCBtZW1vcnlCeXRlc1VzZWRCeUNhY2hlKCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQo
KSB7IH0KLSAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgeyB9Ci0gICAgdm9pZCBjbG9z
ZURhdGFiYXNlSWZJZGxlKCkgeyB9Ci0KLSAgICBTZWN1cml0eU9yaWdpbkRhdGEgc2VjdXJpdHlP
cmlnaW4oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW5EYXRh
OwotICAgIH0KLQotICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBtX3NlY3VyaXR5T3JpZ2luRGF0YTsK
LSAgICBSZWZQdHI8U3RvcmFnZU1hcD4gbV9zdG9yYWdlTWFwOwotfTsKLQotUmVmUHRyPFN0b3Jh
Z2VBcmVhPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6ZXBoZW1lcmFsTG9jYWxTdG9yYWdlQXJlYShj
b25zdCBTZWN1cml0eU9yaWdpbkRhdGEmIHNlY3VyaXR5T3JpZ2luKQotewotICAgIGF1dG8mIHNs
b3QgPSBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzLmFkZChzZWN1cml0eU9yaWdpbiwgbnVs
bHB0cikuaXRlcmF0b3ItPnZhbHVlOwotICAgIGlmICghc2xvdCkKLSAgICAgICAgc2xvdCA9IFN0
b3JhZ2VOYW1lc3BhY2VJbXBsOjpFcGhlbWVyYWxTdG9yYWdlQXJlYTo6Y3JlYXRlKHNlY3VyaXR5
T3JpZ2luLCBtX3F1b3RhSW5CeXRlcyk7Ci0KLSAgICByZXR1cm4gc2xvdC5nZXQoKTsKLX0KLQot
UmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2U+IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjb3B5KFBhZ2Uq
IG5ld1BhZ2UpCi17Ci0gICAgQVNTRVJUKG1fc3RvcmFnZU5hbWVzcGFjZUlEKTsKLQotICAgIGlm
IChtX3N0b3JhZ2VUeXBlID09IFN0b3JhZ2VUeXBlOjpTZXNzaW9uKQotICAgICAgICByZXR1cm4g
Y3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UoV2ViUGFnZTo6ZnJvbUNvcmVQYWdlKG5ld1Bh
Z2UpLT5wYWdlSUQoKSwgbV9xdW90YUluQnl0ZXMpOwotCi0gICAgQVNTRVJUKG1fc3RvcmFnZVR5
cGUgPT0gU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsKTsKLSAgICBSZWZQdHI8U3RvcmFnZU5h
bWVzcGFjZUltcGw+IG5ld05hbWVzcGFjZSA9IGFkb3B0UmVmKG5ldyBTdG9yYWdlTmFtZXNwYWNl
SW1wbChtX3N0b3JhZ2VUeXBlLCBtX3N0b3JhZ2VOYW1lc3BhY2VJRCwgbV90b3BMZXZlbE9yaWdp
bi5nZXQoKSwgbV9xdW90YUluQnl0ZXMpKTsKLQotICAgIGZvciAoYXV0byYgaXRlciA6IG1fZXBo
ZW1lcmFsTG9jYWxTdG9yYWdlQXJlYXMpCi0gICAgICAgIG5ld05hbWVzcGFjZS0+bV9lcGhlbWVy
YWxMb2NhbFN0b3JhZ2VBcmVhcy5zZXQoaXRlci5rZXksIGl0ZXIudmFsdWUtPmNvcHkoKSk7Ci0K
LSAgICByZXR1cm4gbmV3TmFtZXNwYWNlOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VOYW1lc3Bh
Y2VJbXBsLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9TdG9yYWdlTmFtZXNw
YWNlSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNhMjJkY2JkMjFiNjc0
MGU0NTIzN2Y0ZGZhZDgzMTI1NjcyOWUzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1N0b3JhZ2VO
YW1lc3BhY2VJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDEzLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5E
YXRhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkhhc2guaD4KLSNpbmNsdWRl
IDxXZWJDb3JlL1N0b3JhZ2VBcmVhLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTWFwLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlTmFtZXNwYWNlLmg+Ci0jaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFN0b3JhZ2VBcmVhTWFwOwot
Y2xhc3MgV2ViUGFnZTsKLQotY2xhc3MgU3RvcmFnZU5hbWVzcGFjZUltcGwgOiBwdWJsaWMgV2Vi
Q29yZTo6U3RvcmFnZU5hbWVzcGFjZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZlB0cjxTdG9y
YWdlTmFtZXNwYWNlSW1wbD4gY3JlYXRlU2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3Qg
aWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMgUmVmUHRyPFN0
b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
dWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMg
UmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2Uo
dWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLSAgICBzdGF0aWMg
UmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBjcmVhdGVUcmFuc2llbnRMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mIHRv
cExldmVsT3JpZ2luLCB1aW50NjRfdCBxdW90YUluQnl0ZXMpOwotCi0gICAgdmlydHVhbCB+U3Rv
cmFnZU5hbWVzcGFjZUltcGwoKTsKLQotICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0b3JhZ2VU
eXBlKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlVHlwZTsgfQotICAgIHVpbnQ2NF90IHN0b3Jh
Z2VOYW1lc3BhY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZU5hbWVzcGFjZUlEOyB9Ci0g
ICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qIHRvcExldmVsT3JpZ2luKCkgY29uc3QgeyByZXR1
cm4gbV90b3BMZXZlbE9yaWdpbi5nZXQoKTsgfQotICAgIHVuc2lnbmVkIHF1b3RhSW5CeXRlcygp
IGNvbnN0IHsgcmV0dXJuIG1fcXVvdGFJbkJ5dGVzOyB9Ci0KLSAgICB2b2lkIGRpZERlc3Ryb3lT
dG9yYWdlQXJlYU1hcChTdG9yYWdlQXJlYU1hcCYpOwotCi1wcml2YXRlOgotICAgIGV4cGxpY2l0
IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFdlYkNvcmU6OlN0b3JhZ2VUeXBlLCB1aW50NjRfdCBzdG9y
YWdlTmFtZXNwYWNlSUQsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbiwg
dW5zaWduZWQgcXVvdGFJbkJ5dGVzKTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlQXJl
YT4gc3RvcmFnZUFyZWEoY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJikgb3ZlcnJp
ZGU7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+IGNvcHkoV2ViQ29yZTo6
UGFnZSopIG92ZXJyaWRlOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VBcmVhPiBlcGhl
bWVyYWxMb2NhbFN0b3JhZ2VBcmVhKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYp
OwotCi0gICAgY29uc3QgV2ViQ29yZTo6U3RvcmFnZVR5cGUgbV9zdG9yYWdlVHlwZTsKLSAgICBj
b25zdCB1aW50NjRfdCBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsKLQotICAgIC8vIE9ubHkgdXNlZCBm
b3IgdHJhbnNpZW50IGxvY2FsIHN0b3JhZ2UgbmFtZXNwYWNlcy4KLSAgICBjb25zdCBSZWZQdHI8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+IG1fdG9wTGV2ZWxPcmlnaW47Ci0KLSAgICBjb25zdCB1
bnNpZ25lZCBtX3F1b3RhSW5CeXRlczsKLQotICAgIEhhc2hNYXA8V2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhLCBTdG9yYWdlQXJlYU1hcCo+IG1fc3RvcmFnZUFyZWFNYXBzOwotCi0gICAgY2xh
c3MgRXBoZW1lcmFsU3RvcmFnZUFyZWE7Ci0gICAgSGFzaE1hcDxXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbkRhdGEsIFJlZlB0cjxFcGhlbWVyYWxTdG9yYWdlQXJlYT4+IG1fZXBoZW1lcmFsTG9jYWxT
dG9yYWdlQXJlYXM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc1OGViODc0
Mjg4ZmZkODk2NjJkMDI1ZTE1OGQ2NmEwNzBjNTcwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TdG9yYWdlL1dl
YlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiV2Vi
U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgiCi0KLSNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNl
SW1wbC5oIgotI2luY2x1ZGUgIldlYlBhZ2UuaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgot
I2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ryb3llZC5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLXN0YXRpYyBIYXNoTWFwPHVpbnQ2NF90LCBXZWJT
dG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIqPiYgc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpCi17
Ci0gICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEhhc2hNYXA8dWludDY0X3QsIFdlYlN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcio+PiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzOwotCi0gICAgcmV0
dXJuIHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcnM7Ci19Ci0KLVJlZlB0cjxXZWJTdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXI+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Z2V0T3JDcmVhdGUo
dWludDY0X3QgaWRlbnRpZmllcikKLXsKLSAgICBhdXRvJiBzbG90ID0gc3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVycygpLmFkZChpZGVudGlmaWVyLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7Ci0g
ICAgaWYgKHNsb3QpCi0gICAgICAgIHJldHVybiBzbG90OwotCi0gICAgUmVmUHRyPFdlYlN0b3Jh
Z2VOYW1lc3BhY2VQcm92aWRlcj4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyID0gYWRvcHRSZWYo
bmV3IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcihpZGVudGlmaWVyKSk7Ci0gICAgc2xvdCA9
IHN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5nZXQoKTsKLQotICAgIHJldHVybiBzdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXI7Ci19Ci0KLVdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6V2ViU3Rv
cmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIpCi0gICAgOiBtX2lkZW50
aWZpZXIoaWRlbnRpZmllcikKLXsKLX0KLQotV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjp+
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCkKLXsKLSAgICBBU1NFUlQoc3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVycygpLmNvbnRhaW5zKG1faWRlbnRpZmllcikpOwotCi0gICAgc3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVycygpLnJlbW92ZShtX2lkZW50aWZpZXIpOwotfQotCi1SZWZQdHI8V2Vi
Q29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVh
dGVTZXNzaW9uU3RvcmFnZU5hbWVzcGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBxdW90YSkKLXsK
LSAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFt
ZXNwYWNlKFdlYlBhZ2U6OmZyb21Db3JlUGFnZSgmcGFnZSktPnBhZ2VJRCgpLCBxdW90YSk7Ci19
Ci0KLVJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNl
UHJvdmlkZXI6OmNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShQYWdlJiBwYWdl
LCB1bnNpZ25lZCBxdW90YSkKLXsKLSAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNy
ZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2Uo
JnBhZ2UpLT5wYWdlSUQoKSwgcXVvdGEpOwotfQotCi1SZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5h
bWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVMb2NhbFN0b3JhZ2VO
YW1lc3BhY2UodW5zaWduZWQgcXVvdGEpCi17Ci0gICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UobV9pZGVudGlmaWVyLCBxdW90YSk7Ci19
Ci0KLVJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNl
UHJvdmlkZXI6OmNyZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbiYgdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhKQotewotICAgIHJl
dHVybiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKG1faWRlbnRpZmllciwgdG9wTGV2ZWxPcmlnaW4sIHF1b3RhKTsKLX0KLQotfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1N0b3JhZ2UvV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3RvcmFnZS9XZWJTdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRj
MjE0MjRiZjI2ZTM0MTAxMDg4YmMwMjgyYjQzMTIyNmE2NDlhNi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU3Rv
cmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUx
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgV2ViU3RvcmFnZU5hbWVzcGFjZVBy
b3ZpZGVyX2gKLSNkZWZpbmUgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyX2gKLQotI2luY2x1
ZGUgPFdlYkNvcmUvU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmg+Ci0KLW5hbWVzcGFjZSBXZWJL
aXQgewotCi1jbGFzcyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIgZmluYWwgOiBwdWJsaWMg
V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMg
UmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcj4gZ2V0T3JDcmVhdGUodWludDY0X3Qg
aWRlbnRpZmllcik7Ci0gICAgdmlydHVhbCB+V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKCk7
Ci0KLXByaXZhdGU6Ci0gICAgZXhwbGljaXQgV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyKHVp
bnQ2NF90IGlkZW50aWZpZXIpOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3Bh
Y2U+IGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYkNvcmU6OlBhZ2UmLCB1bnNpZ25l
ZCBxdW90YSkgb3ZlcnJpZGU7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VOYW1lc3BhY2U+
IGNyZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdlJiwgdW5z
aWduZWQgcXVvdGEpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNw
YWNlPiBjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5zaWduZWQgcXVvdGEpIG92ZXJyaWRl
OwotICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVUcmFuc2llbnRM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4mLCB1bnNpZ25lZCBx
dW90YSkgb3ZlcnJpZGU7Ci0KLSAgICBjb25zdCB1aW50NjRfdCBtX2lkZW50aWZpZXI7Ci19Owot
Ci19Ci0KLSNlbmRpZiAvLyBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmNw
cCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uYmU4NTA3YTMxMzI2NDJkYmRjMGYxOGE2OTlkMWU3Y2YzYmE0ODYxZAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0
b3JhZ2VBcmVhSW1wbC5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgiCisKKyNpbmNsdWRlICJT
dG9yYWdlQXJlYU1hcC5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1lbnQuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QYWdlLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9TY2hlbWVSZWdpc3RyeS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2VjdXJpdHlPcmln
aW5EYXRhLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZXR0aW5ncy5oPgorCit1c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0YXRpYyB1aW50NjRfdCBnZW5l
cmF0ZVN0b3JhZ2VBcmVhSUQoKQoreworICAgIHN0YXRpYyB1aW50NjRfdCBzdG9yYWdlQXJlYUlE
OworICAgIHJldHVybiArK3N0b3JhZ2VBcmVhSUQ7Cit9CisKK1JlZjxTdG9yYWdlQXJlYUltcGw+
IFN0b3JhZ2VBcmVhSW1wbDo6Y3JlYXRlKFJlZjxTdG9yYWdlQXJlYU1hcD4mJiBzdG9yYWdlQXJl
YU1hcCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdG9yYWdlQXJlYUltcGwoV1RGTW92
ZShzdG9yYWdlQXJlYU1hcCkpKTsKK30KKworU3RvcmFnZUFyZWFJbXBsOjpTdG9yYWdlQXJlYUlt
cGwoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmIHN0b3JhZ2VBcmVhTWFwKQorICAgIDogbV9zdG9yYWdl
QXJlYUlEKGdlbmVyYXRlU3RvcmFnZUFyZWFJRCgpKQorICAgICwgbV9zdG9yYWdlQXJlYU1hcChX
VEZNb3ZlKHN0b3JhZ2VBcmVhTWFwKSkKK3sKK30KKworU3RvcmFnZUFyZWFJbXBsOjp+U3RvcmFn
ZUFyZWFJbXBsKCkKK3sKK30KKwordW5zaWduZWQgU3RvcmFnZUFyZWFJbXBsOjpsZW5ndGgoKQor
eworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5sZW5ndGgoKTsKK30KKworU3RyaW5nIFN0
b3JhZ2VBcmVhSW1wbDo6a2V5KHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVybiBtX3N0b3Jh
Z2VBcmVhTWFwLT5rZXkoaW5kZXgpOworfQorCitTdHJpbmcgU3RvcmFnZUFyZWFJbXBsOjppdGVt
KGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIHJldHVybiBtX3N0b3JhZ2VBcmVhTWFwLT5pdGVt
KGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFJbXBsOjpzZXRJdGVtKEZyYW1lKiBzb3VyY2VG
cmFtZSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJvb2wmIHF1b3Rh
RXhjZXB0aW9uKQoreworICAgIEFTU0VSVCghdmFsdWUuaXNOdWxsKCkpOworCisgICAgbV9zdG9y
YWdlQXJlYU1hcC0+c2V0SXRlbShzb3VyY2VGcmFtZSwgdGhpcywga2V5LCB2YWx1ZSwgcXVvdGFF
eGNlcHRpb24pOworfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6cmVtb3ZlSXRlbShGcmFtZSog
c291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIG1fc3RvcmFnZUFyZWFNYXAt
PnJlbW92ZUl0ZW0oc291cmNlRnJhbWUsIHRoaXMsIGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFy
ZWFJbXBsOjpjbGVhcihGcmFtZSogc291cmNlRnJhbWUpCit7CisgICAgbV9zdG9yYWdlQXJlYU1h
cC0+Y2xlYXIoc291cmNlRnJhbWUsIHRoaXMpOworfQorCitib29sIFN0b3JhZ2VBcmVhSW1wbDo6
Y29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFN
YXAtPmNvbnRhaW5zKGtleSk7Cit9CisKK2Jvb2wgU3RvcmFnZUFyZWFJbXBsOjpjYW5BY2Nlc3NT
dG9yYWdlKEZyYW1lKiBmcmFtZSkKK3sKKyAgICByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnBhZ2Uo
KTsKK30KKworU3RvcmFnZVR5cGUgU3RvcmFnZUFyZWFJbXBsOjpzdG9yYWdlVHlwZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fc3RvcmFnZUFyZWFNYXAtPnN0b3JhZ2VUeXBlKCk7Cit9CisKK3Np
emVfdCBTdG9yYWdlQXJlYUltcGw6Om1lbW9yeUJ5dGVzVXNlZEJ5Q2FjaGUoKQoreworICAgIHJl
dHVybiAwOworfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6aW5jcmVtZW50QWNjZXNzQ291bnQo
KQoreworICAgIC8vIFN0b3JhZ2UgYWNjZXNzIGlzIGhhbmRsZWQgaW4gdGhlIFVJIHByb2Nlc3Ms
IHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlLgorfQorCit2b2lkIFN0b3JhZ2VBcmVhSW1w
bDo6ZGVjcmVtZW50QWNjZXNzQ291bnQoKQoreworICAgIC8vIFN0b3JhZ2UgYWNjZXNzIGlzIGhh
bmRsZWQgaW4gdGhlIFVJIHByb2Nlc3MsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlLgor
fQorCit2b2lkIFN0b3JhZ2VBcmVhSW1wbDo6Y2xvc2VEYXRhYmFzZUlmSWRsZSgpCit7CisgICAg
Ly8gRklYTUU6IEltcGxlbWVudCB0aGlzLgorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQor
CitXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEgU3RvcmFnZUFyZWFJbXBsOjpzZWN1cml0eU9y
aWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YTo6
ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc3RvcmFnZUFyZWFNYXAtPnNlY3VyaXR5T3JpZ2luKCkpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOThiNmIzZmM5
ZGEwZDU4NjlhODliMmE0Nzc5ODhkMDJmN2ZkNWI1OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhSW1wbC5oCkBAIC0wLDAg
KzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
CisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgor
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk1lc3NhZ2VS
ZWNlaXZlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZUFyZWEuaD4KKyNpbmNsdWRlIDx3
dGYvSGFzaENvdW50ZWRTZXQuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CitjbGFzcyBTZWN1cml0eU9yaWdpbjsKK30KKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK2NsYXNzIFN0b3JhZ2VBcmVhTWFwOworCitjbGFzcyBTdG9yYWdlQXJlYUltcGwgZmlu
YWwgOiBwdWJsaWMgV2ViQ29yZTo6U3RvcmFnZUFyZWEgeworcHVibGljOgorICAgIHN0YXRpYyBS
ZWY8U3RvcmFnZUFyZWFJbXBsPiBjcmVhdGUoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKKyAgICB2
aXJ0dWFsIH5TdG9yYWdlQXJlYUltcGwoKTsKKworICAgIHVpbnQ2NF90IHN0b3JhZ2VBcmVhSUQo
KSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2VBcmVhSUQ7IH0KKworcHJpdmF0ZToKKyAgICBTdG9y
YWdlQXJlYUltcGwoUmVmPFN0b3JhZ2VBcmVhTWFwPiYmKTsKKworICAgIC8vIFdlYkNvcmU6OlN0
b3JhZ2VBcmVhLgorICAgIHVuc2lnbmVkIGxlbmd0aCgpIG92ZXJyaWRlOworICAgIFN0cmluZyBr
ZXkodW5zaWduZWQgaW5kZXgpIG92ZXJyaWRlOworICAgIFN0cmluZyBpdGVtKGNvbnN0IFN0cmlu
ZyYga2V5KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEl0ZW0oV2ViQ29yZTo6RnJhbWUqIHNvdXJj
ZUZyYW1lLCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVv
dGFFeGNlcHRpb24pIG92ZXJyaWRlOworICAgIHZvaWQgcmVtb3ZlSXRlbShXZWJDb3JlOjpGcmFt
ZSogc291cmNlRnJhbWUsIGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgICB2b2lkIGNs
ZWFyKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBjb250
YWlucyhjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5BY2Nlc3NTdG9y
YWdlKFdlYkNvcmU6OkZyYW1lKikgb3ZlcnJpZGU7CisgICAgV2ViQ29yZTo6U3RvcmFnZVR5cGUg
c3RvcmFnZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICBzaXplX3QgbWVtb3J5Qnl0ZXNVc2Vk
QnlDYWNoZSgpIG92ZXJyaWRlOworICAgIHZvaWQgaW5jcmVtZW50QWNjZXNzQ291bnQoKSBvdmVy
cmlkZTsKKyAgICB2b2lkIGRlY3JlbWVudEFjY2Vzc0NvdW50KCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBjbG9zZURhdGFiYXNlSWZJZGxlKCkgb3ZlcnJpZGU7CisgICAgV2ViQ29yZTo6U2VjdXJpdHlP
cmlnaW5EYXRhIHNlY3VyaXR5T3JpZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB1aW50NjRf
dCBtX3N0b3JhZ2VBcmVhSUQ7CisgICAgUmVmPFN0b3JhZ2VBcmVhTWFwPiBtX3N0b3JhZ2VBcmVh
TWFwOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5jcHAgYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTI2NTBkMWIzZWJmYzcyOGMyNzVlZTAxMGJmZWEzYTI2OGIwYjg4NgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmNw
cApAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJTdG9yYWdlQXJlYU1hcC5oIgorCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFJbXBsLmgi
CisjaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXBNZXNzYWdlcy5oIgorI2luY2x1ZGUgIlN0b3JhZ2VN
YW5hZ2VyTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIgorI2lu
Y2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJQYWdlR3JvdXBQcm94eS5oIgorI2luY2x1
ZGUgIldlYlByb2Nlc3MuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0RPTVdpbmRvdy5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvRG9jdW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL01haW5GcmFtZS5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZUdyb3VwLmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbkRhdGEuaD4KKyNpbmNsdWRlIDxXZWJD
b3JlL1N0b3JhZ2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VFdmVudERpc3BhdGNoZXIu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VNYXAuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0
b3JhZ2VUeXBlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworc3RhdGljIHVpbnQ2NF90IGdlbmVyYXRlU3RvcmFnZU1hcElEKCkKK3sKKyAgICBz
dGF0aWMgdWludDY0X3Qgc3RvcmFnZU1hcElEOworICAgIHJldHVybiArK3N0b3JhZ2VNYXBJRDsK
K30KKworUmVmPFN0b3JhZ2VBcmVhTWFwPiBTdG9yYWdlQXJlYU1hcDo6Y3JlYXRlKFN0b3JhZ2VO
YW1lc3BhY2VJbXBsKiBzdG9yYWdlTmFtZXNwYWNlLCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmln
aW4+JiYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3RvcmFn
ZUFyZWFNYXAoc3RvcmFnZU5hbWVzcGFjZSwgV1RGTW92ZShzZWN1cml0eU9yaWdpbikpKTsKK30K
KworU3RvcmFnZUFyZWFNYXA6OlN0b3JhZ2VBcmVhTWFwKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiBz
dG9yYWdlTmFtZXNwYWNlLCBSZWY8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4+JiYgc2VjdXJpdHlP
cmlnaW4pCisgICAgOiBtX3N0b3JhZ2VOYW1lc3BhY2UoKnN0b3JhZ2VOYW1lc3BhY2UpCisgICAg
LCBtX3N0b3JhZ2VNYXBJRChnZW5lcmF0ZVN0b3JhZ2VNYXBJRCgpKQorICAgICwgbV9zdG9yYWdl
VHlwZShzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlVHlwZSgpKQorICAgICwgbV9zdG9yYWdlTmFt
ZXNwYWNlSUQoc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFjZUlEKCkpCisgICAgLCBt
X3F1b3RhSW5CeXRlcyhzdG9yYWdlTmFtZXNwYWNlLT5xdW90YUluQnl0ZXMoKSkKKyAgICAsIG1f
c2VjdXJpdHlPcmlnaW4oV1RGTW92ZShzZWN1cml0eU9yaWdpbikpCisgICAgLCBtX2N1cnJlbnRT
ZWVkKDApCisgICAgLCBtX2hhc1BlbmRpbmdDbGVhcihmYWxzZSkKKyAgICAsIG1faGFzUGVuZGlu
Z0dldFZhbHVlcyhmYWxzZSkKK3sKKyAgICBzd2l0Y2ggKG1fc3RvcmFnZVR5cGUpIHsKKyAgICBj
YXNlIFN0b3JhZ2VUeXBlOjpMb2NhbDoKKyAgICBjYXNlIFN0b3JhZ2VUeXBlOjpUcmFuc2llbnRM
b2NhbDoKKyAgICAgICAgaWYgKFNlY3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbiA9IHN0b3Jh
Z2VOYW1lc3BhY2UtPnRvcExldmVsT3JpZ2luKCkpCisgICAgICAgICAgICBXZWJQcm9jZXNzOjpz
aW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9y
YWdlTWFuYWdlcjo6Q3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElE
LCBzdG9yYWdlTmFtZXNwYWNlLT5zdG9yYWdlTmFtZXNwYWNlSUQoKSwgU2VjdXJpdHlPcmlnaW5E
YXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4oKnRvcExldmVsT3JpZ2luKSwgU2VjdXJpdHlPcmlnaW5E
YXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9yaWdpbikpLCAwKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nv
bm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkNyZWF0ZUxvY2FsU3Rv
cmFnZU1hcChtX3N0b3JhZ2VNYXBJRCwgc3RvcmFnZU5hbWVzcGFjZS0+c3RvcmFnZU5hbWVzcGFj
ZUlEKCksIFNlY3VyaXR5T3JpZ2luRGF0YTo6ZnJvbVNlY3VyaXR5T3JpZ2luKG1fc2VjdXJpdHlP
cmlnaW4pKSwgMCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFN0b3JhZ2VUeXBlOjpT
ZXNzaW9uOgorICAgICAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29u
bmVjdGlvbigpLT5zZW5kKE1lc3NhZ2VzOjpTdG9yYWdlTWFuYWdlcjo6Q3JlYXRlU2Vzc2lvblN0
b3JhZ2VNYXAobV9zdG9yYWdlTWFwSUQsIHN0b3JhZ2VOYW1lc3BhY2UtPnN0b3JhZ2VOYW1lc3Bh
Y2VJRCgpLCBTZWN1cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5
T3JpZ2luKSksIDApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU3RvcmFnZVR5cGU6OkVw
aGVtZXJhbExvY2FsOgorICAgICAgICAvLyBUaGUgVUkgcHJvY2VzcyBpcyBub3QgaW52b2x2ZWQg
Zm9yIEVwaGVtZXJhbExvY2FsIHN0b3JhZ2VzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpT
dG9yYWdlQXJlYU1hcDo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3N0b3JhZ2VNYXBJRCwgKnRo
aXMpOworfQorCitTdG9yYWdlQXJlYU1hcDo6flN0b3JhZ2VBcmVhTWFwKCkKK3sKKyAgICBpZiAo
bV9zdG9yYWdlVHlwZSAhPSBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWwpIHsKKyAgICAgICAg
V2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChN
ZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkRlc3Ryb3lTdG9yYWdlTWFwKG1fc3RvcmFnZU1hcElE
KSwgMCk7CisgICAgICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnJlbW92ZU1lc3NhZ2VSZWNl
aXZlcihNZXNzYWdlczo6U3RvcmFnZUFyZWFNYXA6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwgbV9z
dG9yYWdlTWFwSUQpOworICAgIH0KKworICAgIG1fc3RvcmFnZU5hbWVzcGFjZS0+ZGlkRGVzdHJv
eVN0b3JhZ2VBcmVhTWFwKCp0aGlzKTsKK30KKwordW5zaWduZWQgU3RvcmFnZUFyZWFNYXA6Omxl
bmd0aCgpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9y
YWdlTWFwLT5sZW5ndGgoKTsKK30KKworU3RyaW5nIFN0b3JhZ2VBcmVhTWFwOjprZXkodW5zaWdu
ZWQgaW5kZXgpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9z
dG9yYWdlTWFwLT5rZXkoaW5kZXgpOworfQorCitTdHJpbmcgU3RvcmFnZUFyZWFNYXA6Oml0ZW0o
Y29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisKKyAgICBy
ZXR1cm4gbV9zdG9yYWdlTWFwLT5nZXRJdGVtKGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFN
YXA6OnNldEl0ZW0oRnJhbWUqIHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFy
ZWEsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBib29sJiBxdW90YUV4
Y2VwdGlvbikKK3sKKyAgICBsb2FkVmFsdWVzSWZOZWVkZWQoKTsKKworICAgIEFTU0VSVChtX3N0
b3JhZ2VNYXAtPmhhc09uZVJlZigpKTsKKworICAgIFN0cmluZyBvbGRWYWx1ZTsKKyAgICBxdW90
YUV4Y2VwdGlvbiA9IGZhbHNlOworICAgIG1fc3RvcmFnZU1hcC0+c2V0SXRlbShrZXksIHZhbHVl
LCBvbGRWYWx1ZSwgcXVvdGFFeGNlcHRpb24pOworICAgIGlmIChxdW90YUV4Y2VwdGlvbikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG9sZFZhbHVlID09IHZhbHVlKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3BlbmRpbmdWYWx1ZUNoYW5nZXMuYWRkKGtleSk7CisKKyAgICBXZWJQcm9j
ZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLT5zZW5kKE1lc3NhZ2Vz
OjpTdG9yYWdlTWFuYWdlcjo6U2V0SXRlbShtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+c3Rv
cmFnZUFyZWFJRCgpLCBtX2N1cnJlbnRTZWVkLCBrZXksIHZhbHVlLCBzb3VyY2VGcmFtZS0+ZG9j
dW1lbnQoKS0+dXJsKCkpLCAwKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6cmVtb3ZlSXRl
bShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1wbCogc291cmNlQXJl
YSwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbG9hZFZhbHVlc0lmTmVlZGVkKCk7CisgICAg
QVNTRVJUKG1fc3RvcmFnZU1hcC0+aGFzT25lUmVmKCkpOworCisgICAgU3RyaW5nIG9sZFZhbHVl
OworICAgIG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKKworICAgIGlm
IChvbGRWYWx1ZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wZW5kaW5nVmFs
dWVDaGFuZ2VzLmFkZChrZXkpOworCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50
UHJvY2Vzc0Nvbm5lY3Rpb24oKS0+c2VuZChNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OlJlbW92
ZUl0ZW0obV9zdG9yYWdlTWFwSUQsIHNvdXJjZUFyZWEtPnN0b3JhZ2VBcmVhSUQoKSwgbV9jdXJy
ZW50U2VlZCwga2V5LCBzb3VyY2VGcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsKK30KKwor
dm9pZCBTdG9yYWdlQXJlYU1hcDo6Y2xlYXIoV2ViQ29yZTo6RnJhbWUqIHNvdXJjZUZyYW1lLCBT
dG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEpCit7CisgICAgcmVzZXRWYWx1ZXMoKTsKKworICAg
IG1faGFzUGVuZGluZ0NsZWFyID0gdHJ1ZTsKKyAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFw
OjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOworICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBh
cmVudFByb2Nlc3NDb25uZWN0aW9uKCktPnNlbmQoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpD
bGVhcihtX3N0b3JhZ2VNYXBJRCwgc291cmNlQXJlYS0+c3RvcmFnZUFyZWFJRCgpLCBtX2N1cnJl
bnRTZWVkLCBzb3VyY2VGcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpLCAwKTsKK30KKworYm9vbCBT
dG9yYWdlQXJlYU1hcDo6Y29udGFpbnMoY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbG9hZFZh
bHVlc0lmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5jb250YWlucyhrZXkp
OworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjpyZXNldFZhbHVlcygpCit7CisgICAgbV9zdG9y
YWdlTWFwID0gbnVsbHB0cjsKKworICAgIG1fcGVuZGluZ1ZhbHVlQ2hhbmdlcy5jbGVhcigpOwor
ICAgIG1faGFzUGVuZGluZ0NsZWFyID0gZmFsc2U7CisgICAgbV9oYXNQZW5kaW5nR2V0VmFsdWVz
ID0gZmFsc2U7CisgICAgbV9jdXJyZW50U2VlZCsrOworfQorCit2b2lkIFN0b3JhZ2VBcmVhTWFw
Ojpsb2FkVmFsdWVzSWZOZWVkZWQoKQoreworICAgIGlmIChtX3N0b3JhZ2VNYXApCisgICAgICAg
IHJldHVybjsKKworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlczsKKyAgICAvLyBG
SVhNRTogVGhpcyBzaG91bGQgdXNlIGEgc3BlY2lhbCBzZW5kU3luYyBmbGFnIHRvIGluZGljYXRl
IHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGluY29taW5nIG1lc3NhZ2VzIHdoaWxlIHdh
aXRpbmcgZm9yIGEgcmVwbHkuCisgICAgLy8gKFRoaXMgZmxhZyBkb2VzIG5vdCB5ZXQgZXhpc3Qp
LiBTaW5jZSBsb2FkVmFsdWVzSWZOZWVkZWQoKSBlbmRzIHVwIGJlaW5nIGNhbGxlZCBmcm9tIHdp
dGhpbiBKYXZhU2NyaXB0IGNvZGUsIHByb2Nlc3NpbmcgaW5jb21pbmcgc3luY2hyb25vdXMgbWVz
c2FnZXMKKyAgICAvLyBjb3VsZCBsZWFkIHRvIHdlaXJkIHJlZW50cmVuY3kgYnVncyBvdGhlcndp
c2UuCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucGFyZW50UHJvY2Vzc0Nvbm5lY3Rpb24o
KS0+c2VuZFN5bmMoTWVzc2FnZXM6OlN0b3JhZ2VNYW5hZ2VyOjpHZXRWYWx1ZXMobV9zdG9yYWdl
TWFwSUQsIG1fY3VycmVudFNlZWQpLCBNZXNzYWdlczo6U3RvcmFnZU1hbmFnZXI6OkdldFZhbHVl
czo6UmVwbHkodmFsdWVzKSwgMCk7CisKKyAgICBtX3N0b3JhZ2VNYXAgPSBTdG9yYWdlTWFwOjpj
cmVhdGUobV9xdW90YUluQnl0ZXMpOworICAgIG1fc3RvcmFnZU1hcC0+aW1wb3J0SXRlbXModmFs
dWVzKTsKKworICAgIC8vIFdlIHdhbnQgdG8gaWdub3JlIGFsbCBjaGFuZ2VzIHVudGlsIHdlIGdl
dCB0aGUgRGlkR2V0VmFsdWVzIG1lc3NhZ2UuCisgICAgbV9oYXNQZW5kaW5nR2V0VmFsdWVzID0g
dHJ1ZTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0
b3JhZ2VNYXBTZWVkKQoreworICAgIGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVk
KQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9oYXNQZW5kaW5nR2V0VmFsdWVzKTsK
KyAgICBtX2hhc1BlbmRpbmdHZXRWYWx1ZXMgPSBmYWxzZTsKK30KKwordm9pZCBTdG9yYWdlQXJl
YU1hcDo6ZGlkU2V0SXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwgY29uc3QgU3RyaW5nJiBr
ZXksIGJvb2wgcXVvdGFFcnJvcikKK3sKKyAgICBpZiAobV9jdXJyZW50U2VlZCAhPSBzdG9yYWdl
TWFwU2VlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fcGVuZGluZ1ZhbHVlQ2hh
bmdlcy5jb250YWlucyhrZXkpKTsKKworICAgIGlmIChxdW90YUVycm9yKSB7CisgICAgICAgIHJl
c2V0VmFsdWVzKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3BlbmRpbmdWYWx1
ZUNoYW5nZXMucmVtb3ZlKGtleSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpZFJlbW92
ZUl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5KQoreworICAg
IGlmIChtX2N1cnJlbnRTZWVkICE9IHN0b3JhZ2VNYXBTZWVkKQorICAgICAgICByZXR1cm47CisK
KyAgICBBU1NFUlQobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNvbnRhaW5zKGtleSkpOworICAgIG1f
cGVuZGluZ1ZhbHVlQ2hhbmdlcy5yZW1vdmUoa2V5KTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1h
cDo6ZGlkQ2xlYXIodWludDY0X3Qgc3RvcmFnZU1hcFNlZWQpCit7CisgICAgaWYgKG1fY3VycmVu
dFNlZWQgIT0gc3RvcmFnZU1hcFNlZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVCht
X2hhc1BlbmRpbmdDbGVhcik7CisgICAgbV9oYXNQZW5kaW5nQ2xlYXIgPSBmYWxzZTsKK30KKwor
Ym9vbCBTdG9yYWdlQXJlYU1hcDo6c2hvdWxkQXBwbHlDaGFuZ2VGb3JLZXkoY29uc3QgU3RyaW5n
JiBrZXkpIGNvbnN0Cit7CisgICAgLy8gV2UgaGF2ZSBub3QgeWV0IGxvYWRlZCBhbnl0aGluZyBm
cm9tIHRoaXMgc3RvcmFnZSBtYXAuCisgICAgaWYgKCFtX3N0b3JhZ2VNYXApCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrIGlmIHRoaXMgc3RvcmFnZSBhcmVhIGlzIGN1cnJl
bnRseSB3YWl0aW5nIGZvciB0aGUgc3RvcmFnZSBtYW5hZ2VyIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4g
a2V5LgorICAgIC8vIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkg
YW55IGNoYW5nZXMgbWFkZSBieSBvdGhlciBzdG9yYWdlIGFyZWFzLCBzaW5jZQorICAgIC8vIG91
ciBjaGFuZ2Ugd2FzIG1hZGUgbGFzdC4KKyAgICBpZiAobV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmNv
bnRhaW5zKGtleSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIFN0b3JhZ2VBcmVhTWFwOjphcHBseUNoYW5nZShjb25zdCBTdHJpbmcmIGtleSwg
Y29uc3QgU3RyaW5nJiBuZXdWYWx1ZSkKK3sKKyAgICBBU1NFUlQoIW1fc3RvcmFnZU1hcCB8fCBt
X3N0b3JhZ2VNYXAtPmhhc09uZVJlZigpKTsKKworICAgIC8vIFRoZXJlJ3MgYSBjbGVhciBwZW5k
aW5nIG9yIGdldFZhbHVlcyBwZW5kaW5nIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkgYW55IGNoYW5n
ZXMgdW50aWwgd2UgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIERpZENsZWFyL0RpZEdldFZhbHVlcyBt
ZXNzYWdlcy4KKyAgICBpZiAobV9oYXNQZW5kaW5nQ2xlYXIgfHwgbV9oYXNQZW5kaW5nR2V0VmFs
dWVzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWtleSkgeworICAgICAgICAvLyBBIG51
bGwga2V5IG1lYW5zIGNsZWFyLgorICAgICAgICBhdXRvIG5ld1N0b3JhZ2VNYXAgPSBTdG9yYWdl
TWFwOjpjcmVhdGUobV9xdW90YUluQnl0ZXMpOworCisgICAgICAgIC8vIEFueSBjaGFuZ2VzIHRo
YXQgd2VyZSBtYWRlIGxvY2FsbHkgYWZ0ZXIgdGhlIGNsZWFyIG11c3Qgc3RpbGwgYmUga2VwdCBh
cm91bmQgaW4gdGhlIG5ldyBtYXAuCisgICAgICAgIGZvciAoYXV0byBpdCA9IG1fcGVuZGluZ1Zh
bHVlQ2hhbmdlcy5iZWdpbigpLmtleXMoKSwgZW5kID0gbV9wZW5kaW5nVmFsdWVDaGFuZ2VzLmVu
ZCgpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcm
IGtleSA9ICppdDsKKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbV9zdG9yYWdlTWFwLT5n
ZXRJdGVtKGtleSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAg
Ly8gVGhpcyBjaGFuZ2UgbXVzdCBoYXZlIGJlZW4gYSBwZW5kaW5nIHJlbW92ZSwgaWdub3JlIGl0
LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBTdHJpbmcgb2xkVmFsdWU7CisgICAgICAgICAgICBuZXdTdG9yYWdlTWFwLT5zZXRJdGVtSWdu
b3JpbmdRdW90YShrZXksIG9sZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fc3RvcmFn
ZU1hcCA9IFdURk1vdmUobmV3U3RvcmFnZU1hcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAoIXNob3VsZEFwcGx5Q2hhbmdlRm9yS2V5KGtleSkpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmICghbmV3VmFsdWUpIHsKKyAgICAgICAgLy8gQSBudWxsIG5ldyB2YWx1ZSBtZWFu
cyB0aGF0IHRoZSBpdGVtIHNob3VsZCBiZSByZW1vdmVkLgorICAgICAgICBTdHJpbmcgb2xkVmFs
dWU7CisgICAgICAgIG1fc3RvcmFnZU1hcC0+cmVtb3ZlSXRlbShrZXksIG9sZFZhbHVlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc3RvcmFnZU1hcC0+c2V0SXRlbUlnbm9yaW5n
UXVvdGEoa2V5LCBuZXdWYWx1ZSk7Cit9CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpc3BhdGNo
U3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmluZyYg
a2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBpZiAoIXNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsK
KyAgICAgICAgLy8gVGhpcyBzdG9yYWdlIGV2ZW50IG9yaWdpbmF0ZXMgZnJvbSBhbm90aGVyIHBy
b2Nlc3Mgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgY2hhbmdlIHRvIG91ciBzdG9yYWdlIGFyZWEg
bWFwLgorICAgICAgICBhcHBseUNoYW5nZShrZXksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBp
ZiAoc3RvcmFnZVR5cGUoKSA9PSBTdG9yYWdlVHlwZTo6U2Vzc2lvbikKKyAgICAgICAgZGlzcGF0
Y2hTZXNzaW9uU3RvcmFnZUV2ZW50KHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGtleSwgb2xkVmFsdWUs
IG5ld1ZhbHVlLCB1cmxTdHJpbmcpOworICAgIGVsc2UKKyAgICAgICAgZGlzcGF0Y2hMb2NhbFN0
b3JhZ2VFdmVudChzb3VyY2VTdG9yYWdlQXJlYUlELCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwg
dXJsU3RyaW5nKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6Y2xlYXJDYWNoZSgpCit7Cisg
ICAgcmVzZXRWYWx1ZXMoKTsKK30KKwordm9pZCBTdG9yYWdlQXJlYU1hcDo6ZGlzcGF0Y2hTZXNz
aW9uU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIGNvbnN0IFN0cmlu
ZyYga2V5LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVlLCBjb25zdCBTdHJpbmcmIG5ld1ZhbHVlLCBj
b25zdCBTdHJpbmcmIHVybFN0cmluZykKK3sKKyAgICBBU1NFUlQoc3RvcmFnZVR5cGUoKSA9PSBT
dG9yYWdlVHlwZTo6U2Vzc2lvbik7CisKKyAgICAvLyBOYW1lc3BhY2UgSURzIGZvciBzZXNzaW9u
IHN0b3JhZ2UgbmFtZXNwYWNlcyBhcmUgZXF1aXZhbGVudCB0byB3ZWIgcGFnZSBJRHMKKyAgICAv
LyBzbyB3ZSBjYW4gZ2V0IHRoZSByaWdodCBwYWdlIGhlcmUuCisgICAgV2ViUGFnZSogd2ViUGFn
ZSA9IFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLndlYlBhZ2UobV9zdG9yYWdlTmFtZXNwYWNlSUQp
OworICAgIGlmICghd2ViUGFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFJlZlB0
cjxGcmFtZT4+IGZyYW1lczsKKworICAgIFBhZ2UqIHBhZ2UgPSB3ZWJQYWdlLT5jb3JlUGFnZSgp
OworICAgIGZvciAoRnJhbWUqIGZyYW1lID0gJnBhZ2UtPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJh
bWUgPSBmcmFtZS0+dHJlZSgpLnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIERvY3VtZW50KiBk
b2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgICAgICBpZiAoIWRvY3VtZW50LT5zZWN1
cml0eU9yaWdpbigpLmVxdWFsKG1fc2VjdXJpdHlPcmlnaW4ucHRyKCkpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgU3RvcmFnZSogc3RvcmFnZSA9IGRvY3VtZW50LT5kb21XaW5k
b3coKS0+b3B0aW9uYWxTZXNzaW9uU3RvcmFnZSgpOworICAgICAgICBpZiAoIXN0b3JhZ2UpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdG9yYWdlQXJlYUltcGwmIHN0b3JhZ2VB
cmVhID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUFyZWFJbXBsJj4oc3RvcmFnZS0+YXJlYSgpKTsKKyAg
ICAgICAgaWYgKHN0b3JhZ2VBcmVhLnN0b3JhZ2VBcmVhSUQoKSA9PSBzb3VyY2VTdG9yYWdlQXJl
YUlEKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdG9yYWdlIGFyZWEgdGhhdCBjYXVz
ZWQgdGhlIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIGZyYW1lcy5hcHBlbmQoZnJhbWUpOworICAgIH0KKworICAgIFN0
b3JhZ2VFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoU2Vzc2lvblN0b3JhZ2VFdmVudHNUb0ZyYW1l
cygqcGFnZSwgZnJhbWVzLCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgdXJsU3RyaW5nLCBTZWN1
cml0eU9yaWdpbkRhdGE6OmZyb21TZWN1cml0eU9yaWdpbihtX3NlY3VyaXR5T3JpZ2luKSk7Cit9
CisKK3ZvaWQgU3RvcmFnZUFyZWFNYXA6OmRpc3BhdGNoTG9jYWxTdG9yYWdlRXZlbnQodWludDY0
X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYg
b2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5n
KQoreworICAgIEFTU0VSVChpc0xvY2FsU3RvcmFnZShzdG9yYWdlVHlwZSgpKSk7CisKKyAgICBW
ZWN0b3I8UmVmUHRyPEZyYW1lPj4gZnJhbWVzOworCisgICAgUGFnZUdyb3VwJiBwYWdlR3JvdXAg
PSAqV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2ViUGFnZUdyb3VwKG1fc3RvcmFnZU5hbWVzcGFj
ZUlEKS0+Y29yZVBhZ2VHcm91cCgpOworICAgIGNvbnN0IEhhc2hTZXQ8UGFnZSo+JiBwYWdlcyA9
IHBhZ2VHcm91cC5wYWdlcygpOworICAgIGZvciAoSGFzaFNldDxQYWdlKj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gcGFnZXMuYmVnaW4oKSwgZW5kID0gcGFnZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBmb3IgKEZyYW1lKiBmcmFtZSA9ICYoKml0KS0+bWFpbkZyYW1lKCk7IGZy
YW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCkudHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAgICAg
IERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgICAgICAgICAgaWYg
KCFkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKS5lcXVhbChtX3NlY3VyaXR5T3JpZ2luLnB0cigp
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgU3RvcmFnZSogc3Rv
cmFnZSA9IGRvY3VtZW50LT5kb21XaW5kb3coKS0+b3B0aW9uYWxMb2NhbFN0b3JhZ2UoKTsKKyAg
ICAgICAgICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgU3RvcmFnZUFyZWFJbXBsJiBzdG9yYWdlQXJlYSA9IHN0YXRpY19jYXN0PFN0b3Jh
Z2VBcmVhSW1wbCY+KHN0b3JhZ2UtPmFyZWEoKSk7CisgICAgICAgICAgICBpZiAoc3RvcmFnZUFy
ZWEuc3RvcmFnZUFyZWFJRCgpID09IHNvdXJjZVN0b3JhZ2VBcmVhSUQpIHsKKyAgICAgICAgICAg
ICAgICAvLyBUaGlzIGlzIHRoZSBzdG9yYWdlIGFyZWEgdGhhdCBjYXVzZWQgdGhlIGV2ZW50IHRv
IGJlIGRpc3BhdGNoZWQuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGZyYW1lcy5hcHBlbmQoZnJhbWUpOworICAgICAgICB9CisgICAgfQor
CisgICAgU3RvcmFnZUV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hMb2NhbFN0b3JhZ2VFdmVudHNU
b0ZyYW1lcyhwYWdlR3JvdXAsIGZyYW1lcywga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHVybFN0
cmluZywgU2VjdXJpdHlPcmlnaW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obV9zZWN1cml0eU9y
aWdpbikpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VBcmVhTWFwLmggYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjYz
NzA5M2ZiZjQ3NjRiNTAxNzhlZWFjM2ZlMDlmY2RhNTdiNzU5ODcKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1hcC5oCkBA
IC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJN
ZXNzYWdlUmVjZWl2ZXIuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdlQXJlYS5oPgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+
CisjaW5jbHVkZSA8d3RmL0hhc2hDb3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50
ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2Ns
YXNzIFNlY3VyaXR5T3JpZ2luOworY2xhc3MgU3RvcmFnZU1hcDsKK30KKworbmFtZXNwYWNlIFdl
YktpdCB7CisKK2NsYXNzIFN0b3JhZ2VBcmVhSW1wbDsKK2NsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOworCitjbGFzcyBTdG9yYWdlQXJlYU1hcCA6IHB1YmxpYyBSZWZDb3VudGVkPFN0b3JhZ2VB
cmVhTWFwPiwgcHJpdmF0ZSBJUEM6Ok1lc3NhZ2VSZWNlaXZlciB7CitwdWJsaWM6CisgICAgc3Rh
dGljIFJlZjxTdG9yYWdlQXJlYU1hcD4gY3JlYXRlKFN0b3JhZ2VOYW1lc3BhY2VJbXBsKiwgUmVm
PFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiYmKTsKKyAgICB+U3RvcmFnZUFyZWFNYXAoKTsKKwor
ICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9z
dG9yYWdlVHlwZTsgfQorCisgICAgdW5zaWduZWQgbGVuZ3RoKCk7CisgICAgU3RyaW5nIGtleSh1
bnNpZ25lZCBpbmRleCk7CisgICAgU3RyaW5nIGl0ZW0oY29uc3QgU3RyaW5nJiBrZXkpOworICAg
IHZvaWQgc2V0SXRlbShXZWJDb3JlOjpGcmFtZSogc291cmNlRnJhbWUsIFN0b3JhZ2VBcmVhSW1w
bCogc291cmNlQXJlYSwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0IFN0cmluZyYgdmFsdWUsIGJv
b2wmIHF1b3RhRXhjZXB0aW9uKTsKKyAgICB2b2lkIHJlbW92ZUl0ZW0oV2ViQ29yZTo6RnJhbWUq
IHNvdXJjZUZyYW1lLCBTdG9yYWdlQXJlYUltcGwqIHNvdXJjZUFyZWEsIGNvbnN0IFN0cmluZyYg
a2V5KTsKKyAgICB2b2lkIGNsZWFyKFdlYkNvcmU6OkZyYW1lKiBzb3VyY2VGcmFtZSwgU3RvcmFn
ZUFyZWFJbXBsKiBzb3VyY2VBcmVhKTsKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZyYg
a2V5KTsKKworICAgIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiBzZWN1cml0eU9yaWdp
bigpIGNvbnN0IHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW4uZ2V0KCk7IH0KKworcHJpdmF0ZToK
KyAgICBTdG9yYWdlQXJlYU1hcChTdG9yYWdlTmFtZXNwYWNlSW1wbCosIFJlZjxXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbj4mJik7CisKKyAgICAvLyBJUEM6Ok1lc3NhZ2VSZWNlaXZlcgorICAgIHZv
aWQgZGlkUmVjZWl2ZU1lc3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJikgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIGRpZEdldFZhbHVlcyh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCk7
CisgICAgdm9pZCBkaWRTZXRJdGVtKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkLCBjb25zdCBTdHJp
bmcmIGtleSwgYm9vbCBxdW90YUVycm9yKTsKKyAgICB2b2lkIGRpZFJlbW92ZUl0ZW0odWludDY0
X3Qgc3RvcmFnZU1hcFNlZWQsIGNvbnN0IFN0cmluZyYga2V5KTsKKyAgICB2b2lkIGRpZENsZWFy
KHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKTsKKworICAgIHZvaWQgZGlzcGF0Y2hTdG9yYWdlRXZl
bnQodWludDY0X3Qgc291cmNlU3RvcmFnZUFyZWFJRCwgY29uc3QgU3RyaW5nJiBrZXksIGNvbnN0
IFN0cmluZyYgb2xkVmFsdWUsIGNvbnN0IFN0cmluZyYgbmV3VmFsdWUsIGNvbnN0IFN0cmluZyYg
dXJsU3RyaW5nKTsKKyAgICB2b2lkIGNsZWFyQ2FjaGUoKTsKKworICAgIHZvaWQgcmVzZXRWYWx1
ZXMoKTsKKyAgICB2b2lkIGxvYWRWYWx1ZXNJZk5lZWRlZCgpOworCisgICAgYm9vbCBzaG91bGRB
cHBseUNoYW5nZUZvcktleShjb25zdCBTdHJpbmcmIGtleSkgY29uc3Q7CisgICAgdm9pZCBhcHBs
eUNoYW5nZShjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBuZXdWYWx1ZSk7CisKKyAg
ICB2b2lkIGRpc3BhdGNoU2Vzc2lvblN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdl
QXJlYUlELCBjb25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3Qg
U3RyaW5nJiBuZXdWYWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAgIHZvaWQgZGlz
cGF0Y2hMb2NhbFN0b3JhZ2VFdmVudCh1aW50NjRfdCBzb3VyY2VTdG9yYWdlQXJlYUlELCBjb25z
dCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSwgY29uc3QgU3RyaW5nJiBuZXdW
YWx1ZSwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworCisgICAgUmVmPFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsPiBtX3N0b3JhZ2VOYW1lc3BhY2U7CisKKyAgICB1aW50NjRfdCBtX3N0b3JhZ2VNYXBJ
RDsKKworICAgIFdlYkNvcmU6OlN0b3JhZ2VUeXBlIG1fc3RvcmFnZVR5cGU7CisgICAgdWludDY0
X3QgbV9zdG9yYWdlTmFtZXNwYWNlSUQ7CisgICAgdW5zaWduZWQgbV9xdW90YUluQnl0ZXM7Cisg
ICAgUmVmPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luPiBtX3NlY3VyaXR5T3JpZ2luOworCisgICAg
UmVmUHRyPFdlYkNvcmU6OlN0b3JhZ2VNYXA+IG1fc3RvcmFnZU1hcDsKKworICAgIHVpbnQ2NF90
IG1fY3VycmVudFNlZWQ7CisgICAgYm9vbCBtX2hhc1BlbmRpbmdDbGVhcjsKKyAgICBib29sIG1f
aGFzUGVuZGluZ0dldFZhbHVlczsKKyAgICBIYXNoQ291bnRlZFNldDxTdHJpbmc+IG1fcGVuZGlu
Z1ZhbHVlQ2hhbmdlczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2Fn
ZXMuaW4gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlQXJlYU1h
cC5tZXNzYWdlcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMTU5MDRmMTZiZWMxNDJiMTBiNDgwMGQxMDY0NTAw
OTMzODMwMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlN0b3JhZ2UvU3RvcmFnZUFyZWFNYXAubWVzc2FnZXMuaW4KQEAgLTAsMCArMSwzMSBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCittZXNzYWdlcyAtPiBTdG9yYWdl
QXJlYU1hcCB7CisgICAgRGlkR2V0VmFsdWVzKHVpbnQ2NF90IHN0b3JhZ2VNYXBTZWVkKQorICAg
IERpZFNldEl0ZW0odWludDY0X3Qgc3RvcmFnZU1hcFNlZWQsIFN0cmluZyBrZXksIGJvb2wgcXVv
dGFFeGNlcHRpb24pCisgICAgRGlkUmVtb3ZlSXRlbSh1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCwg
U3RyaW5nIGtleSkKKyAgICBEaWRDbGVhcih1aW50NjRfdCBzdG9yYWdlTWFwU2VlZCkKKworICAg
IERpc3BhdGNoU3RvcmFnZUV2ZW50KHVpbnQ2NF90IHNvdXJjZVN0b3JhZ2VBcmVhSUQsIFN0cmlu
ZyBrZXksIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlLCBTdHJpbmcgdXJsU3RyaW5n
KQorICAgIENsZWFyQ2FjaGUoKQorfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9j
ZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwIGIvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjJhYmJjNWMyMWMxODEwODhmZjU4NjA0NWYwMjcxOWUwMjQyNjg3MjUKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9TdG9yYWdlTmFtZXNwYWNl
SW1wbC5jcHAKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIgorCisjaW5jbHVkZSAi
U3RvcmFnZUFyZWFJbXBsLmgiCisjaW5jbHVkZSAiU3RvcmFnZUFyZWFNYXAuaCIKKyNpbmNsdWRl
ICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViUGFnZUdyb3VwUHJveHkuaCIKKyNpbmNsdWRlICJX
ZWJQcm9jZXNzLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZS5oPgorI2luY2x1ZGUgPFdlYkNv
cmUvUGFnZUdyb3VwLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TZWN1cml0eU9yaWdpbi5oPgorI2lu
Y2x1ZGUgPFdlYkNvcmUvU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1N0b3JhZ2VUeXBl
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
UmVmUHRyPFN0b3JhZ2VOYW1lc3BhY2VJbXBsPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRl
U2Vzc2lvblN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRpZmllciwgdW5zaWduZWQgcXVv
dGFJbkJ5dGVzKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RvcmFnZU5hbWVzcGFjZUlt
cGwoU3RvcmFnZVR5cGU6OlNlc3Npb24sIGlkZW50aWZpZXIsIG51bGxwdHIsIHF1b3RhSW5CeXRl
cykpOworfQorCitSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+IFN0b3JhZ2VOYW1lc3BhY2VJ
bXBsOjpjcmVhdGVFcGhlbWVyYWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodWludDY0X3QgaWRlbnRp
ZmllciwgdW5zaWduZWQgcXVvdGFJbkJ5dGVzKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcg
U3RvcmFnZU5hbWVzcGFjZUltcGwoU3RvcmFnZVR5cGU6OkVwaGVtZXJhbExvY2FsLCBpZGVudGlm
aWVyLCBudWxscHRyLCBxdW90YUluQnl0ZXMpKTsKK30KKworUmVmUHRyPFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6Y3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNl
KHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcykKK3sKKyAgICByZXR1
cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpMb2NhbCwg
aWRlbnRpZmllciwgbnVsbHB0ciwgcXVvdGFJbkJ5dGVzKSk7Cit9CisKK1JlZlB0cjxTdG9yYWdl
TmFtZXNwYWNlSW1wbD4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVRyYW5zaWVudExvY2Fs
U3RvcmFnZU5hbWVzcGFjZSh1aW50NjRfdCBpZGVudGlmaWVyLCBXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbiYgdG9wTGV2ZWxPcmlnaW4sIHVpbnQ2NF90IHF1b3RhSW5CeXRlcykKK3sKKyAgICByZXR1
cm4gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKFN0b3JhZ2VUeXBlOjpUcmFuc2ll
bnRMb2NhbCwgaWRlbnRpZmllciwgJnRvcExldmVsT3JpZ2luLCBxdW90YUluQnl0ZXMpKTsKK30K
KworU3RvcmFnZU5hbWVzcGFjZUltcGw6OlN0b3JhZ2VOYW1lc3BhY2VJbXBsKFdlYkNvcmU6OlN0
b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlLCB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQsIFdlYkNv
cmU6OlNlY3VyaXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbiwgdW5zaWduZWQgcXVvdGFJbkJ5dGVz
KQorICAgIDogbV9zdG9yYWdlVHlwZShzdG9yYWdlVHlwZSkKKyAgICAsIG1fc3RvcmFnZU5hbWVz
cGFjZUlEKHN0b3JhZ2VOYW1lc3BhY2VJRCkKKyAgICAsIG1fdG9wTGV2ZWxPcmlnaW4odG9wTGV2
ZWxPcmlnaW4pCisgICAgLCBtX3F1b3RhSW5CeXRlcyhxdW90YUluQnl0ZXMpCit7Cit9CisKK1N0
b3JhZ2VOYW1lc3BhY2VJbXBsOjp+U3RvcmFnZU5hbWVzcGFjZUltcGwoKQoreworfQorCit2b2lk
IFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpkaWREZXN0cm95U3RvcmFnZUFyZWFNYXAoU3RvcmFnZUFy
ZWFNYXAmIG1hcCkKK3sKKyAgICBtX3N0b3JhZ2VBcmVhTWFwcy5yZW1vdmUoU2VjdXJpdHlPcmln
aW5EYXRhOjpmcm9tU2VjdXJpdHlPcmlnaW4obWFwLnNlY3VyaXR5T3JpZ2luKCkpKTsKK30KKwor
UmVmUHRyPFN0b3JhZ2VBcmVhPiBTdG9yYWdlTmFtZXNwYWNlSW1wbDo6c3RvcmFnZUFyZWEoY29u
c3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBzZWN1cml0eU9yaWdpbikKK3sKKyAgICBpZiAobV9zdG9y
YWdlVHlwZSA9PSBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWwpCisgICAgICAgIHJldHVybiBl
cGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhKHNlY3VyaXR5T3JpZ2luKTsKKworICAgIFJlZlB0cjxT
dG9yYWdlQXJlYU1hcD4gbWFwOworCisgICAgYXV0byYgc2xvdCA9IG1fc3RvcmFnZUFyZWFNYXBz
LmFkZChzZWN1cml0eU9yaWdpbiwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgIGlmICgh
c2xvdCkgeworICAgICAgICBtYXAgPSBTdG9yYWdlQXJlYU1hcDo6Y3JlYXRlKHRoaXMsIHNlY3Vy
aXR5T3JpZ2luLnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICBzbG90ID0gbWFwLmdldCgpOwor
ICAgIH0gZWxzZQorICAgICAgICBtYXAgPSBzbG90OworCisgICAgcmV0dXJuIFN0b3JhZ2VBcmVh
SW1wbDo6Y3JlYXRlKG1hcC5yZWxlYXNlTm9uTnVsbCgpKTsKK30KKworY2xhc3MgU3RvcmFnZU5h
bWVzcGFjZUltcGw6OkVwaGVtZXJhbFN0b3JhZ2VBcmVhIGZpbmFsIDogcHVibGljIFN0b3JhZ2VB
cmVhIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPEVwaGVtZXJhbFN0b3JhZ2VBcmVhPiBjcmVh
dGUoY29uc3QgU2VjdXJpdHlPcmlnaW5EYXRhJiBvcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5CeXRl
cykKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEVwaGVtZXJhbFN0b3JhZ2VB
cmVhKG9yaWdpbiwgcXVvdGFJbkJ5dGVzKSk7CisgICAgfQorCisgICAgUmVmPEVwaGVtZXJhbFN0
b3JhZ2VBcmVhPiBjb3B5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEVw
aGVtZXJhbFN0b3JhZ2VBcmVhKCp0aGlzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEVwaGVt
ZXJhbFN0b3JhZ2VBcmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0YSYgb3JpZ2luLCB1bnNpZ25l
ZCBxdW90YUluQnl0ZXMpCisgICAgICAgIDogbV9zZWN1cml0eU9yaWdpbkRhdGEob3JpZ2luKQor
ICAgICAgICAsIG1fc3RvcmFnZU1hcChTdG9yYWdlTWFwOjpjcmVhdGUocXVvdGFJbkJ5dGVzKSkK
KyAgICB7CisgICAgfQorCisgICAgRXBoZW1lcmFsU3RvcmFnZUFyZWEoRXBoZW1lcmFsU3RvcmFn
ZUFyZWEmIG90aGVyKQorICAgICAgICA6IG1fc2VjdXJpdHlPcmlnaW5EYXRhKG90aGVyLm1fc2Vj
dXJpdHlPcmlnaW5EYXRhKQorICAgICAgICAsIG1fc3RvcmFnZU1hcChvdGhlci5tX3N0b3JhZ2VN
YXApCisgICAgeworICAgIH0KKworICAgIC8vIFdlYkNvcmU6OlN0b3JhZ2VBcmVhLgorICAgIHVu
c2lnbmVkIGxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9zdG9yYWdlTWFwLT5sZW5n
dGgoKTsKKyAgICB9CisKKyAgICBTdHJpbmcga2V5KHVuc2lnbmVkIGluZGV4KQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fc3RvcmFnZU1hcC0+a2V5KGluZGV4KTsKKyAgICB9CisKKyAgICBTdHJp
bmcgaXRlbShjb25zdCBTdHJpbmcmIGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3N0b3Jh
Z2VNYXAtPmdldEl0ZW0oa2V5KTsKKyAgICB9CisKKyAgICB2b2lkIHNldEl0ZW0oRnJhbWUqLCBj
b25zdCBTdHJpbmcmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgYm9vbCYgcXVvdGFFeGNlcHRp
b24pCisgICAgeworICAgICAgICBTdHJpbmcgb2xkVmFsdWU7CisgICAgICAgIGlmIChhdXRvIG5l
d01hcCA9IG1fc3RvcmFnZU1hcC0+c2V0SXRlbShrZXksIHZhbHVlLCBvbGRWYWx1ZSwgcXVvdGFF
eGNlcHRpb24pKQorICAgICAgICAgICAgbV9zdG9yYWdlTWFwID0gV1RGTW92ZShuZXdNYXApOwor
ICAgIH0KKworICAgIHZvaWQgcmVtb3ZlSXRlbShGcmFtZSosIGNvbnN0IFN0cmluZyYga2V5KQor
ICAgIHsKKyAgICAgICAgU3RyaW5nIG9sZFZhbHVlOworICAgICAgICBpZiAoYXV0byBuZXdNYXAg
PSBtX3N0b3JhZ2VNYXAtPnJlbW92ZUl0ZW0oa2V5LCBvbGRWYWx1ZSkpCisgICAgICAgICAgICBt
X3N0b3JhZ2VNYXAgPSBXVEZNb3ZlKG5ld01hcCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcihG
cmFtZSopCisgICAgeworICAgICAgICBpZiAoIW1fc3RvcmFnZU1hcC0+bGVuZ3RoKCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9zdG9yYWdlTWFwID0gU3RvcmFnZU1hcDo6Y3Jl
YXRlKG1fc3RvcmFnZU1hcC0+cXVvdGEoKSk7CisgICAgfQorCisgICAgYm9vbCBjb250YWlucyhj
b25zdCBTdHJpbmcmIGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2VNYXAtPmNv
bnRhaW5zKGtleSk7CisgICAgfQorCisgICAgYm9vbCBjYW5BY2Nlc3NTdG9yYWdlKEZyYW1lKiBm
cmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmcmFtZSAmJiBmcmFtZS0+cGFnZSgpOworICAg
IH0KKworICAgIFN0b3JhZ2VUeXBlIHN0b3JhZ2VUeXBlKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBTdG9yYWdlVHlwZTo6RXBoZW1lcmFsTG9jYWw7CisgICAgfQorCisgICAgc2l6ZV90
IG1lbW9yeUJ5dGVzVXNlZEJ5Q2FjaGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorCisgICAgdm9pZCBpbmNyZW1lbnRBY2Nlc3NDb3VudCgpIHsgfQorICAgIHZvaWQgZGVjcmVt
ZW50QWNjZXNzQ291bnQoKSB7IH0KKyAgICB2b2lkIGNsb3NlRGF0YWJhc2VJZklkbGUoKSB7IH0K
KworICAgIFNlY3VyaXR5T3JpZ2luRGF0YSBzZWN1cml0eU9yaWdpbigpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV9zZWN1cml0eU9yaWdpbkRhdGE7CisgICAgfQorCisgICAgU2VjdXJp
dHlPcmlnaW5EYXRhIG1fc2VjdXJpdHlPcmlnaW5EYXRhOworICAgIFJlZlB0cjxTdG9yYWdlTWFw
PiBtX3N0b3JhZ2VNYXA7Cit9OworCitSZWZQdHI8U3RvcmFnZUFyZWE+IFN0b3JhZ2VOYW1lc3Bh
Y2VJbXBsOjplcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVhKGNvbnN0IFNlY3VyaXR5T3JpZ2luRGF0
YSYgc2VjdXJpdHlPcmlnaW4pCit7CisgICAgYXV0byYgc2xvdCA9IG1fZXBoZW1lcmFsTG9jYWxT
dG9yYWdlQXJlYXMuYWRkKHNlY3VyaXR5T3JpZ2luLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7
CisgICAgaWYgKCFzbG90KQorICAgICAgICBzbG90ID0gU3RvcmFnZU5hbWVzcGFjZUltcGw6OkVw
aGVtZXJhbFN0b3JhZ2VBcmVhOjpjcmVhdGUoc2VjdXJpdHlPcmlnaW4sIG1fcXVvdGFJbkJ5dGVz
KTsKKworICAgIHJldHVybiBzbG90LmdldCgpOworfQorCitSZWZQdHI8U3RvcmFnZU5hbWVzcGFj
ZT4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNvcHkoUGFnZSogbmV3UGFnZSkKK3sKKyAgICBBU1NF
UlQobV9zdG9yYWdlTmFtZXNwYWNlSUQpOworCisgICAgaWYgKG1fc3RvcmFnZVR5cGUgPT0gU3Rv
cmFnZVR5cGU6OlNlc3Npb24pCisgICAgICAgIHJldHVybiBjcmVhdGVTZXNzaW9uU3RvcmFnZU5h
bWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2UobmV3UGFnZSktPnBhZ2VJRCgpLCBtX3F1b3Rh
SW5CeXRlcyk7CisKKyAgICBBU1NFUlQobV9zdG9yYWdlVHlwZSA9PSBTdG9yYWdlVHlwZTo6RXBo
ZW1lcmFsTG9jYWwpOworICAgIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1wbD4gbmV3TmFtZXNw
YWNlID0gYWRvcHRSZWYobmV3IFN0b3JhZ2VOYW1lc3BhY2VJbXBsKG1fc3RvcmFnZVR5cGUsIG1f
c3RvcmFnZU5hbWVzcGFjZUlELCBtX3RvcExldmVsT3JpZ2luLmdldCgpLCBtX3F1b3RhSW5CeXRl
cykpOworCisgICAgZm9yIChhdXRvJiBpdGVyIDogbV9lcGhlbWVyYWxMb2NhbFN0b3JhZ2VBcmVh
cykKKyAgICAgICAgbmV3TmFtZXNwYWNlLT5tX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzLnNl
dChpdGVyLmtleSwgaXRlci52YWx1ZS0+Y29weSgpKTsKKworICAgIHJldHVybiBuZXdOYW1lc3Bh
Y2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvU3RvcmFnZU5hbWVzcGFjZUltcGwuaCBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1lc3BhY2VJbXBsLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZjEzYTIyZGNiZDIxYjY3NDBlNDUyMzdmNGRmYWQ4MzEyNTY3MjllMwotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJTdG9yYWdlL1N0b3JhZ2VOYW1l
c3BhY2VJbXBsLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0y
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL1NlY3VyaXR5T3JpZ2luRGF0YS5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvU2VjdXJpdHlPcmlnaW5IYXNoLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TdG9yYWdl
QXJlYS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU3RvcmFnZU1hcC5oPgorI2luY2x1ZGUgPFdlYkNv
cmUvU3RvcmFnZU5hbWVzcGFjZS5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBTdG9yYWdlQXJlYU1hcDsKK2NsYXNzIFdlYlBhZ2U7CisK
K2NsYXNzIFN0b3JhZ2VOYW1lc3BhY2VJbXBsIDogcHVibGljIFdlYkNvcmU6OlN0b3JhZ2VOYW1l
c3BhY2UgeworcHVibGljOgorICAgIHN0YXRpYyBSZWZQdHI8U3RvcmFnZU5hbWVzcGFjZUltcGw+
IGNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZpZXIsIHVuc2ln
bmVkIHF1b3RhSW5CeXRlcyk7CisgICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFtZXNwYWNlSW1w
bD4gY3JlYXRlRXBoZW1lcmFsTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZp
ZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisgICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFt
ZXNwYWNlSW1wbD4gY3JlYXRlTG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90IGlkZW50aWZp
ZXIsIHVuc2lnbmVkIHF1b3RhSW5CeXRlcyk7CisgICAgc3RhdGljIFJlZlB0cjxTdG9yYWdlTmFt
ZXNwYWNlSW1wbD4gY3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKHVpbnQ2NF90
IGlkZW50aWZpZXIsIFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiB0b3BMZXZlbE9yaWdpbiwgdWlu
dDY0X3QgcXVvdGFJbkJ5dGVzKTsKKworICAgIHZpcnR1YWwgflN0b3JhZ2VOYW1lc3BhY2VJbXBs
KCk7CisKKyAgICBXZWJDb3JlOjpTdG9yYWdlVHlwZSBzdG9yYWdlVHlwZSgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RvcmFnZVR5cGU7IH0KKyAgICB1aW50NjRfdCBzdG9yYWdlTmFtZXNwYWNlSUQoKSBj
b25zdCB7IHJldHVybiBtX3N0b3JhZ2VOYW1lc3BhY2VJRDsgfQorICAgIFdlYkNvcmU6OlNlY3Vy
aXR5T3JpZ2luKiB0b3BMZXZlbE9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fdG9wTGV2ZWxPcmln
aW4uZ2V0KCk7IH0KKyAgICB1bnNpZ25lZCBxdW90YUluQnl0ZXMoKSBjb25zdCB7IHJldHVybiBt
X3F1b3RhSW5CeXRlczsgfQorCisgICAgdm9pZCBkaWREZXN0cm95U3RvcmFnZUFyZWFNYXAoU3Rv
cmFnZUFyZWFNYXAmKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBTdG9yYWdlTmFtZXNwYWNl
SW1wbChXZWJDb3JlOjpTdG9yYWdlVHlwZSwgdWludDY0X3Qgc3RvcmFnZU5hbWVzcGFjZUlELCBX
ZWJDb3JlOjpTZWN1cml0eU9yaWdpbiogdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhSW5C
eXRlcyk7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZUFyZWE+IHN0b3JhZ2VBcmVhKGNv
bnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYpIG92ZXJyaWRlOworICAgIFJlZlB0cjxX
ZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjb3B5KFdlYkNvcmU6OlBhZ2UqKSBvdmVycmlkZTsK
KworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlQXJlYT4gZXBoZW1lcmFsTG9jYWxTdG9yYWdl
QXJlYShjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmKTsKKworICAgIGNvbnN0IFdl
YkNvcmU6OlN0b3JhZ2VUeXBlIG1fc3RvcmFnZVR5cGU7CisgICAgY29uc3QgdWludDY0X3QgbV9z
dG9yYWdlTmFtZXNwYWNlSUQ7CisKKyAgICAvLyBPbmx5IHVzZWQgZm9yIHRyYW5zaWVudCBsb2Nh
bCBzdG9yYWdlIG5hbWVzcGFjZXMuCisgICAgY29uc3QgUmVmUHRyPFdlYkNvcmU6OlNlY3VyaXR5
T3JpZ2luPiBtX3RvcExldmVsT3JpZ2luOworCisgICAgY29uc3QgdW5zaWduZWQgbV9xdW90YUlu
Qnl0ZXM7CisKKyAgICBIYXNoTWFwPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSwgU3RvcmFn
ZUFyZWFNYXAqPiBtX3N0b3JhZ2VBcmVhTWFwczsKKworICAgIGNsYXNzIEVwaGVtZXJhbFN0b3Jh
Z2VBcmVhOworICAgIEhhc2hNYXA8V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhLCBSZWZQdHI8
RXBoZW1lcmFsU3RvcmFnZUFyZWE+PiBtX2VwaGVtZXJhbExvY2FsU3RvcmFnZUFyZWFzOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXIuY3BwIGIvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVy
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5hMzc1OGViODc0Mjg4ZmZkODk2NjJkMDI1ZTE1OGQ2NmEwNzBjNTcw
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2Uv
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmNwcApAQCAtMCwwICsxLDg5IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE0LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2ViU3RvcmFnZU5hbWVz
cGFjZVByb3ZpZGVyLmgiCisKKyNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlSW1wbC5oIgorI2lu
Y2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9OZXZlckRlc3Ryb3llZC5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNw
YWNlIFdlYktpdCB7CisKK3N0YXRpYyBIYXNoTWFwPHVpbnQ2NF90LCBXZWJTdG9yYWdlTmFtZXNw
YWNlUHJvdmlkZXIqPiYgc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygpCit7CisgICAgc3RhdGlj
IE5ldmVyRGVzdHJveWVkPEhhc2hNYXA8dWludDY0X3QsIFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92
aWRlcio+PiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXJzOworCisgICAgcmV0dXJuIHN0b3JhZ2VO
YW1lc3BhY2VQcm92aWRlcnM7Cit9CisKK1JlZlB0cjxXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXI+IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6Z2V0T3JDcmVhdGUodWludDY0X3QgaWRl
bnRpZmllcikKK3sKKyAgICBhdXRvJiBzbG90ID0gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVycygp
LmFkZChpZGVudGlmaWVyLCBudWxscHRyKS5pdGVyYXRvci0+dmFsdWU7CisgICAgaWYgKHNsb3Qp
CisgICAgICAgIHJldHVybiBzbG90OworCisgICAgUmVmUHRyPFdlYlN0b3JhZ2VOYW1lc3BhY2VQ
cm92aWRlcj4gc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyID0gYWRvcHRSZWYobmV3IFdlYlN0b3Jh
Z2VOYW1lc3BhY2VQcm92aWRlcihpZGVudGlmaWVyKSk7CisgICAgc2xvdCA9IHN0b3JhZ2VOYW1l
c3BhY2VQcm92aWRlci5nZXQoKTsKKworICAgIHJldHVybiBzdG9yYWdlTmFtZXNwYWNlUHJvdmlk
ZXI7Cit9CisKK1dlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcjo6V2ViU3RvcmFnZU5hbWVzcGFj
ZVByb3ZpZGVyKHVpbnQ2NF90IGlkZW50aWZpZXIpCisgICAgOiBtX2lkZW50aWZpZXIoaWRlbnRp
ZmllcikKK3sKK30KKworV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjp+V2ViU3RvcmFnZU5h
bWVzcGFjZVByb3ZpZGVyKCkKK3sKKyAgICBBU1NFUlQoc3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVy
cygpLmNvbnRhaW5zKG1faWRlbnRpZmllcikpOworCisgICAgc3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVycygpLnJlbW92ZShtX2lkZW50aWZpZXIpOworfQorCitSZWZQdHI8V2ViQ29yZTo6U3RvcmFn
ZU5hbWVzcGFjZT4gV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVTZXNzaW9uU3Rv
cmFnZU5hbWVzcGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBxdW90YSkKK3sKKyAgICByZXR1cm4g
U3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZVNlc3Npb25TdG9yYWdlTmFtZXNwYWNlKFdlYlBh
Z2U6OmZyb21Db3JlUGFnZSgmcGFnZSktPnBhZ2VJRCgpLCBxdW90YSk7Cit9CisKK1JlZlB0cjxX
ZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNy
ZWF0ZUVwaGVtZXJhbExvY2FsU3RvcmFnZU5hbWVzcGFjZShQYWdlJiBwYWdlLCB1bnNpZ25lZCBx
dW90YSkKK3sKKyAgICByZXR1cm4gU3RvcmFnZU5hbWVzcGFjZUltcGw6OmNyZWF0ZUVwaGVtZXJh
bExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJQYWdlOjpmcm9tQ29yZVBhZ2UoJnBhZ2UpLT5wYWdl
SUQoKSwgcXVvdGEpOworfQorCitSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gV2Vi
U3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyOjpjcmVhdGVMb2NhbFN0b3JhZ2VOYW1lc3BhY2UodW5z
aWduZWQgcXVvdGEpCit7CisgICAgcmV0dXJuIFN0b3JhZ2VOYW1lc3BhY2VJbXBsOjpjcmVhdGVM
b2NhbFN0b3JhZ2VOYW1lc3BhY2UobV9pZGVudGlmaWVyLCBxdW90YSk7Cit9CisKK1JlZlB0cjxX
ZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBXZWJTdG9yYWdlTmFtZXNwYWNlUHJvdmlkZXI6OmNy
ZWF0ZVRyYW5zaWVudExvY2FsU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpTZWN1cml0eU9yaWdp
biYgdG9wTGV2ZWxPcmlnaW4sIHVuc2lnbmVkIHF1b3RhKQoreworICAgIHJldHVybiBTdG9yYWdl
TmFtZXNwYWNlSW1wbDo6Y3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFtZXNwYWNlKG1faWRl
bnRpZmllciwgdG9wTGV2ZWxPcmlnaW4sIHF1b3RhKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlN0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3Zp
ZGVyLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViU3RvcmFnZS9XZWJTdG9yYWdlTmFt
ZXNwYWNlUHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44ZWEyNWU2ZTc1MDllYjJjMTdiZDFmOTQ4NGMz
NzMxZjZjMWVhNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlN0b3JhZ2UvV2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyLmgKQEAgLTAsMCArMSw0OCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL1N0
b3JhZ2VOYW1lc3BhY2VQcm92aWRlci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3Mg
V2ViU3RvcmFnZU5hbWVzcGFjZVByb3ZpZGVyIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OlN0b3Jh
Z2VOYW1lc3BhY2VQcm92aWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZlB0cjxXZWJTdG9y
YWdlTmFtZXNwYWNlUHJvdmlkZXI+IGdldE9yQ3JlYXRlKHVpbnQ2NF90IGlkZW50aWZpZXIpOwor
ICAgIHZpcnR1YWwgfldlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcigpOworCitwcml2YXRlOgor
ICAgIGV4cGxpY2l0IFdlYlN0b3JhZ2VOYW1lc3BhY2VQcm92aWRlcih1aW50NjRfdCBpZGVudGlm
aWVyKTsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVTZXNz
aW9uU3RvcmFnZU5hbWVzcGFjZShXZWJDb3JlOjpQYWdlJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJy
aWRlOworICAgIFJlZlB0cjxXZWJDb3JlOjpTdG9yYWdlTmFtZXNwYWNlPiBjcmVhdGVFcGhlbWVy
YWxMb2NhbFN0b3JhZ2VOYW1lc3BhY2UoV2ViQ29yZTo6UGFnZSYsIHVuc2lnbmVkIHF1b3RhKSBv
dmVycmlkZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlTG9j
YWxTdG9yYWdlTmFtZXNwYWNlKHVuc2lnbmVkIHF1b3RhKSBvdmVycmlkZTsKKyAgICBSZWZQdHI8
V2ViQ29yZTo6U3RvcmFnZU5hbWVzcGFjZT4gY3JlYXRlVHJhbnNpZW50TG9jYWxTdG9yYWdlTmFt
ZXNwYWNlKFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luJiwgdW5zaWduZWQgcXVvdGEpIG92ZXJyaWRl
OworCisgICAgY29uc3QgdWludDY0X3QgbV9pZGVudGlmaWVyOworfTsKKworfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>