<?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>200612</bug_id>
          
          <creation_ts>2019-08-10 08:46:39 -0700</creation_ts>
          <short_desc>Factor complex line layout path out from RenderBlockFlow</short_desc>
          <delta_ts>2019-08-11 04:03:22 -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>Layout and Rendering</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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1560234</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2019-08-10 08:46:39 -0700</bug_when>
    <thetext>Move the code in RenderBlockLineLayout.cpp into a class of its own.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560237</commentid>
    <comment_count>1</comment_count>
      <attachid>376012</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2019-08-10 09:12:44 -0700</bug_when>
    <thetext>Created attachment 376012
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560238</commentid>
    <comment_count>2</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-08-10 09:14:01 -0700</bug_when>
    <thetext>Attachment 376012 did not pass style-queue:


ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:219:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:221:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:227:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:336:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:346:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:878:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:878:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:879:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:999:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1009:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1111:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1293:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1302:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1571:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1575:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1675:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1684:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1738:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1763:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1772:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1824:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1903:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:2139:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:2151:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:2152:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Total errors found: 25 in 17 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560240</commentid>
    <comment_count>3</comment_count>
      <attachid>376014</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2019-08-10 10:20:47 -0700</bug_when>
    <thetext>Created attachment 376014
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560241</commentid>
    <comment_count>4</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-08-10 10:22:11 -0700</bug_when>
    <thetext>Attachment 376014 did not pass style-queue:


ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1110:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1570:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1574:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1771:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1902:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
Total errors found: 5 in 17 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560318</commentid>
    <comment_count>5</comment_count>
      <attachid>376032</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2019-08-11 00:37:35 -0700</bug_when>
    <thetext>Created attachment 376032
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560323</commentid>
    <comment_count>6</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-08-11 03:08:14 -0700</bug_when>
    <thetext>Attachment 376032 did not pass style-queue:


ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1110:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1570:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1574:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1771:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
ERROR: Source/WebCore/rendering/ComplexLineLayout.cpp:1902:  Please replace ASSERT_WITH_SECURITY_IMPLICATION() with RELEASE_ASSERT_WITH_SECURITY_IMPLICATION().  [security/assertion] [5]
Total errors found: 5 in 18 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>1560326</commentid>
    <comment_count>7</comment_count>
      <attachid>376032</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-08-11 04:02:08 -0700</bug_when>
    <thetext>Comment on attachment 376032
patch

Clearing flags on attachment: 376032

Committed r248517: &lt;https://trac.webkit.org/changeset/248517&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560327</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-08-11 04:02:09 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1560328</commentid>
    <comment_count>9</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-08-11 04:03:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/54178193&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>376012</attachid>
            <date>2019-08-10 09:12:44 -0700</date>
            <delta_ts>2019-08-10 10:20:47 -0700</delta_ts>
            <desc>patch</desc>
            <filename>complex-line-layout-separate-9.patch</filename>
            <type>text/plain</type>
            <size>355193</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0NyBAQAorMjAxOS0wOC0xMCAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgRmFjdG9yIGNvbXBsZXggbGlu
ZSBsYXlvdXQgcGF0aCBvdXQgZnJvbSBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDYxMgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggZmFjdG9ycyB0aGUgbGlu
ZSBsYXlvdXQgY29kZSB0aGF0IGlzIGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBSZW5kZXJCbG9ja0Zs
b3cgYW5kIGxpdmVzIGluIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKyAgICAgICAgaW50byBh
IG5ldyBDb21wbGV4TGluZUxheW91dCBjbGFzcy4gQ29tcGxleExpbmVMYXlvdXQgaXMgYSBtZW1i
ZXIgb2YgUmVuZGVyQmxvY2tGbG93LgorCisgICAgICAgIEluIHRoZSBmdXR1cmUgd2UgY2FuIHN0
b3AgY29uc3RydWN0aW5nIENvbXBsZXhMaW5lTGF5b3V0IGF0IGFsbCB3aGVuIHVzaW5nIG90aGVy
IGxpbmUgbGF5b3V0IHBhdGhzLgorCisgICAgICAgICogU291cmNlcy50eHQ6CisgICAgICAgICog
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHJlbmRlcmluZy9D
b21wbGV4TGluZUxheW91dC5jcHA6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExp
bmVMYXlvdXQ6OkNvbXBsZXhMaW5lTGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhM
aW5lTGF5b3V0OjphcHBlbmRSdW5zRm9yT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBs
ZXhMaW5lTGF5b3V0OjpjcmVhdGVSb290SW5saW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhMaW5lTGF5b3V0OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcik6
CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlTGluZUJveGVzKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpjb25zdHJ1Y3RMaW5lKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZSBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6c2V0TWFyZ2luc0Zv
clJ1YnlSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnVwZGF0ZVJ1
YnlGb3JKdXN0aWZpZWRUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0
Ojpjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpD
b21wbGV4TGluZUxheW91dDo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9z
aXRpb25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29t
cHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleExpbmVMYXlvdXQ6OnJlbW92ZUlubGluZUJveCBjb25zdCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25z
Rm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6aGFuZGxlVHJh
aWxpbmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmFwcGVu
ZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGlu
ZUxheW91dDo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXlvdXRSdW5zQW5kRmxvYXRzKToKKyAgICAgICAgKFdlYkNv
cmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2Up
OgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxheW91dFJ1bnNBbmRGbG9h
dHNJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpyZWF0dGFj
aENsZWFuTGluZUZsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6
bGlua1RvRW5kTGluZUlmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5
b3V0OjpsYXlvdXRMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlv
dXQ6OmNoZWNrRmxvYXRJbkNsZWFuTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGlu
ZUxheW91dDo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4TGluZUxheW91dDo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleExpbmVMYXlvdXQ6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6bGluZVdpZHRoRm9yUGFnaW5hdGVk
TGluZUNoYW5nZWQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6
Om1hdGNoZWRFbmRMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojph
ZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
TGluZUxheW91dDo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleExpbmVMYXlvdXQ6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3cpOgorICAgICAgICAo
V2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxp
bmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnVwZGF0ZUZyYWdtZW50
Rm9yTGluZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6c3R5
bGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxheW91dENv
bnRleHQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjphcHBlbmRS
dW5zRm9yT2JqZWN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6Y3JlYXRlUm9vdElubGluZUJveCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3gpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXMpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6dGV4dEFsaWdubWVudEZv
ckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpzZXRNYXJnaW5zRm9yUnVieVJ1bik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnVwZGF0ZVJ1YnlGb3JKdXN0aWZpZWRUZXh0KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmll
ZFRleHQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp1cGRh
dGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZSk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxp
bmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6cmVtb3ZlSW5saW5lQm94IGNvbnN0KTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9z
aXRpb25zRm9yTGluZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6YXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJp
ZGlSdW5zKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5
b3V0UnVuc0FuZEZsb2F0cyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdl
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6cmVhdHRhY2hD
bGVhbkxpbmVGbG9hdHMpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0SW5DbGVhbkxpbmUpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9u
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5l
RW5kUG9zaXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdl
ZCBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1h
dGNoZWRFbmRMaW5lKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpn
ZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBzaXNM
aW5lQm94ZXMpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpj
aGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6IERlbGV0ZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVGcmFnbWVu
dEZvckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAqIHJlbmRlcmluZy9Db21wbGV4TGlu
ZUxheW91dC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojps
aW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxpbmVCb3hl
cyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Zmlyc3RSb290
Qm94IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXN0Um9v
dEJveCBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmg6CisgICAg
ICAgIChXZWJDb3JlOjpJc29sYXRlVHJhY2tlcjo6YWRkRmFrZVJ1bklmTmVjZXNzYXJ5KToKKyAg
ICAgICAgKFdlYkNvcmU6OklubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuSW50ZXJuYWwpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9ja0Zsb3cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpS
ZW5kZXJCbG9ja0Zsb3cpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp3aWxs
QmVEZXN0cm95ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRJ
bmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0
ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpkZWxldGVMaW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmhpdFRlc3RJbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6cGFpbnRJbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFNpbXBsZUxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6ZW5zdXJlTGluZUJveGVzKToKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyQmxvY2tGbG93Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Omxp
bmVCb3hlcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxpbmVCb3hlcyBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmZpcnN0Um9vdEJveCBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Omxhc3RSb290Qm94IGNv
bnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZmxvYXRpbmdPYmplY3Rz
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcGxleExpbmVMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpvdmVycmlkZVRleHRBbGlnbm1l
bnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6YWRq
dXN0SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlclJ1YnlCYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclJ1YnlCYXNlOjpv
dmVycmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclJ1YnlCYXNlOjp0ZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6IERlbGV0ZWQuCisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmg6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlclJ1YnlUZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclJ1YnlUZXh0OjpvdmVy
cmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clJ1YnlUZXh0Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6IERlbGV0ZWQuCisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlclJ1YnlUZXh0Lmg6CisgICAgICAgICogcmVuZGVyaW5nL1NpbXBs
ZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlTGluZUxh
eW91dDo6Z2VuZXJhdGVMaW5lQm94VHJlZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGlu
ZUJyZWFrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OnNraXBMZWFkaW5n
V2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKToKKyAg
ICAgICAgKiByZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oOgorICAgICAgICAoV2Vi
Q29yZTo6c2V0U3RhdGljUG9zaXRpb25zKToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1JlbmRl
clNWR1RleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHVGV4dDo6Y3JlYXRlUm9v
dElubGluZUJveCk6IERlbGV0ZWQuCisgICAgICAgICogcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdU
ZXh0Lmg6CisgICAgICAgICogcmVuZGVyaW5nL3VwZGF0aW5nL1JlbmRlclRyZWVCdWlsZGVyTGlz
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRQYXJlbnRPZkZpcnN0TGluZUJveCk6CisKIDIwMTkt
MDgtMTAgIFRoaWJhdWx0IFNhdW5pZXIgIDx0c2F1bmllckBpZ2FsaWEuY29tPgogCiAgICAgICAg
IFtHU3RyZWFtZXJdW1dlYlJUQ10gUmVtb3ZlIHVudXNlZCBHc3RBZGFwdGVyCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Tb3Vy
Y2VzLnR4dAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTIwMjUsNiArMjAyNSw3IEBAIHJlbmRlcmluZy9Cb3JkZXJFZGdl
LmNwcAogcmVuZGVyaW5nL0JyZWFrTGluZXMuY3BwCiByZW5kZXJpbmcvQ1NTRmlsdGVyLmNwcAog
cmVuZGVyaW5nL0NsaXBSZWN0LmNwcAorcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAog
cmVuZGVyaW5nL0NvdW50ZXJOb2RlLmNwcAogcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAogcmVu
ZGVyaW5nL0V2ZW50UmVnaW9uLmNwcApAQCAtMjA1NCw3ICsyMDU1LDYgQEAgcmVuZGVyaW5nL1Bv
aW50ZXJFdmVudHNIaXRSdWxlcy5jcHAKIHJlbmRlcmluZy9SZW5kZXJBdHRhY2htZW50LmNwcAog
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAK
LXJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCiByZW5kZXJpbmcvUmVuZGVyQm94
LmNwcAogcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAogcmVuZGVyaW5nL1JlbmRl
ckJ1dHRvbi5jcHAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDgyNCw2
ICs0ODI0LDcgQEAKIAkJRTRFMzlBRkIxMzMwRUZBODAwM0FCMjc0IC8qIExlZ2FjeVRpbGVMYXll
clBvb2wuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0
RTM5QUZBMTMzMEVGQTgwMDNBQjI3NCAvKiBMZWdhY3lUaWxlTGF5ZXJQb29sLmggKi87IH07CiAJ
CUU0RThCNEVDMjE2Qjc5RTUwMEI4ODM0RCAvKiBTeXN0ZW1Gb250RGF0YWJhc2VDb3JlVGV4dC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOEI0RUEy
MTZCNzlFNTAwQjg4MzREIC8qIFN5c3RlbUZvbnREYXRhYmFzZUNvcmVUZXh0LmggKi87IH07CiAJ
CUU0RThCNEY1MjE2Qjk1NjUwMEI4ODM0RCAvKiBGb250Q2FzY2FkZURlc2NyaXB0aW9uLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEU4QjRGMjIxNkI4
QjYwMDBCODgzNEQgLyogRm9udENhc2NhZGVEZXNjcmlwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUU0RTk0RDYxMjJGRjE1OEEwMEREMTkx
RiAvKiBDb21wbGV4TGluZUxheW91dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRTRBMUFDNzgyMkZBRkQ1MDAwMTdCNzVCIC8qIENvbXBsZXhMaW5lTGF5
b3V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
RTRFOUIxMTkxODEwOTE2RjAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRSZXNvbHZlci5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOUIxMTgxODEw
OTE2RjAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRSZXNvbHZlci5oICovOyB9OwogCQlFNEU5
QjExRDE4MTQ1NjlDMDAzQUNDREYgLyogU2ltcGxlTGluZUxheW91dEZ1bmN0aW9ucy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOUIxMUMxODE0NTY5
QzAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuaCAqLzsgfTsKIAkJRTRGOUVF
RjMxNTZEQTAwNzAwRDIzRTdFIC8qIFN0eWxlU2hlZXRDb250ZW50cy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRGOUVFRjExNTZEODRDNDAwRDIzRTdF
IC8qIFN0eWxlU2hlZXRDb250ZW50cy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFBy
aXZhdGUsICk7IH07IH07CkBAIC0xMzEwMiw3ICsxMzEwMyw3IEBACiAJCUJDRUE0NzdDMDk3Q0FB
QzgwMDk0QzlFNCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0NzdEMDk3Q0FBQzgwMDk0QzlF
NCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlCQ0VBNDc4QzA5N0NBQUM4MDA5NEM5RTQgLyogQ1NTVmFsdWVLZXl3
b3Jkcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
bGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ1NTVmFsdWVLZXl3b3Jkcy5pbjsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlckJsb2NrTGluZUxheW91dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIENvbXBsZXhMaW5lTGF5b3V0LmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDb21wbGV4TGluZUxheW91dC5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODE1MDk3RDkzMDIwMDk0QzlF
NCAvKiBCcmVha0xpbmVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBCcmVha0xpbmVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4MTYw
OTdEOTMwMjAwOTRDOUU0IC8qIEJyZWFrTGluZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEJyZWFrTGluZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNF
QTQ4MUEwOTdEOTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRCb3guY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZVRleHRCb3guY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwpAQCAtMTQ5NTYsNiArMTQ5NTcsNyBAQAogCQlFNEEwMDc4MjFCODIwRUM4
MDAyQzVBNkUgLyogRGF0YVVSTERlY29kZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gRGF0YVVSTERlY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRB
MDA3ODQxQjgyMEVEMzAwMkM1QTZFIC8qIERhdGFVUkxEZWNvZGVyLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERhdGFVUkxEZWNvZGVyLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJRTRBMTgyMkYxRjEzQkU1ODAwRkVGNjk4IC8qIFN0eWxlSW52YWxp
ZGF0aW9uRnVuY3Rpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0eWxlSW52YWxpZGF0aW9uRnVuY3Rp
b25zLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0QTFBQzc4MjJGQUZENTAwMDE3
Qjc1QiAvKiBDb21wbGV4TGluZUxheW91dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBDb21wbGV4TGluZUxheW91dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlF
NEE3OTk0RTIwRUU0QUUxMDBDMTk1NjggLyogQ1NTUGFyc2VyQ29udGV4dC5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBDU1NQYXJzZXJDb250ZXh0Lmg7IHBhdGggPSBwYXJzZXIv
Q1NTUGFyc2VyQ29udGV4dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEE3OTk1
MDIwRUU0QUUyMDBDMTk1NjggLyogQ1NTUGFyc2VyQ29udGV4dC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBDU1NQYXJzZXJDb250ZXh0LmNwcDsgcGF0aCA9IHBhcnNl
ci9DU1NQYXJzZXJDb250ZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRB
ODE0RDMxQzZERUM0MDAwQkY4NUFDIC8qIENsYXNzQ2hhbmdlSW52YWxpZGF0aW9uLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENsYXNzQ2hhbmdlSW52YWxpZGF0aW9uLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNjk4NSw2ICsyNjk4Nyw4IEBACiAJCQkJNTgw
MzcxNUYxQTY2RjAwQTAwQkFGNTE5IC8qIENsaXBSZWN0LmNwcCAqLywKIAkJCQk1ODAzNzE2MDFB
NjZGMDBBMDBCQUY1MTkgLyogQ2xpcFJlY3QuaCAqLywKIAkJCQlCQ0RENDU0RDEyMzZDOTVDMDA5
QTc5ODUgLyogQ29sdW1uSW5mby5oICovLAorCQkJCUJDRUE0ODEzMDk3RDkzMDIwMDk0QzlFNCAv
KiBDb21wbGV4TGluZUxheW91dC5jcHAgKi8sCisJCQkJRTRBMUFDNzgyMkZBRkQ1MDAwMTdCNzVC
IC8qIENvbXBsZXhMaW5lTGF5b3V0LmggKi8sCiAJCQkJOTM5MkYxNEYwQUQxODYyMzAwNjkxQkQ0
IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKIAkJCQk5MzkyRjE0QjBBRDE4NjFCMDA2OTFCRDQgLyog
Q291bnRlck5vZGUuaCAqLywKIAkJCQkwRjUzRkI4MTIxM0IxQkI4MDBDNDBEMzQgLyogQ1NTRmls
dGVyLmNwcCAqLywKQEAgLTI3MDUyLDcgKzI3MDU2LDYgQEAKIAkJCQlCQ0VBNDgyMTA5N0Q5MzAy
MDA5NEM5RTQgLyogUmVuZGVyQmxvY2suaCAqLywKIAkJCQlCQ0ZCNDVGNDE3RDhFNDk0MDA0NDQ0
NDYgLyogUmVuZGVyQmxvY2tGbG93LmNwcCAqLywKIAkJCQlCQ0ZCNDVGMzE3RDhFMzkyMDA0NDQ0
NDYgLyogUmVuZGVyQmxvY2tGbG93LmggKi8sCi0JCQkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAgKi8sCiAJCQkJQkNFQTQ4MjIwOTdEOTMwMjAw
OTRDOUU0IC8qIFJlbmRlckJveC5jcHAgKi8sCiAJCQkJQkNFQTQ4MjMwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckJveC5oICovLAogCQkJCUJDRUIxNzlCMTQzMzc5RjUwMDUyRUFFOSAvKiBSZW5k
ZXJCb3hGcmFnbWVudEluZm8uaCAqLywKQEAgLTMwODEyLDYgKzMwODE1LDcgQEAKIAkJCQkxQTdG
QTYxOTBEREEzQjNBMDAyOEY4QTUgLyogTmV0d29ya1N0YXRlTm90aWZpZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUUxM0VGMzQ0MTY4NEVDRjQwMDM0QzgzRiAvKiBOZXR3b3JrU3RvcmFnZVNlc3Np
b24uaCBpbiBIZWFkZXJzICovLAogCQkJCTI2OTM5NzI0MUE0QTVCNjQwMEU4MzQ5RCAvKiBORkEu
aCBpbiBIZWFkZXJzICovLAorCQkJCUU0RTk0RDYxMjJGRjE1OEEwMEREMTkxRiAvKiBDb21wbGV4
TGluZUxheW91dC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMjY5Mzk3MjIxQTRBNDEyRjAwRTgzNDlE
IC8qIE5GQU5vZGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTI2NzcyNjAxMUE1QjNBRDkwMDNDMjRE
RCAvKiBORkFUb0RGQS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFRjQzREQwRTY3NDAxMjAwMUMx
Mjg3IC8qIE5pbmVQaWVjZUltYWdlLmggaW4gSGVhZGVycyAqLywKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9Db21wbGV4TGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gMjQ4NDA0
KQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cDoyNDg0MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI4OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwMCBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAz
LCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxs
IHJpZ2h0IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2
YW1pZG93QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIElu
Yy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVk
ZSAiQVhPYmplY3RDYWNoZS5oIgorI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgorI2luY2x1ZGUg
IkJyZWFraW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgorI2luY2x1
ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJJbmxpbmVFbGVtZW50Qm94LmgiCisj
aW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCisj
aW5jbHVkZSAiSW5saW5lVGV4dEJveFN0eWxlLmgiCisjaW5jbHVkZSAiTGluZUxheW91dFN0YXRl
LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYWdtZW50Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyRnJh
Z21lbnRlZEZsb3cuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUg
IlJlbmRlckxpbmVCcmVhay5oIgorI2luY2x1ZGUgIlJlbmRlclJ1YnlCYXNlLmgiCisjaW5jbHVk
ZSAiUmVuZGVyUnVieVRleHQuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAi
U1ZHUm9vdElubGluZUJveC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU2lt
cGxlTGluZUxheW91dEZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElu
bGluZUJveC5oIgorI2luY2x1ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgorI2luY2x1ZGUg
PHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9p
ZCBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShUZXh0RGlyZWN0aW9uJiBkaXIsIElubGluZUl0ZXJh
dG9yIGl0ZXIpCit7CisgICAgd2hpbGUgKCFpdGVyLmF0RW5kKCkpIHsKKyAgICAgICAgaWYgKGl0
ZXIuYXRQYXJhZ3JhcGhTZXBhcmF0b3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKFVDaGFyIGN1cnJlbnQgPSBpdGVyLmN1cnJlbnQoKSkgeworICAgICAgICAgICAgVUNoYXJE
aXJlY3Rpb24gY2hhckRpcmVjdGlvbiA9IHVfY2hhckRpcmVjdGlvbihjdXJyZW50KTsKKyAgICAg
ICAgICAgIGlmIChjaGFyRGlyZWN0aW9uID09IFVfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAg
ICAgICAgIGRpciA9IFRleHREaXJlY3Rpb246OkxUUjsKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhckRpcmVjdGlvbiA9PSBVX1JJR0hU
X1RPX0xFRlQgfHwgY2hhckRpcmVjdGlvbiA9PSBVX1JJR0hUX1RPX0xFRlRfQVJBQklDKSB7Cisg
ICAgICAgICAgICAgICAgZGlyID0gVGV4dERpcmVjdGlvbjo6UlRMOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdGVyLmluY3JlbWVu
dCgpOworICAgIH0KK30KKworaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxCaWRpUnVuPiBjcmVhdGVS
dW4oaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlcikKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihz
dGFydCwgZW5kLCBvYmosIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIuZGlyKCkpOworfQor
Cit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxC
aWRpUnVuPiogcnVucywgaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5s
aW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKK3sKKyAgICBpZiAoc3RhcnQgPiBlbmQgfHwgc2hv
dWxkU2tpcENyZWF0aW5nUnVuc0Zvck9iamVjdChvYmopKQorICAgICAgICByZXR1cm47CisKKyAg
ICBMaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5n
U3RhdGUgPSByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7CisgICAgYm9vbCBo
YXZlTmV4dFRyYW5zaXRpb24gPSAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuY3VycmVu
dFRyYW5zaXRpb24oKSA8IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLm51bVRyYW5zaXRp
b25zKCkpOworICAgIElubGluZUl0ZXJhdG9yIG5leHRUcmFuc2l0aW9uOworICAgIGlmIChoYXZl
TmV4dFRyYW5zaXRpb24pCisgICAgICAgIG5leHRUcmFuc2l0aW9uID0gbGluZVdoaXRlc3BhY2VD
b2xsYXBzaW5nU3RhdGUudHJhbnNpdGlvbnMoKVtsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0
ZS5jdXJyZW50VHJhbnNpdGlvbigpXTsKKyAgICBpZiAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5n
U3RhdGUuYmV0d2VlblRyYW5zaXRpb25zKCkpIHsKKyAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5z
aXRpb24gfHwgKCZvYmogIT0gbmV4dFRyYW5zaXRpb24ucmVuZGVyZXIoKSkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgc3RhcnQgcG9pbnQuIFN0b3AgaWdu
b3Jpbmcgb2JqZWN0cyBhbmQKKyAgICAgICAgLy8gYWRqdXN0IG91ciBzdGFydC4KKyAgICAgICAg
c3RhcnQgPSBuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKTsKKyAgICAgICAgbGluZVdoaXRlc3BhY2VD
b2xsYXBzaW5nU3RhdGUuaW5jcmVtZW50Q3VycmVudFRyYW5zaXRpb24oKTsKKyAgICAgICAgaWYg
KHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICBhcHBlbmRSdW5zRm9yT2JqZWN0KHJ1bnMsIHN0
YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5zaXRpb24gfHwgKCZvYmog
IT0gbmV4dFRyYW5zaXRpb24ucmVuZGVyZXIoKSkpIHsKKyAgICAgICAgICAgIGlmIChydW5zKQor
ICAgICAgICAgICAgICAgIHJ1bnMtPmFwcGVuZFJ1bihjcmVhdGVSdW4oc3RhcnQsIGVuZCwgb2Jq
LCByZXNvbHZlcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQW4gZW5kIHRyYW5zaXRpb24gaGFzIGJlZW4gZW5jb3VudGVyZWQgd2l0aGluIG91ciBvYmpl
Y3QuIFdlIG5lZWQgdG8gYXBwZW5kIGEgcnVuIHdpdGggb3VyIGVuZHBvaW50LgorICAgICAgICBp
ZiAoc3RhdGljX2Nhc3Q8aW50PihuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEpIDw9IGVuZCkg
eworICAgICAgICAgICAgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuaW5jcmVtZW50Q3Vy
cmVudFRyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIGxpbmUgaXMg
YmVmb3JlIHRoZSBvYmplY3Qgd2UncmUgaW5zcGVjdGluZy4gU2tpcCBldmVyeXRoaW5nIGFuZCBy
ZXR1cm4KKyAgICAgICAgICAgIGlmIChuZXh0VHJhbnNpdGlvbi5yZWZlcnNUb0VuZE9mUHJldmlv
dXNOb2RlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKHN0YXRp
Y19jYXN0PGludD4obmV4dFRyYW5zaXRpb24ub2Zmc2V0KCkgKyAxKSA+IHN0YXJ0ICYmIHJ1bnMp
CisgICAgICAgICAgICAgICAgcnVucy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgbmV4dFRy
YW5zaXRpb24ub2Zmc2V0KCkgKyAxLCBvYmosIHJlc29sdmVyKSk7CisgICAgICAgICAgICBhcHBl
bmRSdW5zRm9yT2JqZWN0KHJ1bnMsIG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSwgZW5kLCBv
YmosIHJlc29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChydW5zKQorICAgICAgICAgICAgcnVu
cy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyKSk7CisgICAg
fQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyQmxvY2tGbG93Ojpj
cmVhdGVSb290SW5saW5lQm94KCkKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSb290
SW5saW5lQm94PigqdGhpcyk7Cit9CisKK1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6
Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCit7CisgICAgYXV0byBuZXdSb290Qm94ID0g
Y3JlYXRlUm9vdElubGluZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBuZXdS
b290Qm94LmdldCgpOworICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdS
b290Qm94KSk7CisKKyAgICBpZiAoVU5MSUtFTFkoQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0
eUVuYWJsZWQoKSkgJiYgZmlyc3RSb290Qm94KCkgPT0gcm9vdEJveCkgeworICAgICAgICBpZiAo
QVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb2N1bWVudCgpLmV4aXN0aW5nQVhPYmplY3RDYWNoZSgp
KQorICAgICAgICAgICAgY2FjaGUtPmRlZmVyUmVjb21wdXRlSXNJZ25vcmVkKGVsZW1lbnQoKSk7
CisgICAgfQorCisgICAgcmV0dXJuIHJvb3RCb3g7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW5saW5l
Qm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBi
b29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCit7CisgICAgaWYgKGlz
Um9vdExpbmVCb3gpCisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpy
ZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOworCisgICAgaWYgKGlzPFJl
bmRlclRleHQ+KCpyZW5kZXJlcikpCisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0
PigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZVRleHRCb3goKTsKKworICAgIGlmIChpczxSZW5kZXJC
b3g+KCpyZW5kZXJlcikpIHsKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVycmlibGUuIFRo
aXMgYnJhbmNoIHJldHVybnMgYW4gKm93bmVkKiBwb2ludGVyIQorICAgICAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVyQm94PigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZUJveCgpLnJlbGVhc2UoKTsK
KyAgICB9CisKKyAgICBpZiAoaXM8UmVuZGVyTGluZUJyZWFrPigqcmVuZGVyZXIpKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRlcnJpYmxlLiBUaGlzIGJyYW5jaCByZXR1cm5zIGFuICpv
d25lZCogcG9pbnRlciEKKyAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBkb3duY2FzdDxSZW5kZXJM
aW5lQnJlYWs+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lQm94KCkucmVsZWFzZSgpOworICAgICAg
ICAvLyBXZSBvbmx5IHRyZWF0IGEgYm94IGFzIHRleHQgZm9yIGEgPGJyPiBpZiB3ZSBhcmUgb24g
YSBsaW5lIGJ5IG91cnNlbGYgb3IgaW4gc3RyaWN0IG1vZGUKKyAgICAgICAgLy8gKE5vdGUgdGhl
IHVzZSBvZiBzdHJpY3QgbW9kZS4gSW4gImFsbW9zdCBzdHJpY3QiIG1vZGUsIHdlIGRvbid0IHRy
ZWF0IHRoZSBib3ggZm9yIDxicj4gYXMgdGV4dC4pCisgICAgICAgIGlubGluZUJveC0+c2V0QmVo
YXZlc0xpa2VUZXh0KGlzT25seVJ1biB8fCByZW5kZXJlci0+ZG9jdW1lbnQoKS5pbk5vUXVpcmtz
TW9kZSgpIHx8IHJlbmRlcmVyLT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpOworICAgICAgICBy
ZXR1cm4gaW5saW5lQm94OworICAgIH0KKworICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJJbmxp
bmU+KCpyZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveCgpOworfQorCitzdGF0
aWMgaW5saW5lIHZvaWQgZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QmIHJl
bmRlcmVyLCBib29sIGZ1bGxMYXlvdXQpCit7CisgICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRl
cmVyKSkgeworICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVy
VGV4dD4ocmVuZGVyZXIpOworICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVkZWQocmVuZGVyVGV4
dCk7CisgICAgICAgIHJlbmRlclRleHQuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CisgICAg
fSBlbHNlIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKSkKKyAgICAgICAgZG93bmNh
c3Q8UmVuZGVyTGluZUJyZWFrPihyZW5kZXJlcikuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7
CisgICAgZWxzZQorICAgICAgICBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5kaXJ0
eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKK30KKworc3RhdGljIGJvb2wgcGFyZW50SXNDb25zdHJ1
Y3RlZE9ySGF2ZU5leHQoSW5saW5lRmxvd0JveCogcGFyZW50Qm94KQoreworICAgIGRvIHsKKyAg
ICAgICAgaWYgKHBhcmVudEJveC0+aXNDb25zdHJ1Y3RlZCgpIHx8IHBhcmVudEJveC0+bmV4dE9u
TGluZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHBhcmVudEJveCA9IHBh
cmVudEJveC0+cGFyZW50KCk7CisgICAgfSB3aGlsZSAocGFyZW50Qm94KTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK0lubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJv
eGVzKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGluZUJv
eCogY2hpbGRCb3gpCit7CisgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBs
aW5lIGJveCBmb3IgdGhpcyBvYmplY3QgdGhhdCBpcyBhbHNvCisgICAgLy8gdGhlIGxhc3QgaXRl
bSBvbiB0aGUgbGluZS4KKyAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOworICAgIElubGluZUZs
b3dCb3gqIHBhcmVudEJveCA9IG51bGxwdHI7CisgICAgSW5saW5lRmxvd0JveCogcmVzdWx0ID0g
bnVsbHB0cjsKKyAgICBib29sIGhhc0RlZmF1bHRMaW5lQm94Q29udGFpbiA9IHN0eWxlKCkubGlu
ZUJveENvbnRhaW4oKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVCb3hDb250YWluKCk7Cisg
ICAgZG8geworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihpczxSZW5k
ZXJJbmxpbmU+KCpvYmopIHx8IG9iaiA9PSB0aGlzKTsKKworICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZUZsb3cgPSBvYmogIT0gdGhpcyA/IGRvd25jYXN0PFJlbmRlcklubGluZT4ob2JqKSA6
IG51bGxwdHI7CisKKyAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGJveCB3ZSBtYWRlIGZvciB0aGlz
IHJlbmRlciBvYmplY3QuCisgICAgICAgIHBhcmVudEJveCA9IGlubGluZUZsb3cgPyBpbmxpbmVG
bG93LT5sYXN0TGluZUJveCgpIDogZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93Pigqb2JqKS5sYXN0
Um9vdEJveCgpOworCisgICAgICAgIC8vIElmIHRoaXMgYm94IG9yIGl0cyBhbmNlc3RvciBpcyBj
b25zdHJ1Y3RlZCB0aGVuIGl0IGlzIGZyb20gYSBwcmV2aW91cyBsaW5lLCBhbmQgd2UgbmVlZAor
ICAgICAgICAvLyB0byBtYWtlIGEgbmV3IGJveCBmb3Igb3VyIGxpbmUuICBJZiB0aGlzIGJveCBv
ciBpdHMgYW5jZXN0b3IgaXMgdW5jb25zdHJ1Y3RlZCBidXQgaXQgaGFzCisgICAgICAgIC8vIHNv
bWV0aGluZyBmb2xsb3dpbmcgaXQgb24gdGhlIGxpbmUsIHRoZW4gd2Uga25vdyB3ZSBoYXZlIHRv
IG1ha2UgYSBuZXcgYm94CisgICAgICAgIC8vIGFzIHdlbGwuICBJbiB0aGlzIHNpdHVhdGlvbiBv
dXIgaW5saW5lIGhhcyBhY3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBvbgorICAgICAgICAvLyB0
aGUgc2FtZSBsaW5lICh0aGlzIGNhbiBoYXBwZW4gd2l0aCB2ZXJ5IGZhbmN5IGxhbmd1YWdlIG1p
eHR1cmVzKS4KKyAgICAgICAgYm9vbCBjb25zdHJ1Y3RlZE5ld0JveCA9IGZhbHNlOworICAgICAg
ICBib29sIGFsbG93ZWRUb0NvbnN0cnVjdE5ld0JveCA9ICFoYXNEZWZhdWx0TGluZUJveENvbnRh
aW4gfHwgIWlubGluZUZsb3cgfHwgaW5saW5lRmxvdy0+YWx3YXlzQ3JlYXRlTGluZUJveGVzKCk7
CisgICAgICAgIGJvb2wgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3ggPSBwYXJlbnRCb3ggJiYgIXBh
cmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXh0KHBhcmVudEJveCk7CisgICAgICAgIGlmIChhbGxv
d2VkVG9Db25zdHJ1Y3ROZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CisgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBvYmpl
Y3QuICBPbmNlCisgICAgICAgICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0IHRo
ZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgIElubGluZUJveCogbmV3Qm94
ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7CisgICAgICAg
ICAgICBwYXJlbnRCb3ggPSBkb3duY2FzdDxJbmxpbmVGbG93Qm94PihuZXdCb3gpOworICAgICAg
ICAgICAgcGFyZW50Qm94LT5zZXRJc0ZpcnN0TGluZShsaW5lSW5mby5pc0ZpcnN0TGluZSgpKTsK
KyAgICAgICAgICAgIHBhcmVudEJveC0+c2V0SXNIb3Jpem9udGFsKGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlKCkpOworICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0TGluZUJveENvbnRhaW4pCisg
ICAgICAgICAgICAgICAgcGFyZW50Qm94LT5jbGVhckRlc2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVp
Z2h0QW5kQmFzZWxpbmUoKTsKKyAgICAgICAgICAgIGNvbnN0cnVjdGVkTmV3Qm94ID0gdHJ1ZTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25zdHJ1Y3RlZE5ld0JveCB8fCBjYW5Vc2VFeGlz
dGluZ1BhcmVudEJveCkgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAg
ICAgcmVzdWx0ID0gcGFyZW50Qm94OworCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0
aGUgYmxvY2sgaXRzZWxmLCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKKyAgICAgICAg
ICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJl
IGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKKyAgICAgICAgICAgIC8vIGlubGluZS4KKyAgICAgICAg
ICAgIGlmIChjaGlsZEJveCkKKyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShj
aGlsZEJveCk7CisKKyAgICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09
IHRoaXMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNoaWxkQm94ID0g
cGFyZW50Qm94OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3Vy
IGxpbmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwg
dGhlIHJlbWFpbmluZworICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgorICAg
ICAgICBvYmogPSAoKytsaW5lRGVwdGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5w
YXJlbnQoKTsKKworICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
KwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4gc3RhdGljIGlubGluZSBib29sIGVu
ZHNXaXRoSFRNTFNwYWNlcyhjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25l
ZCBwb3NpdGlvbiwgdW5zaWduZWQgZW5kKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IHBvc2l0
aW9uOyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgaWYgKCFpc0hUTUxTcGFjZShjaGFyYWN0ZXJz
W2ldKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3N0YXRpYyBib29sIHJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihjb25zdCBCaWRpUnVu
TGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMpCit7CisgICAgQmlkaVJ1biogcnVuID0gYmlkaVJ1bnMu
bG9naWNhbGx5TGFzdFJ1bigpOworICAgIGlmICghcnVuKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBpZiAoIWlzPFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBhdXRvJiB0ZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5k
ZXJlcigpKS50ZXh0KCk7CisgICAgdW5zaWduZWQgcG9zaXRpb24gPSBydW4tPnN0b3AoKTsKKyAg
ICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgIGlmICh0ZXh0LmlzOEJpdCgp
KQorICAgICAgICByZXR1cm4gZW5kc1dpdGhIVE1MU3BhY2VzKHRleHQuY2hhcmFjdGVyczgoKSwg
cG9zaXRpb24sIGxlbmd0aCk7CisgICAgcmV0dXJuIGVuZHNXaXRoSFRNTFNwYWNlcyh0ZXh0LmNo
YXJhY3RlcnMxNigpLCBwb3NpdGlvbiwgbGVuZ3RoKTsKK30KKworUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVu
cywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQoreworICAgIEFTU0VSVChiaWRpUnVucy5maXJz
dFJ1bigpKTsKKworICAgIGJvb2wgcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSBmYWxzZTsKKyAg
ICBJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3ggPSAwOworICAgIGludCBydW5Db3VudCA9IGJpZGlS
dW5zLnJ1bkNvdW50KCkgLSBsaW5lSW5mby5ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7Cisg
ICAgCisgICAgZm9yIChCaWRpUnVuKiByID0gYmlkaVJ1bnMuZmlyc3RSdW4oKTsgcjsgciA9IHIt
Pm5leHQoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBib3ggZm9yIG91ciBvYmplY3QuCisgICAg
ICAgIGJvb2wgaXNPbmx5UnVuID0gKHJ1bkNvdW50ID09IDEpOworICAgICAgICBpZiAocnVuQ291
bnQgPT0gMiAmJiAhci0+cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIoKSkKKyAgICAgICAgICAgIGlz
T25seVJ1biA9ICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBiaWRpUnVucy5s
YXN0UnVuKCkgOiBiaWRpUnVucy5maXJzdFJ1bigpKS0+cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIo
KTsKKworICAgICAgICBpZiAobGluZUluZm8uaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJl
cigmci0+cmVuZGVyZXIoKSwgZmFsc2UsIGlzT25seVJ1bik7CisgICAgICAgIHItPnNldEJveChi
b3gpOworCisgICAgICAgIGlmICghcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gJiYgYm94LT5yZW5k
ZXJlcigpLnNlbGVjdGlvblN0YXRlKCkgIT0gUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25Ob25lKQor
ICAgICAgICAgICAgcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSB0cnVlOworICAgICAgICAKKyAg
ICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBu
b3Qgc2ltcGx5IGEgc2libGluZywKKyAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVj
dCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Blcmx5IGVuY2xvc2UgdGhlCisgICAg
ICAgIC8vIHJ1bidzIGlubGluZSBib3guIFNlZ21lbnRzIGNhbiBvbmx5IGJlIHNpYmxpbmdzIGF0
IHRoZSByb290IGxldmVsLCBhcworICAgICAgICAvLyB0aGV5IGFyZSBwb3NpdGlvbmVkIHNlcGFy
YXRlbHkuCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8ICZwYXJlbnRCb3gtPnJlbmRlcmVyKCkg
IT0gci0+cmVuZGVyZXIoKS5wYXJlbnQoKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBp
bmxpbmUgYm94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9u
IHBvaW50LgorICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnRUb1VzZSA9IHItPnJlbmRl
cmVyKCkucGFyZW50KCk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMo
cGFyZW50VG9Vc2UsIGxpbmVJbmZvLCBib3gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KKyAgICAgICAgICAgIHBh
cmVudEJveC0+YWRkVG9MaW5lKGJveCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIHZpc3Vh
bGx5T3JkZXJlZCA9IHItPnJlbmRlcmVyKCkuc3R5bGUoKS5ydGxPcmRlcmluZygpID09IE9yZGVy
OjpWaXN1YWw7CisgICAgICAgIGJveC0+c2V0QmlkaUxldmVsKHItPmxldmVsKCkpOworCisgICAg
ICAgIGlmIChpczxJbmxpbmVUZXh0Qm94PigqYm94KSkgeworICAgICAgICAgICAgYXV0byYgdGV4
dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+KCpib3gpOworICAgICAgICAgICAgdGV4dEJv
eC5zZXRTdGFydChyLT5tX3N0YXJ0KTsKKyAgICAgICAgICAgIHRleHRCb3guc2V0TGVuKHItPm1f
c3RvcCAtIHItPm1fc3RhcnQpOworICAgICAgICAgICAgdGV4dEJveC5zZXREaXJPdmVycmlkZShy
LT5kaXJPdmVycmlkZSh2aXN1YWxseU9yZGVyZWQpKTsKKyAgICAgICAgICAgIGlmIChyLT5tX2hh
c0h5cGhlbikKKyAgICAgICAgICAgICAgICB0ZXh0Qm94LnNldEhhc0h5cGhlbih0cnVlKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94
LiAgSXQgc2hvdWxkIGJlIHVuY29uc3RydWN0ZWQgYW5kCisgICAgLy8gYmUgdGhlIGxhc3QgY29u
dGludWF0aW9uIG9mIG91ciBsaW5lIGxpc3QuCisgICAgQVNTRVJUKGxhc3RSb290Qm94KCkgJiYg
IWxhc3RSb290Qm94KCktPmlzQ29uc3RydWN0ZWQoKSk7CisKKyAgICAvLyBTZXQgdGhlIG1fc2Vs
ZWN0ZWRDaGlsZHJlbiBmbGFnIG9uIHRoZSByb290IGlubGluZSBib3ggaWYgb25lIG9mIHRoZSBs
ZWFmIGlubGluZSBib3gKKyAgICAvLyBmcm9tIHRoZSBiaWRpIHJ1bnMgd2FsayBhYm92ZSBoYXMg
YSBzZWxlY3Rpb24gc3RhdGUuCisgICAgaWYgKHJvb3RIYXNTZWxlY3RlZENoaWxkcmVuKQorICAg
ICAgICBsYXN0Um9vdEJveCgpLT5yb290KCkuc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbih0cnVlKTsK
KworICAgIC8vIFNldCBiaXRzIG9uIG91ciBpbmxpbmUgZmxvdyBib3hlcyB0aGF0IGluZGljYXRl
IHdoaWNoIHNpZGVzIHNob3VsZAorICAgIC8vIHBhaW50IGJvcmRlcnMvbWFyZ2lucy9wYWRkaW5n
LiAgVGhpcyBrbm93bGVkZ2Ugd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgd2hlbgorICAgIC8vIHdl
IGRldGVybWluZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbnMgYW5kIHdpZHRocyBvZiBhbGwgdGhl
IGlubGluZSBib3hlcyBvbgorICAgIC8vIHRoZSBsaW5lLgorICAgIGJvb2wgaXNMb2dpY2FsbHlM
YXN0UnVuV3JhcHBlZCA9IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5p
c1RleHQoKSA/ICFyZWFjaGVkRW5kT2ZUZXh0UmVuZGVyZXIoYmlkaVJ1bnMpIDogIWlzPFJlbmRl
cklubGluZT4oYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpKTsKKyAgICBs
YXN0Um9vdEJveCgpLT5kZXRlcm1pbmVTcGFjaW5nRm9yRmxvd0JveGVzKGxpbmVJbmZvLmlzTGFz
dExpbmUoKSwgaXNMb2dpY2FsbHlMYXN0UnVuV3JhcHBlZCwgJmJpZGlSdW5zLmxvZ2ljYWxseUxh
c3RSdW4oKS0+cmVuZGVyZXIoKSk7CisKKyAgICAvLyBOb3cgbWFyayB0aGUgbGluZSBib3hlcyBh
cyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICBsYXN0Um9vdEJveCgpLT5zZXRDb25zdHJ1Y3RlZCgp
OworCisgICAgLy8gUmV0dXJuIHRoZSBsYXN0IGxpbmUuCisgICAgcmV0dXJuIGxhc3RSb290Qm94
KCk7Cit9CisKK1RleHRBbGlnbk1vZGUgUmVuZGVyQmxvY2tGbG93Ojp0ZXh0QWxpZ25tZW50Rm9y
TGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdAoreworICAgIFRleHRBbGlnbk1vZGUg
YWxpZ25tZW50ID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKKyNpZiBFTkFCTEUoQ1NTM19URVhUKQor
ICAgIFRleHRKdXN0aWZ5IHRleHRKdXN0aWZ5ID0gc3R5bGUoKS50ZXh0SnVzdGlmeSgpOworICAg
IGlmIChhbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiB0ZXh0SnVzdGlmeSA9
PSBUZXh0SnVzdGlmeTo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHN0eWxlKCkuZGlyZWN0aW9uKCkg
PT0gVGV4dERpcmVjdGlvbjo6TFRSID8gVGV4dEFsaWduTW9kZTo6TGVmdCA6IFRleHRBbGlnbk1v
ZGU6OlJpZ2h0OworI2VuZGlmCisKKyAgICBpZiAoZW5kc1dpdGhTb2Z0QnJlYWspCisgICAgICAg
IHJldHVybiBhbGlnbm1lbnQ7CisKKyNpZiAhRU5BQkxFKENTUzNfVEVYVCkKKyAgICByZXR1cm4g
KGFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KSA/IFRleHRBbGlnbk1vZGU6OlN0
YXJ0IDogYWxpZ25tZW50OworI2Vsc2UKKyAgICBpZiAoYWxpZ25tZW50ICE9IFRleHRBbGlnbk1v
ZGU6Okp1c3RpZnkpCisgICAgICAgIHJldHVybiBhbGlnbm1lbnQ7CisKKyAgICBUZXh0QWxpZ25M
YXN0IGFsaWdubWVudExhc3QgPSBzdHlsZSgpLnRleHRBbGlnbkxhc3QoKTsKKyAgICBzd2l0Y2gg
KGFsaWdubWVudExhc3QpIHsKKyAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OlN0YXJ0OgorICAgICAg
ICByZXR1cm4gVGV4dEFsaWduTW9kZTo6U3RhcnQ7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpF
bmQ6CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpFbmQ7CisgICAgY2FzZSBUZXh0QWxp
Z25MYXN0OjpMZWZ0OgorICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6TGVmdDsKKyAgICBj
YXNlIFRleHRBbGlnbkxhc3Q6OlJpZ2h0OgorICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6
UmlnaHQ7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpDZW50ZXI6CisgICAgICAgIHJldHVybiBU
ZXh0QWxpZ25Nb2RlOjpDZW50ZXI7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpKdXN0aWZ5Ogor
ICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKKyAgICBjYXNlIFRleHRBbGln
bkxhc3Q6OkF1dG86CisgICAgICAgIGlmICh0ZXh0SnVzdGlmeSA9PSBUZXh0SnVzdGlmeTo6RGlz
dHJpYnV0ZSkKKyAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OworICAg
ICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6U3RhcnQ7CisgICAgfQorICAgIHJldHVybiBhbGln
bm1lbnQ7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVm
dEFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJpZGlSdW4qIHRyYWls
aW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRo
LCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCit7CisgICAgLy8gVGhlIGRpcmVjdGlvbiBv
ZiB0aGUgYmxvY2sgc2hvdWxkIGRldGVybWluZSB3aGF0IGhhcHBlbnMgd2l0aCB3aWRlIGxpbmVz
LgorICAgIC8vIEluIHBhcnRpY3VsYXIgd2l0aCBSVEwgYmxvY2tzLCB3aWRlIGxpbmVzIHNob3Vs
ZCBzdGlsbCBzcGlsbCBvdXQgdG8gdGhlIGxlZnQuCisgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24pIHsKKyAgICAgICAgaWYgKHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNh
bFdpZHRoICYmIHRyYWlsaW5nU3BhY2VSdW4pCisgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVu
LT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0PigwLCB0cmFpbGluZ1NwYWNl
UnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCkgLSB0b3RhbExvZ2ljYWxXaWR0aCArIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRyYWls
aW5nU3BhY2VSdW4pCisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2Fs
V2lkdGgoMCk7CisgICAgZWxzZSBpZiAodG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dp
Y2FsV2lkdGgpCisgICAgICAgIGxvZ2ljYWxMZWZ0IC09ICh0b3RhbExvZ2ljYWxXaWR0aCAtIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxXaWR0
aEZvclJpZ2h0QWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlvbiwgQmlkaVJ1
biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dp
Y2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBXaWRlIGxp
bmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2sgYmFzZWQgb2ZmIGRpcmVjdGlvbi4KKyAgICAvLyBT
byBldmVuIGlmIHRleHQtYWxpZ24gaXMgcmlnaHQsIGlmIGRpcmVjdGlvbiBpcyBMVFIsIHdpZGUg
bGluZXMgc2hvdWxkIG92ZXJmbG93IG91dCBvZiB0aGUgcmlnaHQKKyAgICAvLyBzaWRlIG9mIHRo
ZSBibG9jay4KKyAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICBpZiAo
dHJhaWxpbmdTcGFjZVJ1bikgeworICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJh
aWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgdHJhaWxp
bmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKKyAgICAgICAgfQorICAgICAg
ICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgwLmYsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0b3Rh
bExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAmJiB0cmFpbGluZ1NwYWNlUnVu
KSB7CisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3Rk
OjptYXg8ZmxvYXQ+KDAsIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSAt
IHRvdGFsTG9naWNhbFdpZHRoICsgYXZhaWxhYmxlTG9naWNhbFdpZHRoKSk7CisgICAgICAgIHRv
dGFsTG9naWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgo
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgbG9naWNhbExlZnQgKz0gYXZhaWxhYmxlTG9naWNhbFdp
ZHRoIC0gdG90YWxMb2dpY2FsV2lkdGg7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxX
aWR0aEZvckNlbnRlckFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJp
ZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFs
TG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCit7CisgICAgZmxvYXQg
dHJhaWxpbmdTcGFjZVdpZHRoID0gMDsKKyAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikgeworICAg
ICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNh
bFdpZHRoKCk7CisgICAgICAgIHRyYWlsaW5nU3BhY2VXaWR0aCA9IHN0ZDo6bWluKHRyYWlsaW5n
U3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSwgKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAt
IHRvdGFsTG9naWNhbFdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+
Ym94KCktPnNldExvZ2ljYWxXaWR0aChzdGQ6Om1heDxmbG9hdD4oMCwgdHJhaWxpbmdTcGFjZVdp
ZHRoKSk7CisgICAgfQorICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQorICAgICAgICBs
b2dpY2FsTGVmdCArPSBzdGQ6Om1heDxmbG9hdD4oKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKSAvIDIsIDApOworICAgIGVsc2UKKyAgICAgICAgbG9naWNhbExlZnQg
Kz0gdG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGggPyAoYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIDogKGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCAtIHRvdGFsTG9naWNhbFdpZHRoKSAvIDIgLSB0cmFpbGluZ1NwYWNlV2lkdGg7Cit9CisKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4sIFJl
bmRlclJ1YnlSdW4mIHJlbmRlcmVyLCBSZW5kZXJPYmplY3QqIHByZXZpb3VzT2JqZWN0LCBjb25z
dCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgZmxvYXQgc3RhcnRPdmVyaGFuZzsKKyAgICBm
bG9hdCBlbmRPdmVyaGFuZzsKKyAgICBSZW5kZXJPYmplY3QqIG5leHRPYmplY3QgPSAwOworICAg
IGZvciAoQmlkaVJ1biogcnVuV2l0aE5leHRPYmplY3QgPSBydW4tPm5leHQoKTsgcnVuV2l0aE5l
eHRPYmplY3Q7IHJ1bldpdGhOZXh0T2JqZWN0ID0gcnVuV2l0aE5leHRPYmplY3QtPm5leHQoKSkg
eworICAgICAgICBpZiAoIXJ1bldpdGhOZXh0T2JqZWN0LT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpICYmICFydW5XaXRoTmV4dE9iamVjdC0+Ym94KCktPmlzTGluZUJyZWFrKCkp
IHsKKyAgICAgICAgICAgIG5leHRPYmplY3QgPSAmcnVuV2l0aE5leHRPYmplY3QtPnJlbmRlcmVy
KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZW5kZXJlci5n
ZXRPdmVyaGFuZyhsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCByZW5kZXJlci5zdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IHByZXZpb3VzT2JqZWN0IDogbmV4dE9iamVjdCwgcmVuZGVy
ZXIuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBuZXh0T2JqZWN0IDogcHJldmlv
dXNPYmplY3QsIHN0YXJ0T3ZlcmhhbmcsIGVuZE92ZXJoYW5nKTsKKyAgICBzZXRNYXJnaW5TdGFy
dEZvckNoaWxkKHJlbmRlcmVyLCBMYXlvdXRVbml0KC1zdGFydE92ZXJoYW5nKSk7CisgICAgc2V0
TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLWVuZE92ZXJoYW5nKSk7Cit9
CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGZsb2F0
IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKKyAgICBHbHlwaE92ZXJmbG93QW5kRmFs
bGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVy
dGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQor
eworICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7CisgICAgR2x5cGhPdmVy
ZmxvdyBnbHlwaE92ZXJmbG93OworCisgICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBsaW5l
U3R5bGUoKnJlbmRlcmVyLnBhcmVudCgpLCBsaW5lSW5mbykuZm9udENhc2NhZGUoKTsKKyAgICAv
LyBBbHdheXMgY29tcHV0ZSBnbHlwaCBvdmVyZmxvdyBpZiB0aGUgYmxvY2sncyBsaW5lLWJveC1j
b250YWluIHZhbHVlIGlzICJnbHlwaHMiLgorICAgIGlmIChsaW5lQm94LT5maXRzVG9HbHlwaHMo
KSkgeworICAgICAgICAvLyBJZiB3ZSBkb24ndCBzdGljayBvdXQgb2YgdGhlIHJvb3QgbGluZSdz
IGZvbnQgYm94LCB0aGVuIGRvbid0IGJvdGhlciBjb21wdXRpbmcgb3VyIGdseXBoIG92ZXJmbG93
LiBUaGlzIG9wdGltaXphdGlvbgorICAgICAgICAvLyB3aWxsIGtlZXAgdXMgZnJvbSBjb21wdXRp
bmcgZ2x5cGggYm91bmRzIGluIG5lYXJseSBhbGwgY2FzZXMuCisgICAgICAgIGJvb2wgaW5jbHVk
ZVJvb3RMaW5lID0gbGluZUJveC0+aW5jbHVkZXNSb290TGluZUJveEZvbnRPckxlYWRpbmcoKTsK
KyAgICAgICAgaW50IGJhc2VsaW5lU2hpZnQgPSBsaW5lQm94LT52ZXJ0aWNhbFBvc2l0aW9uRm9y
Qm94KHJ1bi0+Ym94KCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7CisgICAgICAgIGludCByb290
RGVzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkg
OiAwOworICAgICAgICBpbnQgcm9vdEFzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9u
dE1ldHJpY3MoKS5hc2NlbnQoKSA6IDA7CisgICAgICAgIGludCBib3hBc2NlbnQgPSBmb250LmZv
bnRNZXRyaWNzKCkuYXNjZW50KCkgLSBiYXNlbGluZVNoaWZ0OworICAgICAgICBpbnQgYm94RGVz
Y2VudCA9IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkgKyBiYXNlbGluZVNoaWZ0OworICAg
ICAgICBpZiAoYm94QXNjZW50ID4gcm9vdERlc2NlbnQgfHwgIGJveERlc2NlbnQgPiByb290QXNj
ZW50KQorICAgICAgICAgICAgZ2x5cGhPdmVyZmxvdy5jb21wdXRlQm91bmRzID0gdHJ1ZTsgCisg
ICAgfQorICAgIAorICAgIExheW91dFVuaXQgaHlwaGVuV2lkdGg7CisgICAgaWYgKGRvd25jYXN0
PElubGluZVRleHRCb3g+KCpydW4tPmJveCgpKS5oYXNIeXBoZW4oKSkKKyAgICAgICAgaHlwaGVu
V2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyZXIsIGZvbnQsICZmYWxsYmFja0ZvbnRz
KTsKKworICAgIGZsb2F0IG1lYXN1cmVkV2lkdGggPSAwOworCisgICAgYm9vbCBrZXJuaW5nSXNF
bmFibGVkID0gZm9udC5lbmFibGVLZXJuaW5nKCk7CisgICAgYm9vbCBjYW5Vc2VTaW1wbGVGb250
Q29kZVBhdGggPSByZW5kZXJlci5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKKyAgICAKKyAg
ICAvLyBTaW5jZSB3ZSBkb24ndCBjYWNoZSBnbHlwaCBvdmVyZmxvd3MsIHdlIG5lZWQgdG8gcmUt
bWVhc3VyZSB0aGUgcnVuIGlmCisgICAgLy8gdGhlIHN0eWxlIGlzIGxpbmVib3gtY29udGFpbjog
Z2x5cGguCisgICAgaWYgKCFsaW5lQm94LT5maXRzVG9HbHlwaHMoKSAmJiBjYW5Vc2VTaW1wbGVG
b250Q29kZVBhdGgpIHsKKyAgICAgICAgdW5zaWduZWQgbGFzdEVuZE9mZnNldCA9IHJ1bi0+bV9z
dGFydDsKKyAgICAgICAgYm9vbCBhdEZpcnN0V29yZE1lYXN1cmVtZW50ID0gdHJ1ZTsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDAsIHNpemUgPSB3b3JkTWVhc3VyZW1lbnRzLnNpemUoKTsgaSA8
IHNpemUgJiYgbGFzdEVuZE9mZnNldCA8IHJ1bi0+bV9zdG9wOyArK2kpIHsKKyAgICAgICAgICAg
IFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50c1tpXTsK
KyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQud2lkdGggPD0gMCB8fCB3b3JkTWVhc3Vy
ZW1lbnQuc3RhcnRPZmZzZXQgPT0gd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQucmVuZGVy
ZXIgIT0gJnJlbmRlcmVyIHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCAhPSBsYXN0RW5k
T2Zmc2V0IHx8IHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPiBydW4tPm1fc3RvcCkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbGFzdEVuZE9mZnNldCA9IHdvcmRN
ZWFzdXJlbWVudC5lbmRPZmZzZXQ7CisgICAgICAgICAgICBpZiAoa2VybmluZ0lzRW5hYmxlZCAm
JiBsYXN0RW5kT2Zmc2V0ID09IHJ1bi0+bV9zdG9wKSB7CisgICAgICAgICAgICAgICAgaW50IHdv
cmRMZW5ndGggPSBsYXN0RW5kT2Zmc2V0IC0gd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0Owor
ICAgICAgICAgICAgICAgIEdseXBoT3ZlcmZsb3cgb3ZlcmZsb3c7CisgICAgICAgICAgICAgICAg
bWVhc3VyZWRXaWR0aCArPSByZW5kZXJlci53aWR0aCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZz
ZXQsIHdvcmRMZW5ndGgsIHhQb3MgKyBtZWFzdXJlZFdpZHRoLCBsaW5lSW5mby5pc0ZpcnN0TGlu
ZSgpLAorICAgICAgICAgICAgICAgICAgICAmd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMs
ICZvdmVyZmxvdyk7CisgICAgICAgICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVyLmNoYXJhY3Rl
ckF0KHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgLy8gcmVu
ZGVyZXIud2lkdGgoKSBvbWl0cyB3b3JkLXNwYWNpbmcgdmFsdWUgZm9yIGxlYWRpbmcgd2hpdGVz
cGFjZSwgc28gbGV0J3MganVzdCBhZGQgaXQgYmFjayBoZXJlLgorICAgICAgICAgICAgICAgIGlm
ICghYXRGaXJzdFdvcmRNZWFzdXJlbWVudCAmJiBGb250Q2FzY2FkZTo6dHJlYXRBc1NwYWNlKGMp
KQorICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLnN0eWxlKCku
Zm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSB3b3JkTWVhc3VyZW1lbnQud2lkdGg7CisgICAgICAg
ICAgICBhdEZpcnN0V29yZE1lYXN1cmVtZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICgh
d29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAg
ICAgSGFzaFNldDxjb25zdCBGb250Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciAoSGFzaFNldDxj
b25zdCBGb250Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd29yZE1lYXN1cmVtZW50LmZhbGxiYWNr
Rm9udHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgICAgICAgICBmYWxs
YmFja0ZvbnRzLmFkZCgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
IChtZWFzdXJlZFdpZHRoICYmIGxhc3RFbmRPZmZzZXQgIT0gcnVuLT5tX3N0b3ApIHsKKyAgICAg
ICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGNhY2hlZCBkYXRhLCB3ZSdsbCBtZWFz
dXJlIHRoZSBydW4gYWdhaW4uCisgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gMDsKKyAgICAg
ICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
ICghbWVhc3VyZWRXaWR0aCkKKyAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHJlbmRlcmVyLndpZHRo
KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZv
LmlzRmlyc3RMaW5lKCksICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CisKKyAgICBy
dW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgobWVhc3VyZWRXaWR0aCArIGh5cGhlbldpZHRoKTsK
KyAgICBpZiAoIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChydW4t
PmJveCgpLT5iZWhhdmVzTGlrZVRleHQoKSk7CisgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwOjppdGVyYXRvciBpdCA9IHRleHRCb3hEYXRhTWFwLmFkZChkb3duY2FzdDxJ
bmxpbmVUZXh0Qm94PihydW4tPmJveCgpKSwgc3RkOjptYWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZv
bnQqPigpLCBHbHlwaE92ZXJmbG93KCkpKS5pdGVyYXRvcjsKKyAgICAgICAgQVNTRVJUKGl0LT52
YWx1ZS5maXJzdC5pc0VtcHR5KCkpOworICAgICAgICBpdC0+dmFsdWUuZmlyc3QgPSBjb3B5VG9W
ZWN0b3IoZmFsbGJhY2tGb250cyk7CisgICAgICAgIHJ1bi0+Ym94KCktPnBhcmVudCgpLT5jbGVh
ckRlc2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUoKTsKKyAgICB9CisKKyAg
ICAvLyBJbmNsdWRlIHRleHQgZGVjb3JhdGlvbiB2aXN1YWwgb3ZlcmZsb3cgYXMgcGFydCBvZiB0
aGUgZ2x5cGggb3ZlcmZsb3cuCisgICAgaWYgKCFyZW5kZXJlci5zdHlsZSgpLnRleHREZWNvcmF0
aW9uc0luRWZmZWN0KCkuaXNFbXB0eSgpKQorICAgICAgICBnbHlwaE92ZXJmbG93LmV4dGVuZFRv
KHZpc3VhbE92ZXJmbG93Rm9yRGVjb3JhdGlvbnMocnVuLT5ib3goKS0+bGluZVN0eWxlKCksIGRv
d25jYXN0PElubGluZVRleHRCb3g+KHJ1bi0+Ym94KCkpKSk7CisKKyAgICBpZiAoIWdseXBoT3Zl
cmZsb3cuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChydW4tPmJveCgpLT5iZWhhdmVzTGlr
ZVRleHQoKSk7CisgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwOjppdGVy
YXRvciBpdCA9IHRleHRCb3hEYXRhTWFwLmFkZChkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihydW4t
PmJveCgpKSwgc3RkOjptYWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZvbnQqPigpLCBHbHlwaE92ZXJm
bG93KCkpKS5pdGVyYXRvcjsKKyAgICAgICAgaXQtPnZhbHVlLnNlY29uZCA9IGdseXBoT3ZlcmZs
b3c7CisgICAgICAgIHJ1bi0+Ym94KCktPmNsZWFyS25vd25Ub0hhdmVOb092ZXJmbG93KCk7Cisg
ICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlUnVieUZvckp1c3RpZmllZFRl
eHQoUmVuZGVyUnVieVJ1biYgcnVieVJ1biwgQmlkaVJ1biYgciwgY29uc3QgVmVjdG9yPHVuc2ln
bmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25PcHBv
cnR1bml0eUNvdW50LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgc2l6ZV90JiBpKQoreworICAgIGlmICghcnVieVJ1bi5ydWJ5QmFzZSgpIHx8
ICFydWJ5UnVuLnJ1YnlCYXNlKCktPmZpcnN0Um9vdEJveCgpIHx8IHJ1YnlSdW4ucnVieUJhc2Uo
KS0+Zmlyc3RSb290Qm94KCktPm5leHRSb290Qm94KCkgfHwgIXIucmVuZGVyZXIoKS5zdHlsZSgp
LmNvbGxhcHNlV2hpdGVTcGFjZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvJiBydWJ5
QmFzZSA9ICpydWJ5UnVuLnJ1YnlCYXNlKCk7CisgICAgYXV0byYgcm9vdEJveCA9ICpydWJ5QmFz
ZS5maXJzdFJvb3RCb3goKTsKKworICAgIGZsb2F0IHRvdGFsRXhwYW5zaW9uID0gMDsKKyAgICB1
bnNpZ25lZCB0b3RhbE9wcG9ydHVuaXRpZXNJblJ1biA9IDA7CisgICAgZm9yIChhdXRvKiBsZWFm
Q2hpbGQgPSByb290Qm94LmZpcnN0TGVhZkNoaWxkKCk7IGxlYWZDaGlsZDsgbGVhZkNoaWxkID0g
bGVhZkNoaWxkLT5uZXh0TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgaWYgKCFsZWFmQ2hpbGQtPmlz
SW5saW5lVGV4dEJveCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgdW5zaWdu
ZWQgb3Bwb3J0dW5pdGllc0luUnVuID0gZXhwYW5zaW9uT3Bwb3J0dW5pdGllc1tpKytdOworICAg
ICAgICBBU1NFUlQob3Bwb3J0dW5pdGllc0luUnVuIDw9IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQpOworICAgICAgICBhdXRvIGV4cGFuc2lvbiA9IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0
b3RhbExvZ2ljYWxXaWR0aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4gLyBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50OworICAgICAgICB0b3RhbEV4cGFuc2lvbiArPSBleHBhbnNpb247CisgICAgICAg
IHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuICs9IG9wcG9ydHVuaXRpZXNJblJ1bjsKKyAgICB9CisK
KyAgICBBU1NFUlQoIXJ1YnlSdW4uaGFzT3ZlcnJpZGVDb250ZW50TG9naWNhbFdpZHRoKCkpOwor
ICAgIGZsb2F0IG5ld0Jhc2VXaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdpZHRoKCkgKyB0b3RhbEV4
cGFuc2lvbiArIG1hcmdpblN0YXJ0Rm9yQ2hpbGQocnVieVJ1bikgKyBtYXJnaW5FbmRGb3JDaGls
ZChydWJ5UnVuKTsKKyAgICBmbG9hdCBuZXdSdWJ5UnVuV2lkdGggPSBydWJ5UnVuLmxvZ2ljYWxX
aWR0aCgpICsgdG90YWxFeHBhbnNpb247CisgICAgcnVieUJhc2Uuc2V0SW5pdGlhbE9mZnNldCgo
bmV3UnVieVJ1bldpZHRoIC0gbmV3QmFzZVdpZHRoKSAvIDIpOworICAgIHJ1YnlSdW4uc2V0T3Zl
cnJpZGVDb250ZW50TG9naWNhbFdpZHRoKExheW91dFVuaXQobmV3UnVieVJ1bldpZHRoKSk7Cisg
ICAgcnVieVJ1bi5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgIHJvb3RCb3gubWFy
a0RpcnR5KCk7CisgICAgaWYgKFJlbmRlclJ1YnlUZXh0KiBydWJ5VGV4dCA9IHJ1YnlSdW4ucnVi
eVRleHQoKSkgeworICAgICAgICBpZiAoUm9vdElubGluZUJveCogdGV4dFJvb3RCb3ggPSBydWJ5
VGV4dC0+Zmlyc3RSb290Qm94KCkpCisgICAgICAgICAgICB0ZXh0Um9vdEJveC0+bWFya0RpcnR5
KCk7CisgICAgfQorICAgIHJ1YnlSdW4ubGF5b3V0QmxvY2sodHJ1ZSk7CisgICAgcnVieVJ1bi5j
bGVhck92ZXJyaWRlQ29udGVudExvZ2ljYWxXaWR0aCgpOworICAgIHIuYm94KCktPnNldEV4cGFu
c2lvbihuZXdSdWJ5UnVuV2lkdGggLSByLmJveCgpLT5sb2dpY2FsV2lkdGgoKSk7CisKKyAgICB0
b3RhbExvZ2ljYWxXaWR0aCArPSB0b3RhbEV4cGFuc2lvbjsKKyAgICBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50IC09IHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuOworfQorCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RS
dW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+
JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNv
dW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRo
KQoreworICAgIGlmICghZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCB8fCBhdmFpbGFibGVMb2dp
Y2FsV2lkdGggPD0gdG90YWxMb2dpY2FsV2lkdGgpCisgICAgICAgIHJldHVybjsKKworICAgIHNp
emVfdCBpID0gMDsKKyAgICBmb3IgKEJpZGlSdW4qIHJ1biA9IGZpcnN0UnVuOyBydW47IHJ1biA9
IHJ1bi0+bmV4dCgpKSB7CisgICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4gPT0gdHJhaWxp
bmdTcGFjZVJ1bikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgaWYg
KGlzPFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IG9wcG9ydHVuaXRpZXNJblJ1biA9IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXNbaSsrXTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG9wcG9ydHVuaXRpZXNJblJ1biA8PSBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT25seSBq
dXN0aWZ5IHRleHQgaWYgd2hpdGVzcGFjZSBpcyBjb2xsYXBzZWQuCisgICAgICAgICAgICBpZiAo
cnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKKyAgICAgICAg
ICAgICAgICBJbmxpbmVUZXh0Qm94JiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4o
KnJ1bi0+Ym94KCkpOworICAgICAgICAgICAgICAgIGZsb2F0IGV4cGFuc2lvbiA9IChhdmFpbGFi
bGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4g
LyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OworICAgICAgICAgICAgICAgIHRleHRCb3guc2V0
RXhwYW5zaW9uKGV4cGFuc2lvbik7CisgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGgg
Kz0gZXhwYW5zaW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCAtPSBvcHBvcnR1bml0aWVzSW5SdW47CisgICAgICAgIH0gZWxzZSBpZiAoaXM8
UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSkKKyAgICAgICAgICAgIHVwZGF0ZVJ1YnlG
b3JKdXN0aWZpZWRUZXh0KGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSks
ICpydW4sIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQs
IHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGkpOworCisgICAgICAg
IGlmICghZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAg
IH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdu
bWVudChjb25zdCBUZXh0QWxpZ25Nb2RlJiB0ZXh0QWxpZ24sIGNvbnN0IFJvb3RJbmxpbmVCb3gq
IHJvb3RJbmxpbmVCb3gsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2Fs
TGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdp
ZHRoLCBpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKK3sKKyAgICBUZXh0RGlyZWN0aW9u
IGRpcmVjdGlvbjsKKyAgICBpZiAocm9vdElubGluZUJveCAmJiBzdHlsZSgpLnVuaWNvZGVCaWRp
KCkgPT0gUGxhaW50ZXh0KQorICAgICAgICBkaXJlY3Rpb24gPSByb290SW5saW5lQm94LT5kaXJl
Y3Rpb24oKTsKKyAgICBlbHNlCisgICAgICAgIGRpcmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9u
KCk7CisKKyAgICAvLyBBcm1lZCB3aXRoIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSAod2l0
aG91dCBqdXN0aWZpY2F0aW9uKSwKKyAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGln
biBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCisg
ICAgLy8gb2JqZWN0cyBob3Jpem9udGFsbHkuIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBj
YW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAorICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KKyAg
ICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6TGVmdDoKKyAg
ICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6CisgICAgICAgIHVwZGF0ZUxvZ2ljYWxX
aWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCks
IHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxh
YmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpSaWdodDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAgICAgICB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdodEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNh
bFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFRleHRBbGlnbk1vZGU6OkNlbnRlcjoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdENl
bnRlcjoKKyAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKHN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2Fs
TGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6SnVzdGlmeToKKyAgICAgICAgYWRqdXN0
SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyhleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBsb2dp
Y2FsTGVmdCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgaWYgKGV4cGFuc2lvbk9w
cG9ydHVuaXR5Q291bnQpIHsKKyAgICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7Cisg
ICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94
KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJv
eCgpLT5zZXRMb2dpY2FsV2lkdGgoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBGQUxMVEhST1VHSDsKKyAgICBjYXNlIFRleHRBbGlnbk1v
ZGU6OlN0YXJ0OgorICAgICAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikK
KyAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUo
KS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0
LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxM
ZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpFbmQ6CisgICAgICAgIGlmIChkaXJlY3Rp
b24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRo
Rm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRy
YWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxl
TG9naWNhbFdpZHRoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdp
ZHRoRm9yTGVmdEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwg
dHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lk
IHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgZmxv
YXQmIGxpbmVMb2dpY2FsTGVmdCwgZmxvYXQmIGxpbmVMb2dpY2FsUmlnaHQsIGZsb2F0JiBhdmFp
bGFibGVMb2dpY2FsV2lkdGgsIGJvb2wgZmlyc3RMaW5lLAorICAgIEluZGVudFRleHRPck5vdCBz
aG91bGRJbmRlbnRUZXh0LCBMYXlvdXRVbml0IGJveExvZ2ljYWxIZWlnaHQpCit7CisgICAgTGF5
b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdodCA9IGJsb2NrLm1pbkxpbmVIZWlnaHRGb3JSZXBsYWNl
ZFJlbmRlcmVyKGZpcnN0TGluZSwgYm94TG9naWNhbEhlaWdodCk7CisgICAgbGluZUxvZ2ljYWxM
ZWZ0ID0gYmxvY2subG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWlnaHQo
KSwgc2hvdWxkSW5kZW50VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOworICAgIGxpbmVMb2dpY2Fs
UmlnaHQgPSBibG9jay5sb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWln
aHQoKSwgc2hvdWxkSW5kZW50VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOworICAgIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCA9IGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQ7Cit9CisK
K3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9y
TGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJp
ZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRF
bmQsIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVy
dGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVu
dHMmIHdvcmRNZWFzdXJlbWVudHMpCit7CisgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSB0
ZXh0QWxpZ25tZW50Rm9yTGluZSghcmVhY2hlZEVuZCAmJiAhbGluZUJveC0+ZW5kc1dpdGhCcmVh
aygpKTsKKyAgICAKKyAgICAvLyBDU1MgMi4xOiAiJ1RleHQtaW5kZW50JyBvbmx5IGFmZmVjdHMg
YSBsaW5lIGlmIGl0IGlzIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZSBvZiBhbiBlbGVtZW50LiBG
b3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIAorICAgIC8v
IGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFy
ZW50IGVsZW1lbnQuIgorICAgIC8vIENTUzMgInRleHQtaW5kZW50IiwgIi13ZWJraXQtZWFjaC1s
aW5lIiBhZmZlY3RzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBibG9jayBjb250YWluZXIgYXMgd2Vs
bCBhcyBlYWNoIGxpbmUgYWZ0ZXIgYSBmb3JjZWQgbGluZSBicmVhaywKKyAgICAvLyBidXQgZG9l
cyBub3QgYWZmZWN0IGxpbmVzIGFmdGVyIGEgc29mdCB3cmFwIGJyZWFrLgorICAgIGJvb2wgaXNG
aXJzdExpbmUgPSBsaW5lSW5mby5pc0ZpcnN0TGluZSgpICYmICEoaXNBbm9ueW1vdXNCbG9jaygp
ICYmIHBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gdGhpcyk7CisgICAgYm9vbCBpc0FmdGVySGFy
ZExpbmVCcmVhayA9IGxpbmVCb3gtPnByZXZSb290Qm94KCkgJiYgbGluZUJveC0+cHJldlJvb3RC
b3goKS0+ZW5kc1dpdGhCcmVhaygpOworICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRU
ZXh0ID0gcmVxdWlyZXNJbmRlbnQoaXNGaXJzdExpbmUsIGlzQWZ0ZXJIYXJkTGluZUJyZWFrLCBz
dHlsZSgpKTsKKyAgICBmbG9hdCBsaW5lTG9naWNhbExlZnQ7CisgICAgZmxvYXQgbGluZUxvZ2lj
YWxSaWdodDsKKyAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGg7CisgICAgdXBkYXRlTG9n
aWNhbElubGluZVBvc2l0aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJp
Z2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0
LCAwKTsKKyAgICBib29sIG5lZWRzV29yZFNwYWNpbmc7CisKKyAgICBpZiAoZmlyc3RSdW4gJiYg
Zmlyc3RSdW4tPnJlbmRlcmVyKCkuaXNSZXBsYWNlZCgpKSB7CisgICAgICAgIFJlbmRlckJveCYg
cmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PihmaXJzdFJ1bi0+cmVuZGVyZXIoKSk7Cisg
ICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRoaXMsIGxpbmVMb2dpY2FsTGVm
dCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwg
c2hvdWxkSW5kZW50VGV4dCwgcmVuZGVyQm94LmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgfQorCisg
ICAgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQobGluZUJveCwgbGlu
ZUluZm8sIHRleHRBbGlnbiwgbGluZUxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgs
IGZpcnN0UnVuLCB0cmFpbGluZ1NwYWNlUnVuLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3Np
dGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKKyAgICAvLyBUaGUgd2lkdGhzIG9mIGFsbCBy
dW5zIGFyZSBub3cga25vd24uIFdlIGNhbiBub3cgcGxhY2UgZXZlcnkgaW5saW5lIGJveCAoYW5k
CisgICAgLy8gY29tcHV0ZSBhY2N1cmF0ZSB3aWR0aHMgZm9yIHRoZSBpbmxpbmUgZmxvdyBib3hl
cykuCisgICAgbmVlZHNXb3JkU3BhY2luZyA9IGZhbHNlOworICAgIGxpbmVCb3gtPnBsYWNlQm94
ZXNJbklubGluZURpcmVjdGlvbihsaW5lTG9naWNhbExlZnQsIG5lZWRzV29yZFNwYWNpbmcpOwor
fQorCitzdGF0aWMgaW5saW5lIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9yRm9y
SW5saW5lVGV4dEJveChSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBJbmxpbmVUZXh0Qm94JiB0ZXh0
Qm94LCBCaWRpUnVuKiBwcmV2aW91c1J1biwgQmlkaVJ1biogbmV4dFJ1biwgVGV4dEFsaWduTW9k
ZSB0ZXh0QWxpZ24sIGJvb2wgaXNBZnRlckV4cGFuc2lvbikKK3sKKyAgICAvLyBUYXRlY2h1eW9r
byBpcyBtb2RlbGVkIGFzIHRoZSBPYmplY3QgUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIChVK0ZGRkMp
LCB3aGljaCBjYW4gbmV2ZXIgaGF2ZSBleHBhbnNpb24gb3Bwb3J0dW5pdGllcyBpbnNpZGUgbm9y
IGludHJpbnNpY2FsbHkgYWRqYWNlbnQgdG8gaXQuCisgICAgaWYgKHRleHRCb3gucmVuZGVyZXIo
KS5zdHlsZSgpLnRleHRDb21iaW5lKCkgPT0gVGV4dENvbWJpbmU6Okhvcml6b250YWwpCisgICAg
ICAgIHJldHVybiBGb3JiaWRMZWFkaW5nRXhwYW5zaW9uIHwgRm9yYmlkVHJhaWxpbmdFeHBhbnNp
b247CisKKyAgICBFeHBhbnNpb25CZWhhdmlvciByZXN1bHQgPSAwOworICAgIGJvb2wgc2V0TGVh
ZGluZ0V4cGFuc2lvbiA9IGZhbHNlOworICAgIGJvb2wgc2V0VHJhaWxpbmdFeHBhbnNpb24gPSBm
YWxzZTsKKyAgICBpZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpIHsKKyAg
ICAgICAgLy8gSWYgdGhlIG5leHQgYm94IGlzIHJ1YnksIGFuZCB3ZSdyZSBqdXN0aWZ5aW5nLCBh
bmQgdGhlIGZpcnN0IGJveCBpbiB0aGUgcnVieSBiYXNlIGhhcyBhIGxlYWRpbmcgZXhwYW5zaW9u
LCBhbmQgd2UgYXJlIGEgdGV4dCBib3gsIHRoZW4gZm9yY2UgYSB0cmFpbGluZyBleHBhbnNpb24u
CisgICAgICAgIGlmIChuZXh0UnVuICYmIGlzPFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRl
cmVyKCkpICYmIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpLnJ1
YnlCYXNlKCkgJiYgbmV4dFJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFj
ZSgpKSB7CisgICAgICAgICAgICBhdXRvJiBydWJ5QmFzZSA9ICpkb3duY2FzdDxSZW5kZXJSdWJ5
UnVuPihuZXh0UnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpOworICAgICAgICAgICAgaWYgKHJ1
YnlCYXNlLmZpcnN0Um9vdEJveCgpICYmICFydWJ5QmFzZS5maXJzdFJvb3RCb3goKS0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmIChhdXRvKiBsZWFmQ2hpbGQgPSBydWJ5QmFz
ZS5maXJzdFJvb3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAg
ICBpZiAoaXM8SW5saW5lVGV4dEJveD4oKmxlYWZDaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGxlYWRpbmdFeHBhbnNpb25PcHBvcnR1bml0eSBkb2Vzbid0
IGFjdHVhbGx5IHdvcmsgYmVjYXVzZSBpdCBkb2Vzbid0IHBlcmZvcm0gdGhlIFVCQQorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKEZvbnRDYXNjYWRlOjpsZWFkaW5nRXhwYW5zaW9uT3Bwb3J0
dW5pdHkoZG93bmNhc3Q8UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5kZXJlcigpKS5zdHJpbmdW
aWV3KCksIGxlYWZDaGlsZC0+ZGlyZWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0VHJhaWxpbmdFeHBhbnNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlc3VsdCB8PSBGb3JjZVRyYWlsaW5nRXhwYW5zaW9uOworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNhbWUgdGhpbmcsIGV4Y2VwdCBpZiB3
ZSdyZSBmb2xsb3dpbmcgYSBydWJ5CisgICAgICAgIGlmIChwcmV2aW91c1J1biAmJiBpczxSZW5k
ZXJSdWJ5UnVuPihwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyUnVi
eVJ1bj4ocHJldmlvdXNSdW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkgJiYgcHJldmlvdXNSdW4t
PnJlbmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgeworICAgICAgICAgICAg
YXV0byYgcnVieUJhc2UgPSAqZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocHJldmlvdXNSdW4tPnJl
bmRlcmVyKCkpLnJ1YnlCYXNlKCk7CisgICAgICAgICAgICBpZiAocnVieUJhc2UuZmlyc3RSb290
Qm94KCkgJiYgIXJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgp
LT5sYXN0TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzPElubGluZVRl
eHRCb3g+KCpsZWFmQ2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBsZWFkaW5nRXhwYW5zaW9uT3Bwb3J0dW5pdHkgZG9lc24ndCBhY3R1YWxseSB3b3JrIGJl
Y2F1c2UgaXQgZG9lc24ndCBwZXJmb3JtIHRoZSBVQkEKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChGb250Q2FzY2FkZTo6dHJhaWxpbmdFeHBhbnNpb25PcHBvcnR1bml0eShkb3duY2FzdDxS
ZW5kZXJUZXh0PihsZWFmQ2hpbGQtPnJlbmRlcmVyKCkpLnN0cmluZ1ZpZXcoKSwgbGVhZkNoaWxk
LT5kaXJlY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMZWFkaW5n
RXhwYW5zaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0g
Rm9yY2VMZWFkaW5nRXhwYW5zaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIC8vIElmIHdlJ3JlIHRoZSBmaXJzdCBib3ggaW5zaWRlIGEgcnVieSBiYXNl
LCBmb3JiaWQgYSBsZWFkaW5nIGV4cGFuc2lvbiwgYW5kIHZpY2UtdmVyc2EKKyAgICAgICAgaWYg
KGlzPFJlbmRlclJ1YnlCYXNlPihibG9jaykpIHsKKyAgICAgICAgICAgIFJlbmRlclJ1YnlCYXNl
JiBydWJ5QmFzZSA9IGRvd25jYXN0PFJlbmRlclJ1YnlCYXNlPihibG9jayk7CisgICAgICAgICAg
ICBpZiAoJnRleHRCb3ggPT0gcnVieUJhc2UuZmlyc3RSb290Qm94KCktPmZpcnN0TGVhZkNoaWxk
KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRMZWFkaW5nRXhwYW5zaW9uID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICByZXN1bHQgfD0gRm9yYmlkTGVhZGluZ0V4cGFuc2lvbjsKKyAgICAgICAgICAg
IH0gaWYgKCZ0ZXh0Qm94ID09IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5sYXN0TGVhZkNoaWxk
KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IHRydWU7CisgICAg
ICAgICAgICAgICAgcmVzdWx0IHw9IEZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghc2V0TGVhZGluZ0V4cGFuc2lvbikKKyAg
ICAgICAgcmVzdWx0IHw9IGlzQWZ0ZXJFeHBhbnNpb24gPyBGb3JiaWRMZWFkaW5nRXhwYW5zaW9u
IDogQWxsb3dMZWFkaW5nRXhwYW5zaW9uOworICAgIGlmICghc2V0VHJhaWxpbmdFeHBhbnNpb24p
CisgICAgICAgIHJlc3VsdCB8PSBBbGxvd1RyYWlsaW5nRXhwYW5zaW9uOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBseUV4cGFuc2lvbkJlaGF2aW9yKElu
bGluZVRleHRCb3gmIHRleHRCb3gsIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9y
KQoreworICAgIHN3aXRjaCAoZXhwYW5zaW9uQmVoYXZpb3IgJiBMZWFkaW5nRXhwYW5zaW9uTWFz
aykgeworICAgIGNhc2UgRm9yY2VMZWFkaW5nRXhwYW5zaW9uOgorICAgICAgICB0ZXh0Qm94LnNl
dEZvcmNlTGVhZGluZ0V4cGFuc2lvbigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcmJp
ZExlYWRpbmdFeHBhbnNpb246CisgICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZUxlYWRpbmdFeHBh
bnNpb24oZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFsbG93TGVhZGluZ0V4cGFu
c2lvbjoKKyAgICAgICAgdGV4dEJveC5zZXRDYW5IYXZlTGVhZGluZ0V4cGFuc2lvbih0cnVlKTsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGV4cGFuc2lvbkJlaGF2aW9y
ICYgVHJhaWxpbmdFeHBhbnNpb25NYXNrKSB7CisgICAgY2FzZSBGb3JjZVRyYWlsaW5nRXhwYW5z
aW9uOgorICAgICAgICB0ZXh0Qm94LnNldEZvcmNlVHJhaWxpbmdFeHBhbnNpb24oKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBGb3JiaWRUcmFpbGluZ0V4cGFuc2lvbjoKKyAgICAgICAgdGV4
dEJveC5zZXRDYW5IYXZlVHJhaWxpbmdFeHBhbnNpb24oZmFsc2UpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEFsbG93VHJhaWxpbmdFeHBhbnNpb246CisgICAgICAgIHRleHRCb3guc2V0Q2Fu
SGF2ZVRyYWlsaW5nRXhwYW5zaW9uKHRydWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
fQorCitzdGF0aWMgYm9vbCBpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFy
Z2luKGNvbnN0IFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIGNvbnN0IElubGluZUJveCYgYm94KQor
eworICAgIGJvb2wgaXNMVFIgPSBibG9jay5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSBib3gucGFyZW50KCk7IGN1cnJlbnRCb3g7
IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wYXJlbnQoKSkgeworICAgICAgICBpZiAoKGlzTFRS
ICYmIGN1cnJlbnRCb3gtPm1hcmdpbkJvcmRlclBhZGRpbmdMb2dpY2FsTGVmdCgpID4gMCkKKyAg
ICAgICAgICAgIHx8ICghaXNMVFIgJiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xv
Z2ljYWxSaWdodCgpID4gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpbmxpbmVBbmNlc3Rvckhhc0VuZEJvcmRl
clBhZGRpbmdPck1hcmdpbihjb25zdCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBJbmxp
bmVCb3gmIGJveCkKK3sKKyAgICBib29sIGlzTFRSID0gYmxvY2suc3R5bGUoKS5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCk7CisgICAgZm9yIChhdXRvKiBjdXJyZW50Qm94ID0gYm94LnBhcmVudCgp
OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+cGFyZW50KCkpIHsKKyAgICAg
ICAgaWYgKChpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9naWNhbFJp
Z2h0KCkgPiAwKQorICAgICAgICAgICAgfHwgKCFpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5C
b3JkZXJQYWRkaW5nTG9naWNhbExlZnQoKSA+IDApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKyAgICAKK3N0YXRpYyBib29sIGlzTGFzdElu
Rmxvd1J1bihCaWRpUnVuJiBydW5Ub0NoZWNrKQoreworICAgIGZvciAoYXV0byogcnVuID0gcnVu
VG9DaGVjay5uZXh0KCk7IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAgICAgaWYgKCFy
dW4tPmJveCgpIHx8IHJ1bi0+cmVuZGVyZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBy
dW4tPmJveCgpLT5pc0xpbmVCcmVhaygpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisgICAgCitCaWRpUnVu
KiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdt
ZW50KFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgVGV4
dEFsaWduTW9kZSB0ZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwgCisgICAgZmxvYXQmIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5n
U3BhY2VSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1h
cCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsCisgICAgV29y
ZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBib29sIG5lZWRzV29yZFNw
YWNpbmcgPSBmYWxzZTsKKyAgICBib29sIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgPSBzdHls
ZSgpLmhhbmdpbmdQdW5jdHVhdGlvbigpLmNvbnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6Rmly
c3QpOworICAgIGJvb2wgY2FuSGFuZ1B1bmN0dWF0aW9uQXRFbmQgPSBzdHlsZSgpLmhhbmdpbmdQ
dW5jdHVhdGlvbigpLmNvbnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6TGFzdCk7CisgICAgYm9v
bCBpc0xUUiA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAgIGZsb2F0IHRv
dGFsTG9naWNhbFdpZHRoID0gbGluZUJveC0+Z2V0Rmxvd1NwYWNpbmdMb2dpY2FsV2lkdGgoKTsK
KyAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKKyAgICBib29sIGlz
QWZ0ZXJFeHBhbnNpb24gPSBpczxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpID8gZG93bmNhc3Q8UmVu
ZGVyUnVieUJhc2U+KCp0aGlzKS5pc0FmdGVyRXhwYW5zaW9uKCkgOiB0cnVlOworICAgIFZlY3Rv
cjx1bnNpZ25lZCwgMTY+IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXM7CisKKyAgICBCaWRpUnVuKiBy
dW4gPSBmaXJzdFJ1bjsKKyAgICBCaWRpUnVuKiBwcmV2aW91c1J1biA9IG51bGxwdHI7CisgICAg
Zm9yICg7IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAgICAgYXV0byBjb21wdXRlRXhw
YW5zaW9uT3Bwb3J0dW5pdGllcyA9IFsmZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgJmV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQsIHRleHRBbGlnbiwgJmlzQWZ0ZXJFeHBhbnNpb25dIChSZW5kZXJC
bG9ja0Zsb3cmIGJsb2NrLAorICAgICAgICAgICAgSW5saW5lVGV4dEJveCYgdGV4dEJveCwgQmlk
aVJ1biogcHJldmlvdXNSdW4sIEJpZGlSdW4qIG5leHRSdW4sIGNvbnN0IFN0cmluZ1ZpZXcmIHN0
cmluZ1ZpZXcsIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAg
ICBpZiAoc3RyaW5nVmlldy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBFbXB0eSBy
dW5zIHNob3VsZCBzdGlsbCBwcm9kdWNlIGFuIGVudHJ5IGluIGV4cGFuc2lvbk9wcG9ydHVuaXRp
ZXMgbGlzdCBzbyB0aGF0IHRoZSBudW1iZXIgb2YgaXRlbXMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9m
IHJ1bnMuCisgICAgICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hcHBlbmQoMCk7
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhw
YW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IgPSBleHBhbnNpb25CZWhhdmlvckZvcklu
bGluZVRleHRCb3goYmxvY2ssIHRleHRCb3gsIHByZXZpb3VzUnVuLCBuZXh0UnVuLCB0ZXh0QWxp
Z24sIGlzQWZ0ZXJFeHBhbnNpb24pOworICAgICAgICAgICAgYXBwbHlFeHBhbnNpb25CZWhhdmlv
cih0ZXh0Qm94LCBleHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgICAgICB1bnNpZ25lZCBvcHBv
cnR1bml0aWVzSW5SdW47CisgICAgICAgICAgICBzdGQ6OnRpZShvcHBvcnR1bml0aWVzSW5SdW4s
IGlzQWZ0ZXJFeHBhbnNpb24pID0gRm9udENhc2NhZGU6OmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQoc3RyaW5nVmlldywgZGlyZWN0aW9uLCBleHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgICAg
ICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmFwcGVuZChvcHBvcnR1bml0aWVzSW5SdW4pOworICAg
ICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCArPSBvcHBvcnR1bml0aWVzSW5SdW47
CisgICAgICAgIH07CisgICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4tPnJlbmRlcmVyKCku
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgcnVuLT5ib3goKS0+aXNMaW5lQnJlYWsoKSkgewor
ICAgICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0
aWNpcGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgICAvLyBj
b3JyZWN0IHN0YXRpYyB4IHBvc2l0aW9uLiAgVGhleSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lk
dGguCisgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBsaW5lIGJyZWFrIGJveGVz
IGhhdmUgbm8gZWZmZWN0IG9uIHRoZSB3aWR0aC4KKyAgICAgICAgfQorICAgICAgICBpZiAoaXM8
UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkgeworICAgICAgICAgICAgYXV0byYgcmVuZGVy
VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSk7CisgICAgICAgICAg
ICBhdXRvJiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpOwor
ICAgICAgICAgICAgaWYgKGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgJiYgbGluZUluZm8uaXNG
aXJzdExpbmUoKSAmJiAoaXNMVFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQorICAgICAgICAg
ICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0
aGlzLCAqcnVuLT5ib3goKSkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBoYW5nU3RhcnRXaWR0
aCA9IHJlbmRlclRleHQuaGFuZ2FibGVQdW5jdHVhdGlvblN0YXJ0V2lkdGgocnVuLT5tX3N0YXJ0
KTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ1N0YXJ0V2lk
dGg7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KQorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsTGVmdCAtPSBoYW5nU3RhcnRXaWR0aDsKKyAg
ICAgICAgICAgICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25B
dEVuZCAmJiBsaW5lSW5mby5pc0xhc3RMaW5lKCkgJiYgcnVuLT5tX3N0b3AgPiAwICYmICghaXNM
VFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQorICAgICAgICAgICAgICAgICYmICFpbmxpbmVB
bmNlc3Rvckhhc0VuZEJvcmRlclBhZGRpbmdPck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7
CisgICAgICAgICAgICAgICAgZmxvYXQgaGFuZ0VuZFdpZHRoID0gcmVuZGVyVGV4dC5oYW5nYWJs
ZVB1bmN0dWF0aW9uRW5kV2lkdGgocnVuLT5tX3N0b3AgLSAxKTsKKyAgICAgICAgICAgICAgICBh
dmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ0VuZFdpZHRoOworICAgICAgICAgICAgICAgIGlm
ICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgICAg
IGxvZ2ljYWxMZWZ0IC09IGhhbmdFbmRXaWR0aDsKKyAgICAgICAgICAgICAgICBjYW5IYW5nUHVu
Y3R1YXRpb25BdEVuZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9
IHRyYWlsaW5nU3BhY2VSdW4pCisgICAgICAgICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9y
dHVuaXRpZXMoKnRoaXMsIHRleHRCb3gsIHByZXZpb3VzUnVuLCBydW4tPm5leHQoKSwgcmVuZGVy
VGV4dC5zdHJpbmdWaWV3KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3ApLCBydW4tPmJveCgpLT5k
aXJlY3Rpb24oKSk7CisKKyAgICAgICAgICAgIGlmICh1bnNpZ25lZCBsZW5ndGggPSByZW5kZXJU
ZXh0LnRleHQoKS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGlmICghcnVuLT5tX3N0YXJ0
ICYmIG5lZWRzV29yZFNwYWNpbmcgJiYgaXNTcGFjZU9yTmV3bGluZShyZW5kZXJUZXh0LmNoYXJh
Y3RlckF0KHJ1bi0+bV9zdGFydCkpKQorICAgICAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxX
aWR0aCArPSBsaW5lU3R5bGUoKnJlbmRlclRleHQucGFyZW50KCksIGxpbmVJbmZvKS5mb250Q2Fz
Y2FkZSgpLndvcmRTcGFjaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gcnVuLT5tX3N0YXJ0ID09
IHJ1bi0+bV9zdG9wIHNob3VsZCBvbmx5IGJlIHRydWUgaWZmIHRoZSBydW4gaXMgYSByZXBsYWNl
ZCBydW4gZm9yIGJpZGk6IGlzb2xhdGUuCisgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi0+bV9z
dG9wID4gMCB8fCBydW4tPm1fc3RhcnQgPT0gcnVuLT5tX3N0b3ApOworICAgICAgICAgICAgICAg
IG5lZWRzV29yZFNwYWNpbmcgPSBydW4tPm1fc3RvcCA9PSBsZW5ndGggJiYgIWlzU3BhY2VPck5l
d2xpbmUocmVuZGVyVGV4dC5jaGFyYWN0ZXJBdChydW4tPm1fc3RvcCAtIDEpKTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgc2V0TG9naWNhbFdpZHRoRm9yVGV4dFJ1bihsaW5lQm94LCBy
dW4sIHJlbmRlclRleHQsIHRvdGFsTG9naWNhbFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFN
YXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7Cisg
ICAgICAgICAgICBib29sIGVuY291bnRlcmVkSnVzdGlmaWVkUnVieSA9IGZhbHNlOworICAgICAg
ICAgICAgaWYgKGlzPFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSkgJiYgdGV4dEFsaWdu
ID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5nU3BhY2VSdW4gJiYg
ZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpKSB7Cisg
ICAgICAgICAgICAgICAgYXV0byogcnVieUJhc2UgPSBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihy
dW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJ1YnlCYXNl
LT5maXJzdFJvb3RCb3goKSAmJiAhcnVieUJhc2UtPmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJv
eCgpICYmIHJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJ1YnlCYXNlLT5zZXRJc0FmdGVyRXhwYW5zaW9uKGlzQWZ0ZXJF
eHBhbnNpb24pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1
YnlCYXNlLT5maXJzdFJvb3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKTsgbGVhZkNoaWxkOyBsZWFm
Q2hpbGQgPSBsZWFmQ2hpbGQtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFpczxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRl
cmVkSnVzdGlmaWVkUnVieSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRl
RXhwYW5zaW9uT3Bwb3J0dW5pdGllcygqcnVieUJhc2UsIGRvd25jYXN0PElubGluZVRleHRCb3g+
KCpsZWFmQ2hpbGQpLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KGxlYWZDaGlsZC0+cmVuZGVyZXIoKSkuc3RyaW5nVmll
dygpLCBsZWFmQ2hpbGQtPmRpcmVjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFlbmNvdW50
ZXJlZEp1c3RpZmllZFJ1YnkpCisgICAgICAgICAgICAgICAgaXNBZnRlckV4cGFuc2lvbiA9IGZh
bHNlOworCisgICAgICAgICAgICBpZiAoIWlzPFJlbmRlcklubGluZT4ocnVuLT5yZW5kZXJlcigp
KSkgeworICAgICAgICAgICAgICAgIGF1dG8mIHJlbmRlckJveCA9IGRvd25jYXN0PFJlbmRlckJv
eD4ocnVuLT5yZW5kZXJlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXM8UmVuZGVyUnVieVJ1
bj4ocmVuZGVyQm94KSkKKyAgICAgICAgICAgICAgICAgICAgc2V0TWFyZ2luc0ZvclJ1YnlSdW4o
cnVuLCBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihyZW5kZXJCb3gpLCBwcmV2aW91c1J1biA/ICZw
cmV2aW91c1J1bi0+cmVuZGVyZXIoKSA6IG51bGxwdHIsIGxpbmVJbmZvKTsKKyAgICAgICAgICAg
ICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoRm9yQ2hpbGQocmVu
ZGVyQm94KSk7CisgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gbWFyZ2luU3Rh
cnRGb3JDaGlsZChyZW5kZXJCb3gpICsgbWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyQm94KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IHJ1
bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICBwcmV2aW91c1J1biA9IHJ1bjsKKyAg
ICB9CisKKyAgICBpZiAoaXNBZnRlckV4cGFuc2lvbiAmJiAhZXhwYW5zaW9uT3Bwb3J0dW5pdGll
cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gRklYTUU6IHNlZSA8d2Via2l0Lm9yZy9iLzEzOTM5
MyNjMTE+CisgICAgICAgIGludCBsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgg
PSBleHBhbnNpb25PcHBvcnR1bml0aWVzLnNpemUoKSAtIDE7CisgICAgICAgIHdoaWxlIChsYXN0
VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXggPj0gMCAmJiAhZXhwYW5zaW9uT3Bwb3J0
dW5pdGllcy5hdChsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgpKQorICAgICAg
ICAgICAgLS1sYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXg7CisgICAgICAgIGlm
IChsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXggPj0gMCkgeworICAgICAgICAg
ICAgQVNTRVJUKGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXQobGFzdFZhbGlkRXhwYW5zaW9uT3Bw
b3J0dW5pdGllc0luZGV4KSk7CisgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmF0
KGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCktLTsKKyAgICAgICAgICAgIGV4
cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChp
czxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpICYmICFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQor
ICAgICAgICB0ZXh0QWxpZ24gPSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI7CisKKyAgICB1cGRhdGVM
b2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBsaW5lQm94LCB0cmFpbGluZ1NwYWNl
UnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCwgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7CisKKyAgICBjb21wdXRlRXhwYW5zaW9uRm9y
SnVzdGlmaWVkVGV4dChmaXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgZXhwYW5zaW9uT3Bwb3J0
dW5pdGllcywgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisKKyAgICByZXR1cm4gcnVuOworfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6cmVtb3ZlSW5saW5lQm94KEJpZGlSdW4mIHJ1biwgY29uc3QgUm9vdElubGlu
ZUJveCYgcm9vdExpbmVCb3gpIGNvbnN0Cit7CisgICAgYXV0byogaW5saW5lQm94ID0gcnVuLmJv
eCgpOworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBhdXRvKiBpbmxpbmVQYXJlbnQgPSBpbmxp
bmVCb3gtPnBhcmVudCgpOworICAgIHdoaWxlIChpbmxpbmVQYXJlbnQgJiYgaW5saW5lUGFyZW50
ICE9ICZyb290TGluZUJveCkgeworICAgICAgICBBU1NFUlQoIWlubGluZVBhcmVudC0+aXNEaXJ0
eSgpKTsKKyAgICAgICAgaW5saW5lUGFyZW50ID0gaW5saW5lUGFyZW50LT5wYXJlbnQoKTsKKyAg
ICB9CisgICAgQVNTRVJUKCFyb290TGluZUJveC5pc0RpcnR5KCkpOworI2VuZGlmCisgICAgYXV0
byogcGFyZW50ID0gaW5saW5lQm94LT5wYXJlbnQoKTsKKyAgICBpbmxpbmVCb3gtPnJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIGF1dG8mIHJlbmRlcmVyID0gcnVuLnJlbmRlcmVyKCk7CisgICAg
aWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkKKyAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4
dD4ocmVuZGVyZXIpLnJlbW92ZVRleHRCb3goZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKmlubGlu
ZUJveCkpOworICAgIGRlbGV0ZSBpbmxpbmVCb3g7CisgICAgcnVuLnNldEJveChudWxscHRyKTsK
KyAgICAvLyByZW1vdmVGcm9tUGFyZW50KCkgdW5uZWNlc3NhcmlseSBkaXJ0aWVzIHRoZSBhbmNl
c3RvciBzdWJ0cmVlLgorICAgIGF1dG8qIGFuY2VzdG9yID0gcGFyZW50OworICAgIHdoaWxlIChh
bmNlc3RvcikgeworICAgICAgICBhbmNlc3Rvci0+bWFya0RpcnR5KGZhbHNlKTsKKyAgICAgICAg
aWYgKGFuY2VzdG9yID09ICZyb290TGluZUJveCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBhbmNlc3RvciA9IGFuY2VzdG9yLT5wYXJlbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVy
QmxvY2tGbG93Ojpjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGlj
YWxQb3NpdGlvbkNhY2hlKQoreworICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25C
b3hlc0luQmxvY2tEaXJlY3Rpb24obG9naWNhbEhlaWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVy
dGljYWxQb3NpdGlvbkNhY2hlKSk7CisKKyAgICAvLyBOb3cgbWFrZSBzdXJlIHdlIHBsYWNlIHJl
cGxhY2VkIHJlbmRlciBvYmplY3RzIGNvcnJlY3RseS4KKyAgICBmb3IgKGF1dG8qIHJ1biA9IGZp
cnN0UnVuOyBydW47IHJ1biA9IHJ1bi0+bmV4dCgpKSB7CisgICAgICAgIEFTU0VSVChydW4tPmJv
eCgpKTsKKyAgICAgICAgaWYgKCFydW4tPmJveCgpKQorICAgICAgICAgICAgY29udGludWU7IC8v
IFNraXAgcnVucyB3aXRoIG5vIGxpbmUgYm94ZXMuCisKKyAgICAgICAgLy8gQWxpZ24gcG9zaXRp
b25lZCBib3hlcyB3aXRoIHRoZSB0b3Agb2YgdGhlIGxpbmUgYm94LiAgVGhpcyBpcworICAgICAg
ICAvLyBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBvZiBhbiBhcHByb3ByaWF0ZSB5IHBvc2l0
aW9uLgorICAgICAgICBhdXRvJiByZW5kZXJlciA9IHJ1bi0+cmVuZGVyZXIoKTsKKyAgICAgICAg
aWYgKHJlbmRlcmVyLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgcnVuLT5i
b3goKS0+c2V0TG9naWNhbFRvcChsb2dpY2FsSGVpZ2h0KCkpOworCisgICAgICAgIC8vIFBvc2l0
aW9uIGlzIHVzZWQgdG8gcHJvcGVybHkgcG9zaXRpb24gYm90aCByZXBsYWNlZCBlbGVtZW50cyBh
bmQKKyAgICAgICAgLy8gdG8gdXBkYXRlIHRoZSBzdGF0aWMgbm9ybWFsIGZsb3cgeC95IG9mIHBv
c2l0aW9uZWQgZWxlbWVudHMuCisgICAgICAgIGJvb2wgaW5saW5lQm94SXNSZWR1bmRhbnQgPSBm
YWxzZTsKKyAgICAgICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkgeworICAgICAgICAg
ICAgYXV0byYgaW5saW5lVGV4dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+KCpydW4tPmJv
eCgpKTsKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKS5wb3NpdGlv
bkxpbmVCb3goaW5saW5lVGV4dEJveCk7CisgICAgICAgICAgICBpbmxpbmVCb3hJc1JlZHVuZGFu
dCA9ICFpbmxpbmVUZXh0Qm94Lmhhc1RleHRDb250ZW50KCk7CisgICAgICAgIH0gZWxzZSBpZiAo
aXM8UmVuZGVyQm94PihyZW5kZXJlcikpIHsKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJv
eD4ocmVuZGVyZXIpLnBvc2l0aW9uTGluZUJveChkb3duY2FzdDxJbmxpbmVFbGVtZW50Qm94Pigq
cnVuLT5ib3goKSkpOworICAgICAgICAgICAgaW5saW5lQm94SXNSZWR1bmRhbnQgPSByZW5kZXJl
ci5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJM
aW5lQnJlYWs+KHJlbmRlcmVyKSkKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckxpbmVCcmVh
az4ocmVuZGVyZXIpLnJlcGxhY2VJbmxpbmVCb3hXcmFwcGVyKGRvd25jYXN0PElubGluZUVsZW1l
bnRCb3g+KCpydW4tPmJveCgpKSk7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8ga2Vl
cCB0aGlzIGJveCBvbiB0aGUgbGluZSBhdCBhbGwuCisgICAgICAgIGlmIChpbmxpbmVCb3hJc1Jl
ZHVuZGFudCkKKyAgICAgICAgICAgIHJlbW92ZUlubGluZUJveCgqcnVuLCAqbGluZUJveCk7Cisg
ICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNo
YXJhY3RlciwgY29uc3QgUmVuZGVyVGV4dCYgcmVuZGVyZXIpCit7CisgICAgaWYgKGNoYXJhY3Rl
ciA9PSAnICcgfHwgY2hhcmFjdGVyID09ICdcdCcgfHwgY2hhcmFjdGVyID09IHNvZnRIeXBoZW4p
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykKKyAgICAg
ICAgcmV0dXJuICFyZW5kZXJlci5zdHlsZSgpLnByZXNlcnZlTmV3bGluZSgpOworICAgIGlmIChj
aGFyYWN0ZXIgPT0gbm9CcmVha1NwYWNlKQorICAgICAgICByZXR1cm4gcmVuZGVyZXIuc3R5bGUo
KS5uYnNwTW9kZSgpID09IE5CU1BNb2RlOjpTcGFjZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPgorc3RhdGljIGlubGluZSB1bnNpZ25l
ZCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGNvbnN0IFJlbmRlclRleHQmIGxhc3RUZXh0LCBjb25z
dCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3Rv
cCkKK3sKKyAgICB1bnNpZ25lZCBmaXJzdFNwYWNlID0gc3RvcDsKKyAgICB3aGlsZSAoZmlyc3RT
cGFjZSA+IHN0YXJ0KSB7CisgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0
U3BhY2UgLSAxXTsKKyAgICAgICAgaWYgKCFpc0NvbGxhcHNpYmxlU3BhY2UoY3VycmVudCwgbGFz
dFRleHQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpcnN0U3BhY2UtLTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmlyc3RTcGFjZTsKK30KKworaW5saW5lIEJpZGlSdW4qIFJlbmRlckJs
b2NrRmxvdzo6aGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlS
dW5zLCBCaWRpQ29udGV4dCogY3VycmVudENvbnRleHQpCit7CisgICAgaWYgKCFiaWRpUnVucy5y
dW5Db3VudCgpCisgICAgICAgIHx8ICFiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRl
cmVyKCkuc3R5bGUoKS5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKQorICAgICAgICB8fCAhYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpLnN0eWxlKCkuYXV0b1dyYXAoKSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVu
ID0gYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpOworICAgIGNvbnN0IFJlbmRlck9iamVjdCYg
bGFzdE9iamVjdCA9IHRyYWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCk7CisgICAgaWYgKCFpczxS
ZW5kZXJUZXh0PihsYXN0T2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBj
b25zdCBSZW5kZXJUZXh0JiBsYXN0VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KGxhc3RPYmpl
Y3QpOworICAgIHVuc2lnbmVkIGZpcnN0U3BhY2U7CisgICAgaWYgKGxhc3RUZXh0LnRleHQoKS5p
czhCaXQoKSkKKyAgICAgICAgZmlyc3RTcGFjZSA9IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UobGFz
dFRleHQsIGxhc3RUZXh0LnRleHQoKS5jaGFyYWN0ZXJzOCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5z
dGFydCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdG9wKCkpOworICAgIGVsc2UKKyAgICAgICAgZmly
c3RTcGFjZSA9IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UobGFzdFRleHQsIGxhc3RUZXh0LnRleHQo
KS5jaGFyYWN0ZXJzMTYoKSwgdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSwgdHJhaWxpbmdTcGFj
ZVJ1bi0+c3RvcCgpKTsKKworICAgIGlmIChmaXJzdFNwYWNlID09IHRyYWlsaW5nU3BhY2VSdW4t
PnN0b3AoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBUZXh0RGlyZWN0aW9uIGRp
cmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgYm9vbCBzaG91bGRSZW9yZGVyID0g
dHJhaWxpbmdTcGFjZVJ1biAhPSAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUiA/IGJp
ZGlSdW5zLmxhc3RSdW4oKSA6IGJpZGlSdW5zLmZpcnN0UnVuKCkpOworICAgIGlmIChmaXJzdFNw
YWNlICE9IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKKyAgICAgICAgQmlkaUNvbnRleHQq
IGJhc2VDb250ZXh0ID0gY3VycmVudENvbnRleHQ7CisgICAgICAgIHdoaWxlIChCaWRpQ29udGV4
dCogcGFyZW50ID0gYmFzZUNvbnRleHQtPnBhcmVudCgpKQorICAgICAgICAgICAgYmFzZUNvbnRl
eHQgPSBwYXJlbnQ7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJpZGlSdW4+IG5ld1RyYWls
aW5nUnVuID0gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihmaXJzdFNwYWNlLCB0cmFpbGluZ1Nw
YWNlUnVuLT5tX3N0b3AsIHRyYWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCksIGJhc2VDb250ZXh0
LCBVX09USEVSX05FVVRSQUwpOworICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0b3AgPSBm
aXJzdFNwYWNlOworICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3VHJhaWxpbmdSdW4uZ2V0
KCk7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQorICAgICAg
ICAgICAgYmlkaVJ1bnMuYXBwZW5kUnVuKFdURk1vdmUobmV3VHJhaWxpbmdSdW4pKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgYmlkaVJ1bnMucHJlcGVuZFJ1bihXVEZNb3ZlKG5ld1RyYWls
aW5nUnVuKSk7CisgICAgICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOworICAgIH0KKyAgICBp
ZiAoIXNob3VsZFJlb3JkZXIpCisgICAgICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOworCisg
ICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpIHsKKyAgICAgICAgYmlkaVJ1
bnMubW92ZVJ1blRvRW5kKHRyYWlsaW5nU3BhY2VSdW4pOworICAgICAgICB0cmFpbGluZ1NwYWNl
UnVuLT5tX2xldmVsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBiaWRpUnVucy5tb3ZlUnVu
VG9CZWdpbm5pbmcodHJhaWxpbmdTcGFjZVJ1bik7CisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4t
Pm1fbGV2ZWwgPSAxOworICAgIH0KKyAgICByZXR1cm4gdHJhaWxpbmdTcGFjZVJ1bjsKK30KKwor
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9h
dGluZ09iamVjdCYgZmxvYXRpbmdPYmplY3QpCit7CisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlf
SU1QTElDQVRJT04oIWZsb2F0aW5nT2JqZWN0Lm9yaWdpbmF0aW5nTGluZSgpKTsKKyAgICBBU1NF
UlQobGFzdFJvb3RCb3goKSk7CisgICAgZmxvYXRpbmdPYmplY3Quc2V0T3JpZ2luYXRpbmdMaW5l
KCpsYXN0Um9vdEJveCgpKTsKKyAgICBsYXN0Um9vdEJveCgpLT5hcHBlbmRGbG9hdChmbG9hdGlu
Z09iamVjdC5yZW5kZXJlcigpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5vdGlmeVJlc29s
dmVyVG9SZXN1bWVJbklzb2xhdGUoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgUmVuZGVy
T2JqZWN0KiByb290LCBSZW5kZXJPYmplY3QqIHN0YXJ0T2JqZWN0KQoreworICAgIGlmIChyb290
ICE9IHN0YXJ0T2JqZWN0KSB7CisgICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50ID0gc3RhcnRP
YmplY3QtPnBhcmVudCgpOworICAgICAgICBub3RpZnlSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRl
KHJlc29sdmVyLCByb290LCBwYXJlbnQpOworICAgICAgICBub3RpZnlPYnNlcnZlckVudGVyZWRP
YmplY3QoJnJlc29sdmVyLCBzdGFydE9iamVjdCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgc2V0VXBSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRlKElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVzb2x2ZXIsIEJpZGlSdW4mIGlzb2xh
dGVkUnVuLCBSZW5kZXJPYmplY3QqIHJvb3QsIFJlbmRlck9iamVjdCogc3RhcnRPYmplY3QpCit7
CisgICAgLy8gU2V0IHVwIG1fd2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZQorICAgIHJlc29sdmVy
LndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKSA9IHRvcFJlc29sdmVyLndoaXRlc3BhY2VDb2xs
YXBzaW5nU3RhdGUoKTsKKyAgICByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCku
c2V0Q3VycmVudFRyYW5zaXRpb24odG9wUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFu
c2l0aW9uRm9ySXNvbGF0ZWRSdW4oaXNvbGF0ZWRSdW4pKTsKKworICAgIC8vIFNldCB1cCBtX25l
c3RlZElzb2xhdGVDb3VudAorICAgIG5vdGlmeVJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUocmVz
b2x2ZXIsIHJvb3QsIHN0YXJ0T2JqZWN0KTsKK30KKworLy8gRklYTUU6IEJpZGlSZXNvbHZlciBz
aG91bGQgaGF2ZSB0aGlzIGxvZ2ljLgorc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlS
dW5zRm9yU2VnbWVudChJbmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29sdmVyLCBCaWRpUnVuTGlz
dDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRPZlJ1bnMsIFZp
c3VhbERpcmVjdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSkKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgYSBCaWRpUnVuTGlzdCBpbnRv
IGNyZWF0ZUJpZGlSdW5zRm9yTGluZSBpbnN0ZWFkCisgICAgLy8gb2YgdGhlIHJlc29sdmVyIG93
bmluZyB0aGUgcnVucy4KKyAgICBBU1NFUlQoJnRvcFJlc29sdmVyLnJ1bnMoKSA9PSAmYmlkaVJ1
bnMpOworICAgIEFTU0VSVCh0b3BSZXNvbHZlci5wb3NpdGlvbigpICE9IGVuZE9mUnVucyk7Cisg
ICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50Um9vdCA9IHRvcFJlc29sdmVyLnBvc2l0aW9uKCkucm9v
dCgpOworICAgIHRvcFJlc29sdmVyLmNyZWF0ZUJpZGlSdW5zRm9yTGluZShlbmRPZlJ1bnMsIG92
ZXJyaWRlLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOworCisgICAgd2hpbGUgKCF0b3BSZXNv
bHZlci5pc29sYXRlZFJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSXQgZG9lcyBub3Qg
bWF0dGVyIHdoaWNoIG9yZGVyIHdlIHJlc29sdmUgdGhlIHJ1bnMgYXMgbG9uZyBhcyB3ZSByZXNv
bHZlIHRoZW0gYWxsLgorICAgICAgICBhdXRvIGlzb2xhdGVkUnVuID0gV1RGTW92ZSh0b3BSZXNv
bHZlci5pc29sYXRlZFJ1bnMoKS5sYXN0KCkpOworICAgICAgICB0b3BSZXNvbHZlci5pc29sYXRl
ZFJ1bnMoKS5yZW1vdmVMYXN0KCk7CisgICAgICAgIGN1cnJlbnRSb290ID0gJmlzb2xhdGVkUnVu
LnJvb3Q7CisKKyAgICAgICAgUmVuZGVyT2JqZWN0JiBzdGFydE9iamVjdCA9IGlzb2xhdGVkUnVu
Lm9iamVjdDsKKworICAgICAgICAvLyBPbmx5IGlubGluZXMgbWFrZSBzZW5zZSB3aXRoIHVuaWNv
ZGUtYmlkaTogaXNvbGF0ZSAoYmxvY2tzIGFyZSBhbHJlYWR5IGlzb2xhdGVkKS4KKyAgICAgICAg
Ly8gRklYTUU6IEJlY2F1c2UgZW50ZXJJc29sYXRlIGlzIG5vdCBwYXNzZWQgYSBSZW5kZXJPYmpl
Y3QsIHdlIGhhdmUgdG8gY3Jhd2wgdXAgdGhlCisgICAgICAgIC8vIHRyZWUgdG8gc2VlIHdoaWNo
IHBhcmVudCBpbmxpbmUgaXMgdGhlIGlzb2xhdGUuIFdlIGNvdWxkIGNoYW5nZSBlbnRlcklzb2xh
dGUKKyAgICAgICAgLy8gdG8gdGFrZSBhIFJlbmRlck9iamVjdCBhbmQgZG8gdGhpcyBsb2dpYyB0
aGVyZSwgYnV0IHRoYXQgd291bGQgYmUgYSBsYXllcmluZworICAgICAgICAvLyB2aW9sYXRpb24g
Zm9yIEJpZGlSZXNvbHZlciAod2hpY2gga25vd3Mgbm90aGluZyBhYm91dCBSZW5kZXJPYmplY3Qp
LgorICAgICAgICBSZW5kZXJJbmxpbmUqIGlzb2xhdGVkSW5saW5lID0gZG93bmNhc3Q8UmVuZGVy
SW5saW5lPihoaWdoZXN0Q29udGFpbmluZ0lzb2xhdGVXaXRoaW5Sb290KHN0YXJ0T2JqZWN0LCBj
dXJyZW50Um9vdCkpOworICAgICAgICBBU1NFUlQoaXNvbGF0ZWRJbmxpbmUpOworCisgICAgICAg
IElubGluZUJpZGlSZXNvbHZlciBpc29sYXRlZFJlc29sdmVyOworICAgICAgICBFVW5pY29kZUJp
ZGkgdW5pY29kZUJpZGkgPSBpc29sYXRlZElubGluZS0+c3R5bGUoKS51bmljb2RlQmlkaSgpOwor
ICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbjsKKyAgICAgICAgaWYgKHVuaWNvZGVCaWRp
ID09IFBsYWludGV4dCkKKyAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRpcmVj
dGlvbiwgSW5saW5lSXRlcmF0b3IoaXNvbGF0ZWRJbmxpbmUsICZpc29sYXRlZFJ1bi5vYmplY3Qs
IDApKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQodW5pY29kZUJpZGkgPT0g
SXNvbGF0ZSB8fCB1bmljb2RlQmlkaSA9PSBJc29sYXRlT3ZlcnJpZGUpOworICAgICAgICAgICAg
ZGlyZWN0aW9uID0gaXNvbGF0ZWRJbmxpbmUtPnN0eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgICAg
IH0KKyAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5zZXRTdGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rp
b24sIGlzT3ZlcnJpZGUodW5pY29kZUJpZGkpKSk7CisKKyAgICAgICAgc2V0VXBSZXNvbHZlclRv
UmVzdW1lSW5Jc29sYXRlKGlzb2xhdGVkUmVzb2x2ZXIsIHRvcFJlc29sdmVyLCBpc29sYXRlZFJ1
bi5ydW5Ub1JlcGxhY2UsIGlzb2xhdGVkSW5saW5lLCAmc3RhcnRPYmplY3QpOworCisgICAgICAg
IC8vIFRoZSBzdGFydGluZyBwb3NpdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBy
dW4gd2l0aGluIHRoZSBpc29sYXRlIHRoYXQgd2FzIGlkZW50aWZpZWQKKyAgICAgICAgLy8gZHVy
aW5nIHRoZSBlYXJsaWVyIGNhbGwgdG8gY3JlYXRlQmlkaVJ1bnNGb3JMaW5lLiBUaGlzIGNhbiBi
ZSBidXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZQorICAgICAgICAvLyBmaXJzdCBydW4gd2l0aGlu
IHRoZSBpc29sYXRlLgorICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0
b3IoaXNvbGF0ZWRJbmxpbmUsICZzdGFydE9iamVjdCwgaXNvbGF0ZWRSdW4ucG9zaXRpb24pOwor
ICAgICAgICBpc29sYXRlZFJlc29sdmVyLnNldFBvc2l0aW9uSWdub3JpbmdOZXN0ZWRJc29sYXRl
cyhpdGVyKTsKKworICAgICAgICAvLyBXZSBzdG9wIGF0IHRoZSBuZXh0IGVuZCBvZiBsaW5lOyB3
ZSBtYXkgcmUtZW50ZXIgdGhpcyBpc29sYXRlIGluIHRoZSBuZXh0IGNhbGwgdG8gY29uc3RydWN0
QmlkaVJ1bnMoKS4KKyAgICAgICAgLy8gRklYTUU6IFdoYXQgc2hvdWxkIGVuZCBhbmQgcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5IGJlPworICAgICAgICAvLyBybml3YSBzYXlzIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSBpcyBqdXN0IGEgV2luSUUgaGFjayBhbmQgY291bGQgYWx3YXlzIGJlIGZh
bHNlIGhlcmU/CisgICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuY3JlYXRlQmlkaVJ1bnNGb3JMaW5l
KGVuZE9mUnVucywgTm9WaXN1YWxPdmVycmlkZSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsK
KyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBkZWxldGUgdGhlIHJ1bnMgZnJvbSB0aGUg
cmVzb2x2ZXIuCisgICAgICAgIC8vIFdlJ3JlIG5vdCBndWFyYW50ZWVkIHRvIGdldCBhbnkgQmlk
aVJ1bnMgaW4gdGhlIHByZXZpb3VzIHN0ZXAuIElmIHdlIGRvbid0LCB3ZSBhbGxvdyB0aGUgcGxh
Y2Vob2xkZXIKKyAgICAgICAgLy8gaXRzZWxmIHRvIGJlIHR1cm5lZCBpbnRvIGFuIElubGluZUJv
eC4gV2UgY2FuJ3QgcmVtb3ZlIGl0IGhlcmUgd2l0aG91dCBwb3RlbnRpYWxseSBsb3NpbmcgdHJh
Y2sgb2YKKyAgICAgICAgLy8gdGhlIGxvZ2ljYWxseSBsYXN0IHJ1bi4KKyAgICAgICAgaWYgKGlz
b2xhdGVkUmVzb2x2ZXIucnVucygpLnJ1bkNvdW50KCkpCisgICAgICAgICAgICBiaWRpUnVucy5y
ZXBsYWNlUnVuV2l0aFJ1bnMoJmlzb2xhdGVkUnVuLnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRSZXNv
bHZlci5ydW5zKCkpOworCisgICAgICAgIC8vIElmIHdlIGVuY291bnRlcmVkIGFueSBuZXN0ZWQg
aXNvbGF0ZSBydW5zLCBqdXN0IG1vdmUgdGhlbQorICAgICAgICAvLyB0byB0aGUgdG9wIHJlc29s
dmVyJ3MgbGlzdCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgd2hpbGUgKCFpc29sYXRl
ZFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byBy
dW5XaXRoQ29udGV4dCA9IFdURk1vdmUoaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5s
YXN0KCkpOworICAgICAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5yZW1v
dmVMYXN0KCk7CisgICAgICAgICAgICB0b3BSZXNvbHZlci5zZXRXaGl0ZXNwYWNlQ29sbGFwc2lu
Z1RyYW5zaXRpb25Gb3JJc29sYXRlZFJ1bihydW5XaXRoQ29udGV4dC5ydW5Ub1JlcGxhY2UsIGlz
b2xhdGVkUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFuc2l0aW9uRm9ySXNvbGF0ZWRS
dW4ocnVuV2l0aENvbnRleHQucnVuVG9SZXBsYWNlKSk7CisgICAgICAgICAgICB0b3BSZXNvbHZl
ci5pc29sYXRlZFJ1bnMoKS5hcHBlbmQoV1RGTW92ZShydW5XaXRoQ29udGV4dCkpOworICAgICAg
ICB9CisgICAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBm
b3IgYWxsIG9mIHRoZSB0ZXh0IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVp
ciBwb3NpdGlvbi4KK1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJv
eGVzRnJvbUJpZGlSdW5zKHVuc2lnbmVkIGJpZGlMZXZlbCwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4m
IGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8s
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0
cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQorewor
ICAgIGlmICghYmlkaVJ1bnMucnVuQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgb25seSBkb25lIHdoZW4gd2UgaGFkIHJ1bnM/Cisg
ICAgbGluZUluZm8uc2V0TGFzdExpbmUoIWVuZC5yZW5kZXJlcigpKTsKKworICAgIFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3ggPSBjb25zdHJ1Y3RMaW5lKGJpZGlSdW5zLCBsaW5lSW5mbyk7CisgICAg
aWYgKCFsaW5lQm94KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGxpbmVCb3gtPnNl
dEJpZGlMZXZlbChiaWRpTGV2ZWwpOworICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsobGlu
ZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpOworICAgIAorICAgIGJvb2wgaXNTVkdS
b290SW5saW5lQm94ID0gaXM8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpOworICAgIAorICAg
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwIHRleHRCb3hEYXRhTWFwOworICAgIAor
ICAgIC8vIE5vdyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHku
CisgICAgaWYgKCFpc1NWR1Jvb3RJbmxpbmVCb3gpCisgICAgICAgIGNvbXB1dGVJbmxpbmVEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGxpbmVJbmZvLCBiaWRpUnVucy5maXJzdFJ1
bigpLCB0cmFpbGluZ1NwYWNlUnVuLCBlbmQuYXRFbmQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgCisgICAgLy8gTm93IHBv
c2l0aW9uIG91ciB0ZXh0IHJ1bnMgdmVydGljYWxseS4KKyAgICBjb21wdXRlQmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGJpZGlSdW5zLmZpcnN0UnVuKCksIHRleHRCb3hE
YXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOworICAgIAorICAgIC8vIFNWRyB0ZXh0IGxh
eW91dCBjb2RlIGNvbXB1dGVzIHZlcnRpY2FsICYgaG9yaXpvbnRhbCBwb3NpdGlvbnMgb24gaXRz
IG93bi4KKyAgICAvLyBOb3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBleGVjdXRlIGNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoKSBhcworICAgIC8vIGl0IGNhbGxzIElubGluZVRleHRC
b3g6OnBvc2l0aW9uTGluZUJveCgpLCB3aGljaCB0cmFja3Mgd2hldGhlciB0aGUgYm94CisgICAg
Ly8gY29udGFpbnMgcmV2ZXJzZWQgdGV4dCBvciBub3QuIElmIHdlIHdvdWxkbid0IGRvIHRoYXQg
ZWRpdGluZyBhbmQgdGh1cworICAgIC8vIHRleHQgc2VsZWN0aW9uIGluIFJUTCBib3hlcyB3b3Vs
ZCBub3Qgd29yayBhcyBleHBlY3RlZC4KKyAgICBpZiAoaXNTVkdSb290SW5saW5lQm94KSB7Cisg
ICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlzU1ZHVGV4dCgpKTsKKyAg
ICAgICAgZG93bmNhc3Q8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpLmNvbXB1dGVQZXJDaGFy
YWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigpOworICAgIH0KKyAgICAKKyAgICAvLyBDb21wdXRlIG91
ciBvdmVyZmxvdyBub3cuCisgICAgbGluZUJveC0+Y29tcHV0ZU92ZXJmbG93KGxpbmVCb3gtPmxp
bmVUb3AoKSwgbGluZUJveC0+bGluZUJvdHRvbSgpLCB0ZXh0Qm94RGF0YU1hcCk7CisgICAgCisg
ICAgcmV0dXJuIGxpbmVCb3g7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZUxpbmVSYW5nZShMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQm94KiBzdGFydExpbmUsIFJvb3RJ
bmxpbmVCb3gqIHN0b3BMaW5lID0gMCkKK3sKKyAgICBSb290SW5saW5lQm94KiBib3hUb0RlbGV0
ZSA9IHN0YXJ0TGluZTsKKyAgICB3aGlsZSAoYm94VG9EZWxldGUgJiYgYm94VG9EZWxldGUgIT0g
c3RvcExpbmUpIHsKKyAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJv
eChib3hUb0RlbGV0ZSk7CisgICAgICAgIC8vIE5vdGU6IGRlbGV0ZUxpbmVSYW5nZShmaXJzdFJv
b3RCb3goKSkgaXMgbm90IGlkZW50aWNhbCB0byBkZWxldGVMaW5lQm94VHJlZSgpLgorICAgICAg
ICAvLyBkZWxldGVMaW5lQm94VHJlZSB1c2VzIG5leHRMaW5lQm94KCkgaW5zdGVhZCBvZiBuZXh0
Um9vdEJveCgpIHdoZW4gdHJhdmVyc2luZy4KKyAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9
IGJveFRvRGVsZXRlLT5uZXh0Um9vdEJveCgpOworICAgICAgICBib3hUb0RlbGV0ZS0+ZGVsZXRl
TGluZSgpOworICAgICAgICBib3hUb0RlbGV0ZSA9IG5leHQ7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCByZXBhaW50RGlydHlGbG9hdHMoTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0
cykKK3sKKyAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVw
YWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQorICAgIC8vIHBhaW50
ZWQgYnkgbm93IGlmIHRoZXkgaGFkIG1vdmVkLCBidXQgaWYgdGhleSBzdGF5ZWQgYXQgKDAsIDAp
LCB0aGV5IHN0aWxsIG5lZWQgdG8gYmUKKyAgICAvLyBwYWludGVkLgorICAgIGZvciAoYXV0byYg
ZmxvYXRCb3ggOiBmbG9hdHMpIHsKKyAgICAgICAgaWYgKGZsb2F0Qm94LT5ldmVySGFkTGF5b3V0
KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXV0byYgYm94ID0gZmxvYXRCb3gt
PnJlbmRlcmVyKCk7CisgICAgICAgIGlmICghYm94LngoKSAmJiAhYm94LnkoKSAmJiBib3guY2hl
Y2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpCisgICAgICAgICAgICBib3gucmVwYWludCgpOwor
ICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHMoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgYm9vbCBoYXNJbmxpbmVDaGlsZCkKK3sKKyAgICAv
LyBXZSB3YW50IHRvIHNraXAgYWhlYWQgdG8gdGhlIGZpcnN0IGRpcnR5IGxpbmUKKyAgICBJbmxp
bmVCaWRpUmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgUm9vdElubGluZUJveCogc3RhcnRMaW5lID0g
ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIpOworICAgIAorICAg
IHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKKyAgICBpZiAoc3RhcnRM
aW5lKSB7CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogbGluZSA9IHN0YXJ0TGluZS0+cHJl
dlJvb3RCb3goKTsgbGluZSAmJiBsaW5lLT5pc0h5cGhlbmF0ZWQoKTsgbGluZSA9IGxpbmUtPnBy
ZXZSb290Qm94KCkpCisgICAgICAgICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcysrOwor
ICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBvdXRzaWRl
IG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBzaW5jZQorICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRp
b24gY2FuIGNoYW5nZSB0aGUgZnVsbExheW91dCBmbGFnIHdlIGhhdmUgdG8gZG8gdGhpcyBoZXJl
LiBGYWlsdXJlIHRvIGNhbGwKKyAgICAvLyBkZXRlcm1pbmVTdGFydFBvc2l0aW9uIGZpcnN0IHdp
bGwgYnJlYWsgZmFzdC9yZXBhaW50L2xpbmUtZmxvdy13aXRoLWZsb2F0cy05Lmh0bWwuCisgICAg
aWYgKGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxm
TmVlZHNMYXlvdXQoKSkgeworICAgICAgICBzZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOyAv
LyBNYXJrIGFzIG5lZWRpbmcgYSBmdWxsIGxheW91dCB0byBmb3JjZSB1cyB0byByZXBhaW50Lgor
ICAgICAgICBpZiAoIXZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubmVlZHNGdWxs
UmVwYWludCgpICYmIGhhc1NlbGZQYWludGluZ0xheWVyKCkgJiYgaGFzUmVwYWludExheW91dFJl
Y3RzKCkpIHsKKyAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2Ugd2FpdGVkIHVudGlsIHdlIHdlcmUg
YWxyZWFkeSBpbnNpZGUgbGF5b3V0IHRvIGRpc2NvdmVyCisgICAgICAgICAgICAvLyB0aGF0IHRo
ZSBibG9jayByZWFsbHkgbmVlZGVkIGEgZnVsbCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNl
IHRvIHJlcGFpbnQgdGhlIGxheWVyCisgICAgICAgICAgICAvLyBiZWZvcmUgbGF5b3V0IHN0YXJ0
ZWQuICBMdWNraWx5IHRoZSBsYXllciBoYXMgY2FjaGVkIHRoZSByZXBhaW50IHJlY3QgZm9yIGl0
cyBvcmlnaW5hbAorICAgICAgICAgICAgLy8gcG9zaXRpb24gYW5kIHNpemUsIGFuZCBzbyB3ZSBj
YW4gdXNlIHRoYXQgdG8gbWFrZSBhIHJlcGFpbnQgaGFwcGVuIG5vdy4KKyAgICAgICAgICAgIHJl
cGFpbnRVc2luZ0NvbnRhaW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIHJlcGFpbnRMYXlvdXRS
ZWN0cygpLm1fcmVwYWludFJlY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnRh
aW5zRmxvYXRzKCkpCisgICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLnNldExhc3RGbG9h
dChtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpKTsKKworICAgIC8vIFdlIGFs
c28gZmluZCB0aGUgZmlyc3QgY2xlYW4gbGluZSBhbmQgZXh0cmFjdCB0aGVzZSBsaW5lcy4gIFdl
IHdpbGwgYWRkIHRoZW0gYmFjaworICAgIC8vIGlmIHdlIGRldGVybWluZSB0aGF0IHdlJ3JlIGFi
bGUgdG8gc3luY2hyb25pemUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBkaXJ0eSBsaW5lcy4KKyAg
ICBJbmxpbmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKKyAgICBCaWRpU3RhdHVzIGNsZWFuTGlu
ZUJpZGlTdGF0dXM7CisgICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAmJiBzdGFy
dExpbmUpCisgICAgICAgIGRldGVybWluZUVuZFBvc2l0aW9uKGxheW91dFN0YXRlLCBzdGFydExp
bmUsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKKworICAgIGlmIChzdGFy
dExpbmUpIHsKKyAgICAgICAgaWYgKCFsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQor
ICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0UmVwYWludFJhbmdlKGxvZ2ljYWxIZWlnaHQoKSk7
CisgICAgICAgIGRlbGV0ZUxpbmVSYW5nZShsYXlvdXRTdGF0ZSwgc3RhcnRMaW5lKTsKKyAgICB9
CisKKyAgICBpZiAoIWxheW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIGxhc3RSb290Qm94KCkg
JiYgbGFzdFJvb3RCb3goKS0+ZW5kc1dpdGhCcmVhaygpKSB7CisgICAgICAgIC8vIElmIHRoZSBs
YXN0IGxpbmUgYmVmb3JlIHRoZSBzdGFydCBsaW5lIGVuZHMgd2l0aCBhIGxpbmUgYnJlYWsgdGhh
dCBjbGVhciBmbG9hdHMsCisgICAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5
LgorICAgICAgICAvLyBBIGxpbmUgYnJlYWsgY2FuIGJlIGVpdGhlciB0aGUgZmlyc3Qgb3IgdGhl
IGxhc3Qgb2JqZWN0IG9uIGEgbGluZSwgZGVwZW5kaW5nIG9uIGl0cyBkaXJlY3Rpb24uCisgICAg
ICAgIGlmIChJbmxpbmVCb3gqIGxhc3RMZWFmQ2hpbGQgPSBsYXN0Um9vdEJveCgpLT5sYXN0TGVh
ZkNoaWxkKCkpIHsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9ICZsYXN0
TGVhZkNoaWxkLT5yZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JS
KCkpCisgICAgICAgICAgICAgICAgbGFzdE9iamVjdCA9ICZsYXN0Um9vdEJveCgpLT5maXJzdExl
YWZDaGlsZCgpLT5yZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzQlIo
KSkgeworICAgICAgICAgICAgICAgIENsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5bGUoKS5j
bGVhcigpOworICAgICAgICAgICAgICAgIGlmIChjbGVhciAhPSBDbGVhcjo6Tm9uZSkKKyAgICAg
ICAgICAgICAgICAgICAgY2xlYXJGbG9hdHMoY2xlYXIpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UobGF5b3V0U3RhdGUs
IHJlc29sdmVyLCBjbGVhbkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cywgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMpOworICAgIGxpbmtUb0VuZExpbmVJZk5lZWRlZChsYXlvdXRTdGF0
ZSk7CisgICAgcmVwYWludERpcnR5RmxvYXRzKGxheW91dFN0YXRlLmZsb2F0TGlzdCgpKTsKK30K
KworLy8gQmVmb3JlIHJlc3RhcnRpbmcgdGhlIGxheW91dCBsb29wIHdpdGggYSBuZXcgbG9naWNh
bEhlaWdodCwgcmVtb3ZlIGFsbCBmbG9hdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCByZXNldCB0aGUg
cmVzb2x2ZXIuCitpbmxpbmUgY29uc3QgSW5saW5lSXRlcmF0b3ImIFJlbmRlckJsb2NrRmxvdzo6
cmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhl
aWdodCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25z
dCBJbmxpbmVJdGVyYXRvciYgb2xkRW5kKQoreworICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0Jl
bG93KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQpOworICAgIHNl
dExvZ2ljYWxIZWlnaHQobmV3TG9naWNhbEhlaWdodCk7CisgICAgcmVzb2x2ZXIuc2V0UG9zaXRp
b25JZ25vcmluZ05lc3RlZElzb2xhdGVzKG9sZEVuZCk7CisgICAgcmV0dXJuIG9sZEVuZDsKK30K
Kwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVM
YXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xl
YW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCit7
CisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlVG9Vc2UgPSBzdHlsZSgpOworICAgIGJvb2wg
cGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0
ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+
aXNQYWdpbmF0ZWQoKTsKKyAgICBMaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdo
aXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUgPSByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0
YXRlKCk7CisgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKKyAg
ICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOworICAg
IFJlbmRlclRleHRJbmZvIHJlbmRlclRleHRJbmZvOworICAgIFZlcnRpY2FsUG9zaXRpb25DYWNo
ZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CisKKyAgICBMaW5lQnJlYWtlciBsaW5lQnJlYWtlcigq
dGhpcyk7CisKKyAgICB3aGlsZSAoIWVuZC5hdEVuZCgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBJ
cyB0aGlzIGNoZWNrIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvciBjYW4g
aXQgYmUgbW92ZWQgdG8gdGhlIGVuZD8KKyAgICAgICAgaWYgKGNoZWNrRm9yRW5kTGluZU1hdGNo
KSB7CisgICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTWF0Y2hlZChtYXRjaGVkRW5k
TGluZShsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRp
U3RhdHVzKSk7CisgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkg
eworICAgICAgICAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJl
c29sdmVyLnBvc2l0aW9uKCkucm9vdCgpLCAwLCAwKSwgMCk7CisgICAgICAgICAgICAgICAgbGF5
b3V0U3RhdGUubWFyZ2luSW5mbygpLmNsZWFyTWFyZ2luKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsaW5lV2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZS5yZXNldCgpOworCisgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCku
c2V0RW1wdHkodHJ1ZSk7CisgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkucmVzZXRSdW5z
RnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Ig
b2xkRW5kID0gZW5kOworICAgICAgICBib29sIGlzTmV3VUJBUGFyYWdyYXBoID0gbGF5b3V0U3Rh
dGUubGluZUluZm8oKS5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKTsKKyAgICAgICAgRmxvYXRp
bmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUgPSAoY29udGFpbnNGbG9hdHMoKSkg
PyBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpIDogbnVsbHB0cjsKKworICAg
ICAgICBXb3JkTWVhc3VyZW1lbnRzIHdvcmRNZWFzdXJlbWVudHM7CisgICAgICAgIGVuZCA9IGxp
bmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCks
IHJlbmRlclRleHRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcywgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgIGNhY2hlUHJpb3JDaGFy
YWN0ZXJzSWZOZWVkZWQocmVuZGVyVGV4dEluZm8ubGluZUJyZWFrSXRlcmF0b3IpOworICAgICAg
ICByZW5kZXJUZXh0SW5mby5saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOwor
ICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CisgICAgICAgICAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5leHRMaW5lQnJl
YWsgdG8gYmVnaW4gd2l0aCEKKyAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxpc3QgaXMgc2Vw
YXJhdGVkIGZyb20gQmlkaVJlc29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVkLgorICAgICAg
ICAgICAgcmVzb2x2ZXIucnVucygpLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvbHZlci5tYXJr
Q3VycmVudFJ1bkVtcHR5KCk7IC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBiZSByZXBsYWNl
ZCBieSBhbiBBU1NFUlQgKG9yIGp1c3QgcmVtb3ZlZCkuCisgICAgICAgICAgICBsYXlvdXRTdGF0
ZS5zZXRDaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSh0cnVlKTsKKyAgICAgICAgICAgIHJlc29s
dmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkucm9vdCgp
LCAwLCAwKSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFT
U0VSVChlbmQgIT0gcmVzb2x2ZXIucG9zaXRpb24oKSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBh
IHNob3J0LWN1dCBmb3IgZW1wdHkgbGluZXMuCisgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGxhc3RSb290Qm94KCkpCisgICAg
ICAgICAgICAgICAgbGFzdFJvb3RCb3goKS0+c2V0TGluZUJyZWFrSW5mbyhlbmQucmVuZGVyZXIo
KSwgZW5kLm9mZnNldCgpLCByZXNvbHZlci5zdGF0dXMoKSk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBWaXN1YWxEaXJlY3Rpb25PdmVycmlkZSBvdmVycmlkZSA9IChzdHlsZVRvVXNl
LnJ0bE9yZGVyaW5nKCkgPT0gT3JkZXI6OlZpc3VhbCA/IChzdHlsZVRvVXNlLmRpcmVjdGlvbigp
ID09IFRleHREaXJlY3Rpb246OkxUUiA/IFZpc3VhbExlZnRUb1JpZ2h0T3ZlcnJpZGUgOiBWaXN1
YWxSaWdodFRvTGVmdE92ZXJyaWRlKSA6IE5vVmlzdWFsT3ZlcnJpZGUpOworCisgICAgICAgICAg
ICBpZiAoaXNOZXdVQkFQYXJhZ3JhcGggJiYgc3R5bGVUb1VzZS51bmljb2RlQmlkaSgpID09IFBs
YWludGV4dCAmJiAhcmVzb2x2ZXIuY29udGV4dCgpLT5wYXJlbnQoKSkgeworICAgICAgICAgICAg
ICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGVUb1VzZS5kaXJlY3Rpb24oKTsKKyAg
ICAgICAgICAgICAgICBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24sIHJlc29sdmVy
LnBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhCaWRpU3Rh
dHVzKGRpcmVjdGlvbiwgaXNPdmVycmlkZShzdHlsZVRvVXNlLnVuaWNvZGVCaWRpKCkpKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBvd25lcnNoaXAgaXMgcmV2
ZXJzZWQuIFdlIHNob3VsZCBvd24gdGhlIEJpZGlSdW5MaXN0IGFuZCBwYXNzIGl0IHRvIGNyZWF0
ZUJpZGlSdW5zRm9yTGluZS4KKyAgICAgICAgICAgIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRp
UnVucyA9IHJlc29sdmVyLnJ1bnMoKTsKKyAgICAgICAgICAgIGNvbnN0cnVjdEJpZGlSdW5zRm9y
U2VnbWVudChyZXNvbHZlciwgYmlkaVJ1bnMsIGVuZCwgb3ZlcnJpZGUsIGxheW91dFN0YXRlLmxp
bmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpOworICAgICAgICAgICAgQVNTRVJU
KHJlc29sdmVyLnBvc2l0aW9uKCkgPT0gZW5kKTsKKworICAgICAgICAgICAgQmlkaVJ1biogdHJh
aWxpbmdTcGFjZVJ1biA9ICFsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSgpID8gaGFuZGxlVHJhaWxpbmdTcGFjZXMoYmlkaVJ1bnMsIHJlc29sdmVyLmNvbnRl
eHQoKSkgOiBudWxscHRyOworCisgICAgICAgICAgICBpZiAoYmlkaVJ1bnMucnVuQ291bnQoKSAm
JiBsaW5lQnJlYWtlci5saW5lV2FzSHlwaGVuYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5tX2hhc0h5cGhlbiA9IHRydWU7CisgICAgICAgICAg
ICAgICAgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMrKzsKKyAgICAgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKKworICAgICAg
ICAgICAgLy8gTm93IHRoYXQgdGhlIHJ1bnMgaGF2ZSBiZWVuIG9yZGVyZWQsIHdlIGNyZWF0ZSB0
aGUgbGluZSBib3hlcy4KKyAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJl
IG91dCB3aGVyZSBib3JkZXIvcGFkZGluZy9tYXJnaW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCisg
ICAgICAgICAgICAvLyBpbmxpbmUgZmxvdyBib3hlcy4KKworICAgICAgICAgICAgTGF5b3V0VW5p
dCBvbGRMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgUm9vdElu
bGluZUJveCogbGluZUJveCA9IGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhyZXNvbHZlci5z
dGF0dXMoKS5jb250ZXh0LT5sZXZlbCgpLCBiaWRpUnVucywgZW5kLCBsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHRyYWlsaW5nU3BhY2VSdW4sIHdvcmRNZWFz
dXJlbWVudHMpOworCisgICAgICAgICAgICBiaWRpUnVucy5jbGVhcigpOworICAgICAgICAgICAg
cmVzb2x2ZXIubWFya0N1cnJlbnRSdW5FbXB0eSgpOyAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFi
bHkgYmUgcmVwbGFjZWQgYnkgYW4gQVNTRVJUIChvciBqdXN0IHJlbW92ZWQpLgorCisgICAgICAg
ICAgICBpZiAobGluZUJveCkgeworICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVh
a0luZm8oZW5kLnJlbmRlcmVyKCksIGVuZC5vZmZzZXQoKSwgcmVzb2x2ZXIuc3RhdHVzKCkpOwor
ICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQorICAg
ICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxp
bmVCb3gpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExheW91dFVuaXQgYWRq
dXN0bWVudDsKKyAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50ID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2luSW5m
bygpLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOworCisgICAgICAgICAgICAgICAgaWYg
KHBhZ2luYXRlZCkKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFn
aW5hdGlvbihsaW5lQm94LCBhZGp1c3RtZW50LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3Rh
dGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsK
KyAgICAgICAgICAgICAgICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBs
YXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRmlyc3RMaW5lKCkgPyBJbmRlbnRUZXh0IDogRG9Ob3RJ
bmRlbnRUZXh0OworICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExpbmVXaWR0aCA9
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5k
ZW50VGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0
aW9uUG9zaXRpb24oYWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRT
dGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0
U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChsaW5lQm94KTsKKworICAgICAgICAgICAg
ICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0
ICsgYWRqdXN0bWVudCwgc2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGxpbmUsIHJlbW92
ZSBhbGwgZmxvYXRzIHRoYXQgZ290IGFkZGVkLCBhbmQgbGV0IGxpbmUgbGF5b3V0IHJlLXJ1bi4K
KyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmRlbGV0ZUxpbmUoKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVuZCA9IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShv
bGRMb2dpY2FsSGVpZ2h0LCBvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgcmVzb2x2ZXIsIG9sZEVuZCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
aWYgKHBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJh
Z21lbnRlZEZsb3coKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9y
TGluZShsaW5lQm94KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpbmVCcmVha2VyLnBvc2l0aW9u
ZWRPYmplY3RzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMo
KnRoaXMsICpsaW5lQnJlYWtlci5wb3NpdGlvbmVkT2JqZWN0cygpW2ldLCBEb05vdEluZGVudFRl
eHQpOworCisgICAgICAgIGlmICghbGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKGZhbHNlKTsK
KyAgICAgICAgICAgIGNsZWFyRmxvYXRzKGxpbmVCcmVha2VyLmNsZWFyKCkpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKKyAg
ICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1f
ZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09i
amVjdFNldC5iZWdpbigpOworICAgICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNl
dC5lbmQoKTsKKyAgICAgICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRTdGF0ZS5m
bG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gbGFzdEZsb2F0
SXRlcmF0b3IgPSBmbG9hdGluZ09iamVjdFNldC5maW5kKGxhc3RGbG9hdCk7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKGxhc3RGbG9hdEl0ZXJhdG9yICE9IGVuZCk7CisgICAgICAgICAgICAgICAg
KytsYXN0RmxvYXRJdGVyYXRvcjsKKyAgICAgICAgICAgICAgICBpdCA9IGxhc3RGbG9hdEl0ZXJh
dG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0OworICAgICAgICAg
ICAgICAgIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSgqZmxvYXRpbmdPYmplY3QpOwor
ICAgICAgICAgICAgICAgIC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hhbmdlZCwgZ2l2
ZSB1cCBvbiBzeW5jaW5nIHdpdGggY2xlYW4gbGluZXMuCisgICAgICAgICAgICAgICAgYXV0byog
ZmxvYXRXaXRoUmVjdCA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmZsb2F0V2l0aFJlY3QoZmxv
YXRpbmdPYmplY3QtPnJlbmRlcmVyKCkpOworICAgICAgICAgICAgICAgIGlmICghZmxvYXRXaXRo
UmVjdCB8fCBmbG9hdFdpdGhSZWN0LT5yZWN0KCkgIT0gZmxvYXRpbmdPYmplY3QtPmZyYW1lUmVj
dCgpKQorICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGZhbHNlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuc2V0TGFz
dEZsb2F0KCFmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5KCkgPyBmbG9hdGluZ09iamVjdFNldC5s
YXN0KCkuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmVXaGl0ZXNw
YWNlQ29sbGFwc2luZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9u
KGVuZCwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGVuZCkpOworICAgIH0KKworICAgIC8vIElu
IGNhc2Ugd2UgYWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMg
bGF5b3V0IHRvIGF2b2lkIHdpZG93cworICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhl
IHBvc3NpYmlsaXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgorICAgIC8vIE90
aGVyd2lzZSwgd2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5z
dCB0aGUgYmxvY2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgorICAgIGlmIChwYWdpbmF0ZWQg
JiYgIXN0eWxlKCkuaGFzQXV0b1dpZG93cygpICYmICFkaWRCcmVha0F0TGluZVRvQXZvaWRXaWRv
dygpKSB7CisgICAgICAgIC8vIENoZWNrIHRoZSBsaW5lIGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBk
aWRuJ3QgY3JlYXRlIHVuYWNjZXB0YWJsZSB3aWRvd3MuCisgICAgICAgIC8vIEhvd2V2ZXIsIHdl
J2xsIHByaW9yaXRpemUgb3JwaGFucyAtIHNvIG5vdGhpbmcgd2UgZG8gaGVyZSBzaG91bGQgY3Jl
YXRlCisgICAgICAgIC8vIGEgbmV3IG9ycGhhbi4KKworICAgICAgICBSb290SW5saW5lQm94KiBs
aW5lQm94ID0gbGFzdFJvb3RCb3goKTsKKworICAgICAgICAvLyBDb3VudCBmcm9tIHRoZSBlbmQg
b2YgdGhlIGJsb2NrIGJhY2t3YXJkcywgdG8gc2VlIGhvdyBtYW55IGhhbmdpbmcKKyAgICAgICAg
Ly8gbGluZXMgd2UgaGF2ZS4KKyAgICAgICAgUm9vdElubGluZUJveCogZmlyc3RMaW5lSW5CbG9j
ayA9IGZpcnN0Um9vdEJveCgpOworICAgICAgICBpbnQgbnVtTGluZXNIYW5naW5nID0gMTsKKyAg
ICAgICAgd2hpbGUgKGxpbmVCb3ggJiYgbGluZUJveCAhPSBmaXJzdExpbmVJbkJsb2NrICYmICFs
aW5lQm94LT5pc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsoKSkgeworICAgICAgICAgICAgKytudW1MaW5l
c0hhbmdpbmc7CisgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gYnJlYWtzIGluIHRoZSBi
bG9jaywgd2UgZGlkbid0IGNyZWF0ZSBhbnkgd2lkb3dzLgorICAgICAgICBpZiAoIWxpbmVCb3gg
fHwgIWxpbmVCb3gtPmlzRmlyc3RBZnRlclBhZ2VCcmVhaygpIHx8IGxpbmVCb3ggPT0gZmlyc3RM
aW5lSW5CbG9jaykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobnVtTGluZXNI
YW5naW5nIDwgc3R5bGUoKS53aWRvd3MoKSkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBkZXRl
Y3RlZCBhIHdpZG93LiBOb3cgd2UgbmVlZCB0byB3b3JrIG91dCBob3cgbWFueQorICAgICAgICAg
ICAgLy8gbGluZXMgdGhlcmUgYXJlIG9uIHRoZSBwcmV2aW91cyBwYWdlLCBhbmQgaG93IG1hbnkg
d2UgbmVlZAorICAgICAgICAgICAgLy8gdG8gc3RlYWwuCisgICAgICAgICAgICBpbnQgbnVtTGlu
ZXNOZWVkZWQgPSBzdHlsZSgpLndpZG93cygpIC0gbnVtTGluZXNIYW5naW5nOworICAgICAgICAg
ICAgUm9vdElubGluZUJveCogY3VycmVudEZpcnN0TGluZU9mTmV3UGFnZSA9IGxpbmVCb3g7CisK
KyAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHByZXZpb3Vz
IHBhZ2UuCisgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKKyAg
ICAgICAgICAgIGludCBudW1MaW5lc0luUHJldmlvdXNQYWdlID0gMTsKKyAgICAgICAgICAgIHdo
aWxlIChsaW5lQm94ICYmIGxpbmVCb3ggIT0gZmlyc3RMaW5lSW5CbG9jayAmJiAhbGluZUJveC0+
aXNGaXJzdEFmdGVyUGFnZUJyZWFrKCkpIHsKKyAgICAgICAgICAgICAgICArK251bUxpbmVzSW5Q
cmV2aW91c1BhZ2U7CisgICAgICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gtPnByZXZSb290
Qm94KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBl
eHBsaWNpdCB2YWx1ZSBmb3Igb3JwaGFucywgcmVzcGVjdCB0aGF0LiBJZiBub3QsIHdlIHN0aWxs
CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdlIG1h
a2UgYW4gb3JwaGFuIGJpZ2dlciB0aGFuIHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAgICAgICAg
Ly8gVGhpcyBtZWFucyB0aGF0IHNldHRpbmcgd2lkb3dzIGltcGxpZXMgd2UgYWxzbyBjYXJlIGFi
b3V0IG9ycGhhbnMsIGJ1dCBnaXZlbgorICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmljYXRpb24g
c2F5cyB0aGUgaW5pdGlhbCBvcnBoYW4gdmFsdWUgaXMgbm9uLXplcm8sIHRoaXMgaXMgb2suIFRo
ZQorICAgICAgICAgICAgLy8gYXV0aG9yIGlzIGFsd2F5cyBmcmVlIHRvIHNldCBvcnBoYW5zIGV4
cGxpY2l0bHkgYXMgd2VsbC4KKyAgICAgICAgICAgIGludCBvcnBoYW5zID0gc3R5bGUoKS5oYXNB
dXRvT3JwaGFucygpID8gc3R5bGUoKS5pbml0aWFsT3JwaGFucygpIDogc3R5bGUoKS5vcnBoYW5z
KCk7CisgICAgICAgICAgICBpbnQgbnVtTGluZXNBdmFpbGFibGUgPSBudW1MaW5lc0luUHJldmlv
dXNQYWdlIC0gb3JwaGFuczsKKyAgICAgICAgICAgIGlmIChudW1MaW5lc0F2YWlsYWJsZSA8PSAw
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IG51bUxpbmVzVG9U
YWtlID0gc3RkOjptaW4obnVtTGluZXNBdmFpbGFibGUsIG51bUxpbmVzTmVlZGVkKTsKKyAgICAg
ICAgICAgIC8vIFdpbmQgYmFjayBmcm9tIG91ciBmaXJzdCB3aWRvd2VkIGxpbmUuCisgICAgICAg
ICAgICBsaW5lQm94ID0gY3VycmVudEZpcnN0TGluZU9mTmV3UGFnZTsKKyAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgbnVtTGluZXNUb1Rha2U7ICsraSkKKyAgICAgICAgICAgICAgICBs
aW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKKworICAgICAgICAgICAgLy8gV2Ugbm93
IHdhbnQgdG8gYnJlYWsgYXQgdGhpcyBsaW5lLiBSZW1lbWJlciBmb3IgbmV4dCBsYXlvdXQgYW5k
IHRyaWdnZXIgcmVsYXlvdXQuCisgICAgICAgICAgICBzZXRCcmVha0F0TGluZVRvQXZvaWRXaWRv
dyhsaW5lQ291bnQobGluZUJveCkpOworICAgICAgICAgICAgbWFya0xpbmVzRGlydHlJbkJsb2Nr
UmFuZ2UobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gtPmxp
bmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBj
bGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjpyZWF0dGFjaENsZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIExh
eW91dFVuaXQgZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFuTGluZSkKK3sKKyAgICBhdXRvKiBjbGVh
bkxpbmVGbG9hdHMgPSBjbGVhbkxpbmUuZmxvYXRzUHRyKCk7CisgICAgaWYgKCFjbGVhbkxpbmVG
bG9hdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAq
Y2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgIGlmICghZmxvYXRpbmdCb3gpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGlu
Z09iamVjdCgqZmxvYXRpbmdCb3gpOworICAgICAgICBpZiAoaXNGaXJzdENsZWFuTGluZSAmJiBm
bG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpIHsKKyAgICAgICAgICAgIC8vIEZsb2F0
IGJveCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaW5lIGFueW1vcmUuCisgICAgICAgICAgICBB
U1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihjbGVhbkxpbmUucHJldlJvb3RCb3goKSA9
PSBmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOworICAgICAgICAgICAgY2xlYW5M
aW5lLnJlbW92ZUZsb2F0KCpmbG9hdGluZ0JveCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRp
bmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKKyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNl
dE9yaWdpbmF0aW5nTGluZShjbGVhbkxpbmUpOworICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxv
Z2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZs
b2F0aW5nQm94KSArIGRlbHRhKTsKKyAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKKyAgICB9
Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK3sKKyAgICBhdXRvKiBmaXJzdENsZWFuTGluZSA9IGxh
eW91dFN0YXRlLmVuZExpbmUoKTsKKyAgICBpZiAoZmlyc3RDbGVhbkxpbmUpIHsKKyAgICAgICAg
aWYgKGxheW91dFN0YXRlLmVuZExpbmVNYXRjaGVkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgcGFn
aW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgp
ICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQ
YWdpbmF0ZWQoKTsKKyAgICAgICAgICAgIC8vIEF0dGFjaCBhbGwgdGhlIHJlbWFpbmluZyBsaW5l
cywgYW5kIHRoZW4gYWRqdXN0IHRoZWlyIHktcG9zaXRpb25zIGFzIG5lZWRlZC4KKyAgICAgICAg
ICAgIExheW91dFVuaXQgZGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRM
aW5lTG9naWNhbFRvcCgpOworICAgICAgICAgICAgZm9yIChhdXRvKiBsaW5lID0gZmlyc3RDbGVh
bkxpbmU7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICAg
ICAgbGluZS0+YXR0YWNoTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgZGVsdGEgLT0gbGluZS0+cGFnaW5hdGlvblN0cnV0KCk7Cisg
ICAgICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7CisgICAgICAgICAgICAg
ICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZSwgZGVsdGEsIG92ZXJm
bG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7CisgICAgICAgICAgICAgICAgICAg
IGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZSwgZGVsdGEpOworICAg
ICAgICAgICAgICAgICAgICBsaW5lLT5hZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9uKGRlbHRh
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZy
YWdtZW50ZWRGbG93KCkpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGlu
ZShsaW5lKTsKKyAgICAgICAgICAgICAgICByZWF0dGFjaENsZWFuTGluZUZsb2F0cygqbGluZSwg
ZGVsdGEsIGxpbmUgPT0gZmlyc3RDbGVhbkxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgc2V0TG9naWNhbEhlaWdodChsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmco
KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSByZW1h
aW5pbmcgbGluZXMuCisgICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0U3RhdGUsIGxh
eW91dFN0YXRlLmVuZExpbmUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKG1f
ZmxvYXRpbmdPYmplY3RzICYmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zyb21MYXN0TGlu
ZSgpIHx8IHBvc2l0aW9uTmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsKKyAgICAgICAg
Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgZmxvYXQgb24gdGhlIGxhc3QgbGluZSwgaXQgbWlnaHQgbm90
IGJlIHBvc2l0aW9uZWQgdXAgdG8gbm93LgorICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25l
IGJlZm9yZSBhZGRpbmcgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0
IHdpbGwKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFkZGluZyBpbmNvcnJlY3RseS4gLWR3aAor
ICAgICAgICBpZiAobGF5b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUoKSkgewor
ICAgICAgICAgICAgTGF5b3V0VW5pdCBib3R0b21WaXN1YWxPdmVyZmxvdyA9IGxhc3RSb290Qm94
KCktPmxvZ2ljYWxCb3R0b21WaXN1YWxPdmVyZmxvdygpOworICAgICAgICAgICAgTGF5b3V0VW5p
dCBib3R0b21MYXlvdXRPdmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmxvZ2ljYWxCb3R0b21MYXlv
dXRPdmVyZmxvdygpOworICAgICAgICAgICAgYXV0byBuZXdMaW5lQm94ID0gc3RkOjptYWtlX3Vu
aXF1ZTxUcmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3g+KCp0aGlzKTsKKyAgICAgICAgICAgIGF1
dG8gdHJhaWxpbmdGbG9hdHNMaW5lQm94ID0gbmV3TGluZUJveC5nZXQoKTsKKyAgICAgICAgICAg
IG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdMaW5lQm94KSk7CisgICAgICAg
ICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldENvbnN0cnVjdGVkKCk7CisgICAgICAgICAg
ICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94RGF0YU1hcDsKKyAgICAg
ICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CisgICAg
ICAgICAgICBMYXlvdXRVbml0IGJsb2NrTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsK
KyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJl
Y3Rpb24oYmxvY2tMb2dpY2FsSGVpZ2h0LCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlv
bkNhY2hlKTsKKyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0TGluZVRvcEJv
dHRvbVBvc2l0aW9ucyhibG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCwgYmxv
Y2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgdHJhaWxp
bmdGbG9hdHNMaW5lQm94LT5zZXRQYWdpbmF0ZWRMaW5lV2lkdGgoYXZhaWxhYmxlTG9naWNhbFdp
ZHRoRm9yQ29udGVudChibG9ja0xvZ2ljYWxIZWlnaHQpKTsKKyAgICAgICAgICAgIExheW91dFJl
Y3QgbG9naWNhbExheW91dE92ZXJmbG93KDBfbHUsIGJsb2NrTG9naWNhbEhlaWdodCwgMV9sdSwg
Ym90dG9tTGF5b3V0T3ZlcmZsb3cgLSBibG9ja0xvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAg
TGF5b3V0UmVjdCBsb2dpY2FsVmlzdWFsT3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2FsSGVpZ2h0
LCAxX2x1LCBib3R0b21WaXN1YWxPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7CisgICAg
ICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0
cyhsb2dpY2FsTGF5b3V0T3ZlcmZsb3csIGxvZ2ljYWxWaXN1YWxPdmVyZmxvdywgdHJhaWxpbmdG
bG9hdHNMaW5lQm94LT5saW5lVG9wKCksIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+bGluZUJvdHRv
bSgpKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQorICAg
ICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZSh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gp
OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5n
T2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgICAgICBhdXRvIGl0ID0g
ZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKKyAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09i
amVjdFNldC5lbmQoKTsKKyAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9hdCA9IGxheW91dFN0YXRl
LmZsb2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7CisgICAgICAgICAgICBhdXRvIGxhc3RGbG9hdEl0
ZXJhdG9yID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZChsYXN0RmxvYXQpOworICAgICAgICAgICAg
QVNTRVJUKGxhc3RGbG9hdEl0ZXJhdG9yICE9IGVuZCk7CisgICAgICAgICAgICArK2xhc3RGbG9h
dEl0ZXJhdG9yOworICAgICAgICAgICAgaXQgPSBsYXN0RmxvYXRJdGVyYXRvcjsKKyAgICAgICAg
fQorICAgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgYXBwZW5kRmxv
YXRpbmdPYmplY3RUb0xhc3RMaW5lKCoqaXQpOworICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExp
c3QoKS5zZXRMYXN0RmxvYXQoIWZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSA/IGZsb2F0aW5n
T2JqZWN0U2V0Lmxhc3QoKS5nZXQoKSA6IG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91
dFVuaXQmIHJlcGFpbnRMb2dpY2FsVG9wLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbEJvdHRv
bSkKK3sKKyAgICBBU1NFUlQoIW1fc2ltcGxlTGluZUxheW91dCk7CisKKyAgICBzZXRMb2dpY2Fs
SGVpZ2h0KGJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKSk7CisgICAgCisgICAgLy8gTGF5IG91dCBv
dXIgaHlwb3RoZXRpY2FsIGdyaWQgbGluZSBhcyB0aG91Z2ggaXQgb2NjdXJzIGF0IHRoZSB0b3Ag
b2YgdGhlIGJsb2NrLgorICAgIGlmICh2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgp
LmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlv
dXRTdGF0ZSgpLT5saW5lR3JpZCgpID09IHRoaXMpCisgICAgICAgIGxheW91dExpbmVHcmlkQm94
KCk7CisKKyAgICBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRlZEZsb3cgPSBlbmNsb3Np
bmdGcmFnbWVudGVkRmxvdygpOworICAgIGJvb2wgY2xlYXJMaW5lc0ZvclBhZ2luYXRpb24gPSBm
aXJzdFJvb3RCb3goKSAmJiBmcmFnbWVudGVkRmxvdyAmJiAhZnJhZ21lbnRlZEZsb3ctPmhhc0Zy
YWdtZW50cygpOworCisgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91
ciBsaW5lIGJveGVzLgorICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCisg
ICAgYm9vbCBpc0Z1bGxMYXlvdXQgPSAhZmlyc3RSb290Qm94KCkgfHwgc2VsZk5lZWRzTGF5b3V0
KCkgfHwgcmVsYXlvdXRDaGlsZHJlbiB8fCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbjsKKyAgICBM
aW5lTGF5b3V0U3RhdGUgbGF5b3V0U3RhdGUoKnRoaXMsIGlzRnVsbExheW91dCwgcmVwYWludExv
Z2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tLCBmcmFnbWVudGVkRmxvdyk7CisKKyAgICBp
ZiAoaXNGdWxsTGF5b3V0KQorICAgICAgICBsaW5lQm94ZXMoKS5kZWxldGVMaW5lQm94ZXMoKTsK
KworICAgIC8vIFRleHQgdHJ1bmNhdGlvbiBraWNrcyBpbiBpbiB0d28gY2FzZXM6CisgICAgLy8g
ICAgIDEpIElmIHlvdXIgb3ZlcmZsb3cgaXNuJ3QgdmlzaWJsZSBhbmQgeW91ciB0ZXh0LW92ZXJm
bG93LW1vZGUgaXNuJ3QgY2xpcC4KKyAgICAvLyAgICAgMikgSWYgeW91J3JlIGFuIGFub255bW91
cyBibG9jayB3aXRoIGEgYmxvY2sgcGFyZW50IHRoYXQgc2F0aXNmaWVzICMxLgorICAgIC8vIEZJ
WE1FOiBDU1MzIHNheXMgdGhhdCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjbGlwcGVkIG11c3QgYWxz
byBrbm93IGhvdyB0byB0cnVuY2F0ZS4gIFRoaXMgaXMgaW5zYW5lbHkKKyAgICAvLyBkaWZmaWN1
bHQgdG8gZmlndXJlIG91dCBpbiBnZW5lcmFsIChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2Yg
ZG9pbmcgbGF5b3V0KSwgc28gd2Ugb25seSBoYW5kbGUgdGhlCisgICAgLy8gc2ltcGxlIGNhc2Ug
b2YgYW4gYW5vbnltb3VzIGJsb2NrIHRydW5jYXRpbmcgd2hlbiBpdCdzIHBhcmVudCBpcyBjbGlw
cGVkLgorICAgIGJvb2wgaGFzVGV4dE92ZXJmbG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkg
PT0gVGV4dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKKyAgICAgICAg
fHwgKGlzQW5vbnltb3VzQmxvY2soKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNSZW5kZXJC
bG9jaygpICYmIHBhcmVudCgpLT5zdHlsZSgpLnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxv
dzo6RWxsaXBzaXMgJiYgcGFyZW50KCktPmhhc092ZXJmbG93Q2xpcCgpKTsKKworICAgIC8vIFdh
bGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRo
ZXkgZXhpc3QuCisgICAgaWYgKGhhc1RleHRPdmVyZmxvdykKKyAgICAgICAgIGRlbGV0ZUVsbGlw
c2lzTGluZUJveGVzKCk7CisKKyAgICBpZiAoZmlyc3RDaGlsZCgpKSB7CisgICAgICAgIC8vIElu
IGZ1bGwgbGF5b3V0IG1vZGUsIGNsZWFyIHRoZSBsaW5lIGJveGVzIG9mIGNoaWxkcmVuIHVwZnJv
bnQuIE90aGVyd2lzZSwKKyAgICAgICAgLy8gc2libGluZ3MgY2FuIHJ1biBpbnRvIHN0YWxlIHJv
b3QgbGluZWJveGVzIGR1cmluZyBsYXlvdXQuIFRoZW4gbGF5b3V0CisgICAgICAgIC8vIHRoZSBy
ZXBsYWNlZCBlbGVtZW50cyBsYXRlci4gSW4gcGFydGlhbCBsYXlvdXQgbW9kZSwgbGluZSBib3hl
cyBhcmUgbm90CisgICAgICAgIC8vIGRlbGV0ZWQgYW5kIG9ubHkgZGlydGllZC4gSW4gdGhhdCBj
YXNlLCB3ZSBjYW4gbGF5b3V0IHRoZSByZXBsYWNlZAorICAgICAgICAvLyBlbGVtZW50cyBhdCB0
aGUgc2FtZSB0aW1lLgorICAgICAgICBib29sIGhhc0lubGluZUNoaWxkID0gZmFsc2U7CisgICAg
ICAgIFZlY3RvcjxSZW5kZXJCb3gqPiByZXBsYWNlZENoaWxkcmVuOworICAgICAgICBmb3IgKElu
bGluZVdhbGtlciB3YWxrZXIoKnRoaXMpOyAhd2Fsa2VyLmF0RW5kKCk7IHdhbGtlci5hZHZhbmNl
KCkpIHsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCYgbyA9ICp3YWxrZXIuY3VycmVudCgpOwor
CisgICAgICAgICAgICBpZiAoIWhhc0lubGluZUNoaWxkICYmIG8uaXNJbmxpbmUoKSkKKyAgICAg
ICAgICAgICAgICBoYXNJbmxpbmVDaGlsZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChvLmlz
UmVwbGFjZWQoKSB8fCBvLmlzRmxvYXRpbmcoKSB8fCBvLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyQm94JiBib3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+
KG8pOworCisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgYm94Lmhhc1Jl
bGF0aXZlRGltZW5zaW9ucygpKQorICAgICAgICAgICAgICAgICAgICBib3guc2V0Q2hpbGROZWVk
c0xheW91dChNYXJrT25seVRoaXMpOworCisgICAgICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRD
aGlsZHJlbiBpcyBzZXQgYW5kIHRoZSBjaGlsZCBoYXMgcGVyY2VudGFnZSBwYWRkaW5nIG9yIGFu
IGVtYmVkZGVkIGNvbnRlbnQgYm94LCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2hp
bGRzIHByZWYgd2lkdGhzLgorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYm
IGJveC5uZWVkc1ByZWZlcnJlZFdpZHRoc1JlY2FsY3VsYXRpb24oKSkKKyAgICAgICAgICAgICAg
ICAgICAgYm94LnNldFByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSh0cnVlLCBNYXJrT25seVRo
aXMpOworCisgICAgICAgICAgICAgICAgaWYgKGJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkK
KyAgICAgICAgICAgICAgICAgICAgYm94LmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlv
bmVkT2JqZWN0KGJveCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYm94LmlzRmxvYXRpbmco
KSkKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuYXBwZW5kKEZs
b2F0V2l0aFJlY3Q6OmNyZWF0ZShib3gpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0Z1
bGxMYXlvdXQgfHwgYm94Lm5lZWRzTGF5b3V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
UmVwbGFjZWQgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCAm
JiBpczxSZW5kZXJSdWJ5UnVuPihib3gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBG
SVhNRTogVGhpcyByZXNldHMgdGhlIG92ZXJoYW5naW5nIG1hcmdpbnMgdGhhdCB3ZSBzZXQgZHVy
aW5nIGxpbmUgbGF5b3V0IChzZWUgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNl
Z21lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgbW9yZSBzdWl0YWJsZSBw
bGFjZSBmb3IgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpblN0YXJ0Rm9y
Q2hpbGQoYm94LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpbkVuZEZvckNo
aWxkKGJveCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
Ym94LmRpcnR5TGluZUJveGVzKGlzRnVsbExheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGlm
IChpc0Z1bGxMYXlvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVu
LmFwcGVuZCgmYm94KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgYm94LmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfSBlbHNlIGlmIChvLmlzVGV4dE9yTGluZUJyZWFrKCkgfHwgKGlzPFJlbmRlcklubGlu
ZT4obykgJiYgIXdhbGtlci5hdEVuZE9mSW5saW5lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYg
KGlzPFJlbmRlcklubGluZT4obykpCisgICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRl
cklubGluZT4obykudXBkYXRlQWx3YXlzQ3JlYXRlTGluZUJveGVzKGxheW91dFN0YXRlLmlzRnVs
bExheW91dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0
KCkgfHwgby5zZWxmTmVlZHNMYXlvdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgZGlydHlMaW5l
Qm94ZXNGb3JSZW5kZXJlcihvLCBsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSk7CisgICAgICAg
ICAgICAgICAgby5jbGVhck5lZWRzTGF5b3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcGxhY2VkQ2hpbGRyZW4uc2l6ZSgp
OyBpKyspCisgICAgICAgICAgICAgcmVwbGFjZWRDaGlsZHJlbltpXS0+bGF5b3V0SWZOZWVkZWQo
KTsKKworICAgICAgICBsYXlvdXRSdW5zQW5kRmxvYXRzKGxheW91dFN0YXRlLCBoYXNJbmxpbmVD
aGlsZCk7CisgICAgfQorCisgICAgLy8gRXhwYW5kIHRoZSBsYXN0IGxpbmUgdG8gYWNjb21tb2Rh
dGUgUnVieSBhbmQgZW1waGFzaXMgbWFya3MuCisgICAgaW50IGxhc3RMaW5lQW5ub3RhdGlvbnNB
ZGp1c3RtZW50ID0gMDsKKyAgICBpZiAobGFzdFJvb3RCb3goKSkgeworICAgICAgICBMYXlvdXRV
bml0IGxvd2VzdEFsbG93ZWRQb3NpdGlvbiA9IHN0ZDo6bWF4KGxhc3RSb290Qm94KCktPmxpbmVC
b3R0b20oKSwgbG9naWNhbEhlaWdodCgpICsgcGFkZGluZ0FmdGVyKCkpOworICAgICAgICBpZiAo
IXN0eWxlKCkuaXNGbGlwcGVkTGluZXNXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgbGFzdExp
bmVBbm5vdGF0aW9uc0FkanVzdG1lbnQgPSBsYXN0Um9vdEJveCgpLT5jb21wdXRlVW5kZXJBbm5v
dGF0aW9uQWRqdXN0bWVudChsb3dlc3RBbGxvd2VkUG9zaXRpb24pOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVudCA9IGxhc3RSb290Qm94KCkt
PmNvbXB1dGVPdmVyQW5ub3RhdGlvbkFkanVzdG1lbnQobG93ZXN0QWxsb3dlZFBvc2l0aW9uKTsK
KyAgICB9CisgICAgCisgICAgLy8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9m
IHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAg
Ly8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3Jt
YXRpb24uIFRoaXMgY29sbGFwc2UgaXMgb25seSBuZWNlc3NhcnkKKyAgICAvLyBpZiBvdXIgbGFz
dCBjaGlsZCB3YXMgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayB0aGF0IG1pZ2h0IG5lZWQgdG8g
cHJvcGFnYXRlIG1hcmdpbiBpbmZvcm1hdGlvbiBvdXQgdG8KKyAgICAvLyB1cy4KKyAgICBMYXlv
dXRVbml0IGFmdGVyRWRnZSA9IGJvcmRlckFuZFBhZGRpbmdBZnRlcigpICsgc2Nyb2xsYmFyTG9n
aWNhbEhlaWdodCgpICsgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQ7CisgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBhZnRlckVkZ2UpOworCisgICAgaWYgKCFmaXJz
dFJvb3RCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQorICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0
KGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVIZWlnaHQodHJ1ZSwgaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JM
aW5lQm94ZXMpKTsKKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNwaWxs
IG91dCBvZiBvdXIgYmxvY2suICBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQg
dG8KKyAgICAvLyB0cnVuY2F0ZSB0ZXh0LgorICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCisgICAg
ICAgIGNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmNoZWNrRmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRl
ckJveCYgZmxvYXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdp
dGhSZWN0LAorICAgIGJvb2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZs
b2F0KQoreworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdEJveE9u
Q2xlYW5MaW5lLnN0eWxlKCkuZGVsZXRpb25IYXNCZWd1bigpKTsKKyAgICBpZiAoJm1hdGNoaW5n
RmxvYXRXaXRoUmVjdC5yZW5kZXJlcigpICE9ICZmbG9hdEJveE9uQ2xlYW5MaW5lKSB7CisgICAg
ICAgIGVuY291bnRlcmVkTmV3RmxvYXQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGZsb2F0Qm94T25DbGVhbkxpbmUubGF5b3V0SWZOZWVkZWQoKTsKKyAgICBMYXlvdXRSZWN0
IG9yaWdpbmFsRmxvYXRSZWN0ID0gbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LnJlY3QoKTsKKyAgICBM
YXlvdXRTaXplIG5ld1NpemUoCisgICAgICAgIGZsb2F0Qm94T25DbGVhbkxpbmUud2lkdGgoKSAr
IGZsb2F0Qm94T25DbGVhbkxpbmUuaG9yaXpvbnRhbE1hcmdpbkV4dGVudCgpLAorICAgICAgICBm
bG9hdEJveE9uQ2xlYW5MaW5lLmhlaWdodCgpICsgZmxvYXRCb3hPbkNsZWFuTGluZS52ZXJ0aWNh
bE1hcmdpbkV4dGVudCgpKTsKKyAgICAKKyAgICAvLyBXZSBoYXZlIHRvIHJlc2V0IHRoZSBjYXAt
aGVpZ2h0IGFsaWdubWVudCBkb25lIGJ5IHRoZSBmaXJzdC1sZXR0ZXIgZmxvYXRzIHdoZW4gaW5p
dGlhbC1sZXR0ZXIgaXMgc2V0LCBzbyBqdXN0IGFsd2F5cyB0cmVhdCBmaXJzdC1sZXR0ZXIgZmxv
YXRzIGFzIGRpcnR5LgorICAgIGlmIChvcmlnaW5hbEZsb2F0UmVjdC5zaXplKCkgPT0gbmV3U2l6
ZSAmJiAoZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLnN0eWxlVHlwZSgpICE9IFBzZXVkb0lk
OjpGaXJzdExldHRlciB8fCAhZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLmluaXRpYWxMZXR0
ZXJEcm9wKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBMYXlvdXRVbml0IGZsb2F0VG9wID0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IG9yaWdpbmFsRmxvYXRSZWN0LnkoKSA6IG9yaWdp
bmFsRmxvYXRSZWN0LngoKTsKKyAgICBMYXlvdXRVbml0IGZsb2F0SGVpZ2h0ID0gaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSA/IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBu
ZXdTaXplLmhlaWdodCgpKQorICAgICAgICA6IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0Lndp
ZHRoKCksIG5ld1NpemUud2lkdGgoKSk7CisgICAgZmxvYXRIZWlnaHQgPSBzdGQ6Om1pbihmbG9h
dEhlaWdodCwgTGF5b3V0VW5pdDo6bWF4KCkgLSBmbG9hdFRvcCk7CisgICAgY2xlYW5MaW5lLm1h
cmtEaXJ0eSgpOworICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5l
Qm90dG9tV2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7
CisgICAgTGF5b3V0UmVjdCBuZXdGbG9hdFJlY3QgPSBvcmlnaW5hbEZsb2F0UmVjdDsKKyAgICBu
ZXdGbG9hdFJlY3Quc2V0U2l6ZShuZXdTaXplKTsKKyAgICBtYXRjaGluZ0Zsb2F0V2l0aFJlY3Qu
YWRqdXN0UmVjdChuZXdGbG9hdFJlY3QpOworICAgIGRpcnRpZWRCeUZsb2F0ID0gdHJ1ZTsKK30K
KworUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9u
KExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIpCit7CisgICAgUm9vdElubGluZUJveCogY3VycmVudExpbmUgPSBudWxscHRyOworICAgIFJv
b3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FOiBUaGlzIGVu
dGlyZSBmbG9hdC1jaGVja2luZyBibG9jayBuZWVkcyB0byBiZSBicm9rZW4gaW50byBhIG5ldyBm
dW5jdGlvbi4KKyAgICBhdXRvJiBmbG9hdHMgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKTsKKyAg
ICBib29sIGRpcnRpZWRCeUZsb2F0ID0gZmFsc2U7CisgICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1
bGxMYXlvdXQoKSkgeworICAgICAgICAvLyBQYWdpbmF0ZSBhbGwgb2YgdGhlIGNsZWFuIGxpbmVz
LgorICAgICAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250
ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgp
LmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7CisgICAgICAgIExheW91dFVuaXQgcGFnaW5h
dGlvbkRlbHRhOworICAgICAgICBhdXRvIGZsb2F0c0l0ZXJhdG9yID0gZmxvYXRzLmJlZ2luKCk7
CisgICAgICAgIGF1dG8gZW5kID0gZmxvYXRzLmVuZCgpOworICAgICAgICBmb3IgKGN1cnJlbnRM
aW5lID0gZmlyc3RSb290Qm94KCk7IGN1cnJlbnRMaW5lICYmICFjdXJyZW50TGluZS0+aXNEaXJ0
eSgpOyBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
ICAgICBpZiAocGFnaW5hdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aEZvclBh
Z2luYXRlZExpbmVDaGFuZ2VkKGN1cnJlbnRMaW5lLCAwLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVk
RmxvdygpKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZS0+bWFya0RpcnR5KCk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBwYWdpbmF0aW9uRGVsdGEgLT0gY3VycmVudExpbmUtPnBhZ2luYXRpb25TdHJ1dCgp
OworICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7CisgICAgICAgICAgICAg
ICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyZW50TGluZSwgcGFnaW5hdGlv
bkRlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7
CisgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb25EZWx0YSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAoY29udGFpbnNGbG9hdHMoKSB8fCAhZmxvYXRzLmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IERvIGJldHRlciBldmVudHVhbGx5LiAgRm9yIG5v
dyBpZiB3ZSBldmVyIHNoaWZ0IGJlY2F1c2Ugb2YgcGFnaW5hdGlvbiBhbmQgZmxvYXRzIGFyZSBw
cmVzZW50IGp1c3QgZ28gdG8gYSBmdWxsIGxheW91dC4KKyAgICAgICAgICAgICAgICAgICAgICAg
IGxheW91dFN0YXRlLm1hcmtGb3JGdWxsTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxh
eW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3goY3VycmVudExpbmUsIHBhZ2luYXRp
b25EZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLT5hZGp1c3RCbG9ja0Rp
cmVjdGlvblBvc2l0aW9uKHBhZ2luYXRpb25EZWx0YSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQorICAgICAgICAg
ICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUoY3VycmVudExpbmUpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gY3VycmVudExp
bmUtPmZsb2F0c1B0cigpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgYSBuZXcgZmxvYXQgaGFz
IGJlZW4gaW5zZXJ0ZWQgYmVmb3JlIHRoaXMgbGluZSBvciBiZWZvcmUgaXRzIGxhc3Qga25vd24g
ZmxvYXQsIGp1c3QgZG8gYSBmdWxsIGxheW91dC4KKyAgICAgICAgICAgICAgICBib29sIGVuY291
bnRlcmVkTmV3RmxvYXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0
Qm94T25DbGVhbkxpbmUgOiAqY2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgICAgICAgICAgICAg
IEFTU0VSVChmbG9hdHNJdGVyYXRvciAhPSBlbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWZsb2F0Qm94T25DbGVhbkxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGluZSwg
KmZsb2F0Qm94T25DbGVhbkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdGbG9h
dCwgZGlydGllZEJ5RmxvYXQpOworICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJhdG9y
OworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVuY291
bnRlcmVkTmV3RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLm1h
cmtGb3JGdWxsTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAo
ZGlydGllZEJ5RmxvYXQgfHwgZW5jb3VudGVyZWROZXdGbG9hdCkKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYg
YSBuZXcgZmxvYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gZmxvYXQu
CisgICAgICAgIGlmIChmbG9hdHNJdGVyYXRvciAhPSBlbmQpIHsKKyAgICAgICAgICAgIGlmICgh
Y3VycmVudExpbmUpCisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlv
dXQoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoOyBmbG9hdHNJ
dGVyYXRvciAhPSBlbmQ7ICsrZmxvYXRzSXRlcmF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAg
YXV0byYgZmxvYXRXaXRoUmVjdCA9ICpmbG9hdHNJdGVyYXRvcjsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCFmbG9hdFdpdGhSZWN0LT5yZW5kZXJlcigpLm5lZWRzTGF5b3V0KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3Rh
dGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYg
KGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKSB7CisgICAgICAgIG1fbGluZUJveGVzLmRlbGV0
ZUxpbmVCb3hUcmVlKCk7CisgICAgICAgIGN1cnJlbnRMaW5lID0gbnVsbHB0cjsKKyAgICAgICAg
QVNTRVJUKCFmaXJzdFJvb3RCb3goKSAmJiAhbGFzdFJvb3RCb3goKSk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgZGly
dHkgbGluZS4KKyAgICAgICAgICAgIGlmIChSb290SW5saW5lQm94KiBwcmV2Um9vdEJveCA9IGN1
cnJlbnRMaW5lLT5wcmV2Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBh
IHByZXZpb3VzIGxpbmUuCisgICAgICAgICAgICAgICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAo
IXByZXZSb290Qm94LT5lbmRzV2l0aEJyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXBy
ZXZSb290Qm94LT5saW5lQnJlYWtPYmooKQorICAgICAgICAgICAgICAgICAgICB8fCAoaXM8UmVu
ZGVyVGV4dD4oKnByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSkKKyAgICAgICAgICAgICAgICAg
ICAgJiYgcHJldlJvb3RCb3gtPmxpbmVCcmVha1BvcygpID49IGRvd25jYXN0PFJlbmRlclRleHQ+
KCpwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkpLnRleHQoKS5sZW5ndGgoKSkpKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBsaW5lIGRpZG4ndCBicmVhayBjbGVhbmx5
IG9yIGJyb2tlIGF0IGEgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBi
ZWVuIGRlbGV0ZWQsIHNvIHRyZWF0IGl0IGFzIGRpcnR5IHRvby4KKyAgICAgICAgICAgICAgICAg
ICAgY3VycmVudExpbmUgPSBwcmV2Um9vdEJveDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBkaXJ0eSBsaW5lcywg
dGhlbiBsYXN0IGlzIGp1c3QgdGhlIGxhc3Qgcm9vdCBib3guCisgICAgICAgIGxhc3RMaW5lID0g
Y3VycmVudExpbmUgPyBjdXJyZW50TGluZS0+cHJldlJvb3RCb3goKSA6IGxhc3RSb290Qm94KCk7
CisgICAgfQorCisgICAgaWYgKCFmbG9hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIExheW91dFVu
aXQgc2F2ZWRMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICAvLyBSZXN0
b3JlIGZsb2F0cyBmcm9tIGNsZWFuIGxpbmVzLgorICAgICAgICBSb290SW5saW5lQm94KiBsaW5l
ID0gZmlyc3RSb290Qm94KCk7CisgICAgICAgIHdoaWxlIChsaW5lICE9IGN1cnJlbnRMaW5lKSB7
CisgICAgICAgICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRy
KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFuTGlu
ZUZsb2F0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQorICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGF1dG8qIGZs
b2F0aW5nT2JqZWN0ID0gaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKKyAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIWZsb2F0aW5n
T2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5n
T2JqZWN0LT5zZXRPcmlnaW5hdGluZ0xpbmUoKmxpbmUpOworICAgICAgICAgICAgICAgICAgICBz
ZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2lu
QmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0
aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0cy5zZXRMYXN0Q2xlYW5G
bG9hdCgqZmxvYXRpbmdCb3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpOworICAgICAgICB9CisgICAgICAg
IHNldExvZ2ljYWxIZWlnaHQoc2F2ZWRMb2dpY2FsSGVpZ2h0KTsKKyAgICB9CisKKyAgICBsYXlv
dXRTdGF0ZS5saW5lSW5mbygpLnNldEZpcnN0TGluZSghbGFzdExpbmUpOworICAgIGxheW91dFN0
YXRlLmxpbmVJbmZvKCkuc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCFsYXN0TGluZSB8fCBs
YXN0TGluZS0+ZW5kc1dpdGhCcmVhaygpKTsKKworICAgIGlmIChsYXN0TGluZSkgeworICAgICAg
ICBzZXRMb2dpY2FsSGVpZ2h0KGxhc3RMaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Cisg
ICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVyYXRvcih0aGlzLCBsYXN0TGlu
ZS0+bGluZUJyZWFrT2JqKCksIGxhc3RMaW5lLT5saW5lQnJlYWtQb3MoKSk7CisgICAgICAgIHJl
c29sdmVyLnNldFBvc2l0aW9uKGl0ZXIsIG51bWJlck9mSXNvbGF0ZUFuY2VzdG9ycyhpdGVyKSk7
CisgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhsYXN0TGluZS0+bGluZUJyZWFrQmlkaVN0YXR1
cygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0
eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgICAgIGlmIChzdHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0g
UGxhaW50ZXh0KQorICAgICAgICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGlyZWN0aW9u
LCBJbmxpbmVJdGVyYXRvcih0aGlzLCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcygqdGhp
cyksIDApKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0U3RhdHVzKEJpZGlTdGF0dXMoZGlyZWN0aW9u
LCBpc092ZXJyaWRlKHN0eWxlKCkudW5pY29kZUJpZGkoKSkpKTsKKyAgICAgICAgSW5saW5lSXRl
cmF0b3IgaXRlciA9IElubGluZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJ
bmxpbmVzKCp0aGlzLCAmcmVzb2x2ZXIpLCAwKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRp
b24oaXRlciwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGl0ZXIpKTsKKyAgICB9CisgICAgcmV0
dXJuIGN1cnJlbnRMaW5lOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5k
UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3Rh
cnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFu
TGluZUJpZGlTdGF0dXMpCit7CisgICAgYXV0byBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9hdCA9
IFtdKExpbmVMYXlvdXRTdGF0ZTo6RmxvYXRMaXN0JiBmbG9hdHMpIHsKKyAgICAgICAgYXV0byBs
YXN0Q2xlYW5GbG9hdCA9IGZsb2F0cy5sYXN0Q2xlYW5GbG9hdCgpOworICAgICAgICBpZiAoIWxh
c3RDbGVhbkZsb2F0KQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0cy5iZWdpbigpOworICAgICAg
ICBhdXRvKiBsYXN0Q2xlYW5GbG9hdFdpdGhSZWN0ID0gZmxvYXRzLmZsb2F0V2l0aFJlY3QoKmxh
c3RDbGVhbkZsb2F0KTsKKyAgICAgICAgQVNTRVJUKGxhc3RDbGVhbkZsb2F0V2l0aFJlY3QpOwor
ICAgICAgICByZXR1cm4gKytmbG9hdHMuZmluZCgqbGFzdENsZWFuRmxvYXRXaXRoUmVjdCk7Cisg
ICAgfTsKKworICAgIEFTU0VSVCghbGF5b3V0U3RhdGUuZW5kTGluZSgpKTsKKyAgICBhdXRvIGZs
b2F0c0l0ZXJhdG9yID0gaXRlcmF0b3JGb3JGaXJzdERpcnR5RmxvYXQobGF5b3V0U3RhdGUuZmxv
YXRMaXN0KCkpOworICAgIGF1dG8gZW5kID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuZW5kKCk7
CisgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBudWxscHRyOworICAgIGZvciAoUm9vdElu
bGluZUJveCogY3VycmVudExpbmUgPSBzdGFydExpbmUtPm5leHRSb290Qm94KCk7IGN1cnJlbnRM
aW5lOyBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
IGlmICghY3VycmVudExpbmUtPmlzRGlydHkoKSkgeworICAgICAgICAgICAgaWYgKGF1dG8qIGNs
ZWFuTGluZUZsb2F0cyA9IGN1cnJlbnRMaW5lLT5mbG9hdHNQdHIoKSkgeworICAgICAgICAgICAg
ICAgIGJvb2wgZW5jb3VudGVyZWROZXdGbG9hdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJv
b2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZs
b2F0Qm94T25DbGVhbkxpbmUgOiAqY2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICghZmxvYXRCb3hPbkNsZWFuTGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZmxvYXRzSXRlcmF0b3IgIT0gZW5k
KTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGlu
ZSwgKmZsb2F0Qm94T25DbGVhbkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdG
bG9hdCwgZGlydGllZEJ5RmxvYXQpOworICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJh
dG9yOworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVu
Y291bnRlcmVkTmV3RmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjdXJy
ZW50TGluZS0+aXNEaXJ0eSgpKQorICAgICAgICAgICAgbGFzdExpbmUgPSBudWxscHRyOworICAg
ICAgICBlbHNlIGlmICghbGFzdExpbmUpCisgICAgICAgICAgICBsYXN0TGluZSA9IGN1cnJlbnRM
aW5lOworICAgIH0KKworICAgIGlmICghbGFzdExpbmUpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIEF0IHRoaXMgcG9pbnQsIHxsYXN0fCBpcyB0aGUgZmlyc3QgbGluZSBpbiBhIHJ1biBvZiBj
bGVhbiBsaW5lcyB0aGF0IGVuZHMgd2l0aCB0aGUgbGFzdCBsaW5lCisgICAgLy8gaW4gdGhlIGJs
b2NrLgorICAgIFJvb3RJbmxpbmVCb3gqIHByZXZpb3VzTGluZSA9IGxhc3RMaW5lLT5wcmV2Um9v
dEJveCgpOworICAgIGNsZWFuTGluZVN0YXJ0ID0gSW5saW5lSXRlcmF0b3IodGhpcywgcHJldmlv
dXNMaW5lLT5saW5lQnJlYWtPYmooKSwgcHJldmlvdXNMaW5lLT5saW5lQnJlYWtQb3MoKSk7Cisg
ICAgY2xlYW5MaW5lQmlkaVN0YXR1cyA9IHByZXZpb3VzTGluZS0+bGluZUJyZWFrQmlkaVN0YXR1
cygpOworICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVMb2dpY2FsVG9wKHByZXZpb3VzTGluZS0+
bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworCisgICAgZm9yIChSb290SW5saW5lQm94KiBsaW5l
ID0gbGFzdExpbmU7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
IC8vIERpc2Nvbm5lY3QgYWxsIGxpbmUgYm94ZXMgZnJvbSB0aGVpciByZW5kZXIgb2JqZWN0cyB3
aGlsZSBwcmVzZXJ2aW5nIHRoZWlyIGNvbm5lY3Rpb25zIHRvIG9uZSBhbm90aGVyLgorICAgICAg
ICBsaW5lLT5leHRyYWN0TGluZSgpOworICAgIH0KKyAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5l
KGxhc3RMaW5lKTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFu
ZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQoreworICAgIExh
eW91dFVuaXQgbGluZURlbHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGlu
ZUxvZ2ljYWxUb3AoKTsKKworICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygp
LmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlv
dXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAgICBpZiAocGFnaW5h
dGVkICYmIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpIHsKKyAgICAgICAgLy8gQ2hlY2sg
YWxsIGxpbmVzIGZyb20gaGVyZSB0byB0aGUgZW5kLCBhbmQgc2VlIGlmIHRoZSBoeXBvdGhldGlj
YWwgbmV3IHBvc2l0aW9uIGZvciB0aGUgbGluZXMgd2lsbCByZXN1bHQKKyAgICAgICAgLy8gaW4g
YSBkaWZmZXJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGguCisgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogbGluZUJveCA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsgbGluZUJveDsgbGluZUJveCA9
IGxpbmVCb3gtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHRoZSByZWFsIG1vdmUgd2UncmUgZ29pbmcg
dG8gZG8sIHNvIGRvbid0IHVwZGF0ZSB0aGUgbGluZSBib3gncyBwYWdpbmF0aW9uCisgICAgICAg
ICAgICAgICAgLy8gc3RydXQgeWV0LgorICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkUGFn
aW5hdGlvblN0cnV0ID0gbGluZUJveC0+cGFnaW5hdGlvblN0cnV0KCk7CisgICAgICAgICAgICAg
ICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVudDsKKyAgICAgICAgICAgICAgICBsaW5lRGVsdGEgLT0g
b2xkUGFnaW5hdGlvblN0cnV0OworICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZv
clBhZ2luYXRpb24obGluZUJveCwgbGluZURlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0
U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0UGFn
aW5hdGlvblN0cnV0KG9sZFBhZ2luYXRpb25TdHJ1dCk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAobGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQobGluZUJveCwgbGluZURl
bHRhLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFsaW5lRGVsdGEgfHwg
IW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAvLyBT
ZWUgaWYgYW55IGZsb2F0cyBlbmQgaW4gdGhlIHJhbmdlIGFsb25nIHdoaWNoIHdlIHdhbnQgdG8g
c2hpZnQgdGhlIGxpbmVzIHZlcnRpY2FsbHkuCisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0g
c3RkOjptaW4obG9naWNhbEhlaWdodCgpLCBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgp
KTsKKworICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgp
OworICAgIHdoaWxlIChSb290SW5saW5lQm94KiBuZXh0TGluZSA9IGxhc3RMaW5lLT5uZXh0Um9v
dEJveCgpKQorICAgICAgICBsYXN0TGluZSA9IG5leHRMaW5lOworCisgICAgTGF5b3V0VW5pdCBs
b2dpY2FsQm90dG9tID0gbGFzdExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpICsgYWJzb2x1
dGVWYWx1ZShsaW5lRGVsdGEpOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0
aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGF1dG8gZW5kID0g
ZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmpl
Y3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGZs
b2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b21Gb3JG
bG9hdChmbG9hdGluZ09iamVjdCkgPj0gbG9naWNhbFRvcCAmJiBsb2dpY2FsQm90dG9tRm9yRmxv
YXQoZmxvYXRpbmdPYmplY3QpIDwgbG9naWNhbEJvdHRvbSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zs
b3c6OmxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqIHJvb3RC
b3gsIExheW91dFVuaXQgbGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRl
ZEZsb3cpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFnbWVudGVkRmxvdykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGN1cnJlbnRGcmFnbWVudCA9
IGZyYWdtZW50QXRCbG9ja09mZnNldChyb290Qm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSArIGxp
bmVEZWx0YSk7CisgICAgLy8gSnVzdCBiYWlsIGlmIHRoZSBmcmFnbWVudCBkaWRuJ3QgY2hhbmdl
LgorICAgIGlmIChyb290Qm94LT5jb250YWluaW5nRnJhZ21lbnQoKSA9PSBjdXJyZW50RnJhZ21l
bnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcm9vdEJveC0+cGFnaW5hdGVk
TGluZVdpZHRoKCkgIT0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChjdXJyZW50RnJh
Z21lbnQpOworfQorCitib29sIFJlbmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
ciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYg
ZW5kTGluZVN0YXR1cykKK3sKKyAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5l
U3RhcnQpIHsKKyAgICAgICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjaGVja1BhZ2luYXRp
b25BbmRGbG9hdHNBdEVuZExpbmUobGF5b3V0U3RhdGUpOworICAgIH0KKworICAgIC8vIFRoZSBm
aXJzdCBjbGVhbiBsaW5lIGRvZXNuJ3QgbWF0Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgYSBoYW5kZnVs
IG9mIGZvbGxvd2luZyBsaW5lcyB0byB0cnkKKyAgICAvLyB0byBtYXRjaCBiYWNrIHVwLgorICAg
IHN0YXRpYyBjb25zdCBpbnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3
aWxsaW5nIHRvIG1hdGNoIGFnYWluc3QuCisgICAgUm9vdElubGluZUJveCogb3JpZ2luYWxFbmRM
aW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOworICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBv
cmlnaW5hbEVuZExpbmU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5l
OyBpKyssIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChsaW5lLT5s
aW5lQnJlYWtPYmooKSA9PSByZXNvbHZlci5wb3NpdGlvbigpLnJlbmRlcmVyKCkgJiYgbGluZS0+
bGluZUJyZWFrUG9zKCkgPT0gcmVzb2x2ZXIucG9zaXRpb24oKS5vZmZzZXQoKSkgeworICAgICAg
ICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLgorICAgICAgICAgICAgaWYgKGxpbmUtPmxpbmVCcmVh
a0JpZGlTdGF0dXMoKSAhPSByZXNvbHZlci5zdGF0dXMoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7IC8vIC4uLmJ1dCB0aGUgYmlkaSBzdGF0ZSBkb2Vzbid0IG1hdGNoLgorICAgICAg
ICAgICAgCisgICAgICAgICAgICBib29sIG1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFJv
b3RJbmxpbmVCb3gqIHJlc3VsdCA9IGxpbmUtPm5leHRSb290Qm94KCk7CisgICAgICAgICAgICBs
YXlvdXRTdGF0ZS5zZXRFbmRMaW5lKHJlc3VsdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7
CisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxUb3AobGluZS0+
bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBjaGVj
a1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUobGF5b3V0U3RhdGUpOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAvLyBOb3cgZGVsZXRlIHRoZSBsaW5lcyB0aGF0IHdlIGZhaWxlZCB0
byBzeW5jLgorICAgICAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBvcmlnaW5h
bEVuZExpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZDsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9jazo6Z2Vu
ZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCit7
CisgICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkgPT0gdGhpcyk7CisKKyAgICBJbmxpbmVJ
dGVyYXRvciBpdCh0aGlzLCBpbmxpbmVPYmosIDApOworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQg
cGFzcyBjb3JyZWN0IHZhbHVlIGZvciBXaGl0ZXNwYWNlUG9zaXRpb24uCisgICAgd2hpbGUgKCFp
dC5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXQpKQorICAgICAgICBpdC5pbmNyZW1lbnQo
KTsKKworICAgIHJldHVybiAhaXQuYXRFbmQoKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKK3sKKyAgICBpZiAoYXV0byBsYXlvdXQg
PSBzaW1wbGVMaW5lTGF5b3V0KCkpIHsKKyAgICAgICAgQVNTRVJUKCFoYXNPdmVyZmxvd0NsaXAo
KSk7CisgICAgICAgIFNpbXBsZUxpbmVMYXlvdXQ6OmNvbGxlY3RGbG93T3ZlcmZsb3coKnRoaXMs
ICpsYXlvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExheW91dFVuaXQgZW5kUGFk
ZGluZyA9IGhhc092ZXJmbG93Q2xpcCgpID8gcGFkZGluZ0VuZCgpIDogMF9sdTsKKyAgICAvLyBG
SVhNRTogTmVlZCB0byBmaW5kIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMsIHNpbmNlIHNjcm9sbGJh
cnMgY291bGQgc2hvdyB3aGVuIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KKyAgICBpZiAoaGFzT3Zl
cmZsb3dDbGlwKCkgJiYgIWVuZFBhZGRpbmcgJiYgZWxlbWVudCgpICYmIGVsZW1lbnQoKS0+aXNS
b290RWRpdGFibGVFbGVtZW50KCkgJiYgc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkp
CisgICAgICAgIGVuZFBhZGRpbmcgPSAxOworICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9
IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAg
ICAgICBhZGRMYXlvdXRPdmVyZmxvdyhjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3QoZW5k
UGFkZGluZykpOworICAgICAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogZnJhZ21lbnQgPSBl
bmNsb3NpbmdGcmFnbWVudGVkRmxvdygpID8gY3Vyci0+Y29udGFpbmluZ0ZyYWdtZW50KCkgOiBu
dWxscHRyOworICAgICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICBmcmFnbWVudC0+YWRk
TGF5b3V0T3ZlcmZsb3dGb3JCb3godGhpcywgY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0
KGVuZFBhZGRpbmcpKTsKKyAgICAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSkgeworICAgICAg
ICAgICAgTGF5b3V0UmVjdCBjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCA9IGN1cnItPnZpc3VhbE92
ZXJmbG93UmVjdChjdXJyLT5saW5lVG9wKCksIGN1cnItPmxpbmVCb3R0b20oKSk7CisgICAgICAg
ICAgICBhZGRWaXN1YWxPdmVyZmxvdyhjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7CisgICAgICAg
ICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICAgICAgZnJhZ21lbnQtPmFkZFZpc3VhbE92
ZXJmbG93Rm9yQm94KHRoaXMsIGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVz
KCkKK3sKKyAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7
CisgICAgYm9vbCBsdHIgPSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IEluZGVudFRleHQ7CisgICAgZm9yIChS
b290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5u
ZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChjdXJyLT5oYXNFbGxpcHNpc0JveCgpKSB7Cisg
ICAgICAgICAgICBjdXJyLT5jbGVhclRydW5jYXRpb24oKTsKKworICAgICAgICAgICAgLy8gU2hp
ZnQgdGhlIGxpbmUgYmFjayB3aGVyZSBpdCBiZWxvbmdzIGlmIHdlIGNhbm5vdCBhY2NvbW9kYXRl
IGFuIGVsbGlwc2lzLgorICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSBsb2dpY2FsTGVm
dE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAg
ICAgICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9mZnNldEZv
ckxpbmUoY3Vyci0+bGluZVRvcCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExlZnQ7Cisg
ICAgICAgICAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1cnItPmxvZ2ljYWxXaWR0aCgp
OworICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwg
Y3VyciwgMCwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2Fs
V2lkdGgsIDApOworCisgICAgICAgICAgICBpZiAobHRyKQorICAgICAgICAgICAgICAgIGN1cnIt
PmFkanVzdExvZ2ljYWxQb3NpdGlvbigobG9naWNhbExlZnQgLSBjdXJyLT5sb2dpY2FsTGVmdCgp
KSwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9n
aWNhbFBvc2l0aW9uKC0oY3Vyci0+bG9naWNhbExlZnQoKSAtIGxvZ2ljYWxMZWZ0KSwgMCk7Cisg
ICAgICAgIH0KKyAgICAgICAgc2hvdWxkSW5kZW50VGV4dCA9IERvTm90SW5kZW50VGV4dDsKKyAg
ICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93
KCkKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNpcyB1c2luZyB0
aGUgY3VycmVudCBmb250LgorICAgIC8vIEZJWE1FOiBDU1MzIHNheXMgdGhpcyBpcyBjb25maWd1
cmFibGUsIGFsc28gbmVlZCB0byB1c2UgMHgwMDJFIChGVUxMIFNUT1ApIGlmIGhvcml6b250YWwg
ZWxsaXBzaXMgaXMgIm5vdCByZW5kZXJhYmxlIgorICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250
ID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpOworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxBdG9t
U3RyaW5nPiBlbGxpcHNpc1N0cigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxKTsKKyAgICBjb25zdCBG
b250Q2FzY2FkZSYgZmlyc3RMaW5lRm9udCA9IGZpcnN0TGluZVN0eWxlKCkuZm9udENhc2NhZGUo
KTsKKyAgICBmbG9hdCBmaXJzdExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53aWR0
aChjb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9udGFsRWxsaXBzaXMsIDEsIGZpcnN0TGluZVN0eWxl
KCkpKTsKKyAgICBmbG9hdCBlbGxpcHNpc1dpZHRoID0gKGZvbnQgPT0gZmlyc3RMaW5lRm9udCkg
PyBmaXJzdExpbmVFbGxpcHNpc1dpZHRoIDogZm9udC53aWR0aChjb25zdHJ1Y3RUZXh0UnVuKCZo
b3Jpem9udGFsRWxsaXBzaXMsIDEsIHN0eWxlKCkpKTsKKworICAgIC8vIEZvciBMVFIgdGV4dCB0
cnVuY2F0aW9uLCB3ZSB3YW50IHRvIGdldCB0aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBi
b3gsIGFuZCB0aGVuIHdlIHdhbnQgdG8gc2VlCisgICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2Yg
YSBsaW5lIGJveCBleGNlZWRzIHRoYXQuICBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBv
ZiB0aGUgcGFkZGluZyBib3ggYW5kCisgICAgLy8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUg
bGluZSBib3ggdG8gc2VlIGlmIGl0IGlzIGxlc3MKKyAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxi
YXIgZm9yIG92ZXJmbG93IGJsb2Nrcywgd2hpY2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRl
bnRXaWR0aCgpIgorICAgIGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCk7CisgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgpLnRleHRBbGlnbigpOwor
ICAgIGJvb2wgZmlyc3RMaW5lID0gdHJ1ZTsKKyAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIg
PSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBmaXJzdExpbmUgPyBJbmRl
bnRUZXh0IDogRG9Ob3RJbmRlbnRUZXh0OworICAgICAgICBMYXlvdXRVbml0IGJsb2NrUmlnaHRF
ZGdlID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZElu
ZGVudFRleHQpOworICAgICAgICBMYXlvdXRVbml0IGJsb2NrTGVmdEVkZ2UgPSBsb2dpY2FsTGVm
dE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAg
ICAgTGF5b3V0VW5pdCBsaW5lQm94RWRnZSB7IGx0ciA/IGN1cnItPngoKSArIGN1cnItPmxvZ2lj
YWxXaWR0aCgpIDogY3Vyci0+eCgpIH07CisgICAgICAgIGlmICgobHRyICYmIGxpbmVCb3hFZGdl
ID4gYmxvY2tSaWdodEVkZ2UpIHx8ICghbHRyICYmIGxpbmVCb3hFZGdlIDwgYmxvY2tMZWZ0RWRn
ZSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbGluZSBzcGlsbHMgb3V0IG9mIG91ciBib3ggaW4g
dGhlIGFwcHJvcHJpYXRlIGRpcmVjdGlvbi4gIE5vdyB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgbGlu
ZQorICAgICAgICAgICAgLy8gY2FuIGJlIHRydW5jYXRlZC4gIEluIG9yZGVyIGZvciB0cnVuY2F0
aW9uIHRvIGJlIHBvc3NpYmxlLCB0aGUgbGluZSBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZSB0
bworICAgICAgICAgICAgLy8gYWNjb21tb2RhdGUgb3VyIHRydW5jYXRpb24gc3RyaW5nLCBhbmQg
bm8gcmVwbGFjZWQgZWxlbWVudHMgKGltYWdlcywgdGFibGVzKSBjYW4gb3ZlcmxhcCB0aGUgZWxs
aXBzaXMKKyAgICAgICAgICAgIC8vIHNwYWNlLgorICAgICAgICAgICAgTGF5b3V0VW5pdCB3aWR0
aCB7IGZpcnN0TGluZSA/IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBlbGxpcHNpc1dpZHRoIH07
CisgICAgICAgICAgICBMYXlvdXRVbml0IGJsb2NrRWRnZSB7IGx0ciA/IGJsb2NrUmlnaHRFZGdl
IDogYmxvY2tMZWZ0RWRnZSB9OworICAgICAgICAgICAgaWYgKGN1cnItPmxpbmVDYW5BY2NvbW1v
ZGF0ZUVsbGlwc2lzKGx0ciwgYmxvY2tFZGdlLCBsaW5lQm94RWRnZSwgd2lkdGgpKSB7CisgICAg
ICAgICAgICAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBjdXJyLT5wbGFjZUVsbGlwc2lz
KGVsbGlwc2lzU3RyLCBsdHIsIGJsb2NrTGVmdEVkZ2UsIGJsb2NrUmlnaHRFZGdlLCB3aWR0aCk7
CisKKyAgICAgICAgICAgICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IDA7IC8vIFdlIGFyZSBvbmx5
IGludGVyZXN0ZWQgaW4gdGhlIGRlbHRhIGZyb20gdGhlIGJhc2UgcG9zaXRpb24uCisgICAgICAg
ICAgICAgICAgZmxvYXQgdHJ1bmNhdGVkV2lkdGggPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JM
aW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgICAgICAgICAgICAg
dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgY3VyciwgbnVsbHB0ciwg
bG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCB0cnVuY2F0ZWRXaWR0aCwgMCk7CisgICAg
ICAgICAgICAgICAgaWYgKGx0cikKKyAgICAgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9n
aWNhbFBvc2l0aW9uKGxvZ2ljYWxMZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbigtKHRydW5jYXRlZFdp
ZHRoIC0gKGxvZ2ljYWxMZWZ0ICsgdG90YWxMb2dpY2FsV2lkdGgpKSwgMCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7CisgICAgfQorfQorCiti
b29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25zdCBGbG9hdGlu
Z09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lLCBMaW5lSW5mbyYgbGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCit7CisgICAgaWYgKCFw
b3NpdGlvbk5ld0Zsb2F0cygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aWR0aC5z
aHJpbmtBdmFpbGFibGVXaWR0aEZvck5ld0Zsb2F0SWZOZWVkZWQobmV3RmxvYXQpOworCisgICAg
Ly8gV2Ugb25seSBjb25uZWN0IGZsb2F0cyB0byBsaW5lcyBmb3IgcGFnaW5hdGlvbiBwdXJwb3Nl
cyBpZiB0aGUgZmxvYXRzIG9jY3VyIGF0IHRoZSBzdGFydCBvZgorICAgIC8vIHRoZSBsaW5lIGFu
ZCB0aGUgcHJldmlvdXMgbGluZSBoYWQgYSBoYXJkIGJyZWFrIChzbyB0aGlzIGxpbmUgaXMgZWl0
aGVyIHRoZSBmaXJzdCBpbiB0aGUgYmxvY2sKKyAgICAvLyBvciBmb2xsb3dzIGEgPGJyPikuCisg
ICAgaWYgKCFuZXdGbG9hdC5wYWdpbmF0aW9uU3RydXQoKSB8fCAhbGluZUluZm8ucHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KCkgfHwgIWxpbmVJbmZvLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQg
PSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgQVNTRVJUKGZsb2F0aW5nT2JqZWN0U2V0
Lmxhc3QoKS5nZXQoKSA9PSAmbmV3RmxvYXQpOworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2lj
YWxUb3AgPSBsb2dpY2FsVG9wRm9yRmxvYXQobmV3RmxvYXQpOworICAgIExheW91dFVuaXQgcGFn
aW5hdGlvblN0cnV0ID0gbmV3RmxvYXQucGFnaW5hdGlvblN0cnV0KCk7CisKKyAgICBpZiAoZmxv
YXRMb2dpY2FsVG9wIC0gcGFnaW5hdGlvblN0cnV0ICE9IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJ
bmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
YXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIC0taXQ7IC8vIExhc3QgZmxv
YXQgaXMgbmV3RmxvYXQsIHNraXAgdGhhdCBvbmUuCisgICAgYXV0byBiZWdpbiA9IGZsb2F0aW5n
T2JqZWN0U2V0LmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGJlZ2luKSB7CisgICAgICAgIC0t
aXQ7CisgICAgICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKKyAgICAgICAg
aWYgKCZmbG9hdGluZ09iamVjdCA9PSBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGlmIChsb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmpl
Y3QpID09IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkp
IHsKKyAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LnNldFBhZ2luYXRpb25TdHJ1dChwYWdpbmF0
aW9uU3RydXQgKyBmbG9hdGluZ09iamVjdC5wYWdpbmF0aW9uU3RydXQoKSk7CisgICAgICAgICAg
ICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gZmxvYXRpbmdPYmplY3QucmVuZGVyZXIoKTsKKyAgICAg
ICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChmbG9hdEJveCwgbG9naWNhbFRvcEZvckNoaWxk
KGZsb2F0Qm94KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGZsb2F0Qm94KSArIHBhZ2luYXRpb25T
dHJ1dCk7CisKKyAgICAgICAgICAgIGlmICh1cGRhdGVGcmFnbWVudFJhbmdlRm9yQm94Q2hpbGQo
ZmxvYXRCb3gpKQorICAgICAgICAgICAgICAgIGZsb2F0Qm94LnNldE5lZWRzTGF5b3V0KE1hcmtP
bmx5VGhpcyk7CisgICAgICAgICAgICBlbHNlIGlmIChpczxSZW5kZXJCbG9jaz4oZmxvYXRCb3gp
KQorICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPihmbG9hdEJveCkuc2V0Q2hp
bGROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgICAgICAgICAgZmxvYXRCb3gubGF5b3V0
SWZOZWVkZWQoKTsKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb2xkIGxvZ2ljYWwgdG9wIGJl
Zm9yZSBjYWxsaW5nIHJlbW92ZVBsYWNlZE9iamVjdCB3aGljaCB3aWxsIHNldAorICAgICAgICAg
ICAgLy8gaXNQbGFjZWQgdG8gZmFsc2UuIE90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIgYW4gYXNz
ZXJ0IGluIGxvZ2ljYWxUb3BGb3JGbG9hdC4KKyAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9n
aWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCk7CisgICAgICAgICAg
ICBtX2Zsb2F0aW5nT2JqZWN0cy0+cmVtb3ZlUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVjdCk7
CisgICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QsIG9sZExv
Z2ljYWxUb3AgKyBwYWdpbmF0aW9uU3RydXQpOworICAgICAgICAgICAgbV9mbG9hdGluZ09iamVj
dHMtPmFkZFBsYWNlZE9iamVjdCgmZmxvYXRpbmdPYmplY3QpOworICAgICAgICB9CisgICAgfQor
CisgICAgLy8gSnVzdCB1cGRhdGUgdGhlIGxpbmUgaW5mbydzIHBhZ2luYXRpb24gc3RydXQgd2l0
aG91dCBhbHRlcmluZyBvdXIgbG9naWNhbCBoZWlnaHQgeWV0LiBJZiB0aGUgbGluZSBlbmRzIHVw
IGNvbnRhaW5pbmcKKyAgICAvLyBubyBjb250ZW50LCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gaW1w
cm9wZXJseSBncm93IHRoZSBoZWlnaHQgb2YgdGhlIGJsb2NrLgorICAgIGxpbmVJbmZvLnNldEZs
b2F0UGFnaW5hdGlvblN0cnV0KGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkgKyBwYWdp
bmF0aW9uU3RydXQpOworICAgIHJldHVybiB0cnVlOworfQorCitMYXlvdXRVbml0IFJlbmRlckJs
b2NrRmxvdzo6c3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCkKK3sKKyAgICBUZXh0QWxpZ25Nb2RlIHRl
eHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgYm9vbCBzaG91bGRBcHBseUluZGVu
dFRleHQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgIGNhc2UgVGV4dEFs
aWduTW9kZTo6TGVmdDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6CisgICAg
ICAgIHNob3VsZEFwcGx5SW5kZW50VGV4dCA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlJpZ2h0OgorICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0UmlnaHQ6CisgICAgICAgIHNob3VsZEFwcGx5SW5k
ZW50VGV4dCA9ICFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpTdGFydDoKKyAgICAgICAgc2hvdWxkQXBwbHlJ
bmRlbnRUZXh0ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
c2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gZmFsc2U7CisgICAgfQorICAgIC8vIDxyZGFyOi8vcHJv
YmxlbS8xNTQyNzU3MT4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTI0NTIyCisgICAgLy8gVGhpcyBxdWlyayBpcyBmb3IgbGVnYWN5IGNvbnRlbnQgdGhh
dCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgY2VudGVyIHBvc2l0aW9uaW5nIHNjaGVt
ZQorICAgIC8vIGJlaW5nIGhvbm9yZWQgKGUuZy4sIGVwdWJzKS4KKyAgICBpZiAoc2hvdWxkQXBw
bHlJbmRlbnRUZXh0IHx8IHNldHRpbmdzKCkudXNlTGVnYWN5VGV4dEFsaWduUG9zaXRpb25lZEVs
ZW1lbnRCZWhhdmlvcigpKSAvLyBGSVhNRTogSGFuZGxlIFRleHRBbGlnbk1vZGU6OkVuZCBoZXJl
CisgICAgICAgIHJldHVybiBzdGFydE9mZnNldEZvckxpbmUocG9zaXRpb24sIHNob3VsZEluZGVu
dFRleHQpOworCisgICAgLy8gdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KCkgaGFuZGxl
cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayBzbyBubyBuZWVkIHRvIGNvbnNpZGVyIGl0IGhl
cmUKKyAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IDA7CisgICAgZmxvYXQgbG9naWNhbExl
ZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVu
dFRleHQpOworICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9m
ZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExl
ZnQ7CisKKyAgICAvLyBGSVhNRTogQnVnIDEyOTMxMTogV2UgbmVlZCB0byBwYXNzIGEgdmFsaWQg
Um9vdElubGluZUJveCBoZXJlLCBjb25zaWRlcmluZyB0aGUgYmlkaSBsZXZlbCB1c2VkIHRvIGNv
bnN0cnVjdCB0aGUgbGluZS4KKyAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4
dEFsaWduLCAwLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgMCk7CisKKyAgICBpZiAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpKQorICAgICAgICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsV2lkdGgoKSAtIGxvZ2ljYWxM
ZWZ0KTsKKyAgICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsTGVmdCk7Cit9CisKK3ZvaWQgUmVu
ZGVyQmxvY2tGbG93Ojp1cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJv
eCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGluZUJveCk7CisKKyAgICBpZiAoIWhhc0ZyYWdtZW50
UmFuZ2VJbkZyYWdtZW50ZWRGbG93KCkpCisgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29udGFpbmlu
Z0ZyYWdtZW50KCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhdXRvIGNvbnRhaW5pbmdGcmFn
bWVudCA9IGZyYWdtZW50QXRCbG9ja09mZnNldChsaW5lQm94LT5saW5lVG9wV2l0aExlYWRpbmco
KSkpCisgICAgICAgICAgICBsaW5lQm94LT5zZXRDb250YWluaW5nRnJhZ21lbnQoKmNvbnRhaW5p
bmdGcmFnbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29u
dGFpbmluZ0ZyYWdtZW50KCk7CisgICAgfQorCisgICAgUm9vdElubGluZUJveCogcHJldkxpbmVC
b3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOworICAgIGlmICghcHJldkxpbmVCb3gpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgY2hlY2sgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRo
ZSBvbmUgaW4gfGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb258IGJlY2F1c2UgaXQgdGFr
ZXMgaW50bworICAgIC8vIGFjY291bnQganVzdCB0aGUgY29udGFpbmVyIGNoYW5nZXMgYmV0d2Vl
biBsaW5lcy4gVGhlIGJlZm9yZSBtZW50aW9uZWQgZnVuY3Rpb24gZG9lc24ndCBzZXQgdGhlIGZs
YWcKKyAgICAvLyBjb3JyZWN0bHkgaWYgdGhlIGxpbmUgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9w
IG9mIHRoZSBsYXN0IGZyYWdtZW50IGNvbnRhaW5lci4KKyAgICBpZiAobGluZUJveC0+Y29udGFp
bmluZ0ZyYWdtZW50KCkgIT0gcHJldkxpbmVCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpKQorICAg
ICAgICBsaW5lQm94LT5zZXRJc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsodHJ1ZSk7Cit9CisKK30KClBy
b3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21wbGV4TGluZUxh
eW91dC5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQojIyAtMCwwICsxICMjCitu
YXRpdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3BwCShyZXZpc2lvbiAyNDg0MDQp
CisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJz
IEtub2xsIChrbm9sbEBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVz
ZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21h
aWwuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmln
aHQgcmVzZXJ2ZWQuCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkNvbXBsZXhMaW5lTGF5b3V0LmgiCiAKICNpbmNsdWRlICJBWE9iamVjdENh
Y2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCkBAIC00MiwxNiArNDMsMjMgQEAKICNp
bmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKICNpbmNsdWRlICJSZW5kZXJSdWJ5QmFzZS5oIgog
I2luY2x1ZGUgIlJlbmRlclJ1YnlUZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyU1ZHVGV4dC5oIgog
I2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTVkdSb290SW5saW5lQm94LmgiCiAj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25z
LmgiCiAjaW5jbHVkZSAiVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94LmgiCiAjaW5jbHVkZSAi
VmVydGljYWxQb3NpdGlvbkNhY2hlLmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK0NvbXBsZXhMaW5lTGF5b3V0OjpDb21wbGV4TGluZUxh
eW91dChSZW5kZXJCbG9ja0Zsb3cmIGZsb3cpCisgICAgOiBtX2Zsb3coZmxvdykKK3sKK30KKwor
Q29tcGxleExpbmVMYXlvdXQ6On5Db21wbGV4TGluZUxheW91dCgpID0gZGVmYXVsdDsKKwogc3Rh
dGljIHZvaWQgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxp
bmVJdGVyYXRvciBpdGVyKQogewogICAgIHdoaWxlICghaXRlci5hdEVuZCgpKSB7CkBAIC03Nyw5
ICs4NSw5IEBAIGlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8QmlkaVJ1bj4gY3JlYXRlUnUKICAgICBy
ZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVy
LmNvbnRleHQoKSwgcmVzb2x2ZXIuZGlyKCkpOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6
YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiogcnVucywgaW50IHN0YXJ0
LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
cikKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OmFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4qIHJ1bnMsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0JiBvYmos
IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCiB7Ci0gICAgaWYgKHN0YXJ0ID4gZW5kIHx8
IHNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JPYmplY3Qob2JqKSkKKyAgICBpZiAoc3RhcnQgPiBl
bmQgfHwgUmVuZGVyQmxvY2s6OnNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JPYmplY3Qob2JqKSkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgTGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUmIGxp
bmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlID0gcmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNp
bmdTdGF0ZSgpOwpAQCAtMTE5LDI5ICsxMjcsMzUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFw
cGVuZFJ1bnNGb3JPYmplYwogICAgIH0KIH0KIAotc3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVC
b3g+IFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlUm9vdElubGluZUJveCgpCitzdGQ6OnVuaXF1ZV9w
dHI8Um9vdElubGluZUJveD4gQ29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZVJvb3RJbmxpbmVCb3go
KQogewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KCp0aGlzKTsK
KyAgICBpZiAoaXM8UmVuZGVyU1ZHVGV4dD4obV9mbG93KSkgeworICAgICAgICBhdXRvIGJveCA9
IHN0ZDo6bWFrZV91bmlxdWU8U1ZHUm9vdElubGluZUJveD4oZG93bmNhc3Q8UmVuZGVyU1ZHVGV4
dD4obV9mbG93KSk7CisgICAgICAgIGJveC0+c2V0SGFzVmlydHVhbExvZ2ljYWxIZWlnaHQoKTsK
KyAgICAgICAgcmV0dXJuIGJveDsKKyAgICB9CisgICAgICAgIAorICAgIHJldHVybiBzdGQ6Om1h
a2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KG1fZmxvdyk7CiB9CiAKLVJvb3RJbmxpbmVCb3gqIFJl
bmRlckJsb2NrRmxvdzo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCitSb290SW5saW5l
Qm94KiBDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCiB7
CiAgICAgYXV0byBuZXdSb290Qm94ID0gY3JlYXRlUm9vdElubGluZUJveCgpOwogICAgIFJvb3RJ
bmxpbmVCb3gqIHJvb3RCb3ggPSBuZXdSb290Qm94LmdldCgpOwogICAgIG1fbGluZUJveGVzLmFw
cGVuZExpbmVCb3goV1RGTW92ZShuZXdSb290Qm94KSk7CiAKICAgICBpZiAoVU5MSUtFTFkoQVhP
YmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgJiYgZmlyc3RSb290Qm94KCkgPT0g
cm9vdEJveCkgewotICAgICAgICBpZiAoQVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb2N1bWVudCgp
LmV4aXN0aW5nQVhPYmplY3RDYWNoZSgpKQotICAgICAgICAgICAgY2FjaGUtPmRlZmVyUmVjb21w
dXRlSXNJZ25vcmVkKGVsZW1lbnQoKSk7CisgICAgICAgIGlmIChBWE9iamVjdENhY2hlKiBjYWNo
ZSA9IG1fZmxvdy5kb2N1bWVudCgpLmV4aXN0aW5nQVhPYmplY3RDYWNoZSgpKQorICAgICAgICAg
ICAgY2FjaGUtPmRlZmVyUmVjb21wdXRlSXNJZ25vcmVkKG1fZmxvdy5lbGVtZW50KCkpOwogICAg
IH0KIAogICAgIHJldHVybiByb290Qm94OwogfQogCi1zdGF0aWMgaW5saW5lIElubGluZUJveCog
Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgYm9vbCBp
c1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNlKQoraW5saW5lIElubGluZUJveCog
Q29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVj
dCogcmVuZGVyZXIsIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4pCiB7CiAgICAg
aWYgKGlzUm9vdExpbmVCb3gpCi0gICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zs
b3c+KCpyZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOworICAgICAgICBy
ZXR1cm4gZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93PigqcmVuZGVyZXIpLmNvbXBsZXhMaW5lTGF5
b3V0KCkuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOwogCiAgICAgaWYgKGlzPFJlbmRl
clRleHQ+KCpyZW5kZXJlcikpCiAgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0Pigq
cmVuZGVyZXIpLmNyZWF0ZUlubGluZVRleHRCb3goKTsKQEAgLTE4NSw3ICsxOTksNyBAQCBzdGF0
aWMgYm9vbCBwYXJlbnRJc0NvbnN0cnVjdGVkT3JIYXZlTmV4CiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi1JbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlcyhSZW5k
ZXJPYmplY3QqIG9iaiwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNoaWxk
Qm94KQorSW5saW5lRmxvd0JveCogQ29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUxpbmVCb3hlcyhS
ZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNo
aWxkQm94KQogewogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFuIHVuY29uc3RydWN0ZWQgbGluZSBi
b3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwogICAgIC8vIHRoZSBsYXN0IGl0ZW0gb24g
dGhlIGxpbmUuCkBAIC0xOTQsOSArMjA4LDkgQEAgSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2tG
bG93OjpjcmVhdGVMaQogICAgIElubGluZUZsb3dCb3gqIHJlc3VsdCA9IG51bGxwdHI7CiAgICAg
Ym9vbCBoYXNEZWZhdWx0TGluZUJveENvbnRhaW4gPSBzdHlsZSgpLmxpbmVCb3hDb250YWluKCkg
PT0gUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lQm94Q29udGFpbigpOwogICAgIGRvIHsKLSAgICAg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oaXM8UmVuZGVySW5saW5lPigqb2Jq
KSB8fCBvYmogPT0gdGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfU0VDVVJJVFlf
SU1QTElDQVRJT04oaXM8UmVuZGVySW5saW5lPigqb2JqKSB8fCBvYmogPT0gJm1fZmxvdyk7CiAK
LSAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gb2JqICE9IHRoaXMgPyBkb3duY2Fz
dDxSZW5kZXJJbmxpbmU+KG9iaikgOiBudWxscHRyOworICAgICAgICBSZW5kZXJJbmxpbmUqIGlu
bGluZUZsb3cgPSBvYmogIT0gJm1fZmxvdyA/IGRvd25jYXN0PFJlbmRlcklubGluZT4ob2JqKSA6
IG51bGxwdHI7CiAKICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGJveCB3ZSBtYWRlIGZvciB0aGlz
IHJlbmRlciBvYmplY3QuCiAgICAgICAgIHBhcmVudEJveCA9IGlubGluZUZsb3cgPyBpbmxpbmVG
bG93LT5sYXN0TGluZUJveCgpIDogZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93Pigqb2JqKS5sYXN0
Um9vdEJveCgpOwpAQCAtMjEyLDEwICsyMjYsMTAgQEAgSW5saW5lRmxvd0JveCogUmVuZGVyQmxv
Y2tGbG93OjpjcmVhdGVMaQogICAgICAgICBpZiAoYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ICYm
ICFjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCkgewogICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBt
YWtlIGEgbmV3IGJveCBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LiAgT25jZQogICAgICAgICAgICAg
Ly8gbWFkZSwgd2UgbmVlZCB0byBwbGFjZSBpdCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxp
bmUuCi0gICAgICAgICAgICBJbmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0ZUlubGluZUJveEZvclJl
bmRlcmVyKG9iaiwgb2JqID09IHRoaXMpOworICAgICAgICAgICAgSW5saW5lQm94KiBuZXdCb3gg
PSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSAmbV9mbG93KTsKICAgICAg
ICAgICAgIHBhcmVudEJveCA9IGRvd25jYXN0PElubGluZUZsb3dCb3g+KG5ld0JveCk7CiAgICAg
ICAgICAgICBwYXJlbnRCb3gtPnNldElzRmlyc3RMaW5lKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkp
OwotICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwoaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSk7CisgICAgICAgICAgICBwYXJlbnRCb3gtPnNldElzSG9yaXpvbnRhbChtX2Zs
b3cuaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CiAgICAgICAgICAgICBpZiAoIWhhc0RlZmF1
bHRMaW5lQm94Q29udGFpbikKICAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmNsZWFyRGVzY2Vu
ZGFudHNIYXZlU2FtZUxpbmVIZWlnaHRBbmRCYXNlbGluZSgpOwogICAgICAgICAgICAgY29uc3Ry
dWN0ZWROZXdCb3ggPSB0cnVlOwpAQCAtMjMxLDcgKzI0NSw3IEBAIElubGluZUZsb3dCb3gqIFJl
bmRlckJsb2NrRmxvdzo6Y3JlYXRlTGkKICAgICAgICAgICAgIGlmIChjaGlsZEJveCkKICAgICAg
ICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7CiAKLSAgICAgICAgICAg
IGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCisgICAgICAgICAgICBpZiAo
IWNvbnN0cnVjdGVkTmV3Qm94IHx8IG9iaiA9PSAmbV9mbG93KQogICAgICAgICAgICAgICAgIGJy
ZWFrOwogCiAgICAgICAgICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsKQEAgLTIzOSw3ICsyNTMs
NyBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpCiAKICAgICAgICAg
Ly8gSWYgd2UndmUgZXhjZWVkZWQgb3VyIGxpbmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0
byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwgdGhlIHJlbWFpbmluZwogICAgICAgICAvLyBpbnRlcm1l
ZGlhdGUgaW5saW5lIGZsb3dzLgotICAgICAgICBvYmogPSAoKytsaW5lRGVwdGggPj0gY01heExp
bmVEZXB0aCkgPyB0aGlzIDogb2JqLT5wYXJlbnQoKTsKKyAgICAgICAgb2JqID0gKCsrbGluZURl
cHRoID49IGNNYXhMaW5lRGVwdGgpID8gJm1fZmxvdyA6IG9iai0+cGFyZW50KCk7CiAKICAgICB9
IHdoaWxlICh0cnVlKTsKIApAQCAtMjcwLDcgKzI4NCw3IEBAIHN0YXRpYyBib29sIHJlYWNoZWRF
bmRPZlRleHRSZW5kZXJlcihjb24KICAgICByZXR1cm4gZW5kc1dpdGhIVE1MU3BhY2VzKHRleHQu
Y2hhcmFjdGVyczE2KCksIHBvc2l0aW9uLCBsZW5ndGgpOwogfQogCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9ja0Zsb3c6OmNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlS
dW5zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCitSb290SW5saW5lQm94KiBDb21wbGV4TGlu
ZUxheW91dDo6Y29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNv
bnN0IExpbmVJbmZvJiBsaW5lSW5mbykKIHsKICAgICBBU1NFUlQoYmlkaVJ1bnMuZmlyc3RSdW4o
KSk7CiAKQEAgLTM0Miw4ICszNTYsMTEgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93
Ojpjb25zdHJ1YwogICAgIHJldHVybiBsYXN0Um9vdEJveCgpOwogfQogCi1UZXh0QWxpZ25Nb2Rl
IFJlbmRlckJsb2NrRmxvdzo6dGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRC
cmVhaykgY29uc3QKK1RleHRBbGlnbk1vZGUgQ29tcGxleExpbmVMYXlvdXQ6OnRleHRBbGlnbm1l
bnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0CiB7CisgICAgaWYgKGF1dG8g
b3ZlcnJpZGVBbGlnbm1lbnQgPSBtX2Zsb3cub3ZlcnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZShl
bmRzV2l0aFNvZnRCcmVhaykpCisgICAgICAgIHJldHVybiAqb3ZlcnJpZGVBbGlnbm1lbnQ7CisK
ICAgICBUZXh0QWxpZ25Nb2RlIGFsaWdubWVudCA9IHN0eWxlKCkudGV4dEFsaWduKCk7CiAjaWYg
RU5BQkxFKENTUzNfVEVYVCkKICAgICBUZXh0SnVzdGlmeSB0ZXh0SnVzdGlmeSA9IHN0eWxlKCku
dGV4dEp1c3RpZnkoKTsKQEAgLTQzNCw3ICs0NTEsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVMb2dp
Y2FsV2lkdGhGb3JDZW50ZXJBCiAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHRvdGFsTG9naWNhbFdp
ZHRoID4gYXZhaWxhYmxlTG9naWNhbFdpZHRoID8gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKSA6IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxX
aWR0aCkgLyAyIC0gdHJhaWxpbmdTcGFjZVdpZHRoOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxv
dzo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biogcnVuLCBSZW5kZXJSdWJ5UnVuJiByZW5k
ZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09iamVjdCwgY29uc3QgTGluZUluZm8mIGxpbmVJ
bmZvKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1
biogcnVuLCBSZW5kZXJSdWJ5UnVuJiByZW5kZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09i
amVjdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQogewogICAgIGZsb2F0IHN0YXJ0T3Zlcmhh
bmc7CiAgICAgZmxvYXQgZW5kT3Zlcmhhbmc7CkBAIC00NDYsOCArNDYzLDggQEAgdm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UgogICAgICAgICB9CiAgICAgfQogICAgIHJl
bmRlcmVyLmdldE92ZXJoYW5nKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksIHJlbmRlcmVyLnN0eWxl
KCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gcHJldmlvdXNPYmplY3QgOiBuZXh0T2JqZWN0
LCByZW5kZXJlci5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG5leHRPYmplY3Qg
OiBwcmV2aW91c09iamVjdCwgc3RhcnRPdmVyaGFuZywgZW5kT3ZlcmhhbmcpOwotICAgIHNldE1h
cmdpblN0YXJ0Rm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLXN0YXJ0T3ZlcmhhbmcpKTsK
LSAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgtZW5kT3Zlcmhh
bmcpKTsKKyAgICBtX2Zsb3cuc2V0TWFyZ2luU3RhcnRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0
VW5pdCgtc3RhcnRPdmVyaGFuZykpOworICAgIG1fZmxvdy5zZXRNYXJnaW5FbmRGb3JDaGlsZChy
ZW5kZXJlciwgTGF5b3V0VW5pdCgtZW5kT3ZlcmhhbmcpKTsKIH0KIAogc3RhdGljIGlubGluZSB2
b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlk
aVJ1biogcnVuLCBSZW5kZXJUZXh0JiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvLApAQCAtNTQzLDcgKzU2MCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRM
b2dpY2FsV2lkdGhGb3JUZXgKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRh
dGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChSZW5kZXJSdWJ5UnVuJiBydWJ5UnVuLCBCaWRpUnVuJiBy
LCBjb25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5z
aWduZWQmIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0
aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGkpCit2b2lkIENvbXBsZXhM
aW5lTGF5b3V0Ojp1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChSZW5kZXJSdWJ5UnVuJiBydWJ5
UnVuLCBCaWRpUnVuJiByLCBjb25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bw
b3J0dW5pdGllcywgdW5zaWduZWQmIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0
b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGkp
CiB7CiAgICAgaWYgKCFydWJ5UnVuLnJ1YnlCYXNlKCkgfHwgIXJ1YnlSdW4ucnVieUJhc2UoKS0+
Zmlyc3RSb290Qm94KCkgfHwgcnVieVJ1bi5ydWJ5QmFzZSgpLT5maXJzdFJvb3RCb3goKS0+bmV4
dFJvb3RCb3goKSB8fCAhci5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkp
CiAgICAgICAgIHJldHVybjsKQEAgLTU2NSw3ICs1ODIsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6dXBkYXRlUnVieUZvckp1c3RpCiAgICAgfQogCiAgICAgQVNTRVJUKCFydWJ5UnVuLmhhc092
ZXJyaWRlQ29udGVudExvZ2ljYWxXaWR0aCgpKTsKLSAgICBmbG9hdCBuZXdCYXNlV2lkdGggPSBy
dWJ5UnVuLmxvZ2ljYWxXaWR0aCgpICsgdG90YWxFeHBhbnNpb24gKyBtYXJnaW5TdGFydEZvckNo
aWxkKHJ1YnlSdW4pICsgbWFyZ2luRW5kRm9yQ2hpbGQocnVieVJ1bik7CisgICAgZmxvYXQgbmV3
QmFzZVdpZHRoID0gcnVieVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFsRXhwYW5zaW9uICsgbV9m
bG93Lm1hcmdpblN0YXJ0Rm9yQ2hpbGQocnVieVJ1bikgKyBtX2Zsb3cubWFyZ2luRW5kRm9yQ2hp
bGQocnVieVJ1bik7CiAgICAgZmxvYXQgbmV3UnVieVJ1bldpZHRoID0gcnVieVJ1bi5sb2dpY2Fs
V2lkdGgoKSArIHRvdGFsRXhwYW5zaW9uOwogICAgIHJ1YnlCYXNlLnNldEluaXRpYWxPZmZzZXQo
KG5ld1J1YnlSdW5XaWR0aCAtIG5ld0Jhc2VXaWR0aCkgLyAyKTsKICAgICBydWJ5UnVuLnNldE92
ZXJyaWRlQ29udGVudExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KG5ld1J1YnlSdW5XaWR0aCkpOwpA
QCAtNTgzLDcgKzYwMCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVSdWJ5Rm9ySnVz
dGkKICAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IC09IHRvdGFsT3Bwb3J0dW5pdGllc0lu
UnVuOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3Rp
ZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGNv
bnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25l
ZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwgZmxv
YXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y29tcHV0
ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRy
YWlsaW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBv
cnR1bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3Rh
bExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQogewogICAgIGlmICgh
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCB8fCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPD0gdG90
YWxMb2dpY2FsV2lkdGgpCiAgICAgICAgIHJldHVybjsKQEAgLTYxNCw3ICs2MzEsNyBAQCB2b2lk
IFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvCiAgICAgfQogfQogCi12b2lkIFJl
bmRlckJsb2NrRmxvdzo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IFRleHRB
bGlnbk1vZGUmIHRleHRBbGlnbiwgY29uc3QgUm9vdElubGluZUJveCogcm9vdElubGluZUJveCwg
QmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90
YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGludCBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50KQordm9pZCBDb21wbGV4TGluZUxheW91dDo6dXBkYXRlTG9naWNh
bFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmIHRleHRBbGlnbiwgY29uc3Qg
Um9vdElubGluZUJveCogcm9vdElubGluZUJveCwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwg
ZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFp
bGFibGVMb2dpY2FsV2lkdGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQogewogICAg
IFRleHREaXJlY3Rpb24gZGlyZWN0aW9uOwogICAgIGlmIChyb290SW5saW5lQm94ICYmIHN0eWxl
KCkudW5pY29kZUJpZGkoKSA9PSBQbGFpbnRleHQpCkBAIC02NDAsNyArNjU3LDcgQEAgdm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUxvZ2ljYWxXaWR0aAogICAgICAgICB1cGRhdGVMb2dpY2Fs
V2lkdGhGb3JDZW50ZXJBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZh
aWxhYmxlTG9naWNhbFdpZHRoKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUZXh0QWxpZ25N
b2RlOjpKdXN0aWZ5OgotICAgICAgICBhZGp1c3RJbmxpbmVEaXJlY3Rpb25MaW5lQm91bmRzKGV4
cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lk
dGgpOworICAgICAgICBtX2Zsb3cuYWRqdXN0SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyhleHBh
bnNpb25PcHBvcnR1bml0eUNvdW50LCBsb2dpY2FsTGVmdCwgYXZhaWxhYmxlTG9naWNhbFdpZHRo
KTsKICAgICAgICAgaWYgKGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpIHsKICAgICAgICAgICAg
IGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7CiAgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lk
dGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOwpAQCAtNjczLDcg
KzY5MCw3IEBAIHN0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMKICAgICBh
dmFpbGFibGVMb2dpY2FsV2lkdGggPSBsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxMZWZ0
OwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0
aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJ
bmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCBy
ZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFN
YXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVh
c3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y29t
cHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJv
eCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGlj
YWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewog
ICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gdGV4dEFsaWdubWVudEZvckxpbmUoIXJlYWNo
ZWRFbmQgJiYgIWxpbmVCb3gtPmVuZHNXaXRoQnJlYWsoKSk7CiAgICAgCkBAIC02ODEsMTggKzY5
OCwxOCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjCiAgICAgLy8g
Ym94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJl
bnQgZWxlbWVudC4iCiAgICAgLy8gQ1NTMyAidGV4dC1pbmRlbnQiLCAiLXdlYmtpdC1lYWNoLWxp
bmUiIGFmZmVjdHMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJsb2NrIGNvbnRhaW5lciBhcyB3ZWxs
IGFzIGVhY2ggbGluZSBhZnRlciBhIGZvcmNlZCBsaW5lIGJyZWFrLAogICAgIC8vIGJ1dCBkb2Vz
IG5vdCBhZmZlY3QgbGluZXMgYWZ0ZXIgYSBzb2Z0IHdyYXAgYnJlYWsuCi0gICAgYm9vbCBpc0Zp
cnN0TGluZSA9IGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgJiYgIShpc0Fub255bW91c0Jsb2NrKCkg
JiYgcGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSB0aGlzKTsKKyAgICBib29sIGlzRmlyc3RMaW5l
ID0gbGluZUluZm8uaXNGaXJzdExpbmUoKSAmJiAhKG1fZmxvdy5pc0Fub255bW91c0Jsb2NrKCkg
JiYgbV9mbG93LnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gJm1fZmxvdyk7CiAgICAgYm9vbCBp
c0FmdGVySGFyZExpbmVCcmVhayA9IGxpbmVCb3gtPnByZXZSb290Qm94KCkgJiYgbGluZUJveC0+
cHJldlJvb3RCb3goKS0+ZW5kc1dpdGhCcmVhaygpOwogICAgIEluZGVudFRleHRPck5vdCBzaG91
bGRJbmRlbnRUZXh0ID0gcmVxdWlyZXNJbmRlbnQoaXNGaXJzdExpbmUsIGlzQWZ0ZXJIYXJkTGlu
ZUJyZWFrLCBzdHlsZSgpKTsKICAgICBmbG9hdCBsaW5lTG9naWNhbExlZnQ7CiAgICAgZmxvYXQg
bGluZUxvZ2ljYWxSaWdodDsKICAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGg7Ci0gICAg
dXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5l
TG9naWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJ
bmRlbnRUZXh0LCAwKTsKKyAgICB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKG1fZmxvdywg
bGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgs
IGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0LCAwKTsKICAgICBib29sIG5lZWRzV29yZFNw
YWNpbmc7CiAKICAgICBpZiAoZmlyc3RSdW4gJiYgZmlyc3RSdW4tPnJlbmRlcmVyKCkuaXNSZXBs
YWNlZCgpKSB7CiAgICAgICAgIFJlbmRlckJveCYgcmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVy
Qm94PihmaXJzdFJ1bi0+cmVuZGVyZXIoKSk7Ci0gICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQ
b3NpdGlvbnMoKnRoaXMsIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxh
YmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwgc2hvdWxkSW5kZW50VGV4dCwgcmVuZGVyQm94
LmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMo
bV9mbG93LCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQsIGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCwgaXNGaXJzdExpbmUsIHNob3VsZEluZGVudFRleHQsIHJlbmRlckJveC5sb2dpY2Fs
SGVpZ2h0KCkpOwogICAgIH0KIAogICAgIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNG
b3JTZWdtZW50KGxpbmVCb3gsIGxpbmVJbmZvLCB0ZXh0QWxpZ24sIGxpbmVMb2dpY2FsTGVmdCwg
YXZhaWxhYmxlTG9naWNhbFdpZHRoLCBmaXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgdGV4dEJv
eERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CkBAIC04
MjUsNyArODQyLDcgQEAgc3RhdGljIGJvb2wgaXNMYXN0SW5GbG93UnVuKEJpZGlSdW4mIHJ1bgog
ICAgIHJldHVybiB0cnVlOwogfQogICAgIAotQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21w
dXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsaW5l
Qm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduLCBm
bG9hdCYgbG9naWNhbExlZnQsIAorQmlkaVJ1biogQ29tcGxleExpbmVMYXlvdXQ6OmNvbXB1dGVJ
bmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIGZsb2F0
JiBsb2dpY2FsTGVmdCwKICAgICBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVu
KiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZh
bGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZl
cnRpY2FsUG9zaXRpb25DYWNoZSwKICAgICBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1l
bnRzKQogewpAQCAtODM1LDcgKzg1Miw3IEBAIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29t
cHV0ZUlubGluZUQKICAgICBib29sIGlzTFRSID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uKCk7CiAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LT5nZXRGbG93U3Bh
Y2luZ0xvZ2ljYWxXaWR0aCgpOwogICAgIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQgPSAwOwotICAgIGJvb2wgaXNBZnRlckV4cGFuc2lvbiA9IGlzPFJlbmRlclJ1YnlCYXNlPigq
dGhpcykgPyBkb3duY2FzdDxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpLmlzQWZ0ZXJFeHBhbnNpb24o
KSA6IHRydWU7CisgICAgYm9vbCBpc0FmdGVyRXhwYW5zaW9uID0gaXM8UmVuZGVyUnVieUJhc2U+
KG1fZmxvdykgPyBkb3duY2FzdDxSZW5kZXJSdWJ5QmFzZT4obV9mbG93KS5pc0FmdGVyRXhwYW5z
aW9uKCkgOiB0cnVlOwogICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IGV4cGFuc2lvbk9wcG9ydHVu
aXRpZXM7CiAKICAgICBCaWRpUnVuKiBydW4gPSBmaXJzdFJ1bjsKQEAgLTg2NSw3ICs4ODIsNyBA
QCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgICAgICAgICBh
dXRvJiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKTsK
ICAgICAgICAgICAgIGF1dG8mIHRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqcnVu
LT5ib3goKSk7CiAgICAgICAgICAgICBpZiAoY2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFydCAmJiBs
aW5lSW5mby5pc0ZpcnN0TGluZSgpICYmIChpc0xUUiB8fCBpc0xhc3RJbkZsb3dSdW4oKnJ1bikp
Ci0gICAgICAgICAgICAgICAgJiYgIWlubGluZUFuY2VzdG9ySGFzU3RhcnRCb3JkZXJQYWRkaW5n
T3JNYXJnaW4oKnRoaXMsICpydW4tPmJveCgpKSkgeworICAgICAgICAgICAgICAgICYmICFpbmxp
bmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luKG1fZmxvdywgKnJ1bi0+Ym94
KCkpKSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgaGFuZ1N0YXJ0V2lkdGggPSByZW5kZXJUZXh0
LmhhbmdhYmxlUHVuY3R1YXRpb25TdGFydFdpZHRoKHJ1bi0+bV9zdGFydCk7CiAgICAgICAgICAg
ICAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRoICs9IGhhbmdTdGFydFdpZHRoOwogICAgICAgICAg
ICAgICAgIGlmIChzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKQEAgLTg3NCw3ICs4
OTEsNyBAQCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25B
dEVuZCAmJiBsaW5lSW5mby5pc0xhc3RMaW5lKCkgJiYgcnVuLT5tX3N0b3AgPiAwICYmICghaXNM
VFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQotICAgICAgICAgICAgICAgICYmICFpbmxpbmVB
bmNlc3Rvckhhc0VuZEJvcmRlclBhZGRpbmdPck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7
CisgICAgICAgICAgICAgICAgJiYgIWlubGluZUFuY2VzdG9ySGFzRW5kQm9yZGVyUGFkZGluZ09y
TWFyZ2luKG1fZmxvdywgKnJ1bi0+Ym94KCkpKSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgaGFu
Z0VuZFdpZHRoID0gcmVuZGVyVGV4dC5oYW5nYWJsZVB1bmN0dWF0aW9uRW5kV2lkdGgocnVuLT5t
X3N0b3AgLSAxKTsKICAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFu
Z0VuZFdpZHRoOwogICAgICAgICAgICAgICAgIGlmICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGly
ZWN0aW9uKCkpCkBAIC04ODMsNyArOTAwLDcgQEAgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpj
b21wdXRlSW5saW5lRAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBp
ZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5n
U3BhY2VSdW4pCi0gICAgICAgICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMo
KnRoaXMsIHRleHRCb3gsIHByZXZpb3VzUnVuLCBydW4tPm5leHQoKSwgcmVuZGVyVGV4dC5zdHJp
bmdWaWV3KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3ApLCBydW4tPmJveCgpLT5kaXJlY3Rpb24o
KSk7CisgICAgICAgICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMobV9mbG93
LCB0ZXh0Qm94LCBwcmV2aW91c1J1biwgcnVuLT5uZXh0KCksIHJlbmRlclRleHQuc3RyaW5nVmll
dyhydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wKSwgcnVuLT5ib3goKS0+ZGlyZWN0aW9uKCkpOwog
CiAgICAgICAgICAgICBpZiAodW5zaWduZWQgbGVuZ3RoID0gcmVuZGVyVGV4dC50ZXh0KCkubGVu
Z3RoKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIXJ1bi0+bV9zdGFydCAmJiBuZWVkc1dvcmRT
cGFjaW5nICYmIGlzU3BhY2VPck5ld2xpbmUocmVuZGVyVGV4dC5jaGFyYWN0ZXJBdChydW4tPm1f
c3RhcnQpKSkKQEAgLTkxOCw4ICs5MzUsOCBAQCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNv
bXB1dGVJbmxpbmVECiAgICAgICAgICAgICAgICAgYXV0byYgcmVuZGVyQm94ID0gZG93bmNhc3Q8
UmVuZGVyQm94PihydW4tPnJlbmRlcmVyKCkpOwogICAgICAgICAgICAgICAgIGlmIChpczxSZW5k
ZXJSdWJ5UnVuPihyZW5kZXJCb3gpKQogICAgICAgICAgICAgICAgICAgICBzZXRNYXJnaW5zRm9y
UnVieVJ1bihydW4sIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJlbmRlckJveCksIHByZXZpb3Vz
UnVuID8gJnByZXZpb3VzUnVuLT5yZW5kZXJlcigpIDogbnVsbHB0ciwgbGluZUluZm8pOwotICAg
ICAgICAgICAgICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JD
aGlsZChyZW5kZXJCb3gpKTsKLSAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCArPSBt
YXJnaW5TdGFydEZvckNoaWxkKHJlbmRlckJveCkgKyBtYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJC
b3gpOworICAgICAgICAgICAgICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChtX2Zsb3cu
bG9naWNhbFdpZHRoRm9yQ2hpbGQocmVuZGVyQm94KSk7CisgICAgICAgICAgICAgICAgdG90YWxM
b2dpY2FsV2lkdGggKz0gbV9mbG93Lm1hcmdpblN0YXJ0Rm9yQ2hpbGQocmVuZGVyQm94KSArIG1f
Zmxvdy5tYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJCb3gpOwogICAgICAgICAgICAgfQogICAgICAg
ICB9CiAKQEAgLTkzOSw3ICs5NTYsNyBAQCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1
dGVJbmxpbmVECiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaXM8UmVuZGVyUnVieUJhc2U+
KCp0aGlzKSAmJiAhZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKKyAgICBpZiAoaXM8UmVuZGVy
UnVieUJhc2U+KG1fZmxvdykgJiYgIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpCiAgICAgICAg
IHRleHRBbGlnbiA9IFRleHRBbGlnbk1vZGU6OkNlbnRlcjsKIAogICAgIHVwZGF0ZUxvZ2ljYWxX
aWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24sIGxpbmVCb3gsIHRyYWlsaW5nU3BhY2VSdW4sIGxv
Z2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBleHBh
bnNpb25PcHBvcnR1bml0eUNvdW50KTsKQEAgLTk0OSw3ICs5NjYsNyBAQCBCaWRpUnVuKiBSZW5k
ZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgcmV0dXJuIHJ1bjsKIH0KIAotdm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OnJlbW92ZUlubGluZUJveChCaWRpUnVuJiBydW4sIGNvbnN0IFJvb3RJ
bmxpbmVCb3gmIHJvb3RMaW5lQm94KSBjb25zdAordm9pZCBDb21wbGV4TGluZUxheW91dDo6cmVt
b3ZlSW5saW5lQm94KEJpZGlSdW4mIHJ1biwgY29uc3QgUm9vdElubGluZUJveCYgcm9vdExpbmVC
b3gpIGNvbnN0CiB7CiAgICAgYXV0byogaW5saW5lQm94ID0gcnVuLmJveCgpOwogI2lmICFBU1NF
UlRfRElTQUJMRUQKQEAgLTk3OCwxMCArOTk1LDEwIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojpy
ZW1vdmVJbmxpbmVCb3goQmkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21w
dXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0Ojpjb21wdXRlQmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIGZpcnN0
UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZl
cnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlKQogewotICAgIHNldExv
Z2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJlY3Rpb24obG9naWNhbEhl
aWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlKSk7CisgICAgbV9m
bG93LnNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJlY3Rpb24o
bV9mbG93LmxvZ2ljYWxIZWlnaHQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25D
YWNoZSkpOwogCiAgICAgLy8gTm93IG1ha2Ugc3VyZSB3ZSBwbGFjZSByZXBsYWNlZCByZW5kZXIg
b2JqZWN0cyBjb3JyZWN0bHkuCiAgICAgZm9yIChhdXRvKiBydW4gPSBmaXJzdFJ1bjsgcnVuOyBy
dW4gPSBydW4tPm5leHQoKSkgewpAQCAtOTkzLDcgKzEwMTAsNyBAQCB2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0CiAgICAgICAgIC8vIGEgcmVhc29uYWJsZSBhcHByb3hp
bWF0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHkgcG9zaXRpb24uCiAgICAgICAgIGF1dG8mIHJlbmRl
cmVyID0gcnVuLT5yZW5kZXJlcigpOwogICAgICAgICBpZiAocmVuZGVyZXIuaXNPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsVG9wKGxvZ2lj
YWxIZWlnaHQoKSk7CisgICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsVG9wKG1fZmxv
dy5sb2dpY2FsSGVpZ2h0KCkpOwogCiAgICAgICAgIC8vIFBvc2l0aW9uIGlzIHVzZWQgdG8gcHJv
cGVybHkgcG9zaXRpb24gYm90aCByZXBsYWNlZCBlbGVtZW50cyBhbmQKICAgICAgICAgLy8gdG8g
dXBkYXRlIHRoZSBzdGF0aWMgbm9ybWFsIGZsb3cgeC95IG9mIHBvc2l0aW9uZWQgZWxlbWVudHMu
CkBAIC0xMDM4LDcgKzEwNTUsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRGaXJzdFRy
YWlsaW5nCiAgICAgcmV0dXJuIGZpcnN0U3BhY2U7CiB9CiAKLWlubGluZSBCaWRpUnVuKiBSZW5k
ZXJCbG9ja0Zsb3c6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBi
aWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRDb250ZXh0KQoraW5saW5lIEJpZGlSdW4qIENv
bXBsZXhMaW5lTGF5b3V0OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVu
PiYgYmlkaVJ1bnMsIEJpZGlDb250ZXh0KiBjdXJyZW50Q29udGV4dCkKIHsKICAgICBpZiAoIWJp
ZGlSdW5zLnJ1bkNvdW50KCkKICAgICAgICAgfHwgIWJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4o
KS0+cmVuZGVyZXIoKS5zdHlsZSgpLmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpCkBAIC0xMDg5
LDcgKzExMDYsNyBAQCBpbmxpbmUgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUCiAg
ICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VSdW47CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojph
cHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QmIGZsb2F0aW5nT2Jq
ZWN0KQordm9pZCBDb21wbGV4TGluZUxheW91dDo6YXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RM
aW5lKEZsb2F0aW5nT2JqZWN0JiBmbG9hdGluZ09iamVjdCkKIHsKICAgICBBU1NFUlRfV0lUSF9T
RUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdPYmplY3Qub3JpZ2luYXRpbmdMaW5lKCkpOwog
ICAgIEFTU0VSVChsYXN0Um9vdEJveCgpKTsKQEAgLTExODQsNyArMTIwMSw3IEBAIHN0YXRpYyBp
bmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvclMKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiBj
b25zdHJ1Y3RzIGxpbmUgYm94ZXMgZm9yIGFsbCBvZiB0aGUgdGV4dCBydW5zIGluIHRoZSByZXNv
bHZlciBhbmQgY29tcHV0ZXMgdGhlaXIgcG9zaXRpb24uCi1Sb290SW5saW5lQm94KiBSZW5kZXJC
bG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyh1bnNpZ25lZCBiaWRpTGV2ZWws
IEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVu
ZCwgTGluZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9z
aXRpb25DYWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKK1Jvb3RJbmxpbmVCb3gqIENvbXBsZXhMaW5lTGF5b3V0OjpjcmVh
dGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxldmVsLCBCaWRpUnVuTGlzdDxC
aWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiBs
aW5lSW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIEJp
ZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVu
dHMpCiB7CiAgICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQogICAgICAgICByZXR1cm4gbnVs
bHB0cjsKQEAgLTEyMTYsNyArMTIzMyw3IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxv
dzo6Y3JlYXRlTGkKICAgICAvLyBjb250YWlucyByZXZlcnNlZCB0ZXh0IG9yIG5vdC4gSWYgd2Ug
d291bGRuJ3QgZG8gdGhhdCBlZGl0aW5nIGFuZCB0aHVzCiAgICAgLy8gdGV4dCBzZWxlY3Rpb24g
aW4gUlRMIGJveGVzIHdvdWxkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgogICAgIGlmIChpc1NWR1Jv
b3RJbmxpbmVCb3gpIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04o
aXNTVkdUZXh0KCkpOworICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJ
Q0FUSU9OKG1fZmxvdy5pc1NWR1RleHQoKSk7CiAgICAgICAgIGRvd25jYXN0PFNWR1Jvb3RJbmxp
bmVCb3g+KCpsaW5lQm94KS5jb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsK
ICAgICB9CiAgICAgCkBAIC0xMjUzLDcgKzEyNzAsNyBAQCBzdGF0aWMgdm9pZCByZXBhaW50RGly
dHlGbG9hdHMoTGluZUxheW91CiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5
b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lu
bGluZUNoaWxkKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6bGF5b3V0UnVuc0FuZEZsb2F0cyhM
aW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lubGluZUNoaWxkKQogewogICAg
IC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGlydHkgbGluZQogICAgIElu
bGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKQEAgLTEyNjgsMTkgKzEyODUsMTkgQEAgdm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgIC8vIEZJWE1FOiBUaGlzIHdv
dWxkIG1ha2UgbW9yZSBzZW5zZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBzaW5jZQog
ICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRpb24gY2FuIGNoYW5nZSB0aGUgZnVsbExheW91dCBm
bGFnIHdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlLiBGYWlsdXJlIHRvIGNhbGwKICAgICAvLyBkZXRl
cm1pbmVTdGFydFBvc2l0aW9uIGZpcnN0IHdpbGwgYnJlYWsgZmFzdC9yZXBhaW50L2xpbmUtZmxv
dy13aXRoLWZsb2F0cy05Lmh0bWwuCi0gICAgaWYgKGxheW91dFN0YXRlLmlzRnVsbExheW91dCgp
ICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAgICBzZXRO
ZWVkc0xheW91dChNYXJrT25seVRoaXMpOyAvLyBNYXJrIGFzIG5lZWRpbmcgYSBmdWxsIGxheW91
dCB0byBmb3JjZSB1cyB0byByZXBhaW50LgotICAgICAgICBpZiAoIXZpZXcoKS5mcmFtZVZpZXco
KS5sYXlvdXRDb250ZXh0KCkubmVlZHNGdWxsUmVwYWludCgpICYmIGhhc1NlbGZQYWludGluZ0xh
eWVyKCkgJiYgaGFzUmVwYWludExheW91dFJlY3RzKCkpIHsKKyAgICBpZiAobGF5b3V0U3RhdGUu
aXNGdWxsTGF5b3V0KCkgJiYgaGFzSW5saW5lQ2hpbGQgJiYgIW1fZmxvdy5zZWxmTmVlZHNMYXlv
dXQoKSkgeworICAgICAgICBtX2Zsb3cuc2V0TmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsgLy8g
TWFyayBhcyBuZWVkaW5nIGEgZnVsbCBsYXlvdXQgdG8gZm9yY2UgdXMgdG8gcmVwYWludC4KKyAg
ICAgICAgaWYgKCFsYXlvdXRDb250ZXh0KCkubmVlZHNGdWxsUmVwYWludCgpICYmIG1fZmxvdy5o
YXNTZWxmUGFpbnRpbmdMYXllcigpICYmIG1fZmxvdy5oYXNSZXBhaW50TGF5b3V0UmVjdHMoKSkg
ewogICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBhbHJlYWR5
IGluc2lkZSBsYXlvdXQgdG8gZGlzY292ZXIKICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGJsb2Nr
IHJlYWxseSBuZWVkZWQgYSBmdWxsIGxheW91dCwgd2UgbWlzc2VkIG91ciBjaGFuY2UgdG8gcmVw
YWludCB0aGUgbGF5ZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQgc3RhcnRlZC4gIEx1
Y2tpbHkgdGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRzIG9yaWdp
bmFsCiAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNhbiB1c2Ug
dGhhdCB0byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93LgotICAgICAgICAgICAgcmVwYWludFVz
aW5nQ29udGFpbmVyKGNvbnRhaW5lckZvclJlcGFpbnQoKSwgcmVwYWludExheW91dFJlY3RzKCku
bV9yZXBhaW50UmVjdCk7CisgICAgICAgICAgICBtX2Zsb3cucmVwYWludFVzaW5nQ29udGFpbmVy
KG1fZmxvdy5jb250YWluZXJGb3JSZXBhaW50KCksIG1fZmxvdy5yZXBhaW50TGF5b3V0UmVjdHMo
KS5tX3JlcGFpbnRSZWN0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjb250YWluc0Zs
b2F0cygpKQotICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0RmxvYXQobV9m
bG9hdGluZ09iamVjdHMtPnNldCgpLmxhc3QoKS5nZXQoKSk7CisgICAgaWYgKG1fZmxvdy5jb250
YWluc0Zsb2F0cygpKQorICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0Rmxv
YXQobV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKS5sYXN0KCkuZ2V0KCkpOwogCiAgICAg
Ly8gV2UgYWxzbyBmaW5kIHRoZSBmaXJzdCBjbGVhbiBsaW5lIGFuZCBleHRyYWN0IHRoZXNlIGxp
bmVzLiAgV2Ugd2lsbCBhZGQgdGhlbSBiYWNrCiAgICAgLy8gaWYgd2UgZGV0ZXJtaW5lIHRoYXQg
d2UncmUgYWJsZSB0byBzeW5jaHJvbml6ZSBhZnRlciBoYW5kbGluZyBhbGwgb3VyIGRpcnR5IGxp
bmVzLgpAQCAtMTI5MSw3ICsxMzA4LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1
bnNBbmRGbG9hdAogCiAgICAgaWYgKHN0YXJ0TGluZSkgewogICAgICAgICBpZiAoIWxheW91dFN0
YXRlLnVzZXNSZXBhaW50Qm91bmRzKCkpCi0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRSZXBh
aW50UmFuZ2UobG9naWNhbEhlaWdodCgpKTsKKyAgICAgICAgICAgIGxheW91dFN0YXRlLnNldFJl
cGFpbnRSYW5nZShtX2Zsb3cubG9naWNhbEhlaWdodCgpKTsKICAgICAgICAgZGVsZXRlTGluZVJh
bmdlKGxheW91dFN0YXRlLCBzdGFydExpbmUpOwogICAgIH0KIApAQCAtMTMwNiw3ICsxMzIzLDcg
QEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgICAgICAgICAg
aWYgKGxhc3RPYmplY3QtPmlzQlIoKSkgewogICAgICAgICAgICAgICAgIENsZWFyIGNsZWFyID0g
bGFzdE9iamVjdC0+c3R5bGUoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgIGlmIChjbGVhciAh
PSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgICAgICAgICAgICAgY2xlYXJGbG9hdHMoY2xlYXIpOwor
ICAgICAgICAgICAgICAgICAgICBtX2Zsb3cuY2xlYXJGbG9hdHMoY2xlYXIpOwogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTMxNywyNSArMTMzNCwyNSBAQCB2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiB9CiAKIC8vIEJlZm9yZSByZXN0YXJ0aW5n
IHRoZSBsYXlvdXQgbG9vcCB3aXRoIGEgbmV3IGxvZ2ljYWxIZWlnaHQsIHJlbW92ZSBhbGwgZmxv
YXRzIHRoYXQgd2VyZSBhZGRlZCBhbmQgcmVzZXQgdGhlIHJlc29sdmVyLgotaW5saW5lIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBSZW5kZXJCbG9ja0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxv
YXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9n
aWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJ
bmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImIG9sZEVu
ZCkKK2lubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYgQ29tcGxleExpbmVMYXlvdXQ6OnJlc3Rh
cnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQs
IExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRG
cm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCAgY29uc3QgSW5s
aW5lSXRlcmF0b3ImIG9sZEVuZCkKIHsKLSAgICByZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBvbGRMb2dpY2FsSGVpZ2h0KTsKLSAgICBzZXRMb2dp
Y2FsSGVpZ2h0KG5ld0xvZ2ljYWxIZWlnaHQpOworICAgIG1fZmxvdy5yZW1vdmVGbG9hdGluZ09i
amVjdHNCZWxvdyhsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBvbGRMb2dpY2FsSGVpZ2h0KTsK
KyAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKICAgICByZXNv
bHZlci5zZXRQb3NpdGlvbklnbm9yaW5nTmVzdGVkSXNvbGF0ZXMob2xkRW5kKTsKICAgICByZXR1
cm4gb2xkRW5kOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0
c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBC
aWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lcykKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OmxheW91dFJ1bnNBbmRGbG9hdHNJ
blJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlk
aVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMpCiB7CiAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlVG9Vc2UgPSBzdHlsZSgp
OwotICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQo
KS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5
b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAgICBib29sIHBhZ2luYXRlZCA9IGxheW91dENv
bnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5p
c1BhZ2luYXRlZCgpOwogICAgIExpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlJiBsaW5lV2hp
dGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSA9IHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3Rh
dGUoKTsKICAgICBJbmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOwogICAg
IGJvb2wgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7CiAgICAg
UmVuZGVyVGV4dEluZm8gcmVuZGVyVGV4dEluZm87CiAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hl
IHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKIAotICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKCp0
aGlzKTsKKyAgICBMaW5lQnJlYWtlciBsaW5lQnJlYWtlcihtX2Zsb3cpOwogCiAgICAgd2hpbGUg
KCFlbmQuYXRFbmQoKSkgewogICAgICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBuZWNlc3Nh
cnkgYmVmb3JlIHRoZSBmaXJzdCBpdGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRvIHRoZSBl
bmQ/CkBAIC0xMzU1LDExICsxMzcyLDExIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRS
dW5zQW5kRmxvYXQKIAogICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7
CiAgICAgICAgIGJvb2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygp
LnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpOwotICAgICAgICBGbG9hdGluZ09iamVjdCogbGFz
dEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChjb250YWluc0Zsb2F0cygpKSA/IG1fZmxvYXRpbmdP
YmplY3RzLT5zZXQoKS5sYXN0KCkuZ2V0KCkgOiBudWxscHRyOworICAgICAgICBGbG9hdGluZ09i
amVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChtX2Zsb3cuY29udGFpbnNGbG9hdHMo
KSkgPyBtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCktPnNldCgpLmxhc3QoKS5nZXQoKSA6IG51bGxw
dHI7CiAKICAgICAgICAgV29yZE1lYXN1cmVtZW50cyB3b3JkTWVhc3VyZW1lbnRzOwogICAgICAg
ICBlbmQgPSBsaW5lQnJlYWtlci5uZXh0TGluZUJyZWFrKHJlc29sdmVyLCBsYXlvdXRTdGF0ZS5s
aW5lSW5mbygpLCByZW5kZXJUZXh0SW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29u
c2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIHdvcmRNZWFzdXJlbWVudHMpOwotICAgICAgICBjYWNo
ZVByaW9yQ2hhcmFjdGVyc0lmTmVlZGVkKHJlbmRlclRleHRJbmZvLmxpbmVCcmVha0l0ZXJhdG9y
KTsKKyAgICAgICAgbV9mbG93LmNhY2hlUHJpb3JDaGFyYWN0ZXJzSWZOZWVkZWQocmVuZGVyVGV4
dEluZm8ubGluZUJyZWFrSXRlcmF0b3IpOwogICAgICAgICByZW5kZXJUZXh0SW5mby5saW5lQnJl
YWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOwogICAgICAgICBpZiAocmVzb2x2ZXIucG9z
aXRpb24oKS5hdEVuZCgpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJl
IGNyZWF0aW5nIGFueSBydW5zIGluIG5leHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0aCEKQEAgLTE0
MDIsNyArMTQxOSw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQK
ICAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJlIG91dCB3aGVyZSBib3Jk
ZXIvcGFkZGluZy9tYXJnaW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCiAgICAgICAgICAgICAvLyBp
bmxpbmUgZmxvdyBib3hlcy4KIAotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVp
Z2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2Fs
SGVpZ2h0ID0gbV9mbG93LmxvZ2ljYWxIZWlnaHQoKTsKICAgICAgICAgICAgIFJvb3RJbmxpbmVC
b3gqIGxpbmVCb3ggPSBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMocmVzb2x2ZXIuc3RhdHVz
KCkuY29udGV4dC0+bGV2ZWwoKSwgYmlkaVJ1bnMsIGVuZCwgbGF5b3V0U3RhdGUubGluZUluZm8o
KSwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB0cmFpbGluZ1NwYWNlUnVuLCB3b3JkTWVhc3VyZW1l
bnRzKTsKIAogICAgICAgICAgICAgYmlkaVJ1bnMuY2xlYXIoKTsKQEAgLTE0MTksMjIgKzE0MzYs
MjIgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgICAgICAg
ICAgICAgIGxheW91dFN0YXRlLm1hcmdpbkluZm8oKS5zZXRBdEJlZm9yZVNpZGVPZkJsb2NrKGZh
bHNlKTsKIAogICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpCi0gICAgICAgICAgICAgICAg
ICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgYWRqdXN0bWVudCwg
b3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOworICAgICAg
ICAgICAgICAgICAgICBtX2Zsb3cuYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5l
Qm94LCBhZGp1c3RtZW50LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRl
ZEZsb3coKSk7CiAgICAgICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsKICAgICAgICAgICAg
ICAgICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBsYXlvdXRTdGF0ZS5s
aW5lSW5mbygpLmlzRmlyc3RMaW5lKCkgPyBJbmRlbnRUZXh0IDogRG9Ob3RJbmRlbnRUZXh0Owot
ICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExpbmVXaWR0aCA9IGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5kZW50VGV4dCk7Cisg
ICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkTGluZVdpZHRoID0gbV9mbG93LmF2YWls
YWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5kZW50VGV4
dCk7CiAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9z
aXRpb24oYWRqdXN0bWVudCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS51
c2VzUmVwYWludEJvdW5kcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUu
dXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChsaW5lQm94KTsKIAotICAgICAgICAgICAgICAgICAg
ICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0ICsgYWRq
dXN0bWVudCwgc2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChtX2Zsb3cuYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dp
Y2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgc2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRo
KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGxp
bmUsIHJlbW92ZSBhbGwgZmxvYXRzIHRoYXQgZ290IGFkZGVkLCBhbmQgbGV0IGxpbmUgbGF5b3V0
IHJlLXJ1bi4KICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmRlbGV0ZUxpbmUoKTsK
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRz
SW5SYW5nZShvbGRMb2dpY2FsSGVpZ2h0LCBvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwg
bGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgcmVzb2x2ZXIsIG9sZEVuZCk7CiAgICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAg
ICAgICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFk
aW5nKCkpOworICAgICAgICAgICAgICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChsaW5l
Qm94LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CkBAIC0xNDQ1
LDE1ICsxNDYyLDE1IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQK
ICAgICAgICAgfQogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZUJyZWFrZXIu
cG9zaXRpb25lZE9iamVjdHMoKS5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHNldFN0YXRpY1Bv
c2l0aW9ucygqdGhpcywgKmxpbmVCcmVha2VyLnBvc2l0aW9uZWRPYmplY3RzKClbaV0sIERvTm90
SW5kZW50VGV4dCk7CisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMobV9mbG93LCAqbGlu
ZUJyZWFrZXIucG9zaXRpb25lZE9iamVjdHMoKVtpXSwgRG9Ob3RJbmRlbnRUZXh0KTsKIAogICAg
ICAgICBpZiAoIWxheW91dFN0YXRlLmxpbmVJbmZvKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAg
ICBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnNldEZpcnN0TGluZShmYWxzZSk7Ci0gICAgICAgICAg
ICBjbGVhckZsb2F0cyhsaW5lQnJlYWtlci5jbGVhcigpKTsKKyAgICAgICAgICAgIG1fZmxvdy5j
bGVhckZsb2F0cyhsaW5lQnJlYWtlci5jbGVhcigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlm
IChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBsYXN0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICBjb25z
dCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0
cy0+c2V0KCk7CisgICAgICAgIGlmIChtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCkgJiYgbGFzdFJv
b3RCb3goKSkgeworICAgICAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5n
T2JqZWN0U2V0ID0gbV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICAgICAgICAg
IGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOwogICAgICAgICAgICAgYXV0byBl
bmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKICAgICAgICAgICAgIGlmIChhdXRvKiBsYXN0
RmxvYXQgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgewpAQCAtMTQ4MCw3
ICsxNDk3LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAg
IC8vIEluIGNhc2Ugd2UgYWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5n
IHRoaXMgbGF5b3V0IHRvIGF2b2lkIHdpZG93cwogICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25v
cmUgdGhlIHBvc3NpYmlsaXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgogICAg
IC8vIE90aGVyd2lzZSwgd2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMg
YWdhaW5zdCB0aGUgYmxvY2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgotICAgIGlmIChwYWdp
bmF0ZWQgJiYgIXN0eWxlKCkuaGFzQXV0b1dpZG93cygpICYmICFkaWRCcmVha0F0TGluZVRvQXZv
aWRXaWRvdygpKSB7CisgICAgaWYgKHBhZ2luYXRlZCAmJiAhc3R5bGUoKS5oYXNBdXRvV2lkb3dz
KCkgJiYgIW1fZmxvdy5kaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7CiAgICAgICAgIC8v
IENoZWNrIHRoZSBsaW5lIGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHVuYWNj
ZXB0YWJsZSB3aWRvd3MuCiAgICAgICAgIC8vIEhvd2V2ZXIsIHdlJ2xsIHByaW9yaXRpemUgb3Jw
aGFucyAtIHNvIG5vdGhpbmcgd2UgZG8gaGVyZSBzaG91bGQgY3JlYXRlCiAgICAgICAgIC8vIGEg
bmV3IG9ycGhhbi4KQEAgLTE1MzIsMTQgKzE1NDksMTQgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmxheW91dFJ1bnNBbmRGbG9hdAogICAgICAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5w
cmV2Um9vdEJveCgpOwogCiAgICAgICAgICAgICAvLyBXZSBub3cgd2FudCB0byBicmVhayBhdCB0
aGlzIGxpbmUuIFJlbWVtYmVyIGZvciBuZXh0IGxheW91dCBhbmQgdHJpZ2dlciByZWxheW91dC4K
LSAgICAgICAgICAgIHNldEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KGxpbmVDb3VudChsaW5lQm94
KSk7Ci0gICAgICAgICAgICBtYXJrTGluZXNEaXJ0eUluQmxvY2tSYW5nZShsYXN0Um9vdEJveCgp
LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5n
KCksIGxpbmVCb3gpOworICAgICAgICAgICAgbV9mbG93LnNldEJyZWFrQXRMaW5lVG9Bdm9pZFdp
ZG93KG1fZmxvdy5saW5lQ291bnQobGluZUJveCkpOworICAgICAgICAgICAgbV9mbG93Lm1hcmtM
aW5lc0RpcnR5SW5CbG9ja1JhbmdlKGxhc3RSb290Qm94KCktPmxpbmVCb3R0b21XaXRoTGVhZGlu
ZygpLCBsaW5lQm94LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGluZUJveCk7CiAgICAgICAg
IH0KICAgICB9Ci0gICAgY2xlYXJEaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpOworICAgIG1f
Zmxvdy5jbGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CiB9CiAKLXZvaWQgUmVuZGVy
QmxvY2tGbG93OjpyZWF0dGFjaENsZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxp
bmUsIExheW91dFVuaXQgZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFuTGluZSkKK3ZvaWQgQ29tcGxl
eExpbmVMYXlvdXQ6OnJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNsZWFu
TGluZSwgTGF5b3V0VW5pdCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKQogewogICAgIGF1
dG8qIGNsZWFuTGluZUZsb2F0cyA9IGNsZWFuTGluZS5mbG9hdHNQdHIoKTsKICAgICBpZiAoIWNs
ZWFuTGluZUZsb2F0cykKQEAgLTE1NDgsNyArMTU2NSw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93
OjpyZWF0dGFjaENsZWFuTGluZUYKICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFu
TGluZUZsb2F0cykgewogICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQogICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIGF1dG8qIGZsb2F0aW5nT2JqZWN0ID0gaW5zZXJ0RmxvYXRpbmdPYmpl
Y3QoKmZsb2F0aW5nQm94KTsKKyAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBtX2Zsb3cu
aW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKICAgICAgICAgaWYgKGlzRmlyc3RD
bGVhbkxpbmUgJiYgZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKSB7CiAgICAgICAg
ICAgICAvLyBGbG9hdCBib3ggZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbGluZSBhbnltb3JlLgog
ICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oY2xlYW5MaW5lLnBy
ZXZSb290Qm94KCkgPT0gZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKQEAgLTE1
NTcsMjUgKzE1NzQsMjUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlYXR0YWNoQ2xlYW5MaW5l
RgogICAgICAgICB9CiAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFm
bG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwogICAgICAgICBmbG9hdGluZ09iamVj
dC0+c2V0T3JpZ2luYXRpbmdMaW5lKGNsZWFuTGluZSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWln
aHQobG9naWNhbFRvcEZvckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5CZWZvcmVGb3JDaGls
ZCgqZmxvYXRpbmdCb3gpICsgZGVsdGEpOwotICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOwor
ICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChtX2Zsb3cubG9naWNhbFRvcEZvckNoaWxk
KCpmbG9hdGluZ0JveCkgLSBtX2Zsb3cubWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94
KSArIGRlbHRhKTsKKyAgICAgICAgbV9mbG93LnBvc2l0aW9uTmV3RmxvYXRzKCk7CiAgICAgfQog
fQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGlua1RvRW5kTGluZUlmTmVlZGVkKExpbmVMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0OjpsaW5rVG9FbmRM
aW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKIHsKICAgICBhdXRvKiBm
aXJzdENsZWFuTGluZSA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsKICAgICBpZiAoZmlyc3RDbGVh
bkxpbmUpIHsKICAgICAgICAgaWYgKGxheW91dFN0YXRlLmVuZExpbmVNYXRjaGVkKCkpIHsKLSAg
ICAgICAgICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRl
eHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCku
bGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAgICAgICAgICAgIGJvb2wgcGFnaW5hdGVk
ID0gbGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgbGF5b3V0Q29udGV4dCgpLmxheW91
dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7CiAgICAgICAgICAgICAvLyBBdHRhY2ggYWxsIHRoZSBy
ZW1haW5pbmcgbGluZXMsIGFuZCB0aGVuIGFkanVzdCB0aGVpciB5LXBvc2l0aW9ucyBhcyBuZWVk
ZWQuCi0gICAgICAgICAgICBMYXlvdXRVbml0IGRlbHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5
b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsKKyAgICAgICAgICAgIExheW91dFVuaXQgZGVs
dGEgPSBtX2Zsb3cubG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxU
b3AoKTsKICAgICAgICAgICAgIGZvciAoYXV0byogbGluZSA9IGZpcnN0Q2xlYW5MaW5lOyBsaW5l
OyBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkgewogICAgICAgICAgICAgICAgIGxpbmUtPmF0
dGFjaExpbmUoKTsKICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CiAgICAgICAgICAg
ICAgICAgICAgIGRlbHRhIC09IGxpbmUtPnBhZ2luYXRpb25TdHJ1dCgpOwogICAgICAgICAgICAg
ICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50OwotICAgICAgICAgICAgICAgICAgICBhZGp1
c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBvdmVyZmxvd3NGcmFnbWVu
dCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgICAgIG1f
Zmxvdy5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBvdmVyZmxv
d3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CiAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgIGlmIChkZWx0YSkgewogICAgICAgICAgICAgICAgICAgICBs
YXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmUsIGRlbHRhKTsKQEAgLTE1
ODUsMzAgKzE2MDIsMzAgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmtUb0VuZExpbmVJZk5l
ZQogICAgICAgICAgICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUobGluZSk7CiAgICAg
ICAgICAgICAgICAgcmVhdHRhY2hDbGVhbkxpbmVGbG9hdHMoKmxpbmUsIGRlbHRhLCBsaW5lID09
IGZpcnN0Q2xlYW5MaW5lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldExvZ2ljYWxI
ZWlnaHQobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAgICAg
ICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhM
ZWFkaW5nKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCB0
aGUgcmVtYWluaW5nIGxpbmVzLgogICAgICAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0
YXRlLCBsYXlvdXRTdGF0ZS5lbmRMaW5lKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIAotICAg
IGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAobGF5b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9t
TGFzdExpbmUoKSB8fCBwb3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBsYXN0Um9vdEJveCgpKSB7Cisg
ICAgaWYgKG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKSAmJiAobGF5b3V0U3RhdGUuY2hlY2tGb3JG
bG9hdHNGcm9tTGFzdExpbmUoKSB8fCBtX2Zsb3cucG9zaXRpb25OZXdGbG9hdHMoKSkgJiYgbGFz
dFJvb3RCb3goKSkgewogICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0aGUg
bGFzdCBsaW5lLCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCiAgICAgICAg
IC8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRl
ci9wYWRkaW5nLCBvciB0aGUgZmxvYXQgd2lsbAogICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWRk
aW5nIGluY29ycmVjdGx5LiAtZHdoCiAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZs
b2F0c0Zyb21MYXN0TGluZSgpKSB7CiAgICAgICAgICAgICBMYXlvdXRVbml0IGJvdHRvbVZpc3Vh
bE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+bG9naWNhbEJvdHRvbVZpc3VhbE92ZXJmbG93KCk7
CiAgICAgICAgICAgICBMYXlvdXRVbml0IGJvdHRvbUxheW91dE92ZXJmbG93ID0gbGFzdFJvb3RC
b3goKS0+bG9naWNhbEJvdHRvbUxheW91dE92ZXJmbG93KCk7Ci0gICAgICAgICAgICBhdXRvIG5l
d0xpbmVCb3ggPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveD4o
KnRoaXMpOworICAgICAgICAgICAgYXV0byBuZXdMaW5lQm94ID0gc3RkOjptYWtlX3VuaXF1ZTxU
cmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3g+KG1fZmxvdyk7CiAgICAgICAgICAgICBhdXRvIHRy
YWlsaW5nRmxvYXRzTGluZUJveCA9IG5ld0xpbmVCb3guZ2V0KCk7CiAgICAgICAgICAgICBtX2xp
bmVCb3hlcy5hcHBlbmRMaW5lQm94KFdURk1vdmUobmV3TGluZUJveCkpOwogICAgICAgICAgICAg
dHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRDb25zdHJ1Y3RlZCgpOwogICAgICAgICAgICAgR2x5
cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAgdGV4dEJveERhdGFNYXA7CiAgICAgICAgICAg
ICBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwotICAgICAgICAg
ICAgTGF5b3V0VW5pdCBibG9ja0xvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAg
ICAgICAgICBMYXlvdXRVbml0IGJsb2NrTG9naWNhbEhlaWdodCA9IG1fZmxvdy5sb2dpY2FsSGVp
Z2h0KCk7CiAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPmFsaWduQm94ZXNJbkJs
b2NrRGlyZWN0aW9uKGJsb2NrTG9naWNhbEhlaWdodCwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2Fs
UG9zaXRpb25DYWNoZSk7CiAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldExp
bmVUb3BCb3R0b21Qb3NpdGlvbnMoYmxvY2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWln
aHQsIGJsb2NrTG9naWNhbEhlaWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgICAg
IHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0UGFnaW5hdGVkTGluZVdpZHRoKGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aEZvckNvbnRlbnQoYmxvY2tMb2dpY2FsSGVpZ2h0KSk7CisgICAgICAgICAgICB0
cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldFBhZ2luYXRlZExpbmVXaWR0aChtX2Zsb3cuYXZhaWxh
YmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChibG9ja0xvZ2ljYWxIZWlnaHQpKTsKICAgICAgICAg
ICAgIExheW91dFJlY3QgbG9naWNhbExheW91dE92ZXJmbG93KDBfbHUsIGJsb2NrTG9naWNhbEhl
aWdodCwgMV9sdSwgYm90dG9tTGF5b3V0T3ZlcmZsb3cgLSBibG9ja0xvZ2ljYWxIZWlnaHQpOwog
ICAgICAgICAgICAgTGF5b3V0UmVjdCBsb2dpY2FsVmlzdWFsT3ZlcmZsb3coMF9sdSwgYmxvY2tM
b2dpY2FsSGVpZ2h0LCAxX2x1LCBib3R0b21WaXN1YWxPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhl
aWdodCk7CiAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldE92ZXJmbG93RnJv
bUxvZ2ljYWxSZWN0cyhsb2dpY2FsTGF5b3V0T3ZlcmZsb3csIGxvZ2ljYWxWaXN1YWxPdmVyZmxv
dywgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5saW5lVG9wKCksIHRyYWlsaW5nRmxvYXRzTGluZUJv
eC0+bGluZUJvdHRvbSgpKTsKQEAgLTE2MTYsNyArMTYzMyw3IEBAIHZvaWQgUmVuZGVyQmxvY2tG
bG93OjpsaW5rVG9FbmRMaW5lSWZOZWUKICAgICAgICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZv
ckxpbmUodHJhaWxpbmdGbG9hdHNMaW5lQm94KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0
IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3Rz
LT5zZXQoKTsKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0
U2V0ID0gbV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICAgICAgYXV0byBpdCA9
IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7CiAgICAgICAgIGF1dG8gZW5kID0gZmxvYXRpbmdP
YmplY3RTZXQuZW5kKCk7CiAgICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRTdGF0
ZS5mbG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgewpAQCAtMTYzMSwyMyArMTY0OCwyMyBAQCB2b2lk
IFJlbmRlckJsb2NrRmxvdzo6bGlua1RvRW5kTGluZUlmTmVlCiAgICAgfQogfQogCi12b2lkIFJl
bmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5
b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90
dG9tKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlv
dXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJl
cGFpbnRMb2dpY2FsQm90dG9tKQogewotICAgIEFTU0VSVCghbV9zaW1wbGVMaW5lTGF5b3V0KTsK
KyAgICBBU1NFUlQoIW1fZmxvdy5zaW1wbGVMaW5lTGF5b3V0KCkpOwogCi0gICAgc2V0TG9naWNh
bEhlaWdodChib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCkpOworICAgIG1fZmxvdy5zZXRMb2dpY2Fs
SGVpZ2h0KG1fZmxvdy5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCkpOwogICAgIAogICAgIC8vIExh
eSBvdXQgb3VyIGh5cG90aGV0aWNhbCBncmlkIGxpbmUgYXMgdGhvdWdoIGl0IG9jY3VycyBhdCB0
aGUgdG9wIG9mIHRoZSBibG9jay4KLSAgICBpZiAodmlldygpLmZyYW1lVmlldygpLmxheW91dENv
bnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0
KCkubGF5b3V0U3RhdGUoKS0+bGluZUdyaWQoKSA9PSB0aGlzKQotICAgICAgICBsYXlvdXRMaW5l
R3JpZEJveCgpOworICAgIGlmIChsYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiBsYXlv
dXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+bGluZUdyaWQoKSA9PSAmbV9mbG93KQorICAgICAg
ICBtX2Zsb3cubGF5b3V0TGluZUdyaWRCb3goKTsKIAotICAgIFJlbmRlckZyYWdtZW50ZWRGbG93
KiBmcmFnbWVudGVkRmxvdyA9IGVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCk7CisgICAgUmVuZGVy
RnJhZ21lbnRlZEZsb3cqIGZyYWdtZW50ZWRGbG93ID0gbV9mbG93LmVuY2xvc2luZ0ZyYWdtZW50
ZWRGbG93KCk7CiAgICAgYm9vbCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbiA9IGZpcnN0Um9vdEJv
eCgpICYmIGZyYWdtZW50ZWRGbG93ICYmICFmcmFnbWVudGVkRmxvdy0+aGFzRnJhZ21lbnRzKCk7
CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94
ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKLSAgICBib29sIGlz
RnVsbExheW91dCA9ICFmaXJzdFJvb3RCb3goKSB8fCBzZWxmTmVlZHNMYXlvdXQoKSB8fCByZWxh
eW91dENoaWxkcmVuIHx8IGNsZWFyTGluZXNGb3JQYWdpbmF0aW9uOwotICAgIExpbmVMYXlvdXRT
dGF0ZSBsYXlvdXRTdGF0ZSgqdGhpcywgaXNGdWxsTGF5b3V0LCByZXBhaW50TG9naWNhbFRvcCwg
cmVwYWludExvZ2ljYWxCb3R0b20sIGZyYWdtZW50ZWRGbG93KTsKKyAgICBib29sIGlzRnVsbExh
eW91dCA9ICFmaXJzdFJvb3RCb3goKSB8fCBtX2Zsb3cuc2VsZk5lZWRzTGF5b3V0KCkgfHwgcmVs
YXlvdXRDaGlsZHJlbiB8fCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbjsKKyAgICBMaW5lTGF5b3V0
U3RhdGUgbGF5b3V0U3RhdGUobV9mbG93LCBpc0Z1bGxMYXlvdXQsIHJlcGFpbnRMb2dpY2FsVG9w
LCByZXBhaW50TG9naWNhbEJvdHRvbSwgZnJhZ21lbnRlZEZsb3cpOwogCiAgICAgaWYgKGlzRnVs
bExheW91dCkKICAgICAgICAgbGluZUJveGVzKCkuZGVsZXRlTGluZUJveGVzKCk7CkBAIC0xNjU4
LDE0ICsxNjc1LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8K
ICAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY2xpcHBl
ZCBtdXN0IGFsc28ga25vdyBob3cgdG8gdHJ1bmNhdGUuICBUaGlzIGlzIGluc2FuZWx5CiAgICAg
Ly8gZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgaW4gZ2VuZXJhbCAoZXNwZWNpYWxseSBpbiB0aGUg
bWlkZGxlIG9mIGRvaW5nIGxheW91dCksIHNvIHdlIG9ubHkgaGFuZGxlIHRoZQogICAgIC8vIHNp
bXBsZSBjYXNlIG9mIGFuIGFub255bW91cyBibG9jayB0cnVuY2F0aW5nIHdoZW4gaXQncyBwYXJl
bnQgaXMgY2xpcHBlZC4KLSAgICBib29sIGhhc1RleHRPdmVyZmxvdyA9IChzdHlsZSgpLnRleHRP
dmVyZmxvdygpID09IFRleHRPdmVyZmxvdzo6RWxsaXBzaXMgJiYgaGFzT3ZlcmZsb3dDbGlwKCkp
Ci0gICAgICAgIHx8IChpc0Fub255bW91c0Jsb2NrKCkgJiYgcGFyZW50KCkgJiYgcGFyZW50KCkt
PmlzUmVuZGVyQmxvY2soKSAmJiBwYXJlbnQoKS0+c3R5bGUoKS50ZXh0T3ZlcmZsb3coKSA9PSBU
ZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIHBhcmVudCgpLT5oYXNPdmVyZmxvd0NsaXAoKSk7Cisg
ICAgYXV0byogcGFyZW50ID0gbV9mbG93LnBhcmVudCgpOworICAgIGJvb2wgaGFzVGV4dE92ZXJm
bG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4dE92ZXJmbG93OjpFbGxpcHNpcyAm
JiBtX2Zsb3cuaGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgIHx8IChtX2Zsb3cuaXNBbm9ueW1v
dXNCbG9jaygpICYmIHBhcmVudCAmJiBwYXJlbnQtPmlzUmVuZGVyQmxvY2soKSAmJiBwYXJlbnQt
PnN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBwYXJl
bnQtPmhhc092ZXJmbG93Q2xpcCgpKTsKIAogICAgIC8vIFdhbGsgYWxsIHRoZSBsaW5lcyBhbmQg
ZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRoZXkgZXhpc3QuCiAgICAgaWYgKGhh
c1RleHRPdmVyZmxvdykKICAgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CiAKLSAg
ICBpZiAoZmlyc3RDaGlsZCgpKSB7CisgICAgaWYgKG1fZmxvdy5maXJzdENoaWxkKCkpIHsKICAg
ICAgICAgLy8gSW4gZnVsbCBsYXlvdXQgbW9kZSwgY2xlYXIgdGhlIGxpbmUgYm94ZXMgb2YgY2hp
bGRyZW4gdXBmcm9udC4gT3RoZXJ3aXNlLAogICAgICAgICAvLyBzaWJsaW5ncyBjYW4gcnVuIGlu
dG8gc3RhbGUgcm9vdCBsaW5lYm94ZXMgZHVyaW5nIGxheW91dC4gVGhlbiBsYXlvdXQKICAgICAg
ICAgLy8gdGhlIHJlcGxhY2VkIGVsZW1lbnRzIGxhdGVyLiBJbiBwYXJ0aWFsIGxheW91dCBtb2Rl
LCBsaW5lIGJveGVzIGFyZSBub3QKQEAgLTE2NzMsNyArMTY5MSw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAgICAgICAgLy8gZWxlbWVudHMgYXQgdGhlIHNh
bWUgdGltZS4KICAgICAgICAgYm9vbCBoYXNJbmxpbmVDaGlsZCA9IGZhbHNlOwogICAgICAgICBW
ZWN0b3I8UmVuZGVyQm94Kj4gcmVwbGFjZWRDaGlsZHJlbjsKLSAgICAgICAgZm9yIChJbmxpbmVX
YWxrZXIgd2Fsa2VyKCp0aGlzKTsgIXdhbGtlci5hdEVuZCgpOyB3YWxrZXIuYWR2YW5jZSgpKSB7
CisgICAgICAgIGZvciAoSW5saW5lV2Fsa2VyIHdhbGtlcihtX2Zsb3cpOyAhd2Fsa2VyLmF0RW5k
KCk7IHdhbGtlci5hZHZhbmNlKCkpIHsKICAgICAgICAgICAgIFJlbmRlck9iamVjdCYgbyA9ICp3
YWxrZXIuY3VycmVudCgpOwogCiAgICAgICAgICAgICBpZiAoIWhhc0lubGluZUNoaWxkICYmIG8u
aXNJbmxpbmUoKSkKQEAgLTE2OTgsOCArMTcxNiw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojps
YXlvdXRMaW5lQm94ZXMoYm8KICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCAm
JiBpczxSZW5kZXJSdWJ5UnVuPihib3gpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBG
SVhNRTogVGhpcyByZXNldHMgdGhlIG92ZXJoYW5naW5nIG1hcmdpbnMgdGhhdCB3ZSBzZXQgZHVy
aW5nIGxpbmUgbGF5b3V0IChzZWUgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNl
Z21lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgbW9yZSBzdWl0YWJsZSBw
bGFjZSBmb3IgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpblN0YXJ0Rm9y
Q2hpbGQoYm94LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpbkVuZEZvckNo
aWxkKGJveCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Zsb3cuc2V0TWFyZ2luU3Rh
cnRGb3JDaGlsZChib3gsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbV9mbG93LnNldE1h
cmdpbkVuZEZvckNoaWxkKGJveCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgICAgICAgICAgYm94LmRpcnR5TGluZUJveGVzKGlzRnVsbExheW91dCk7CiAgICAgICAgICAg
ICAgICAgICAgIGlmIChpc0Z1bGxMYXlvdXQpCkBAIC0xNzI1LDcgKzE3NDMsNyBAQCB2b2lkIFJl
bmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvCiAgICAgLy8gRXhwYW5kIHRoZSBsYXN0
IGxpbmUgdG8gYWNjb21tb2RhdGUgUnVieSBhbmQgZW1waGFzaXMgbWFya3MuCiAgICAgaW50IGxh
c3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gMDsKICAgICBpZiAobGFzdFJvb3RCb3goKSkg
ewotICAgICAgICBMYXlvdXRVbml0IGxvd2VzdEFsbG93ZWRQb3NpdGlvbiA9IHN0ZDo6bWF4KGxh
c3RSb290Qm94KCktPmxpbmVCb3R0b20oKSwgbG9naWNhbEhlaWdodCgpICsgcGFkZGluZ0FmdGVy
KCkpOworICAgICAgICBMYXlvdXRVbml0IGxvd2VzdEFsbG93ZWRQb3NpdGlvbiA9IHN0ZDo6bWF4
KGxhc3RSb290Qm94KCktPmxpbmVCb3R0b20oKSwgbV9mbG93LmxvZ2ljYWxIZWlnaHQoKSArIG1f
Zmxvdy5wYWRkaW5nQWZ0ZXIoKSk7CiAgICAgICAgIGlmICghc3R5bGUoKS5pc0ZsaXBwZWRMaW5l
c1dyaXRpbmdNb2RlKCkpCiAgICAgICAgICAgICBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVu
dCA9IGxhc3RSb290Qm94KCktPmNvbXB1dGVVbmRlckFubm90YXRpb25BZGp1c3RtZW50KGxvd2Vz
dEFsbG93ZWRQb3NpdGlvbik7CiAgICAgICAgIGVsc2UKQEAgLTE3MzYsMTEgKzE3NTQsMTEgQEAg
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhibwogICAgIC8vIGRldGVybWlu
aW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2luIGluZm9ybWF0aW9uLiBUaGlz
IGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNzYXJ5CiAgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2Fz
IGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBt
YXJnaW4gaW5mb3JtYXRpb24gb3V0IHRvCiAgICAgLy8gdXMuCi0gICAgTGF5b3V0VW5pdCBhZnRl
ckVkZ2UgPSBib3JkZXJBbmRQYWRkaW5nQWZ0ZXIoKSArIHNjcm9sbGJhckxvZ2ljYWxIZWlnaHQo
KSArIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50OwotICAgIHNldExvZ2ljYWxIZWlnaHQo
bG9naWNhbEhlaWdodCgpICsgYWZ0ZXJFZGdlKTsKKyAgICBMYXlvdXRVbml0IGFmdGVyRWRnZSA9
IG1fZmxvdy5ib3JkZXJBbmRQYWRkaW5nQWZ0ZXIoKSArIG1fZmxvdy5zY3JvbGxiYXJMb2dpY2Fs
SGVpZ2h0KCkgKyBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVudDsKKyAgICBtX2Zsb3cuc2V0
TG9naWNhbEhlaWdodChtX2Zsb3cubG9naWNhbEhlaWdodCgpICsgYWZ0ZXJFZGdlKTsKIAotICAg
IGlmICghZmlyc3RSb290Qm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKLSAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkgPyBIb3Jpem9udGFsTGluZSA6IFZlcnRpY2FsTGluZSwgUG9zaXRpb25P
ZkludGVyaW9yTGluZUJveGVzKSk7CisgICAgaWYgKCFmaXJzdFJvb3RCb3goKSAmJiBtX2Zsb3cu
aGFzTGluZUlmRW1wdHkoKSkKKyAgICAgICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQobV9mbG93
LmxvZ2ljYWxIZWlnaHQoKSArIG1fZmxvdy5saW5lSGVpZ2h0KHRydWUsIG1fZmxvdy5pc0hvcml6
b250YWxXcml0aW5nTW9kZSgpID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0aWNhbExpbmUsIFBvc2l0
aW9uT2ZJbnRlcmlvckxpbmVCb3hlcykpOwogCiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW55IGxp
bmVzIHRoYXQgc3BpbGwgb3V0IG9mIG91ciBibG9jay4gIElmIHdlIGRvLCB0aGVuIHdlIHdpbGwg
cG9zc2libHkgbmVlZCB0bwogICAgIC8vIHRydW5jYXRlIHRleHQuCkBAIC0xNzQ4LDcgKzE3NjYs
NyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvCiAgICAgICAgIGNo
ZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNo
ZWNrRmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRlckJveCYg
ZmxvYXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0
LAordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y2hlY2tGbG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxp
bmVCb3gmIGNsZWFuTGluZSwgUmVuZGVyQm94JiBmbG9hdEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdp
dGhSZWN0JiBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QsCiAgICAgYm9vbCYgZW5jb3VudGVyZWROZXdG
bG9hdCwgYm9vbCYgZGlydGllZEJ5RmxvYXQpCiB7CiAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlf
SU1QTElDQVRJT04oIWZsb2F0Qm94T25DbGVhbkxpbmUuc3R5bGUoKS5kZWxldGlvbkhhc0JlZ3Vu
KCkpOwpAQCAtMTc2NiwxOSArMTc4NCwxOSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tG
bG9hdEluQ2xlYW5MCiAgICAgaWYgKG9yaWdpbmFsRmxvYXRSZWN0LnNpemUoKSA9PSBuZXdTaXpl
ICYmIChmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuc3R5bGVUeXBlKCkgIT0gUHNldWRvSWQ6
OkZpcnN0TGV0dGVyIHx8ICFmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuaW5pdGlhbExldHRl
ckRyb3AoKSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIExheW91dFVuaXQgZmxvYXRUb3AgPSBp
c0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9hdFJlY3QueSgpIDogb3JpZ2lu
YWxGbG9hdFJlY3QueCgpOwotICAgIExheW91dFVuaXQgZmxvYXRIZWlnaHQgPSBpc0hvcml6b250
YWxXcml0aW5nTW9kZSgpID8gc3RkOjptYXgob3JpZ2luYWxGbG9hdFJlY3QuaGVpZ2h0KCksIG5l
d1NpemUuaGVpZ2h0KCkpCisgICAgTGF5b3V0VW5pdCBmbG9hdFRvcCA9IG1fZmxvdy5pc0hvcml6
b250YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9hdFJlY3QueSgpIDogb3JpZ2luYWxGbG9h
dFJlY3QueCgpOworICAgIExheW91dFVuaXQgZmxvYXRIZWlnaHQgPSBtX2Zsb3cuaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSA/IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBu
ZXdTaXplLmhlaWdodCgpKQogICAgICAgICA6IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0Lndp
ZHRoKCksIG5ld1NpemUud2lkdGgoKSk7CiAgICAgZmxvYXRIZWlnaHQgPSBzdGQ6Om1pbihmbG9h
dEhlaWdodCwgTGF5b3V0VW5pdDo6bWF4KCkgLSBmbG9hdFRvcCk7CiAgICAgY2xlYW5MaW5lLm1h
cmtEaXJ0eSgpOwotICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5l
Qm90dG9tV2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7
CisgICAgbV9mbG93Lm1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5lQm90
dG9tV2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7CiAg
ICAgTGF5b3V0UmVjdCBuZXdGbG9hdFJlY3QgPSBvcmlnaW5hbEZsb2F0UmVjdDsKICAgICBuZXdG
bG9hdFJlY3Quc2V0U2l6ZShuZXdTaXplKTsKICAgICBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QuYWRq
dXN0UmVjdChuZXdGbG9hdFJlY3QpOwogICAgIGRpcnRpZWRCeUZsb2F0ID0gdHJ1ZTsKIH0KIAot
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExp
bmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIp
CitSb290SW5saW5lQm94KiBDb21wbGV4TGluZUxheW91dDo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlv
bihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29s
dmVyKQogewogICAgIFJvb3RJbmxpbmVCb3gqIGN1cnJlbnRMaW5lID0gbnVsbHB0cjsKICAgICBS
b290SW5saW5lQm94KiBsYXN0TGluZSA9IG51bGxwdHI7CkBAIC0xNzg4LDcgKzE4MDYsNyBAQCBS
b290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluCiAgICAgYm9vbCBkaXJ0aWVk
QnlGbG9hdCA9IGZhbHNlOwogICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpIHsK
ICAgICAgICAgLy8gUGFnaW5hdGUgYWxsIG9mIHRoZSBjbGVhbiBsaW5lcy4KLSAgICAgICAgYm9v
bCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0
YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgp
LT5pc1BhZ2luYXRlZCgpOworICAgICAgICBib29sIHBhZ2luYXRlZCA9IGxheW91dENvbnRleHQo
KS5sYXlvdXRTdGF0ZSgpICYmIGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2lu
YXRlZCgpOwogICAgICAgICBMYXlvdXRVbml0IHBhZ2luYXRpb25EZWx0YTsKICAgICAgICAgYXV0
byBmbG9hdHNJdGVyYXRvciA9IGZsb2F0cy5iZWdpbigpOwogICAgICAgICBhdXRvIGVuZCA9IGZs
b2F0cy5lbmQoKTsKQEAgLTE4MDAsOSArMTgxOCw5IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJs
b2NrRmxvdzo6ZGV0ZXJtaW4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGFn
aW5hdGlvbkRlbHRhIC09IGN1cnJlbnRMaW5lLT5wYWdpbmF0aW9uU3RydXQoKTsKICAgICAgICAg
ICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50OwotICAgICAgICAgICAgICAgIGFkanVzdExp
bmVQb3NpdGlvbkZvclBhZ2luYXRpb24oY3VycmVudExpbmUsIHBhZ2luYXRpb25EZWx0YSwgb3Zl
cmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOworICAgICAgICAg
ICAgICAgIG1fZmxvdy5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGN1cnJlbnRMaW5l
LCBwYWdpbmF0aW9uRGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVu
dGVkRmxvdygpKTsKICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGlvbkRlbHRhKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChjb250YWluc0Zsb2F0cygpIHx8ICFmbG9hdHMuaXNFbXB0eSgp
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2Zsb3cuY29udGFpbnNGbG9hdHMoKSB8fCAh
ZmxvYXRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IERv
IGJldHRlciBldmVudHVhbGx5LiAgRm9yIG5vdyBpZiB3ZSBldmVyIHNoaWZ0IGJlY2F1c2Ugb2Yg
cGFnaW5hdGlvbiBhbmQgZmxvYXRzIGFyZSBwcmVzZW50IGp1c3QgZ28gdG8gYSBmdWxsIGxheW91
dC4KICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLm1hcmtGb3JGdWxsTGF5b3V0
KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4NzMsNyArMTg5MSw3IEBA
IFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW4KICAgICB9CiAKICAgICBp
ZiAoIWZsb2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgTGF5b3V0VW5pdCBzYXZlZExvZ2ljYWxI
ZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgIExheW91dFVuaXQgc2F2ZWRMb2dpY2Fs
SGVpZ2h0ID0gbV9mbG93LmxvZ2ljYWxIZWlnaHQoKTsKICAgICAgICAgLy8gUmVzdG9yZSBmbG9h
dHMgZnJvbSBjbGVhbiBsaW5lcy4KICAgICAgICAgUm9vdElubGluZUJveCogbGluZSA9IGZpcnN0
Um9vdEJveCgpOwogICAgICAgICB3aGlsZSAobGluZSAhPSBjdXJyZW50TGluZSkgewpAQCAtMTg4
MSwzOSArMTg5OSwzOSBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWlu
CiAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdGluZ0JveCA6ICpjbGVhbkxpbmVGbG9h
dHMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmbG9hdGluZ0JveCkKICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBhdXRvKiBmbG9hdGlu
Z09iamVjdCA9IGluc2VydEZsb2F0aW5nT2JqZWN0KCpmbG9hdGluZ0JveCk7CisgICAgICAgICAg
ICAgICAgICAgIGF1dG8qIGZsb2F0aW5nT2JqZWN0ID0gbV9mbG93Lmluc2VydEZsb2F0aW5nT2Jq
ZWN0KCpmbG9hdGluZ0JveCk7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VS
SVRZX0lNUExJQ0FUSU9OKCFmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwogICAg
ICAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRpbmdMaW5lKCpsaW5l
KTsKLSAgICAgICAgICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wRm9yQ2hp
bGQoKmZsb2F0aW5nQm94KSAtIG1hcmdpbkJlZm9yZUZvckNoaWxkKCpmbG9hdGluZ0JveCkpOwot
ICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOworICAgICAgICAgICAgICAg
ICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChtX2Zsb3cubG9naWNhbFRvcEZvckNoaWxkKCpm
bG9hdGluZ0JveCkgLSBtX2Zsb3cubWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSk7
CisgICAgICAgICAgICAgICAgICAgIG1fZmxvdy5wb3NpdGlvbk5ld0Zsb2F0cygpOwogICAgICAg
ICAgICAgICAgICAgICBmbG9hdHMuc2V0TGFzdENsZWFuRmxvYXQoKmZsb2F0aW5nQm94KTsKICAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsaW5lID0gbGluZS0+
bmV4dFJvb3RCb3goKTsKICAgICAgICAgfQotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KHNhdmVk
TG9naWNhbEhlaWdodCk7CisgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KHNhdmVkTG9n
aWNhbEhlaWdodCk7CiAgICAgfQogCiAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRGaXJz
dExpbmUoIWxhc3RMaW5lKTsKICAgICBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnNldFByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSghbGFzdExpbmUgfHwgbGFzdExpbmUtPmVuZHNXaXRoQnJlYWsoKSk7
CiAKICAgICBpZiAobGFzdExpbmUpIHsKLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChsYXN0TGlu
ZS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVy
ID0gSW5saW5lSXRlcmF0b3IodGhpcywgbGFzdExpbmUtPmxpbmVCcmVha09iaigpLCBsYXN0TGlu
ZS0+bGluZUJyZWFrUG9zKCkpOworICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChsYXN0
TGluZS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAgICBJbmxpbmVJdGVyYXRvciBp
dGVyID0gSW5saW5lSXRlcmF0b3IoJm1fZmxvdywgbGFzdExpbmUtPmxpbmVCcmVha09iaigpLCBs
YXN0TGluZS0+bGluZUJyZWFrUG9zKCkpOwogICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihp
dGVyLCBudW1iZXJPZklzb2xhdGVBbmNlc3RvcnMoaXRlcikpOwogICAgICAgICByZXNvbHZlci5z
ZXRTdGF0dXMobGFzdExpbmUtPmxpbmVCcmVha0JpZGlTdGF0dXMoKSk7CiAgICAgfSBlbHNlIHsK
ICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdHlsZSgpLmRpcmVjdGlvbigpOwog
ICAgICAgICBpZiAoc3R5bGUoKS51bmljb2RlQmlkaSgpID09IFBsYWludGV4dCkKLSAgICAgICAg
ICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRpcmVjdGlvbiwgSW5saW5lSXRlcmF0b3IodGhp
cywgYmlkaUZpcnN0U2tpcHBpbmdFbXB0eUlubGluZXMoKnRoaXMpLCAwKSk7CisgICAgICAgICAg
ICBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24sIElubGluZUl0ZXJhdG9yKCZtX2Zs
b3csIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKG1fZmxvdyksIDApKTsKICAgICAgICAg
cmVzb2x2ZXIuc2V0U3RhdHVzKEJpZGlTdGF0dXMoZGlyZWN0aW9uLCBpc092ZXJyaWRlKHN0eWxl
KCkudW5pY29kZUJpZGkoKSkpKTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgaXRlciA9IElubGlu
ZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKCp0aGlzLCAmcmVz
b2x2ZXIpLCAwKTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgaXRlciA9IElubGluZUl0ZXJhdG9y
KCZtX2Zsb3csIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKG1fZmxvdywgJnJlc29sdmVy
KSwgMCk7CiAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKGl0ZXIsIG51bWJlck9mSXNvbGF0
ZUFuY2VzdG9ycyhpdGVyKSk7CiAgICAgfQogICAgIHJldHVybiBjdXJyZW50TGluZTsKIH0KIAot
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSwgSW5saW5lSXRlcmF0b3Im
IGNsZWFuTGluZVN0YXJ0LCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKQordm9pZCBD
b21wbGV4TGluZUxheW91dDo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xl
YW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpCiB7CiAgICAgYXV0
byBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9hdCA9IFtdKExpbmVMYXlvdXRTdGF0ZTo6RmxvYXRM
aXN0JiBmbG9hdHMpIHsKICAgICAgICAgYXV0byBsYXN0Q2xlYW5GbG9hdCA9IGZsb2F0cy5sYXN0
Q2xlYW5GbG9hdCgpOwpAQCAtMTk1Niw3ICsxOTc0LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmRldGVybWluZUVuZFBvc2l0aQogICAgIC8vIEF0IHRoaXMgcG9pbnQsIHxsYXN0fCBpcyB0aGUg
Zmlyc3QgbGluZSBpbiBhIHJ1biBvZiBjbGVhbiBsaW5lcyB0aGF0IGVuZHMgd2l0aCB0aGUgbGFz
dCBsaW5lCiAgICAgLy8gaW4gdGhlIGJsb2NrLgogICAgIFJvb3RJbmxpbmVCb3gqIHByZXZpb3Vz
TGluZSA9IGxhc3RMaW5lLT5wcmV2Um9vdEJveCgpOwotICAgIGNsZWFuTGluZVN0YXJ0ID0gSW5s
aW5lSXRlcmF0b3IodGhpcywgcHJldmlvdXNMaW5lLT5saW5lQnJlYWtPYmooKSwgcHJldmlvdXNM
aW5lLT5saW5lQnJlYWtQb3MoKSk7CisgICAgY2xlYW5MaW5lU3RhcnQgPSBJbmxpbmVJdGVyYXRv
cigmbV9mbG93LCBwcmV2aW91c0xpbmUtPmxpbmVCcmVha09iaigpLCBwcmV2aW91c0xpbmUtPmxp
bmVCcmVha1BvcygpKTsKICAgICBjbGVhbkxpbmVCaWRpU3RhdHVzID0gcHJldmlvdXNMaW5lLT5s
aW5lQnJlYWtCaWRpU3RhdHVzKCk7CiAgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxU
b3AocHJldmlvdXNMaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7CiAKQEAgLTE5NjcsMTEg
KzE5ODUsMTEgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVuZFBvc2l0aQogICAg
IGxheW91dFN0YXRlLnNldEVuZExpbmUobGFzdExpbmUpOwogfQogCi1ib29sIFJlbmRlckJsb2Nr
Rmxvdzo6Y2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUpCitib29sIENvbXBsZXhMaW5lTGF5b3V0OjpjaGVja1BhZ2luYXRpb25BbmRG
bG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKIHsKLSAgICBMYXlv
dXRVbml0IGxpbmVEZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAtIGxheW91dFN0YXRlLmVuZExpbmVM
b2dpY2FsVG9wKCk7CisgICAgTGF5b3V0VW5pdCBsaW5lRGVsdGEgPSBtX2Zsb3cubG9naWNhbEhl
aWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsKIAotICAgIGJvb2wgcGFn
aW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgp
ICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQ
YWdpbmF0ZWQoKTsKKyAgICBib29sIHBhZ2luYXRlZCA9IGxheW91dENvbnRleHQoKS5sYXlvdXRT
dGF0ZSgpICYmIGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwog
ICAgIGlmIChwYWdpbmF0ZWQgJiYgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkgewogICAg
ICAgICAvLyBDaGVjayBhbGwgbGluZXMgZnJvbSBoZXJlIHRvIHRoZSBlbmQsIGFuZCBzZWUgaWYg
dGhlIGh5cG90aGV0aWNhbCBuZXcgcG9zaXRpb24gZm9yIHRoZSBsaW5lcyB3aWxsIHJlc3VsdAog
ICAgICAgICAvLyBpbiBhIGRpZmZlcmVudCBhdmFpbGFibGUgbGluZSB3aWR0aC4KQEAgLTE5ODIs
NyArMjAwMCw3IEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93OjpjaGVja1BhZ2luYXRpb25BbmQKICAg
ICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZFBhZ2luYXRpb25TdHJ1dCA9IGxpbmVCb3gtPnBh
Z2luYXRpb25TdHJ1dCgpOwogICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7
CiAgICAgICAgICAgICAgICAgbGluZURlbHRhIC09IG9sZFBhZ2luYXRpb25TdHJ1dDsKLSAgICAg
ICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmVCb3gsIGxpbmVE
ZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOwor
ICAgICAgICAgICAgICAgIG1fZmxvdy5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxp
bmVCb3gsIGxpbmVEZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50
ZWRGbG93KCkpOwogICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldFBhZ2luYXRpb25TdHJ1dChv
bGRQYWdpbmF0aW9uU3RydXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxpbmVX
aWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKGxpbmVCb3gsIGxpbmVEZWx0YSwgbGF5b3V0U3Rh
dGUuZnJhZ21lbnRlZEZsb3coKSkpCkBAIC0xOTkwLDExICsyMDA4LDExIEBAIGJvb2wgUmVuZGVy
QmxvY2tGbG93OjpjaGVja1BhZ2luYXRpb25BbmQKICAgICAgICAgfQogICAgIH0KICAgICAKLSAg
ICBpZiAoIWxpbmVEZWx0YSB8fCAhbV9mbG9hdGluZ09iamVjdHMpCisgICAgaWYgKCFsaW5lRGVs
dGEgfHwgIW1fZmxvdy5mbG9hdGluZ09iamVjdHMoKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgCiAgICAgLy8gU2VlIGlmIGFueSBmbG9hdHMgZW5kIGluIHRoZSByYW5nZSBhbG9uZyB3aGlj
aCB3ZSB3YW50IHRvIHNoaWZ0IHRoZSBsaW5lcyB2ZXJ0aWNhbGx5LgotICAgIExheW91dFVuaXQg
bG9naWNhbFRvcCA9IHN0ZDo6bWluKGxvZ2ljYWxIZWlnaHQoKSwgbGF5b3V0U3RhdGUuZW5kTGlu
ZUxvZ2ljYWxUb3AoKSk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0gc3RkOjptaW4obV9m
bG93LmxvZ2ljYWxIZWlnaHQoKSwgbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKSk7CiAK
ICAgICBSb290SW5saW5lQm94KiBsYXN0TGluZSA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsKICAg
ICB3aGlsZSAoUm9vdElubGluZUJveCogbmV4dExpbmUgPSBsYXN0TGluZS0+bmV4dFJvb3RCb3go
KSkKQEAgLTIwMDIsMzAgKzIwMjAsMzAgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFn
aW5hdGlvbkFuZAogCiAgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gbGFzdExpbmUtPmxp
bmVCb3R0b21XaXRoTGVhZGluZygpICsgYWJzb2x1dGVWYWx1ZShsaW5lRGVsdGEpOwogCi0gICAg
Y29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09i
amVjdHMtPnNldCgpOworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVj
dFNldCA9IG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKS0+c2V0KCk7CiAgICAgYXV0byBlbmQgPSBm
bG9hdGluZ09iamVjdFNldC5lbmQoKTsKICAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVj
dFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgY29uc3QgYXV0byYgZmxv
YXRpbmdPYmplY3QgPSAqaXQtPmdldCgpOwotICAgICAgICBpZiAobG9naWNhbEJvdHRvbUZvckZs
b2F0KGZsb2F0aW5nT2JqZWN0KSA+PSBsb2dpY2FsVG9wICYmIGxvZ2ljYWxCb3R0b21Gb3JGbG9h
dChmbG9hdGluZ09iamVjdCkgPCBsb2dpY2FsQm90dG9tKQorICAgICAgICBpZiAobV9mbG93Lmxv
Z2ljYWxCb3R0b21Gb3JGbG9hdChmbG9hdGluZ09iamVjdCkgPj0gbG9naWNhbFRvcCAmJiBtX2Zs
b3cubG9naWNhbEJvdHRvbUZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA8IGxvZ2ljYWxCb3R0b20p
CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKLWJvb2wgUmVuZGVyQmxvY2tGbG93OjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdl
ZChSb290SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVyRnJh
Z21lbnRlZEZsb3cqIGZyYWdtZW50ZWRGbG93KSBjb25zdAorYm9vbCBDb21wbGV4TGluZUxheW91
dDo6bGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoUm9vdElubGluZUJveCogcm9vdEJv
eCwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRlckZyYWdtZW50ZWRGbG93KiBmcmFnbWVudGVk
RmxvdykgY29uc3QKIHsKICAgICBpZiAoIWZyYWdtZW50ZWRGbG93KQogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAKLSAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogY3VycmVudEZyYWdtZW50ID0g
ZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KHJvb3RCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygpICsgbGlu
ZURlbHRhKTsKKyAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogY3VycmVudEZyYWdtZW50ID0g
bV9mbG93LmZyYWdtZW50QXRCbG9ja09mZnNldChyb290Qm94LT5saW5lVG9wV2l0aExlYWRpbmco
KSArIGxpbmVEZWx0YSk7CiAgICAgLy8gSnVzdCBiYWlsIGlmIHRoZSBmcmFnbWVudCBkaWRuJ3Qg
Y2hhbmdlLgogICAgIGlmIChyb290Qm94LT5jb250YWluaW5nRnJhZ21lbnQoKSA9PSBjdXJyZW50
RnJhZ21lbnQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gcm9vdEJveC0+cGFn
aW5hdGVkTGluZVdpZHRoKCkgIT0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChjdXJy
ZW50RnJhZ21lbnQpOworICAgIHJldHVybiByb290Qm94LT5wYWdpbmF0ZWRMaW5lV2lkdGgoKSAh
PSBtX2Zsb3cuYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChjdXJyZW50RnJhZ21lbnQp
OwogfQogCi1ib29sIFJlbmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0
YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGlu
ZVN0YXR1cykKK2Jvb2wgQ29tcGxleExpbmVMYXlvdXQ6Om1hdGNoZWRFbmRMaW5lKExpbmVMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVu
ZExpbmVTdGF0dXMpCiB7CiAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkgPT0gZW5kTGluZVN0
YXJ0KSB7CiAgICAgICAgIGlmIChyZXNvbHZlci5zdGF0dXMoKSAhPSBlbmRMaW5lU3RhdHVzKQpA
QCAtMjA2MSw0NCArMjA3OSwyOSBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExp
bmUoTGluCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0
ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqIGlubGluZU9iaikKK3ZvaWQg
Q29tcGxleExpbmVMYXlvdXQ6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKIHsKLSAg
ICBBU1NFUlQoaW5saW5lT2JqLT5wYXJlbnQoKSA9PSB0aGlzKTsKLQotICAgIElubGluZUl0ZXJh
dG9yIGl0KHRoaXMsIGlubGluZU9iaiwgMCk7Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBwYXNz
IGNvcnJlY3QgdmFsdWUgZm9yIFdoaXRlc3BhY2VQb3NpdGlvbi4KLSAgICB3aGlsZSAoIWl0LmF0
RW5kKCkgJiYgIXJlcXVpcmVzTGluZUJveChpdCkpCi0gICAgICAgIGl0LmluY3JlbWVudCgpOwot
Ci0gICAgcmV0dXJuICFpdC5hdEVuZCgpOwotfQorICAgIEFTU0VSVCghbV9mbG93LnNpbXBsZUxp
bmVMYXlvdXQoKSk7CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGRPdmVyZmxvd0Zyb21Jbmxp
bmVDaGlsZHJlbigpCi17Ci0gICAgaWYgKGF1dG8gbGF5b3V0ID0gc2ltcGxlTGluZUxheW91dCgp
KSB7Ci0gICAgICAgIEFTU0VSVCghaGFzT3ZlcmZsb3dDbGlwKCkpOwotICAgICAgICBTaW1wbGVM
aW5lTGF5b3V0Ojpjb2xsZWN0Rmxvd092ZXJmbG93KCp0aGlzLCAqbGF5b3V0KTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBMYXlvdXRVbml0IGVuZFBhZGRpbmcgPSBoYXNPdmVyZmxvd0Ns
aXAoKSA/IHBhZGRpbmdFbmQoKSA6IDBfbHU7CisgICAgTGF5b3V0VW5pdCBlbmRQYWRkaW5nID0g
bV9mbG93Lmhhc092ZXJmbG93Q2xpcCgpID8gbV9mbG93LnBhZGRpbmdFbmQoKSA6IDBfbHU7CiAg
ICAgLy8gRklYTUU6IE5lZWQgdG8gZmluZCBhbm90aGVyIHdheSB0byBkbyB0aGlzLCBzaW5jZSBz
Y3JvbGxiYXJzIGNvdWxkIHNob3cgd2hlbiB3ZSBkb24ndCB3YW50IHRoZW0gdG8uCi0gICAgaWYg
KGhhc092ZXJmbG93Q2xpcCgpICYmICFlbmRQYWRkaW5nICYmIGVsZW1lbnQoKSAmJiBlbGVtZW50
KCktPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmIHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpKQorICAgIGlmIChtX2Zsb3cuaGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWVuZFBhZGRpbmcg
JiYgbV9mbG93LmVsZW1lbnQoKSAmJiBtX2Zsb3cuZWxlbWVudCgpLT5pc1Jvb3RFZGl0YWJsZUVs
ZW1lbnQoKSAmJiBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKICAgICAgICAgZW5k
UGFkZGluZyA9IDE7CiAgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIGFkZExheW91
dE92ZXJmbG93KGN1cnItPnBhZGRlZExheW91dE92ZXJmbG93UmVjdChlbmRQYWRkaW5nKSk7Ci0g
ICAgICAgIFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBmcmFnbWVudCA9IGVuY2xvc2luZ0ZyYWdt
ZW50ZWRGbG93KCkgPyBjdXJyLT5jb250YWluaW5nRnJhZ21lbnQoKSA6IG51bGxwdHI7CisgICAg
ICAgIG1fZmxvdy5hZGRMYXlvdXRPdmVyZmxvdyhjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1Jl
Y3QoZW5kUGFkZGluZykpOworICAgICAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogZnJhZ21l
bnQgPSBtX2Zsb3cuZW5jbG9zaW5nRnJhZ21lbnRlZEZsb3coKSA/IGN1cnItPmNvbnRhaW5pbmdG
cmFnbWVudCgpIDogbnVsbHB0cjsKICAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAgICAgICAg
ZnJhZ21lbnQtPmFkZExheW91dE92ZXJmbG93Rm9yQm94KHRoaXMsIGN1cnItPnBhZGRlZExheW91
dE92ZXJmbG93UmVjdChlbmRQYWRkaW5nKSk7Ci0gICAgICAgIGlmICghaGFzT3ZlcmZsb3dDbGlw
KCkpIHsKKyAgICAgICAgICAgIGZyYWdtZW50LT5hZGRMYXlvdXRPdmVyZmxvd0ZvckJveCgmbV9m
bG93LCBjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3QoZW5kUGFkZGluZykpOworICAgICAg
ICBpZiAoIW1fZmxvdy5oYXNPdmVyZmxvd0NsaXAoKSkgewogICAgICAgICAgICAgTGF5b3V0UmVj
dCBjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCA9IGN1cnItPnZpc3VhbE92ZXJmbG93UmVjdChjdXJy
LT5saW5lVG9wKCksIGN1cnItPmxpbmVCb3R0b20oKSk7Ci0gICAgICAgICAgICBhZGRWaXN1YWxP
dmVyZmxvdyhjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7CisgICAgICAgICAgICBtX2Zsb3cuYWRk
VmlzdWFsT3ZlcmZsb3coY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QpOwogICAgICAgICAgICAgaWYg
KGZyYWdtZW50KQotICAgICAgICAgICAgICAgIGZyYWdtZW50LT5hZGRWaXN1YWxPdmVyZmxvd0Zv
ckJveCh0aGlzLCBjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7CisgICAgICAgICAgICAgICAgZnJh
Z21lbnQtPmFkZFZpc3VhbE92ZXJmbG93Rm9yQm94KCZtX2Zsb3csIGNoaWxkVmlzdWFsT3ZlcmZs
b3dSZWN0KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRl
bGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OmRlbGV0ZUVs
bGlwc2lzTGluZUJveGVzKCkKIHsKICAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxl
KCkudGV4dEFsaWduKCk7CiAgICAgYm9vbCBsdHIgPSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKTsKQEAgLTIxMDgsOCArMjExMSw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxl
dGVFbGxpcHNpc0xpbmUKICAgICAgICAgICAgIGN1cnItPmNsZWFyVHJ1bmNhdGlvbigpOwogCiAg
ICAgICAgICAgICAvLyBTaGlmdCB0aGUgbGluZSBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MgaWYgd2Ug
Y2Fubm90IGFjY29tb2RhdGUgYW4gZWxsaXBzaXMuCi0gICAgICAgICAgICBmbG9hdCBsb2dpY2Fs
TGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZElu
ZGVudFRleHQpOwotICAgICAgICAgICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbG9n
aWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIERvTm90SW5kZW50VGV4dCkg
LSBsb2dpY2FsTGVmdDsKKyAgICAgICAgICAgIGZsb2F0IGxvZ2ljYWxMZWZ0ID0gbV9mbG93Lmxv
Z2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQp
OworICAgICAgICAgICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbV9mbG93LmxvZ2lj
YWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBEb05vdEluZGVudFRleHQpIC0g
bG9naWNhbExlZnQ7CiAgICAgICAgICAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1cnIt
PmxvZ2ljYWxXaWR0aCgpOwogICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25t
ZW50KHRleHRBbGlnbiwgY3VyciwgMCwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBh
dmFpbGFibGVMb2dpY2FsV2lkdGgsIDApOwogCkBAIC0yMTIyLDE1ICsyMTI1LDE1IEBAIHZvaWQg
UmVuZGVyQmxvY2tGbG93OjpkZWxldGVFbGxpcHNpc0xpbmUKICAgICB9CiB9CiAKLXZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCkKK3ZvaWQgQ29tcGxleExp
bmVMYXlvdXQ6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQogewogICAgIC8vIERldGVybWlu
ZSB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCiAgICAg
Ly8gRklYTUU6IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRvIHVz
ZSAweDAwMkUgKEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJlbmRl
cmFibGUiCiAgICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBzdHlsZSgpLmZvbnRDYXNjYWRl
KCk7CiAgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEF0b21TdHJpbmc+IGVsbGlwc2lzU3RyKCZo
b3Jpem9udGFsRWxsaXBzaXMsIDEpOwotICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmaXJzdExpbmVG
b250ID0gZmlyc3RMaW5lU3R5bGUoKS5mb250Q2FzY2FkZSgpOwotICAgIGZsb2F0IGZpcnN0TGlu
ZUVsbGlwc2lzV2lkdGggPSBmaXJzdExpbmVGb250LndpZHRoKGNvbnN0cnVjdFRleHRSdW4oJmhv
cml6b250YWxFbGxpcHNpcywgMSwgZmlyc3RMaW5lU3R5bGUoKSkpOwotICAgIGZsb2F0IGVsbGlw
c2lzV2lkdGggPSAoZm9udCA9PSBmaXJzdExpbmVGb250KSA/IGZpcnN0TGluZUVsbGlwc2lzV2lk
dGggOiBmb250LndpZHRoKGNvbnN0cnVjdFRleHRSdW4oJmhvcml6b250YWxFbGxpcHNpcywgMSwg
c3R5bGUoKSkpOworICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmaXJzdExpbmVGb250ID0gbV9mbG93
LmZpcnN0TGluZVN0eWxlKCkuZm9udENhc2NhZGUoKTsKKyAgICBmbG9hdCBmaXJzdExpbmVFbGxp
cHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53aWR0aChtX2Zsb3cuY29uc3RydWN0VGV4dFJ1bigm
aG9yaXpvbnRhbEVsbGlwc2lzLCAxLCBtX2Zsb3cuZmlyc3RMaW5lU3R5bGUoKSkpOworICAgIGZs
b2F0IGVsbGlwc2lzV2lkdGggPSAoZm9udCA9PSBmaXJzdExpbmVGb250KSA/IGZpcnN0TGluZUVs
bGlwc2lzV2lkdGggOiBmb250LndpZHRoKG1fZmxvdy5jb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9u
dGFsRWxsaXBzaXMsIDEsIHN0eWxlKCkpKTsKIAogICAgIC8vIEZvciBMVFIgdGV4dCB0cnVuY2F0
aW9uLCB3ZSB3YW50IHRvIGdldCB0aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBib3gsIGFu
ZCB0aGVuIHdlIHdhbnQgdG8gc2VlCiAgICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2YgYSBsaW5l
IGJveCBleGNlZWRzIHRoYXQuICBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBvZiB0aGUg
cGFkZGluZyBib3ggYW5kCkBAIC0yMTQxLDggKzIxNDQsOCBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6Y2hlY2tMaW5lc0ZvclRleHRPCiAgICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOwogICAgIGZv
ciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vy
ci0+bmV4dFJvb3RCb3goKSkgewogICAgICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50
VGV4dCA9IGZpcnN0TGluZSA/IEluZGVudFRleHQgOiBEb05vdEluZGVudFRleHQ7Ci0gICAgICAg
IExheW91dFVuaXQgYmxvY2tSaWdodEVkZ2UgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGN1
cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7Ci0gICAgICAgIExheW91dFVuaXQgYmxv
Y2tMZWZ0RWRnZSA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNo
b3VsZEluZGVudFRleHQpOworICAgICAgICBMYXlvdXRVbml0IGJsb2NrUmlnaHRFZGdlID0gbV9m
bG93LmxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRl
bnRUZXh0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBibG9ja0xlZnRFZGdlID0gbV9mbG93LmxvZ2lj
YWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwog
ICAgICAgICBMYXlvdXRVbml0IGxpbmVCb3hFZGdlIHsgbHRyID8gY3Vyci0+eCgpICsgY3Vyci0+
bG9naWNhbFdpZHRoKCkgOiBjdXJyLT54KCkgfTsKICAgICAgICAgaWYgKChsdHIgJiYgbGluZUJv
eEVkZ2UgPiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFsdHIgJiYgbGluZUJveEVkZ2UgPCBibG9ja0xl
ZnRFZGdlKSkgewogICAgICAgICAgICAgLy8gVGhpcyBsaW5lIHNwaWxscyBvdXQgb2Ygb3VyIGJv
eCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiAgTm93IHdlIG5lZWQgdG8gc2VlIGlmIHRo
ZSBsaW5lCkBAIC0yMTU1LDcgKzIxNTgsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tM
aW5lc0ZvclRleHRPCiAgICAgICAgICAgICAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBj
dXJyLT5wbGFjZUVsbGlwc2lzKGVsbGlwc2lzU3RyLCBsdHIsIGJsb2NrTGVmdEVkZ2UsIGJsb2Nr
UmlnaHRFZGdlLCB3aWR0aCk7CiAKICAgICAgICAgICAgICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9
IDA7IC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGRlbHRhIGZyb20gdGhlIGJhc2Ug
cG9zaXRpb24uCi0gICAgICAgICAgICAgICAgZmxvYXQgdHJ1bmNhdGVkV2lkdGggPSBhdmFpbGFi
bGVMb2dpY2FsV2lkdGhGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7
CisgICAgICAgICAgICAgICAgZmxvYXQgdHJ1bmNhdGVkV2lkdGggPSBtX2Zsb3cuYXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwog
ICAgICAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24s
IGN1cnIsIG51bGxwdHIsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgdHJ1bmNhdGVk
V2lkdGgsIDApOwogICAgICAgICAgICAgICAgIGlmIChsdHIpCiAgICAgICAgICAgICAgICAgICAg
IGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbihsb2dpY2FsTGVmdCwgMCk7CkBAIC0yMTY3LDkg
KzIxNzAsOSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tMaW5lc0ZvclRleHRPCiAgICAg
fQogfQogCi1ib29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25z
dCBGbG9hdGluZ09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCBMaW5lSW5mbyYgbGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCitib29s
IENvbXBsZXhMaW5lTGF5b3V0Ojpwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGNvbnN0IEZsb2F0aW5n
T2JqZWN0JiBuZXdGbG9hdCwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xp
bmUsIExpbmVJbmZvJiBsaW5lSW5mbywgTGluZVdpZHRoJiB3aWR0aCkKIHsKLSAgICBpZiAoIXBv
c2l0aW9uTmV3RmxvYXRzKCkpCisgICAgaWYgKCFtX2Zsb3cucG9zaXRpb25OZXdGbG9hdHMoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgd2lkdGguc2hyaW5rQXZhaWxhYmxlV2lkdGhG
b3JOZXdGbG9hdElmTmVlZGVkKG5ld0Zsb2F0KTsKQEAgLTIxODAsMTMgKzIxODMsMTMgQEAgYm9v
bCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbgogICAgIGlmICghbmV3RmxvYXQu
cGFnaW5hdGlvblN0cnV0KCkgfHwgIWxpbmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgp
IHx8ICFsaW5lSW5mby5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgY29u
c3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVj
dHMtPnNldCgpOworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNl
dCA9IG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKS0+c2V0KCk7CiAgICAgQVNTRVJUKGZsb2F0aW5n
T2JqZWN0U2V0Lmxhc3QoKS5nZXQoKSA9PSAmbmV3RmxvYXQpOwogCi0gICAgTGF5b3V0VW5pdCBm
bG9hdExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yRmxvYXQobmV3RmxvYXQpOworICAgIExheW91
dFVuaXQgZmxvYXRMb2dpY2FsVG9wID0gbV9mbG93LmxvZ2ljYWxUb3BGb3JGbG9hdChuZXdGbG9h
dCk7CiAgICAgTGF5b3V0VW5pdCBwYWdpbmF0aW9uU3RydXQgPSBuZXdGbG9hdC5wYWdpbmF0aW9u
U3RydXQoKTsKIAotICAgIGlmIChmbG9hdExvZ2ljYWxUb3AgLSBwYWdpbmF0aW9uU3RydXQgIT0g
bG9naWNhbEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkKKyAgICBp
ZiAoZmxvYXRMb2dpY2FsVG9wIC0gcGFnaW5hdGlvblN0cnV0ICE9IG1fZmxvdy5sb2dpY2FsSGVp
Z2h0KCkgKyBsaW5lSW5mby5mbG9hdFBhZ2luYXRpb25TdHJ1dCgpKQogICAgICAgICByZXR1cm4g
dHJ1ZTsKIAogICAgIGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKQEAgLTIxOTcs
MTIgKzIyMDAsMTIgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbgog
ICAgICAgICBhdXRvJiBmbG9hdGluZ09iamVjdCA9ICppdC0+Z2V0KCk7CiAgICAgICAgIGlmICgm
ZmxvYXRpbmdPYmplY3QgPT0gbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSkKICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBpZiAobG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA9
PSBsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSW5mby5mbG9hdFBhZ2luYXRpb25TdHJ1dCgpKSB7Cisg
ICAgICAgIGlmIChtX2Zsb3cubG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA9PSBt
X2Zsb3cubG9naWNhbEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkg
ewogICAgICAgICAgICAgZmxvYXRpbmdPYmplY3Quc2V0UGFnaW5hdGlvblN0cnV0KHBhZ2luYXRp
b25TdHJ1dCArIGZsb2F0aW5nT2JqZWN0LnBhZ2luYXRpb25TdHJ1dCgpKTsKICAgICAgICAgICAg
IFJlbmRlckJveCYgZmxvYXRCb3ggPSBmbG9hdGluZ09iamVjdC5yZW5kZXJlcigpOwotICAgICAg
ICAgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94LCBsb2dpY2FsVG9wRm9yQ2hpbGQo
ZmxvYXRCb3gpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoZmxvYXRCb3gpICsgcGFnaW5hdGlvblN0
cnV0KTsKKyAgICAgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsVG9wRm9yQ2hpbGQoZmxvYXRCb3gs
IG1fZmxvdy5sb2dpY2FsVG9wRm9yQ2hpbGQoZmxvYXRCb3gpICsgbV9mbG93Lm1hcmdpbkJlZm9y
ZUZvckNoaWxkKGZsb2F0Qm94KSArIHBhZ2luYXRpb25TdHJ1dCk7CiAKLSAgICAgICAgICAgIGlm
ICh1cGRhdGVGcmFnbWVudFJhbmdlRm9yQm94Q2hpbGQoZmxvYXRCb3gpKQorICAgICAgICAgICAg
aWYgKG1fZmxvdy51cGRhdGVGcmFnbWVudFJhbmdlRm9yQm94Q2hpbGQoZmxvYXRCb3gpKQogICAg
ICAgICAgICAgICAgIGZsb2F0Qm94LnNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CiAgICAg
ICAgICAgICBlbHNlIGlmIChpczxSZW5kZXJCbG9jaz4oZmxvYXRCb3gpKQogICAgICAgICAgICAg
ICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPihmbG9hdEJveCkuc2V0Q2hpbGROZWVkc0xheW91dChN
YXJrT25seVRoaXMpOwpAQCAtMjIxMCwxMCArMjIxMywxMCBAQCBib29sIFJlbmRlckJsb2NrRmxv
dzo6cG9zaXRpb25OZXdGbG9hdE9uCiAKICAgICAgICAgICAgIC8vIFNhdmUgdGhlIG9sZCBsb2dp
Y2FsIHRvcCBiZWZvcmUgY2FsbGluZyByZW1vdmVQbGFjZWRPYmplY3Qgd2hpY2ggd2lsbCBzZXQK
ICAgICAgICAgICAgIC8vIGlzUGxhY2VkIHRvIGZhbHNlLiBPdGhlcndpc2UgaXQgd2lsbCB0cmln
Z2VyIGFuIGFzc2VydCBpbiBsb2dpY2FsVG9wRm9yRmxvYXQuCi0gICAgICAgICAgICBMYXlvdXRV
bml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpOwot
ICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPnJlbW92ZVBsYWNlZE9iamVjdCgmZmxvYXRp
bmdPYmplY3QpOwotICAgICAgICAgICAgc2V0TG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2Jq
ZWN0LCBvbGRMb2dpY2FsVG9wICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAgIG1fZmxv
YXRpbmdPYmplY3RzLT5hZGRQbGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsKKyAgICAgICAg
ICAgIExheW91dFVuaXQgb2xkTG9naWNhbFRvcCA9IG1fZmxvdy5sb2dpY2FsVG9wRm9yRmxvYXQo
ZmxvYXRpbmdPYmplY3QpOworICAgICAgICAgICAgbV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5y
ZW1vdmVQbGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsKKyAgICAgICAgICAgIG1fZmxvdy5z
ZXRMb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QsIG9sZExvZ2ljYWxUb3AgKyBwYWdp
bmF0aW9uU3RydXQpOworICAgICAgICAgICAgbV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5hZGRQ
bGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjIy
Myw3ICsyMjI2LDcgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbgog
ICAgIHJldHVybiB0cnVlOwogfQogCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6c3RhcnRB
bGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJbmRlbnRUZXh0T3JOb3Qg
c2hvdWxkSW5kZW50VGV4dCkKK0xheW91dFVuaXQgQ29tcGxleExpbmVMYXlvdXQ6OnN0YXJ0QWxp
Z25lZE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBwb3NpdGlvbiwgSW5kZW50VGV4dE9yTm90IHNo
b3VsZEluZGVudFRleHQpCiB7CiAgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgp
LnRleHRBbGlnbigpOwogICAgIGJvb2wgc2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gZmFsc2U7CkBA
IC0yMjQ2LDMwICsyMjQ5LDMwIEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93OjpzdGFydEFs
aWduZWQKICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI0
NTIyCiAgICAgLy8gVGhpcyBxdWlyayBpcyBmb3IgbGVnYWN5IGNvbnRlbnQgdGhhdCBkb2Vzbid0
IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgY2VudGVyIHBvc2l0aW9uaW5nIHNjaGVtZQogICAgIC8v
IGJlaW5nIGhvbm9yZWQgKGUuZy4sIGVwdWJzKS4KLSAgICBpZiAoc2hvdWxkQXBwbHlJbmRlbnRU
ZXh0IHx8IHNldHRpbmdzKCkudXNlTGVnYWN5VGV4dEFsaWduUG9zaXRpb25lZEVsZW1lbnRCZWhh
dmlvcigpKSAvLyBGSVhNRTogSGFuZGxlIFRleHRBbGlnbk1vZGU6OkVuZCBoZXJlCi0gICAgICAg
IHJldHVybiBzdGFydE9mZnNldEZvckxpbmUocG9zaXRpb24sIHNob3VsZEluZGVudFRleHQpOwor
ICAgIGlmIChzaG91bGRBcHBseUluZGVudFRleHQgfHwgbV9mbG93LnNldHRpbmdzKCkudXNlTGVn
YWN5VGV4dEFsaWduUG9zaXRpb25lZEVsZW1lbnRCZWhhdmlvcigpKSAvLyBGSVhNRTogSGFuZGxl
IFRleHRBbGlnbk1vZGU6OkVuZCBoZXJlCisgICAgICAgIHJldHVybiBtX2Zsb3cuc3RhcnRPZmZz
ZXRGb3JMaW5lKHBvc2l0aW9uLCBzaG91bGRJbmRlbnRUZXh0KTsKIAogICAgIC8vIHVwZGF0ZUxv
Z2ljYWxXaWR0aEZvckFsaWdubWVudCgpIGhhbmRsZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxv
Y2sgc28gbm8gbmVlZCB0byBjb25zaWRlciBpdCBoZXJlCiAgICAgZmxvYXQgdG90YWxMb2dpY2Fs
V2lkdGggPSAwOwotICAgIGZsb2F0IGxvZ2ljYWxMZWZ0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JM
aW5lKGxvZ2ljYWxIZWlnaHQoKSwgRG9Ob3RJbmRlbnRUZXh0KTsKLSAgICBmbG9hdCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGggPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGxvZ2ljYWxIZWlnaHQo
KSwgRG9Ob3RJbmRlbnRUZXh0KSAtIGxvZ2ljYWxMZWZ0OworICAgIGZsb2F0IGxvZ2ljYWxMZWZ0
ID0gbV9mbG93LmxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShtX2Zsb3cubG9naWNhbEhlaWdodCgp
LCBEb05vdEluZGVudFRleHQpOworICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IG1f
Zmxvdy5sb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCksIERv
Tm90SW5kZW50VGV4dCkgLSBsb2dpY2FsTGVmdDsKIAogICAgIC8vIEZJWE1FOiBCdWcgMTI5MzEx
OiBXZSBuZWVkIHRvIHBhc3MgYSB2YWxpZCBSb290SW5saW5lQm94IGhlcmUsIGNvbnNpZGVyaW5n
IHRoZSBiaWRpIGxldmVsIHVzZWQgdG8gY29uc3RydWN0IHRoZSBsaW5lLgogICAgIHVwZGF0ZUxv
Z2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24sIDAsIDAsIGxvZ2ljYWxMZWZ0LCB0b3Rh
bExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCAwKTsKIAogICAgIGlmICghc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIHJldHVybiBMYXlvdXRVbml0
KGxvZ2ljYWxXaWR0aCgpIC0gbG9naWNhbExlZnQpOworICAgICAgICByZXR1cm4gTGF5b3V0VW5p
dChtX2Zsb3cubG9naWNhbFdpZHRoKCkgLSBsb2dpY2FsTGVmdCk7CiAgICAgcmV0dXJuIExheW91
dFVuaXQobG9naWNhbExlZnQpOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlRnJh
Z21lbnRGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gpIGNvbnN0Cit2b2lkIENvbXBsZXhM
aW5lTGF5b3V0Ojp1cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCkg
Y29uc3QKIHsKICAgICBBU1NFUlQobGluZUJveCk7CiAKLSAgICBpZiAoIWhhc0ZyYWdtZW50UmFu
Z2VJbkZyYWdtZW50ZWRGbG93KCkpCisgICAgaWYgKCFtX2Zsb3cuaGFzRnJhZ21lbnRSYW5nZUlu
RnJhZ21lbnRlZEZsb3coKSkKICAgICAgICAgbGluZUJveC0+Y2xlYXJDb250YWluaW5nRnJhZ21l
bnQoKTsKICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGF1dG8gY29udGFpbmluZ0ZyYWdtZW50ID0g
ZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KGxpbmVCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygpKSkKKyAg
ICAgICAgaWYgKGF1dG8gY29udGFpbmluZ0ZyYWdtZW50ID0gbV9mbG93LmZyYWdtZW50QXRCbG9j
a09mZnNldChsaW5lQm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSkpCiAgICAgICAgICAgICBsaW5l
Qm94LT5zZXRDb250YWluaW5nRnJhZ21lbnQoKmNvbnRhaW5pbmdGcmFnbWVudCk7CiAgICAgICAg
IGVsc2UKICAgICAgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29udGFpbmluZ0ZyYWdtZW50KCk7CkBA
IC0yMjg2LDQgKzIyODksMTUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUZyYWdtZW50
Rm9yTAogICAgICAgICBsaW5lQm94LT5zZXRJc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsodHJ1ZSk7CiB9
CiAKK2NvbnN0IFJlbmRlclN0eWxlJiBDb21wbGV4TGluZUxheW91dDo6c3R5bGUoKSBjb25zdAor
eworICAgIHJldHVybiBtX2Zsb3cuc3R5bGUoKTsKK30KKworY29uc3QgRnJhbWVWaWV3TGF5b3V0
Q29udGV4dCYgQ29tcGxleExpbmVMYXlvdXQ6OmxheW91dENvbnRleHQoKSBjb25zdAoreworICAg
IHJldHVybiBtX2Zsb3cudmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKTsKK30KKwor
CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQu
aAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVM
YXlvdXQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaW5jbHVkZSAiSW5saW5lRmxvd0JveC5oIgorI2luY2x1ZGUgIkxpbmVX
aWR0aC5oIgorI2luY2x1ZGUgIlJlbmRlckxpbmVCb3hMaXN0LmgiCisjaW5jbHVkZSAiUmVuZGVy
U3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRlICJUcmFpbGluZ09iamVjdHMuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBCaWRpQ29udGV4dDsKK2NsYXNzIEZsb2F0aW5nT2JqZWN0
OworY2xhc3MgRmxvYXRXaXRoUmVjdDsKK2NsYXNzIEZyYW1lVmlld0xheW91dENvbnRleHQ7Citj
bGFzcyBJbmxpbmVCb3g7CitjbGFzcyBJbmxpbmVJdGVyYXRvcjsKK2NsYXNzIExpbmVJbmZvOwor
Y2xhc3MgTGluZUxheW91dFN0YXRlOworY2xhc3MgUmVuZGVyQmxvY2tGbG93OworY2xhc3MgUmVu
ZGVyT2JqZWN0OworY2xhc3MgUmVuZGVyUnVieVJ1bjsKK2NsYXNzIFJvb3RJbmxpbmVCb3g7Citj
bGFzcyBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CitzdHJ1Y3QgQmlkaVN0YXR1czsKK3N0cnVjdCBX
b3JkTWVhc3VyZW1lbnQ7CisKK3RlbXBsYXRlIDxjbGFzcyBSdW4+IGNsYXNzIEJpZGlSdW5MaXN0
OwordHlwZWRlZiBWZWN0b3I8V29yZE1lYXN1cmVtZW50LCA2ND4gV29yZE1lYXN1cmVtZW50czsK
KworY2xhc3MgQ29tcGxleExpbmVMYXlvdXQgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OworcHVibGljOgorICAgIENvbXBsZXhMaW5lTGF5b3V0KFJlbmRlckJsb2NrRmxvdyYpOworICAg
IH5Db21wbGV4TGluZUxheW91dCgpOworCisgICAgUmVuZGVyTGluZUJveExpc3QmIGxpbmVCb3hl
cygpIHsgcmV0dXJuIG1fbGluZUJveGVzOyB9CisgICAgY29uc3QgUmVuZGVyTGluZUJveExpc3Qm
IGxpbmVCb3hlcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzOyB9CisKKyAgICBSb290SW5s
aW5lQm94KiBmaXJzdFJvb3RCb3goKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxSb290SW5saW5l
Qm94PihtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKSk7IH0KKyAgICBSb290SW5saW5lQm94KiBs
YXN0Um9vdEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PFJvb3RJbmxpbmVCb3g+KG1fbGlu
ZUJveGVzLmxhc3RMaW5lQm94KCkpOyB9CisKKyAgICB2b2lkIGxheW91dExpbmVCb3hlcyhib29s
IHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsVG9wLCBMYXlvdXRV
bml0JiByZXBhaW50TG9naWNhbEJvdHRvbSk7CisKKyAgICBMYXlvdXRVbml0IHN0YXJ0QWxpZ25l
ZE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBwb3NpdGlvbiwgSW5kZW50VGV4dE9yTm90IHNob3Vs
ZEluZGVudFRleHQpOworICAgIFJvb3RJbmxpbmVCb3gqIGNvbnN0cnVjdExpbmUoQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mLCBjb25zdCBMaW5lSW5mbyYpOworICAgIGJvb2wgcG9zaXRpb25OZXdGbG9h
dE9uTGluZShjb25zdCBGbG9hdGluZ09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYsIExpbmVXaWR0aCYpOworICAgIHZv
aWQgYWRkT3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4oKTsKKworICAgIHN0YXRpYyB2b2lkIGFw
cGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4qLCBpbnQgc3RhcnQsIGludCBl
bmQsIFJlbmRlck9iamVjdCYsIElubGluZUJpZGlSZXNvbHZlciYpOworCitwcml2YXRlOgorICAg
IHN0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBjcmVhdGVSb290SW5saW5lQm94KCk7Cisg
ICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOworICAgIHN0
YXRpYyBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCos
IGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSk7CisgICAgSW5saW5l
Rmxvd0JveCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJiwg
SW5saW5lQm94Kik7CisgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ25tZW50Rm9yTGluZShib29s
IGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdDsKKyAgICB2b2lkIHNldE1hcmdpbnNGb3JSdWJ5UnVu
KEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVuJiwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09iamVjdCwg
Y29uc3QgTGluZUluZm8mKTsKKyAgICB2b2lkIHVwZGF0ZVJ1YnlGb3JKdXN0aWZpZWRUZXh0KFJl
bmRlclJ1YnlSdW4mLCBCaWRpUnVuJiwgY29uc3QgVmVjdG9yPHVuc2lnbmVkLCAxNj4mIGV4cGFu
c2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBm
bG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgc2l6
ZV90Jik7CisgICAgdm9pZCBjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dChCaWRpUnVu
KiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgY29uc3QgVmVjdG9yPHVuc2ln
bmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQsIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dp
Y2FsV2lkdGgpOworICAgIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0
IFRleHRBbGlnbk1vZGUmLCBjb25zdCBSb290SW5saW5lQm94KiwgQmlkaVJ1biogdHJhaWxpbmdT
cGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZs
b2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
KTsKKyAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJ
bmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0
cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFj
a0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1lYXN1cmVtZW50cyYpOwor
ICAgIEJpZGlSdW4qIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJv
b3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIFRleHRBbGlnbk1vZGUsIGZsb2F0JiBsb2dp
Y2FsTGVmdCwgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4s
IEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRz
TWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1lYXN1cmVtZW50cyYpOworICAgIHZv
aWQgcmVtb3ZlSW5saW5lQm94KEJpZGlSdW4mLCBjb25zdCBSb290SW5saW5lQm94JikgY29uc3Q7
CisgICAgdm9pZCBjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxp
bmVCb3gqLCBCaWRpUnVuKiBmaXJzdFJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNN
YXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmKTsKKyAgICBpbmxpbmUg
QmlkaVJ1biogaGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlS
dW5zLCBCaWRpQ29udGV4dCogY3VycmVudENvbnRleHQpOworICAgIHZvaWQgYXBwZW5kRmxvYXRp
bmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0Jik7CisgICAgUm9vdElubGluZUJveCog
Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKHVuc2lnbmVkIGJpZGlMZXZlbCwgQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5m
byYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdv
cmRNZWFzdXJlbWVudHMmKTsKKyAgICB2b2lkIGxheW91dFJ1bnNBbmRGbG9hdHMoTGluZUxheW91
dFN0YXRlJiwgYm9vbCBoYXNJbmxpbmVDaGlsZCk7CisgICAgaW5saW5lIGNvbnN0IElubGluZUl0
ZXJhdG9yJiByZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRM
b2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsIEZsb2F0aW5nT2JqZWN0
KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCAgY29uc3Qg
SW5saW5lSXRlcmF0b3ImIG9sZEVuZCk7CisgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzSW5S
YW5nZShMaW5lTGF5b3V0U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlT
dGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKKyAgICB2b2lkIHJl
YXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNsZWFuTGluZSwgTGF5b3V0VW5p
dCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKTsKKyAgICB2b2lkIGxpbmtUb0VuZExpbmVJ
Zk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmKTsKKyAgICB2b2lkIGNoZWNrRmxvYXRJbkNsZWFuTGlu
ZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRlckJveCYgZmxvYXRCb3hPbkNsZWFuTGlu
ZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LCBib29sJiBlbmNvdW50ZXJl
ZE5ld0Zsb2F0LCBib29sJiBkaXJ0aWVkQnlGbG9hdCk7CisgICAgUm9vdElubGluZUJveCogZGV0
ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2ZXIm
KTsKKyAgICB2b2lkIGRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYsIFJvb3RJ
bmxpbmVCb3gqIHN0YXJ0TGluZSwgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBCaWRp
U3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKKyAgICBib29sIGNoZWNrUGFnaW5hdGlvbkFu
ZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmKTsKKyAgICBib29sIGxpbmVXaWR0aEZv
clBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqIHJvb3RCb3gsIExheW91dFVuaXQg
bGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyopIGNvbnN0OworICAgIGJvb2wgbWF0Y2hl
ZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGlu
ZVN0YXR1cyk7CisgICAgdm9pZCBkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpOworICAgIHZvaWQg
Y2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOworICAgIHZvaWQgdXBkYXRlRnJhZ21lbnRGb3JM
aW5lKFJvb3RJbmxpbmVCb3gqKSBjb25zdDsKKworICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHls
ZSgpIGNvbnN0OworICAgIGNvbnN0IEZyYW1lVmlld0xheW91dENvbnRleHQmIGxheW91dENvbnRl
eHQoKSBjb25zdDsKKworICAgIFJlbmRlckJsb2NrRmxvdyYgbV9mbG93OworICAgIFJlbmRlckxp
bmVCb3hMaXN0IG1fbGluZUJveGVzOworfTsKKworfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNTM3LDcg
KzUzNyw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIGFkZFBsYWNlaG9sZGVyUnVuRm9ySXNvbGF0
ZWRJbmxpbmUocmVzb2x2ZXIsIG9iaiwgcG9zLCByb290KTsKICAgICAgICAgfQogICAgICAgICBt
X2hhdmVBZGRlZEZha2VSdW5Gb3JSb290SXNvbGF0ZSA9IHRydWU7Ci0gICAgICAgIFJlbmRlckJs
b2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChudWxscHRyLCBwb3MsIGVuZCwgb2JqLCByZXNv
bHZlcik7CisgICAgICAgIENvbXBsZXhMaW5lTGF5b3V0OjphcHBlbmRSdW5zRm9yT2JqZWN0KG51
bGxwdHIsIHBvcywgZW5kLCBvYmosIHJlc29sdmVyKTsKICAgICB9CiAKIHByaXZhdGU6CkBAIC01
NTksNyArNTU5LDcgQEAgaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBlbmRSdQog
ICAgICAgICAgICAgaWYgKGlzb2xhdGVUcmFja2VyLmluSXNvbGF0ZSgpKQogICAgICAgICAgICAg
ICAgIGlzb2xhdGVUcmFja2VyLmFkZEZha2VSdW5JZk5lY2Vzc2FyeSgqb2JqLCBzdGFydCwgb2Jq
LT5sZW5ndGgoKSwgKm1fc29yLnJvb3QoKSwgKnRoaXMpOwogICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdCgmbV9ydW5z
LCBzdGFydCwgb2JqLT5sZW5ndGgoKSwgKm9iaiwgKnRoaXMpOworICAgICAgICAgICAgICAgIENv
bXBsZXhMaW5lTGF5b3V0OjphcHBlbmRSdW5zRm9yT2JqZWN0KCZtX3J1bnMsIHN0YXJ0LCBvYmot
Pmxlbmd0aCgpLCAqb2JqLCAqdGhpcyk7CiAgICAgICAgICAgICAvLyBGSVhNRTogc3RhcnQvb2Jq
IHNob3VsZCBiZSBhbiBJbmxpbmVJdGVyYXRvciBpbnN0ZWFkIG9mIHR3byBzZXBhcmF0ZSB2YXJp
YWJsZXMuCiAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICBvYmogPSBiaWRpTmV4
dFNraXBwaW5nRW1wdHlJbmxpbmVzKCptX3Nvci5yb290KCksIG9iaiwgJmlzb2xhdGVUcmFja2Vy
KTsKQEAgLTU3NSw3ICs1NzUsNyBAQCBpbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFw
cGVuZFJ1CiAgICAgICAgICAgICBpZiAoaXNvbGF0ZVRyYWNrZXIuaW5Jc29sYXRlKCkpCiAgICAg
ICAgICAgICAgICAgaXNvbGF0ZVRyYWNrZXIuYWRkRmFrZVJ1bklmTmVjZXNzYXJ5KCpvYmosIHN0
YXJ0LCBvYmotPmxlbmd0aCgpLCAqbV9zb3Iucm9vdCgpLCAqdGhpcyk7CiAgICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9yT2JqZWN0
KCZtX3J1bnMsIHN0YXJ0LCBlbmQsICpvYmosICp0aGlzKTsKKyAgICAgICAgICAgICAgICBDb21w
bGV4TGluZUxheW91dDo6YXBwZW5kUnVuc0Zvck9iamVjdCgmbV9ydW5zLCBzdGFydCwgZW5kLCAq
b2JqLCAqdGhpcyk7CiAgICAgICAgIH0KIAogICAgICAgICBtX2Vvci5pbmNyZW1lbnQoKTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAyNDg1MDAp
CisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5
KQpAQCAtMTEzLDggKzExMyw2IEBAIHB1YmxpYzoKICAgICBib29sIGhhc01hcmdpbkJlZm9yZVF1
aXJrKGNvbnN0IFJlbmRlckJveCYgY2hpbGQpIGNvbnN0OwogICAgIGJvb2wgaGFzTWFyZ2luQWZ0
ZXJRdWlyayhjb25zdCBSZW5kZXJCb3gmIGNoaWxkKSBjb25zdDsKIAotICAgIGJvb2wgZ2VuZXJh
dGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0Kik7Ci0KICAgICB2b2lkIG1h
cmtQb3NpdGlvbmVkT2JqZWN0c0ZvckxheW91dCgpOwogICAgIHZvaWQgbWFya0ZvclBhZ2luYXRp
b25SZWxheW91dElmTmVlZGVkKCkgb3ZlcnJpZGU7CiAgICAgCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNwcAkocmV2aXNpb24gMjQ4NTAwKQorKysg
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZW5k
ZXJCbG9ja0Zsb3cuaCIKIAorI2luY2x1ZGUgIkNvbXBsZXhMaW5lTGF5b3V0LmgiCiAjaW5jbHVk
ZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRmxvYXRpbmdPYmplY3RzLmgiCiAjaW5jbHVkZSAiRnJh
bWUuaCIKQEAgLTExMCw2ICsxMTEsNyBAQCBSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJsb2NrRmxv
dyhFbGVtZW50CiAgICAgLCBtX3dpZHRoRm9yVGV4dEF1dG9zaXppbmcoLTEpCiAgICAgLCBtX2xp
bmVDb3VudEZvclRleHRBdXRvc2l6aW5nKE5PVF9TRVQpCiAjZW5kaWYKKyAgICAsIG1fY29tcGxl
eExpbmVMYXlvdXQoKnRoaXMpCiB7CiAgICAgc2V0Q2hpbGRyZW5JbmxpbmUodHJ1ZSk7CiB9CkBA
IC0xMjAsNiArMTIyLDcgQEAgUmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3coRG9jdW1l
bgogICAgICwgbV93aWR0aEZvclRleHRBdXRvc2l6aW5nKC0xKQogICAgICwgbV9saW5lQ291bnRG
b3JUZXh0QXV0b3NpemluZyhOT1RfU0VUKQogI2VuZGlmCisgICAgLCBtX2NvbXBsZXhMaW5lTGF5
b3V0KCp0aGlzKQogewogICAgIHNldENoaWxkcmVuSW5saW5lKHRydWUpOwogfQpAQCAtMTUxLDcg
KzE1NCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp3aWxsQmVEZXN0cm95ZWQoKQogICAgICAg
ICAgICAgcGFyZW50KCktPmRpcnR5TGluZXNGcm9tQ2hhbmdlZENoaWxkKCp0aGlzKTsKICAgICB9
CiAKLSAgICBtX2xpbmVCb3hlcy5kZWxldGVMaW5lQm94ZXMoKTsKKyAgICBsaW5lQm94ZXMoKS5k
ZWxldGVMaW5lQm94ZXMoKTsKIAogICAgIGJsb2NrV2lsbEJlRGVzdHJveWVkKCk7CiAKQEAgLTY3
NCw3ICs2NzcsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0SW5saW5lQ2hpbGRyCiAg
ICAgfQogCiAgICAgbV9zaW1wbGVMaW5lTGF5b3V0ID0gbnVsbHB0cjsKLSAgICBsYXlvdXRMaW5l
Qm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2Fs
Qm90dG9tKTsKKyAgICBjb21wbGV4TGluZUxheW91dCgpLmxheW91dExpbmVCb3hlcyhyZWxheW91
dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20pOwogfQog
CiB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGlsZChSZW5kZXJCb3gmIGNoaWxk
LCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBMYXlvdXRVbml0JiBwcmV2aW91c0Zsb2F0TG9naWNh
bEJvdHRvbSwgTGF5b3V0VW5pdCYgbWF4RmxvYXRMb2dpY2FsQm90dG9tKQpAQCAtODk2LDcgKzg5
OSw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGp1c3RGbG9hdGluZ0Jsb2MKIHZvaWQgUmVu
ZGVyQmxvY2tGbG93Ojp1cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKFJlbmRlckJv
eCYgY2hpbGQsIExheW91dFVuaXQgbG9naWNhbFRvcCwgSW5kZW50VGV4dE9yTm90IHNob3VsZElu
ZGVudFRleHQpCiB7CiAgICAgaWYgKGNoaWxkLnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxp
bmVUeXBlKCkpCi0gICAgICAgIHNldFN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQoY2hpbGQs
IGxvZ2ljYWxUb3AsIHN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUobG9naWNhbFRvcCwgc2hvdWxk
SW5kZW50VGV4dCkpOworICAgICAgICBzZXRTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGNo
aWxkLCBsb2dpY2FsVG9wLCBjb21wbGV4TGluZUxheW91dCgpLnN0YXJ0QWxpZ25lZE9mZnNldEZv
ckxpbmUobG9naWNhbFRvcCwgc2hvdWxkSW5kZW50VGV4dCkpOwogICAgIGVsc2UKICAgICAgICAg
c2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcCwgc3RhcnRP
ZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3ApKTsKIH0KQEAgLTIwNjQsMTAgKzIwNjcsMTAgQEAg
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUxpbmVzKCkKICAgICAgICAgbV9mbG9hdGluZ09i
amVjdHMtPmNsZWFyTGluZUJveFRyZWVQb2ludGVycygpOwogCiAgICAgaWYgKG1fc2ltcGxlTGlu
ZUxheW91dCkgewotICAgICAgICBBU1NFUlQoIW1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpKTsK
KyAgICAgICAgQVNTRVJUKCFsaW5lQm94ZXMoKS5maXJzdExpbmVCb3goKSk7CiAgICAgICAgIG1f
c2ltcGxlTGluZUxheW91dCA9IG51bGxwdHI7CiAgICAgfSBlbHNlCi0gICAgICAgIG1fbGluZUJv
eGVzLmRlbGV0ZUxpbmVCb3hUcmVlKCk7CisgICAgICAgIGxpbmVCb3hlcygpLmRlbGV0ZUxpbmVC
b3hUcmVlKCk7CiAKICAgICBSZW5kZXJCbG9jazo6ZGVsZXRlTGluZXMoKTsKIH0KQEAgLTI5MDQs
NyArMjkwNywxOCBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6aGl0VGVzdElubGluZUNoaWxkCiAg
ICAgaWYgKGF1dG8gc2ltcGxlTGluZUxheW91dCA9IHRoaXMtPnNpbXBsZUxpbmVMYXlvdXQoKSkK
ICAgICAgICAgcmV0dXJuIFNpbXBsZUxpbmVMYXlvdXQ6OmhpdFRlc3RGbG93KCp0aGlzLCAqc2lt
cGxlTGluZUxheW91dCwgcmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLCBhY2N1
bXVsYXRlZE9mZnNldCwgaGl0VGVzdEFjdGlvbik7CiAKLSAgICByZXR1cm4gbV9saW5lQm94ZXMu
aGl0VGVzdCh0aGlzLCByZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIsIGFjY3Vt
dWxhdGVkT2Zmc2V0LCBoaXRUZXN0QWN0aW9uKTsKKyAgICByZXR1cm4gbGluZUJveGVzKCkuaGl0
VGVzdCh0aGlzLCByZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIsIGFjY3VtdWxh
dGVkT2Zmc2V0LCBoaXRUZXN0QWN0aW9uKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFk
ZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKK3sKKyAgICBpZiAoYXV0byBzaW1wbGVMaW5l
TGF5b3V0ID0gdGhpcy0+c2ltcGxlTGluZUxheW91dCgpKSB7CisgICAgICAgIEFTU0VSVCghaGFz
T3ZlcmZsb3dDbGlwKCkpOworICAgICAgICBTaW1wbGVMaW5lTGF5b3V0Ojpjb2xsZWN0Rmxvd092
ZXJmbG93KCp0aGlzLCAqc2ltcGxlTGluZUxheW91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBjb21wbGV4TGluZUxheW91dCgpLmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVu
KCk7CiB9CiAKIHZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGp1c3RGb3JCb3JkZXJGaXQoTGF5b3V0
VW5pdCB4LCBMYXlvdXRVbml0JiBsZWZ0LCBMYXlvdXRVbml0JiByaWdodCkgY29uc3QKQEAgLTM0
ODYsNyArMzUwMCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpwYWludElubGluZUNoaWxkcmUK
ICAgICAgICAgU2ltcGxlTGluZUxheW91dDo6cGFpbnRGbG93KCp0aGlzLCAqc2ltcGxlTGluZUxh
eW91dCwgcGFpbnRJbmZvLCBwYWludE9mZnNldCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0g
ICAgbV9saW5lQm94ZXMucGFpbnQodGhpcywgcGFpbnRJbmZvLCBwYWludE9mZnNldCk7CisgICAg
bGluZUJveGVzKCkucGFpbnQodGhpcywgcGFpbnRJbmZvLCBwYWludE9mZnNldCk7CiB9CiAKIGJv
b2wgUmVuZGVyQmxvY2tGbG93OjpyZWxheW91dEZvclBhZ2luYXRpb24oKQpAQCAtMzU4MSw3ICsz
NTk1LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFNpbXBsZUxpbmVzKAogICAgIH0K
ICAgICBmb3IgKGF1dG8mIHJlbmRlcmVyIDogY2hpbGRyZW5PZlR5cGU8UmVuZGVyT2JqZWN0Pigq
dGhpcykpCiAgICAgICAgIHJlbmRlcmVyLmNsZWFyTmVlZHNMYXlvdXQoKTsKLSAgICBBU1NFUlQo
IW1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpKTsKKyAgICBBU1NFUlQoIWxpbmVCb3hlcygpLmZp
cnN0TGluZUJveCgpKTsKICAgICBMYXlvdXRVbml0IGxpbmVMYXlvdXRIZWlnaHQgPSBTaW1wbGVM
aW5lTGF5b3V0Ojpjb21wdXRlRmxvd0hlaWdodCgqdGhpcywgKm1fc2ltcGxlTGluZUxheW91dCk7
CiAgICAgTGF5b3V0VW5pdCBsaW5lTGF5b3V0VG9wID0gYm9yZGVyQW5kUGFkZGluZ0JlZm9yZSgp
OwogICAgIHJlcGFpbnRMb2dpY2FsVG9wID0gbGluZUxheW91dFRvcDsKQEAgLTM2MjcsMTQgKzM2
NDEsMTQgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmVuc3VyZUxpbmVCb3hlcygpCiAgICAgTGF5
b3V0VW5pdCByZXBhaW50TG9naWNhbEJvdHRvbTsKICAgICBpZiAoaXNQYWdpbmF0ZWQpIHsKICAg
ICAgICAgUGFnaW5hdGVkTGF5b3V0U3RhdGVNYWludGFpbmVyIHN0YXRlKCp0aGlzKTsKLSAgICAg
ICAgbGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJlcGFpbnRMb2dpY2FsVG9wLCBy
ZXBhaW50TG9naWNhbEJvdHRvbSk7CisgICAgICAgIGNvbXBsZXhMaW5lTGF5b3V0KCkubGF5b3V0
TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJlcGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9n
aWNhbEJvdHRvbSk7CiAgICAgICAgIC8vIFRoaXMgbWF0Y2hlcyByZWxheW91dFRvQXZvaWRXaWRv
d3MuCiAgICAgICAgIGlmIChzaG91bGRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKQotICAgICAg
ICAgICAgbGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJlcGFpbnRMb2dpY2FsVG9w
LCByZXBhaW50TG9naWNhbEJvdHRvbSk7CisgICAgICAgICAgICBjb21wbGV4TGluZUxheW91dCgp
LmxheW91dExpbmVCb3hlcyhyZWxheW91dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwgcmVw
YWludExvZ2ljYWxCb3R0b20pOwogICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBuZWVkZWQgYXMg
bG9uZyBhcyBzaW1wbGUgYW5kIG5vcm1hbCBsaW5lIGxheW91dCBwcm9kdWNlIGRpZmZlcmVudCBs
aW5lIGJyZWFraW5ncy4KICAgICAgICAgcmVwYWludCgpOwogICAgIH0gZWxzZQotICAgICAgICBs
YXlvdXRMaW5lQm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFp
bnRMb2dpY2FsQm90dG9tKTsKKyAgICAgICAgY29tcGxleExpbmVMYXlvdXQoKS5sYXlvdXRMaW5l
Qm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2Fs
Qm90dG9tKTsKIAogICAgIHVwZGF0ZUxvZ2ljYWxIZWlnaHQoKTsKICAgICBBU1NFUlQoZGlkTmVl
ZExheW91dCB8fCBsb2dpY2FsSGVpZ2h0KCkgPT0gb2xkSGVpZ2h0KTsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDI0ODUwMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5
KQpAQCAtMjIsNiArMjIsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgIkNvbXBsZXhM
aW5lTGF5b3V0LmgiCiAjaW5jbHVkZSAiRmxvYXRpbmdPYmplY3RzLmgiCiAjaW5jbHVkZSAiTGlu
ZVdpZHRoLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKQEAgLTMyLDE3ICszMywxMCBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEZsb2F0V2l0aFJlY3Q7CiBjbGFzcyBMaW5l
QnJlYWtlcjsKLWNsYXNzIExpbmVJbmZvOwogY2xhc3MgUmVuZGVyTXVsdGlDb2x1bW5GbG93Owog
Y2xhc3MgUmVuZGVyUnVieVJ1bjsKIAotc3RydWN0IFdvcmRNZWFzdXJlbWVudDsKLQotdGVtcGxh
dGUgPGNsYXNzIFJ1bj4gY2xhc3MgQmlkaVJ1bkxpc3Q7Ci10eXBlZGVmIFZlY3RvcjxXb3JkTWVh
c3VyZW1lbnQsIDY0PiBXb3JkTWVhc3VyZW1lbnRzOwotCiAjaWYgRU5BQkxFKFRFWFRfQVVUT1NJ
WklORykKIGVudW0gTGluZUNvdW50IHsKICAgICBOT1RfU0VUID0gMCwgTk9fTElORSA9IDEsIE9O
RV9MSU5FID0gMiwgTVVMVElfTElORSA9IDMKQEAgLTMzMiwxMSArMzI2LDExIEBAIHB1YmxpYzoK
IAogICAgIExheW91dFBvaW50IGZsaXBGbG9hdEZvcldyaXRpbmdNb2RlRm9yQ2hpbGQoY29uc3Qg
RmxvYXRpbmdPYmplY3QmLCBjb25zdCBMYXlvdXRQb2ludCYpIGNvbnN0OwogCi0gICAgUmVuZGVy
TGluZUJveExpc3QmIGxpbmVCb3hlcygpIHsgcmV0dXJuIG1fbGluZUJveGVzOyB9Ci0gICAgY29u
c3QgUmVuZGVyTGluZUJveExpc3QmIGxpbmVCb3hlcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJv
eGVzOyB9CisgICAgUmVuZGVyTGluZUJveExpc3QmIGxpbmVCb3hlcygpIHsgcmV0dXJuIG1fY29t
cGxleExpbmVMYXlvdXQubGluZUJveGVzKCk7IH0KKyAgICBjb25zdCBSZW5kZXJMaW5lQm94TGlz
dCYgbGluZUJveGVzKCkgY29uc3QgeyByZXR1cm4gbV9jb21wbGV4TGluZUxheW91dC5saW5lQm94
ZXMoKTsgfQogCi0gICAgUm9vdElubGluZUJveCogZmlyc3RSb290Qm94KCkgY29uc3QgeyByZXR1
cm4gZG93bmNhc3Q8Um9vdElubGluZUJveD4obV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCkpOyB9
Ci0gICAgUm9vdElubGluZUJveCogbGFzdFJvb3RCb3goKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxSb290SW5saW5lQm94PihtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpKTsgfQorICAgIFJvb3RJ
bmxpbmVCb3gqIGZpcnN0Um9vdEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcGxleExpbmVMYXlv
dXQuZmlyc3RSb290Qm94KCk7IH0KKyAgICBSb290SW5saW5lQm94KiBsYXN0Um9vdEJveCgpIGNv
bnN0IHsgcmV0dXJuIG1fY29tcGxleExpbmVMYXlvdXQubGFzdFJvb3RCb3goKTsgfQogCiAgICAg
Ym9vbCBoYXNMaW5lcygpIGNvbnN0OwogICAgIHZvaWQgaW52YWxpZGF0ZUxpbmVMYXlvdXRQYXRo
KCkgZmluYWw7CkBAIC00ODQsOCArNDc4LDggQEAgcHJpdmF0ZToKICAgICAvLyBDYWxsZWQgZnJv
bSBsaW5lV2lkdGgsIHRvIHBvc2l0aW9uIHRoZSBmbG9hdHMgYWRkZWQgaW4gdGhlIGxhc3QgbGlu
ZS4KICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgaXQgaGFzIHBvc2l0aW9uZWQg
YW55IGZsb2F0cy4KICAgICBib29sIHBvc2l0aW9uTmV3RmxvYXRzKCk7Ci0KICAgICB2b2lkIGNs
ZWFyRmxvYXRzKENsZWFyKTsKKyAgICBGbG9hdGluZ09iamVjdHMqIGZsb2F0aW5nT2JqZWN0cygp
IHsgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLmdldCgpOyB9CiAKICAgICBMYXlvdXRVbml0IGxv
Z2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91
dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQgbG9naWNhbEhlaWdodCkgY29uc3Qgb3ZlcnJp
ZGU7CiAgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRV
bml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQgbG9naWNh
bEhlaWdodCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC01MjMsNjMgKzUxNywxNyBAQCBwcml2YXRlOgog
ICAgIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50V2l0aElubGluZUNoaWxkcmVuKGNv
bnN0IExheW91dFBvaW50JiBwb2ludEluTG9naWNhbENvbnRlbnRzLCBjb25zdCBSZW5kZXJGcmFn
bWVudENvbnRhaW5lciopIG92ZXJyaWRlOwogICAgIHZvaWQgYWRkRm9jdXNSaW5nUmVjdHNGb3JJ
bmxpbmVDaGlsZHJlbihWZWN0b3I8TGF5b3V0UmVjdD4mIHJlY3RzLCBjb25zdCBMYXlvdXRQb2lu
dCYgYWRkaXRpb25hbE9mZnNldCwgY29uc3QgUmVuZGVyTGF5ZXJNb2RlbE9iamVjdCopIG92ZXJy
aWRlOwogCi0vLyBGSVhNRS1CTE9DS0ZMT1c6IFRoZXNlIG1ldGhvZHMgaGF2ZSBpbXBsZW1lbnRh
dGlvbnMgaW4KLS8vIFJlbmRlckJsb2NrTGluZUxheW91dC4gVGhleSBzaG91bGQgYmUgbW92ZWQg
dG8gdGhlIHByb3BlciBoZWFkZXIgb25jZSB0aGUKLS8vIGxpbmUgbGF5b3V0IGNvZGUgaXMgc2Vw
YXJhdGVkIGZyb20gUmVuZGVyQmxvY2sgYW5kIFJlbmRlckJsb2NrRmxvdy4KLS8vIFNUQVJUIE1F
VEhPRFMgREVGSU5FRCBJTiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQKIHB1YmxpYzoKLSAgICBzdGF0
aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+KiwgaW50IHN0
YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKLSAgICBS
b290SW5saW5lQm94KiBjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7CisgICAgQ29tcGxl
eExpbmVMYXlvdXQmIGNvbXBsZXhMaW5lTGF5b3V0KCkgeyByZXR1cm4gbV9jb21wbGV4TGluZUxh
eW91dDsgfQogCi0gICAgTGF5b3V0VW5pdCBzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91
dFVuaXQgcG9zaXRpb24sIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KTsKLSAgICB2
aXJ0dWFsIFRleHRBbGlnbk1vZGUgdGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNv
ZnRCcmVhaykgY29uc3Q7CisgICAgdmlydHVhbCBPcHRpb25hbDxUZXh0QWxpZ25Nb2RlPiBvdmVy
cmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgLyogZW5kc1dpdGhTb2Z0QnJlYWsgKi8pIGNv
bnN0IHsgcmV0dXJuIHsgfTsgfQogICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RJbmxpbmVEaXJlY3Rp
b25MaW5lQm91bmRzKGludCAvKiBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ICovLCBmbG9hdCYg
LyogbG9naWNhbExlZnQgKi8sIGZsb2F0JiAvKiBsb2dpY2FsV2lkdGggKi8pIGNvbnN0IHsgfQot
ICAgIFJvb3RJbmxpbmVCb3gqIGNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBj
b25zdCBMaW5lSW5mbyYpOwogCi1wcml2YXRlOiAgICAgICAgCi0gICAgdm9pZCBhZGp1c3RJbnRy
aW5zaWNMb2dpY2FsV2lkdGhzRm9yQ29sdW1ucyhMYXlvdXRVbml0JiBtaW5Mb2dpY2FsV2lkdGgs
IExheW91dFVuaXQmIG1heExvZ2ljYWxXaWR0aCkgY29uc3Q7Ci0KLSAgICB2b2lkIGxheW91dExp
bmVCb3hlcyhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2Fs
VG9wLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbEJvdHRvbSk7Citwcml2YXRlOgogICAgIHZv
aWQgbGF5b3V0U2ltcGxlTGluZXMoYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiBy
ZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxCb3R0b20pOwogCi0g
ICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Um9vdElubGluZUJveD4gY3JlYXRlUm9vdElubGlu
ZUJveCgpOyAvLyBTdWJjbGFzc2VkIGJ5IFJlbmRlclNWR1RleHQuCi0gICAgSW5saW5lRmxvd0Jv
eCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJiwgSW5saW5l
Qm94KiBjaGlsZEJveCk7Ci0gICAgdm9pZCBzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiwg
UmVuZGVyUnVieVJ1biYsIFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJik7Ci0gICAgdm9p
ZCBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94Kiwg
Y29uc3QgTGluZUluZm8mLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFj
ZVJ1biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYs
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKLSAgICB2b2lkIHVw
ZGF0ZVJ1YnlGb3JKdXN0aWZpZWRUZXh0KFJlbmRlclJ1YnlSdW4mLCBCaWRpUnVuJiwgY29uc3Qg
VmVjdG9yPHVuc2lnbmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBl
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgc2l6ZV90JiBleHBhbnNpb25JbmRleCk7Ci0gICAgdm9p
ZCBjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dChCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgY29uc3QgVmVjdG9yPHVuc2lnbmVkLCAxNj4mIGV4cGFu
c2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZs
b2F0IHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotICAg
IEJpZGlSdW4qIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJ
bmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIFRleHRBbGlnbk1vZGUsIGZsb2F0JiBsb2dpY2Fs
TGVmdCwKLSAgICAgICAgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmly
c3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFj
a0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1l
YXN1cmVtZW50cyYpOwotICAgIHZvaWQgY29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25zRm9y
TGluZShSb290SW5saW5lQm94KiwgQmlkaVJ1biosIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0Zv
bnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJik7Ci0gICAgQmlkaVJ1biogaGFuZGxlVHJh
aWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBCaWRpQ29udGV4dCopOwotICAgIHZv
aWQgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0Jik7Ci0gICAg
Ly8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCi0gICAgUm9vdElu
bGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKHVuc2lnbmVkIGJpZGlMZXZlbCwg
QmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5m
byYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdv
cmRNZWFzdXJlbWVudHMmKTsKLSAgICB2b2lkIGxheW91dFJ1bnNBbmRGbG9hdHMoTGluZUxheW91
dFN0YXRlJiwgYm9vbCBoYXNJbmxpbmVDaGlsZCk7Ci0gICAgY29uc3QgSW5saW5lSXRlcmF0b3Im
IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxI
ZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCAgY29uc3QgSW5saW5l
SXRlcmF0b3ImKTsKLSAgICB2b2lkIGxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlv
dXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVh
bkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWdu
ZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOwotICAgIHZvaWQgcmVhdHRhY2hDbGVhbkxp
bmVGbG9hdHMoUm9vdElubGluZUJveCYgY2xlYW5MaW5lLCBMYXlvdXRVbml0IGRlbHRhLCBib29s
IGlzRmlyc3RDbGVhbkxpbmUpOwotICAgIHZvaWQgbGlua1RvRW5kTGluZUlmTmVlZGVkKExpbmVM
YXlvdXRTdGF0ZSYpOwotICAgIHZvaWQgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxpbmVC
b3gmIGNsZWFuTGluZSwgUmVuZGVyQm94JiBmbG9hdEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdpdGhS
ZWN0JiBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QsCi0gICAgICAgIGJvb2wmIGVuY291bnRlcmVkTmV3
RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZsb2F0KTsKLSAgICBSb290SW5saW5lQm94KiBkZXRlcm1p
bmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYpOwot
ICAgIHZvaWQgZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiwgUm9vdElubGlu
ZUJveCogc3RhcnRCb3gsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0YXR1
cyYgY2xlYW5MaW5lQmlkaVN0YXR1cyk7Ci0gICAgYm9vbCBjaGVja1BhZ2luYXRpb25BbmRGbG9h
dHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJik7Ci0gICAgYm9vbCBtYXRjaGVkRW5kTGluZShM
aW5lTGF5b3V0U3RhdGUmLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBlbmRMaW5lU3RhdHVzKTsK
LSAgICB2b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7Ci0gICAgdm9pZCBjaGVja0xpbmVz
Rm9yVGV4dE92ZXJmbG93KCk7Ci0gICAgLy8gUG9zaXRpb25zIG5ldyBmbG9hdHMgYW5kIGFsc28g
YWRqdXN0IGFsbCBmbG9hdHMgZW5jb3VudGVyZWQgb24gdGhlIGxpbmUgaWYgYW55IG9mIHRoZW0K
LSAgICAvLyBoYXZlIHRvIG1vdmUgdG8gdGhlIG5leHQgcGFnZS9jb2x1bW4uCi0gICAgYm9vbCBw
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKGNvbnN0IEZsb2F0aW5nT2JqZWN0JiBuZXdGbG9hdCwgRmxv
YXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVJbmZvJiwgTGluZVdp
ZHRoJik7Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdGVzdCBhIGxpbmUgYm94
IHRoYXQgaGFzIG1vdmVkIGluIHRoZSBibG9jayBkaXJlY3Rpb24gdG8gc2VlIGlmIGl0IGhhcyBl
bmRlZCB1cCBpbiBhIG5ldwotICAgIC8vIHBhZ2UvY29sdW1uIHRoYXQgaGFzIGEgZGlmZmVyZW50
IGF2YWlsYWJsZSBsaW5lIHdpZHRoIHRoYW4gdGhlIG9sZCBvbmUuIFVzZWQgdG8ga25vdyB3aGVu
IHlvdSBoYXZlIHRvIGRpcnR5IGEKLSAgICAvLyBsaW5lLCBpLmUuLCB0aGF0IGl0IGNhbid0IGJl
IHJlLXVzZWQuCi0gICAgYm9vbCBsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChSb290
SW5saW5lQm94KiwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRlckZyYWdtZW50ZWRGbG93Kikg
Y29uc3Q7Ci0gICAgdm9pZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQoY29uc3QgVGV4
dEFsaWduTW9kZSYsIGNvbnN0IFJvb3RJbmxpbmVCb3gqLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNl
UnVuLCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQm
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaW50IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwot
Ly8gRU5EIE1FVEhPRFMgREVGSU5FRCBJTiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQKLQorICAgIHZv
aWQgYWRqdXN0SW50cmluc2ljTG9naWNhbFdpZHRoc0ZvckNvbHVtbnMoTGF5b3V0VW5pdCYgbWlu
TG9naWNhbFdpZHRoLCBMYXlvdXRVbml0JiBtYXhMb2dpY2FsV2lkdGgpIGNvbnN0OwogICAgIHZv
aWQgY29tcHV0ZUlubGluZVByZWZlcnJlZExvZ2ljYWxXaWR0aHMoTGF5b3V0VW5pdCYgbWluTG9n
aWNhbFdpZHRoLCBMYXlvdXRVbml0JiBtYXhMb2dpY2FsV2lkdGgpIGNvbnN0OwotCiAgICAgdm9p
ZCBhZGp1c3RJbml0aWFsTGV0dGVyUG9zaXRpb24oUmVuZGVyQm94JiBjaGlsZEJveCwgTGF5b3V0
VW5pdCYgbG9naWNhbFRvcE9mZnNldCwgTGF5b3V0VW5pdCYgbWFyZ2luQmVmb3JlT2Zmc2V0KTsK
IAogI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCkBAIC01ODgsMTIgKzUzNiw5IEBAIHByaXZh
dGU6ICAgICAgICAKICNlbmRpZgogICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9u
U3RhdGUpIGZpbmFsOwogCi0gICAgdm9pZCByZW1vdmVJbmxpbmVCb3goQmlkaVJ1biYsIGNvbnN0
IFJvb3RJbmxpbmVCb3gmKSBjb25zdDsKLQogcHVibGljOgogICAgIC8vIEZJWE1FLUJMT0NLRkxP
VzogVGhlc2UgY2FuIGJlIG1hZGUgcHJvdGVjdGVkIGFnYWluIG9uY2UgYWxsIGNhbGxlcnMgaGF2
ZSBiZWVuIG1vdmVkIGhlcmUuCiAgICAgdm9pZCBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0
aW9uKFJvb3RJbmxpbmVCb3gqLCBMYXlvdXRVbml0JiBkZWx0YU9mZnNldCwgYm9vbCYgb3ZlcmZs
b3dzRnJhZ21lbnQsIFJlbmRlckZyYWdtZW50ZWRGbG93Kik7IC8vIENvbXB1dGVzIGEgZGVsdGFP
ZmZzZXQgdmFsdWUgdGhhdCBwdXQgYSBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZSBp
ZiBpdCBkb2Vzbid0IGZpdCBvbiB0aGUgY3VycmVudCBwYWdlLgotICAgIHZvaWQgdXBkYXRlRnJh
Z21lbnRGb3JMaW5lKFJvb3RJbmxpbmVCb3gqKSBjb25zdDsKIAogICAgIC8vIFBhZ2luYXRpb24g
cm91dGluZXMuCiAgICAgYm9vbCByZWxheW91dEZvclBhZ2luYXRpb24oKTsKQEAgLTYxNiwxMSAr
NTYxLDE0IEBAIHB1YmxpYzoKIHByb3RlY3RlZDoKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RmxvYXRp
bmdPYmplY3RzPiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVy
QmxvY2tGbG93UmFyZURhdGE+IG1fcmFyZUJsb2NrRmxvd0RhdGE7Ci0gICAgUmVuZGVyTGluZUJv
eExpc3QgbV9saW5lQm94ZXM7CisKKyAgICAvLyBGSVhNRTogT25seSBvbmUgb2YgdGhlc2Ugc2hv
dWxkIGJlIG5lZWRlZCBhdCBhbnkgZ2l2ZW4gdGltZS4KKyAgICBDb21wbGV4TGluZUxheW91dCBt
X2NvbXBsZXhMaW5lTGF5b3V0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTaW1wbGVMaW5lTGF5b3V0
OjpMYXlvdXQ+IG1fc2ltcGxlTGluZUxheW91dDsKIAogICAgIGZyaWVuZCBjbGFzcyBMaW5lQnJl
YWtlcjsKICAgICBmcmllbmQgY2xhc3MgTGluZVdpZHRoOyAvLyBOZWVkcyB0byBrbm93IEZsb2F0
aW5nT2JqZWN0CisgICAgZnJpZW5kIGNsYXNzIENvbXBsZXhMaW5lTGF5b3V0OwogfTsKIAogaW5s
aW5lIGNvbnN0IFNpbXBsZUxpbmVMYXlvdXQ6OkxheW91dCogUmVuZGVyQmxvY2tGbG93OjpzaW1w
bGVMaW5lTGF5b3V0KCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkobm9uZXhpc3Rl
bnQpCkBAIC0xLDIyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJzIEtu
b2xsIChrbm9sbEBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2LCAy
MDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVk
LgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdtYWlsLmNv
bT4KLSAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJpZ2h0IHJl
c2VydmVkLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
LSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiQVhPYmplY3RDYWNo
ZS5oIgotI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgotI2luY2x1ZGUgIkJyZWFraW5nQ29udGV4
dC5oIgotI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgotI2luY2x1ZGUgIkhUTUxQYXJzZXJJ
ZGlvbXMuaCIKLSNpbmNsdWRlICJJbmxpbmVFbGVtZW50Qm94LmgiCi0jaW5jbHVkZSAiSW5saW5l
SXRlcmF0b3IuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiSW5saW5l
VGV4dEJveFN0eWxlLmgiCi0jaW5jbHVkZSAiTGluZUxheW91dFN0YXRlLmgiCi0jaW5jbHVkZSAi
TG9nZ2luZy5oIgotI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgotI2luY2x1ZGUgIlJlbmRl
ckZyYWdtZW50Q29udGFpbmVyLmgiCi0jaW5jbHVkZSAiUmVuZGVyRnJhZ21lbnRlZEZsb3cuaCIK
LSNpbmNsdWRlICJSZW5kZXJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIlJlbmRlckxpbmVCcmVh
ay5oIgotI2luY2x1ZGUgIlJlbmRlclJ1YnlCYXNlLmgiCi0jaW5jbHVkZSAiUmVuZGVyUnVieVRl
eHQuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiU1ZHUm9vdElubGluZUJv
eC5oIgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiU2ltcGxlTGluZUxheW91dEZ1
bmN0aW9ucy5oIgotI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oIgotI2lu
Y2x1ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgotI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1zdGF0aWMgdm9pZCBkZXRlcm1pbmVEaXJl
Y3Rpb25hbGl0eShUZXh0RGlyZWN0aW9uJiBkaXIsIElubGluZUl0ZXJhdG9yIGl0ZXIpCi17Ci0g
ICAgd2hpbGUgKCFpdGVyLmF0RW5kKCkpIHsKLSAgICAgICAgaWYgKGl0ZXIuYXRQYXJhZ3JhcGhT
ZXBhcmF0b3IoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKFVDaGFyIGN1cnJl
bnQgPSBpdGVyLmN1cnJlbnQoKSkgewotICAgICAgICAgICAgVUNoYXJEaXJlY3Rpb24gY2hhckRp
cmVjdGlvbiA9IHVfY2hhckRpcmVjdGlvbihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChjaGFy
RGlyZWN0aW9uID09IFVfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgIGRpciA9IFRl
eHREaXJlY3Rpb246OkxUUjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiAoY2hhckRpcmVjdGlvbiA9PSBVX1JJR0hUX1RPX0xFRlQgfHwgY2hh
ckRpcmVjdGlvbiA9PSBVX1JJR0hUX1RPX0xFRlRfQVJBQklDKSB7Ci0gICAgICAgICAgICAgICAg
ZGlyID0gVGV4dERpcmVjdGlvbjo6UlRMOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpdGVyLmluY3JlbWVudCgpOwotICAgIH0KLX0K
LQotaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxCaWRpUnVuPiBjcmVhdGVSdW4oaW50IHN0YXJ0LCBp
bnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikK
LXsKLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihzdGFydCwgZW5kLCBvYmos
IHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIuZGlyKCkpOwotfQotCi12b2lkIFJlbmRlckJs
b2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiogcnVucywg
aW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlcikKLXsKLSAgICBpZiAoc3RhcnQgPiBlbmQgfHwgc2hvdWxkU2tpcENyZWF0aW5n
UnVuc0Zvck9iamVjdChvYmopKQotICAgICAgICByZXR1cm47Ci0KLSAgICBMaW5lV2hpdGVzcGFj
ZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUgPSByZXNvbHZl
ci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7Ci0gICAgYm9vbCBoYXZlTmV4dFRyYW5zaXRp
b24gPSAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuY3VycmVudFRyYW5zaXRpb24oKSA8
IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLm51bVRyYW5zaXRpb25zKCkpOwotICAgIElu
bGluZUl0ZXJhdG9yIG5leHRUcmFuc2l0aW9uOwotICAgIGlmIChoYXZlTmV4dFRyYW5zaXRpb24p
Ci0gICAgICAgIG5leHRUcmFuc2l0aW9uID0gbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUu
dHJhbnNpdGlvbnMoKVtsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5jdXJyZW50VHJhbnNp
dGlvbigpXTsKLSAgICBpZiAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuYmV0d2VlblRy
YW5zaXRpb25zKCkpIHsKLSAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5zaXRpb24gfHwgKCZvYmog
IT0gbmV4dFRyYW5zaXRpb24ucmVuZGVyZXIoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIC8vIFRoaXMgaXMgYSBuZXcgc3RhcnQgcG9pbnQuIFN0b3AgaWdub3Jpbmcgb2JqZWN0cyBh
bmQKLSAgICAgICAgLy8gYWRqdXN0IG91ciBzdGFydC4KLSAgICAgICAgc3RhcnQgPSBuZXh0VHJh
bnNpdGlvbi5vZmZzZXQoKTsKLSAgICAgICAgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUu
aW5jcmVtZW50Q3VycmVudFRyYW5zaXRpb24oKTsKLSAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7
Ci0gICAgICAgICAgICBhcHBlbmRSdW5zRm9yT2JqZWN0KHJ1bnMsIHN0YXJ0LCBlbmQsIG9iaiwg
cmVzb2x2ZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5zaXRpb24gfHwgKCZvYmogIT0gbmV4dFRyYW5zaXRp
b24ucmVuZGVyZXIoKSkpIHsKLSAgICAgICAgICAgIGlmIChydW5zKQotICAgICAgICAgICAgICAg
IHJ1bnMtPmFwcGVuZFJ1bihjcmVhdGVSdW4oc3RhcnQsIGVuZCwgb2JqLCByZXNvbHZlcikpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQW4gZW5kIHRyYW5z
aXRpb24gaGFzIGJlZW4gZW5jb3VudGVyZWQgd2l0aGluIG91ciBvYmplY3QuIFdlIG5lZWQgdG8g
YXBwZW5kIGEgcnVuIHdpdGggb3VyIGVuZHBvaW50LgotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8
aW50PihuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEpIDw9IGVuZCkgewotICAgICAgICAgICAg
bGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuaW5jcmVtZW50Q3VycmVudFRyYW5zaXRpb24o
KTsKLSAgICAgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgYmVmb3JlIHRoZSBvYmpl
Y3Qgd2UncmUgaW5zcGVjdGluZy4gU2tpcCBldmVyeXRoaW5nIGFuZCByZXR1cm4KLSAgICAgICAg
ICAgIGlmIChuZXh0VHJhbnNpdGlvbi5yZWZlcnNUb0VuZE9mUHJldmlvdXNOb2RlKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4obmV4
dFRyYW5zaXRpb24ub2Zmc2V0KCkgKyAxKSA+IHN0YXJ0ICYmIHJ1bnMpCi0gICAgICAgICAgICAg
ICAgcnVucy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgbmV4dFRyYW5zaXRpb24ub2Zmc2V0
KCkgKyAxLCBvYmosIHJlc29sdmVyKSk7Ci0gICAgICAgICAgICBhcHBlbmRSdW5zRm9yT2JqZWN0
KHJ1bnMsIG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSwgZW5kLCBvYmosIHJlc29sdmVyKTsK
LSAgICAgICAgfSBlbHNlIGlmIChydW5zKQotICAgICAgICAgICAgcnVucy0+YXBwZW5kUnVuKGNy
ZWF0ZVJ1bihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyKSk7Ci0gICAgfQotfQotCi1zdGQ6OnVu
aXF1ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVSb290SW5saW5l
Qm94KCkKLXsKLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSb290SW5saW5lQm94PigqdGhp
cyk7Ci19Ci0KLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlQW5kQXBwZW5k
Um9vdElubGluZUJveCgpCi17Ci0gICAgYXV0byBuZXdSb290Qm94ID0gY3JlYXRlUm9vdElubGlu
ZUJveCgpOwotICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBuZXdSb290Qm94LmdldCgpOwot
ICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdSb290Qm94KSk7Ci0KLSAg
ICBpZiAoVU5MSUtFTFkoQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgJiYg
Zmlyc3RSb290Qm94KCkgPT0gcm9vdEJveCkgewotICAgICAgICBpZiAoQVhPYmplY3RDYWNoZSog
Y2FjaGUgPSBkb2N1bWVudCgpLmV4aXN0aW5nQVhPYmplY3RDYWNoZSgpKQotICAgICAgICAgICAg
Y2FjaGUtPmRlZmVyUmVjb21wdXRlSXNJZ25vcmVkKGVsZW1lbnQoKSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJvb3RCb3g7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBib29sIGlzUm9vdExpbmVC
b3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCi17Ci0gICAgaWYgKGlzUm9vdExpbmVCb3gpCi0g
ICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJlcikuY3JlYXRl
QW5kQXBwZW5kUm9vdElubGluZUJveCgpOwotCi0gICAgaWYgKGlzPFJlbmRlclRleHQ+KCpyZW5k
ZXJlcikpCi0gICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0PigqcmVuZGVyZXIpLmNy
ZWF0ZUlubGluZVRleHRCb3goKTsKLQotICAgIGlmIChpczxSZW5kZXJCb3g+KCpyZW5kZXJlcikp
IHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVycmlibGUuIFRoaXMgYnJhbmNoIHJldHVy
bnMgYW4gKm93bmVkKiBwb2ludGVyIQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyQm94
PigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZUJveCgpLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBp
ZiAoaXM8UmVuZGVyTGluZUJyZWFrPigqcmVuZGVyZXIpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBU
aGlzIGlzIHRlcnJpYmxlLiBUaGlzIGJyYW5jaCByZXR1cm5zIGFuICpvd25lZCogcG9pbnRlciEK
LSAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBkb3duY2FzdDxSZW5kZXJMaW5lQnJlYWs+KCpyZW5k
ZXJlcikuY3JlYXRlSW5saW5lQm94KCkucmVsZWFzZSgpOwotICAgICAgICAvLyBXZSBvbmx5IHRy
ZWF0IGEgYm94IGFzIHRleHQgZm9yIGEgPGJyPiBpZiB3ZSBhcmUgb24gYSBsaW5lIGJ5IG91cnNl
bGYgb3IgaW4gc3RyaWN0IG1vZGUKLSAgICAgICAgLy8gKE5vdGUgdGhlIHVzZSBvZiBzdHJpY3Qg
bW9kZS4gSW4gImFsbW9zdCBzdHJpY3QiIG1vZGUsIHdlIGRvbid0IHRyZWF0IHRoZSBib3ggZm9y
IDxicj4gYXMgdGV4dC4pCi0gICAgICAgIGlubGluZUJveC0+c2V0QmVoYXZlc0xpa2VUZXh0KGlz
T25seVJ1biB8fCByZW5kZXJlci0+ZG9jdW1lbnQoKS5pbk5vUXVpcmtzTW9kZSgpIHx8IHJlbmRl
cmVyLT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpOwotICAgICAgICByZXR1cm4gaW5saW5lQm94
OwotICAgIH0KLQotICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpyZW5kZXJlciku
Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveCgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQg
ZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QmIHJlbmRlcmVyLCBib29sIGZ1
bGxMYXlvdXQpCi17Ci0gICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkgewotICAgICAg
ICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocmVuZGVyZXIp
OwotICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVkZWQocmVuZGVyVGV4dCk7Ci0gICAgICAgIHJl
bmRlclRleHQuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7Ci0gICAgfSBlbHNlIGlmIChpczxS
ZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKSkKLSAgICAgICAgZG93bmNhc3Q8UmVuZGVyTGluZUJy
ZWFrPihyZW5kZXJlcikuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7Ci0gICAgZWxzZQotICAg
ICAgICBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5kaXJ0eUxpbmVCb3hlcyhmdWxs
TGF5b3V0KTsKLX0KLQotc3RhdGljIGJvb2wgcGFyZW50SXNDb25zdHJ1Y3RlZE9ySGF2ZU5leHQo
SW5saW5lRmxvd0JveCogcGFyZW50Qm94KQotewotICAgIGRvIHsKLSAgICAgICAgaWYgKHBhcmVu
dEJveC0+aXNDb25zdHJ1Y3RlZCgpIHx8IHBhcmVudEJveC0+bmV4dE9uTGluZSgpKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHBhcmVudEJveCA9IHBhcmVudEJveC0+cGFyZW50
KCk7Ci0gICAgfSB3aGlsZSAocGFyZW50Qm94KTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUlu
bGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVj
dCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGluZUJveCogY2hpbGRCb3gpCi17
Ci0gICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhp
cyBvYmplY3QgdGhhdCBpcyBhbHNvCi0gICAgLy8gdGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4K
LSAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOwotICAgIElubGluZUZsb3dCb3gqIHBhcmVudEJv
eCA9IG51bGxwdHI7Ci0gICAgSW5saW5lRmxvd0JveCogcmVzdWx0ID0gbnVsbHB0cjsKLSAgICBi
b29sIGhhc0RlZmF1bHRMaW5lQm94Q29udGFpbiA9IHN0eWxlKCkubGluZUJveENvbnRhaW4oKSA9
PSBSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVCb3hDb250YWluKCk7Ci0gICAgZG8gewotICAgICAg
ICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihpczxSZW5kZXJJbmxpbmU+KCpvYmop
IHx8IG9iaiA9PSB0aGlzKTsKLQotICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSBv
YmogIT0gdGhpcyA/IGRvd25jYXN0PFJlbmRlcklubGluZT4ob2JqKSA6IG51bGxwdHI7Ci0KLSAg
ICAgICAgLy8gR2V0IHRoZSBsYXN0IGJveCB3ZSBtYWRlIGZvciB0aGlzIHJlbmRlciBvYmplY3Qu
Ci0gICAgICAgIHBhcmVudEJveCA9IGlubGluZUZsb3cgPyBpbmxpbmVGbG93LT5sYXN0TGluZUJv
eCgpIDogZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93Pigqb2JqKS5sYXN0Um9vdEJveCgpOwotCi0g
ICAgICAgIC8vIElmIHRoaXMgYm94IG9yIGl0cyBhbmNlc3RvciBpcyBjb25zdHJ1Y3RlZCB0aGVu
IGl0IGlzIGZyb20gYSBwcmV2aW91cyBsaW5lLCBhbmQgd2UgbmVlZAotICAgICAgICAvLyB0byBt
YWtlIGEgbmV3IGJveCBmb3Igb3VyIGxpbmUuICBJZiB0aGlzIGJveCBvciBpdHMgYW5jZXN0b3Ig
aXMgdW5jb25zdHJ1Y3RlZCBidXQgaXQgaGFzCi0gICAgICAgIC8vIHNvbWV0aGluZyBmb2xsb3dp
bmcgaXQgb24gdGhlIGxpbmUsIHRoZW4gd2Uga25vdyB3ZSBoYXZlIHRvIG1ha2UgYSBuZXcgYm94
Ci0gICAgICAgIC8vIGFzIHdlbGwuICBJbiB0aGlzIHNpdHVhdGlvbiBvdXIgaW5saW5lIGhhcyBh
Y3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBvbgotICAgICAgICAvLyB0aGUgc2FtZSBsaW5lICh0
aGlzIGNhbiBoYXBwZW4gd2l0aCB2ZXJ5IGZhbmN5IGxhbmd1YWdlIG1peHR1cmVzKS4KLSAgICAg
ICAgYm9vbCBjb25zdHJ1Y3RlZE5ld0JveCA9IGZhbHNlOwotICAgICAgICBib29sIGFsbG93ZWRU
b0NvbnN0cnVjdE5ld0JveCA9ICFoYXNEZWZhdWx0TGluZUJveENvbnRhaW4gfHwgIWlubGluZUZs
b3cgfHwgaW5saW5lRmxvdy0+YWx3YXlzQ3JlYXRlTGluZUJveGVzKCk7Ci0gICAgICAgIGJvb2wg
Y2FuVXNlRXhpc3RpbmdQYXJlbnRCb3ggPSBwYXJlbnRCb3ggJiYgIXBhcmVudElzQ29uc3RydWN0
ZWRPckhhdmVOZXh0KHBhcmVudEJveCk7Ci0gICAgICAgIGlmIChhbGxvd2VkVG9Db25zdHJ1Y3RO
ZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7Ci0gICAgICAgICAgICAvLyBXZSBu
ZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBvYmplY3QuICBPbmNlCi0gICAg
ICAgICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGN1
cnJlbnQgbGluZS4KLSAgICAgICAgICAgIElubGluZUJveCogbmV3Qm94ID0gY3JlYXRlSW5saW5l
Qm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7Ci0gICAgICAgICAgICBwYXJlbnRCb3gg
PSBkb3duY2FzdDxJbmxpbmVGbG93Qm94PihuZXdCb3gpOwotICAgICAgICAgICAgcGFyZW50Qm94
LT5zZXRJc0ZpcnN0TGluZShsaW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKLSAgICAgICAgICAgIHBh
cmVudEJveC0+c2V0SXNIb3Jpem9udGFsKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotICAg
ICAgICAgICAgaWYgKCFoYXNEZWZhdWx0TGluZUJveENvbnRhaW4pCi0gICAgICAgICAgICAgICAg
cGFyZW50Qm94LT5jbGVhckRlc2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUo
KTsKLSAgICAgICAgICAgIGNvbnN0cnVjdGVkTmV3Qm94ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlmIChjb25zdHJ1Y3RlZE5ld0JveCB8fCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCkg
ewotICAgICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFy
ZW50Qm94OwotCi0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgYmxvY2sgaXRzZWxm
LCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKLSAgICAgICAgICAgIC8vIGlubGluZSBi
b3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRvIGFu
eSBwYXJlbnQKLSAgICAgICAgICAgIC8vIGlubGluZS4KLSAgICAgICAgICAgIGlmIChjaGlsZEJv
eCkKLSAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7Ci0KLSAg
ICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNoaWxkQm94ID0gcGFyZW50Qm94OwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3VyIGxpbmUgZGVwdGgsIHRo
ZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwgdGhlIHJlbWFpbmluZwot
ICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgotICAgICAgICBvYmogPSAoKyts
aW5lRGVwdGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5wYXJlbnQoKTsKLQotICAg
IH0gd2hpbGUgKHRydWUpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdGVtcGxhdGU8dHlw
ZW5hbWUgQ2hhcmFjdGVyVHlwZT4gc3RhdGljIGlubGluZSBib29sIGVuZHNXaXRoSFRNTFNwYWNl
cyhjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBwb3NpdGlvbiwgdW5z
aWduZWQgZW5kKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IHBvc2l0aW9uOyBpIDwgZW5kOyAr
K2kpIHsKLSAgICAgICAgaWYgKCFpc0hUTUxTcGFjZShjaGFyYWN0ZXJzW2ldKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBi
b29sIHJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihjb25zdCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYg
YmlkaVJ1bnMpCi17Ci0gICAgQmlkaVJ1biogcnVuID0gYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1
bigpOwotICAgIGlmICghcnVuKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIWlzPFJl
bmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBh
dXRvJiB0ZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKS50ZXh0KCk7
Ci0gICAgdW5zaWduZWQgcG9zaXRpb24gPSBydW4tPnN0b3AoKTsKLSAgICB1bnNpZ25lZCBsZW5n
dGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgIGlmICh0ZXh0LmlzOEJpdCgpKQotICAgICAgICByZXR1
cm4gZW5kc1dpdGhIVE1MU3BhY2VzKHRleHQuY2hhcmFjdGVyczgoKSwgcG9zaXRpb24sIGxlbmd0
aCk7Ci0gICAgcmV0dXJuIGVuZHNXaXRoSFRNTFNwYWNlcyh0ZXh0LmNoYXJhY3RlcnMxNigpLCBw
b3NpdGlvbiwgbGVuZ3RoKTsKLX0KLQotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93Ojpj
b25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvKQotewotICAgIEFTU0VSVChiaWRpUnVucy5maXJzdFJ1bigpKTsKLQotICAg
IGJvb2wgcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICBJbmxpbmVGbG93Qm94
KiBwYXJlbnRCb3ggPSAwOwotICAgIGludCBydW5Db3VudCA9IGJpZGlSdW5zLnJ1bkNvdW50KCkg
LSBsaW5lSW5mby5ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7Ci0gICAgCi0gICAgZm9yIChC
aWRpUnVuKiByID0gYmlkaVJ1bnMuZmlyc3RSdW4oKTsgcjsgciA9IHItPm5leHQoKSkgewotICAg
ICAgICAvLyBDcmVhdGUgYSBib3ggZm9yIG91ciBvYmplY3QuCi0gICAgICAgIGJvb2wgaXNPbmx5
UnVuID0gKHJ1bkNvdW50ID09IDEpOwotICAgICAgICBpZiAocnVuQ291bnQgPT0gMiAmJiAhci0+
cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIoKSkKLSAgICAgICAgICAgIGlzT25seVJ1biA9ICghc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBiaWRpUnVucy5sYXN0UnVuKCkgOiBiaWRp
UnVucy5maXJzdFJ1bigpKS0+cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIoKTsKLQotICAgICAgICBp
ZiAobGluZUluZm8uaXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
SW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcigmci0+cmVuZGVyZXIo
KSwgZmFsc2UsIGlzT25seVJ1bik7Ci0gICAgICAgIHItPnNldEJveChib3gpOwotCi0gICAgICAg
IGlmICghcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gJiYgYm94LT5yZW5kZXJlcigpLnNlbGVjdGlv
blN0YXRlKCkgIT0gUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25Ob25lKQotICAgICAgICAgICAgcm9v
dEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2Ug
aGF2ZSBubyBwYXJlbnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2li
bGluZywKLSAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMg
YXMgbmVjZXNzYXJ5IHRvIHByb3Blcmx5IGVuY2xvc2UgdGhlCi0gICAgICAgIC8vIHJ1bidzIGlu
bGluZSBib3guIFNlZ21lbnRzIGNhbiBvbmx5IGJlIHNpYmxpbmdzIGF0IHRoZSByb290IGxldmVs
LCBhcwotICAgICAgICAvLyB0aGV5IGFyZSBwb3NpdGlvbmVkIHNlcGFyYXRlbHkuCi0gICAgICAg
IGlmICghcGFyZW50Qm94IHx8ICZwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+cmVuZGVyZXIo
KS5wYXJlbnQoKSkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbmxpbmUgYm94ZXMgYWxs
IHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgotICAgICAg
ICAgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnRUb1VzZSA9IHItPnJlbmRlcmVyKCkucGFyZW50KCk7
Ci0gICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMocGFyZW50VG9Vc2UsIGxp
bmVJbmZvLCBib3gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQXBwZW5kIHRo
ZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KLSAgICAgICAgICAgIHBhcmVudEJveC0+YWRkVG9M
aW5lKGJveCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIHZpc3VhbGx5T3JkZXJlZCA9IHIt
PnJlbmRlcmVyKCkuc3R5bGUoKS5ydGxPcmRlcmluZygpID09IE9yZGVyOjpWaXN1YWw7Ci0gICAg
ICAgIGJveC0+c2V0QmlkaUxldmVsKHItPmxldmVsKCkpOwotCi0gICAgICAgIGlmIChpczxJbmxp
bmVUZXh0Qm94PigqYm94KSkgewotICAgICAgICAgICAgYXV0byYgdGV4dEJveCA9IGRvd25jYXN0
PElubGluZVRleHRCb3g+KCpib3gpOwotICAgICAgICAgICAgdGV4dEJveC5zZXRTdGFydChyLT5t
X3N0YXJ0KTsKLSAgICAgICAgICAgIHRleHRCb3guc2V0TGVuKHItPm1fc3RvcCAtIHItPm1fc3Rh
cnQpOwotICAgICAgICAgICAgdGV4dEJveC5zZXREaXJPdmVycmlkZShyLT5kaXJPdmVycmlkZSh2
aXN1YWxseU9yZGVyZWQpKTsKLSAgICAgICAgICAgIGlmIChyLT5tX2hhc0h5cGhlbikKLSAgICAg
ICAgICAgICAgICB0ZXh0Qm94LnNldEhhc0h5cGhlbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94LiAgSXQgc2hvdWxkIGJl
IHVuY29uc3RydWN0ZWQgYW5kCi0gICAgLy8gYmUgdGhlIGxhc3QgY29udGludWF0aW9uIG9mIG91
ciBsaW5lIGxpc3QuCi0gICAgQVNTRVJUKGxhc3RSb290Qm94KCkgJiYgIWxhc3RSb290Qm94KCkt
PmlzQ29uc3RydWN0ZWQoKSk7Ci0KLSAgICAvLyBTZXQgdGhlIG1fc2VsZWN0ZWRDaGlsZHJlbiBm
bGFnIG9uIHRoZSByb290IGlubGluZSBib3ggaWYgb25lIG9mIHRoZSBsZWFmIGlubGluZSBib3gK
LSAgICAvLyBmcm9tIHRoZSBiaWRpIHJ1bnMgd2FsayBhYm92ZSBoYXMgYSBzZWxlY3Rpb24gc3Rh
dGUuCi0gICAgaWYgKHJvb3RIYXNTZWxlY3RlZENoaWxkcmVuKQotICAgICAgICBsYXN0Um9vdEJv
eCgpLT5yb290KCkuc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbih0cnVlKTsKLQotICAgIC8vIFNldCBi
aXRzIG9uIG91ciBpbmxpbmUgZmxvdyBib3hlcyB0aGF0IGluZGljYXRlIHdoaWNoIHNpZGVzIHNo
b3VsZAotICAgIC8vIHBhaW50IGJvcmRlcnMvbWFyZ2lucy9wYWRkaW5nLiAgVGhpcyBrbm93bGVk
Z2Ugd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgd2hlbgotICAgIC8vIHdlIGRldGVybWluZSB0aGUg
aG9yaXpvbnRhbCBwb3NpdGlvbnMgYW5kIHdpZHRocyBvZiBhbGwgdGhlIGlubGluZSBib3hlcyBv
bgotICAgIC8vIHRoZSBsaW5lLgotICAgIGJvb2wgaXNMb2dpY2FsbHlMYXN0UnVuV3JhcHBlZCA9
IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5pc1RleHQoKSA/ICFyZWFj
aGVkRW5kT2ZUZXh0UmVuZGVyZXIoYmlkaVJ1bnMpIDogIWlzPFJlbmRlcklubGluZT4oYmlkaVJ1
bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpKTsKLSAgICBsYXN0Um9vdEJveCgpLT5k
ZXRlcm1pbmVTcGFjaW5nRm9yRmxvd0JveGVzKGxpbmVJbmZvLmlzTGFzdExpbmUoKSwgaXNMb2dp
Y2FsbHlMYXN0UnVuV3JhcHBlZCwgJmJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVy
ZXIoKSk7Ci0KLSAgICAvLyBOb3cgbWFyayB0aGUgbGluZSBib3hlcyBhcyBiZWluZyBjb25zdHJ1
Y3RlZC4KLSAgICBsYXN0Um9vdEJveCgpLT5zZXRDb25zdHJ1Y3RlZCgpOwotCi0gICAgLy8gUmV0
dXJuIHRoZSBsYXN0IGxpbmUuCi0gICAgcmV0dXJuIGxhc3RSb290Qm94KCk7Ci19Ci0KLVRleHRB
bGlnbk1vZGUgUmVuZGVyQmxvY2tGbG93Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZShib29sIGVuZHNX
aXRoU29mdEJyZWFrKSBjb25zdAotewotICAgIFRleHRBbGlnbk1vZGUgYWxpZ25tZW50ID0gc3R5
bGUoKS50ZXh0QWxpZ24oKTsKLSNpZiBFTkFCTEUoQ1NTM19URVhUKQotICAgIFRleHRKdXN0aWZ5
IHRleHRKdXN0aWZ5ID0gc3R5bGUoKS50ZXh0SnVzdGlmeSgpOwotICAgIGlmIChhbGlnbm1lbnQg
PT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiB0ZXh0SnVzdGlmeSA9PSBUZXh0SnVzdGlmeTo6
Tm9uZSkKLSAgICAgICAgcmV0dXJuIHN0eWxlKCkuZGlyZWN0aW9uKCkgPT0gVGV4dERpcmVjdGlv
bjo6TFRSID8gVGV4dEFsaWduTW9kZTo6TGVmdCA6IFRleHRBbGlnbk1vZGU6OlJpZ2h0OwotI2Vu
ZGlmCi0KLSAgICBpZiAoZW5kc1dpdGhTb2Z0QnJlYWspCi0gICAgICAgIHJldHVybiBhbGlnbm1l
bnQ7Ci0KLSNpZiAhRU5BQkxFKENTUzNfVEVYVCkKLSAgICByZXR1cm4gKGFsaWdubWVudCA9PSBU
ZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KSA/IFRleHRBbGlnbk1vZGU6OlN0YXJ0IDogYWxpZ25tZW50
OwotI2Vsc2UKLSAgICBpZiAoYWxpZ25tZW50ICE9IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpCi0g
ICAgICAgIHJldHVybiBhbGlnbm1lbnQ7Ci0KLSAgICBUZXh0QWxpZ25MYXN0IGFsaWdubWVudExh
c3QgPSBzdHlsZSgpLnRleHRBbGlnbkxhc3QoKTsKLSAgICBzd2l0Y2ggKGFsaWdubWVudExhc3Qp
IHsKLSAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OlN0YXJ0OgotICAgICAgICByZXR1cm4gVGV4dEFs
aWduTW9kZTo6U3RhcnQ7Ci0gICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpFbmQ6Ci0gICAgICAgIHJl
dHVybiBUZXh0QWxpZ25Nb2RlOjpFbmQ7Ci0gICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpMZWZ0Ogot
ICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6TGVmdDsKLSAgICBjYXNlIFRleHRBbGlnbkxh
c3Q6OlJpZ2h0OgotICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6UmlnaHQ7Ci0gICAgY2Fz
ZSBUZXh0QWxpZ25MYXN0OjpDZW50ZXI6Ci0gICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpD
ZW50ZXI7Ci0gICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpKdXN0aWZ5OgotICAgICAgICByZXR1cm4g
VGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKLSAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OkF1dG86Ci0g
ICAgICAgIGlmICh0ZXh0SnVzdGlmeSA9PSBUZXh0SnVzdGlmeTo6RGlzdHJpYnV0ZSkKLSAgICAg
ICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OwotICAgICAgICByZXR1cm4gVGV4
dEFsaWduTW9kZTo6U3RhcnQ7Ci0gICAgfQotICAgIHJldHVybiBhbGlnbm1lbnQ7Ci0jZW5kaWYK
LX0KLQotc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVmdEFsaWduZWRCbG9jayhi
b29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZs
b2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gVGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgc2hv
dWxkIGRldGVybWluZSB3aGF0IGhhcHBlbnMgd2l0aCB3aWRlIGxpbmVzLgotICAgIC8vIEluIHBh
cnRpY3VsYXIgd2l0aCBSVEwgYmxvY2tzLCB3aWRlIGxpbmVzIHNob3VsZCBzdGlsbCBzcGlsbCBv
dXQgdG8gdGhlIGxlZnQuCi0gICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pIHsKLSAgICAg
ICAgaWYgKHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNhbFdpZHRoICYmIHRyYWls
aW5nU3BhY2VSdW4pCi0gICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+c2V0TG9n
aWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0PigwLCB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9n
aWNhbFdpZHRoKCkgLSB0b3RhbExvZ2ljYWxXaWR0aCArIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHRyYWlsaW5nU3BhY2VSdW4pCi0g
ICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoMCk7Ci0gICAg
ZWxzZSBpZiAodG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCi0gICAg
ICAgIGxvZ2ljYWxMZWZ0IC09ICh0b3RhbExvZ2ljYWxXaWR0aCAtIGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvclJpZ2h0QWxpZ25l
ZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlvbiwgQmlkaVJ1biogdHJhaWxpbmdTcGFj
ZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKLXsKLSAgICAvLyBXaWRlIGxpbmVzIHNwaWxsIG91dCBv
ZiB0aGUgYmxvY2sgYmFzZWQgb2ZmIGRpcmVjdGlvbi4KLSAgICAvLyBTbyBldmVuIGlmIHRleHQt
YWxpZ24gaXMgcmlnaHQsIGlmIGRpcmVjdGlvbiBpcyBMVFIsIHdpZGUgbGluZXMgc2hvdWxkIG92
ZXJmbG93IG91dCBvZiB0aGUgcmlnaHQKLSAgICAvLyBzaWRlIG9mIHRoZSBibG9jay4KLSAgICBp
ZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikgewotICAgICAgICBpZiAodHJhaWxpbmdTcGFjZVJ1
bikgewotICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+
Ym94KCktPmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94
KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKLSAgICAgICAgfQotICAgICAgICBsb2dpY2FsTGVmdCAr
PSBzdGQ6Om1heCgwLmYsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRo
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh0b3RhbExvZ2ljYWxXaWR0aCA+
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAmJiB0cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAgICAgIHRy
YWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3RkOjptYXg8ZmxvYXQ+KDAs
IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSAtIHRvdGFsTG9naWNhbFdp
ZHRoICsgYXZhaWxhYmxlTG9naWNhbFdpZHRoKSk7Ci0gICAgICAgIHRvdGFsTG9naWNhbFdpZHRo
IC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgbG9naWNhbExlZnQgKz0gYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gdG90YWxMb2dp
Y2FsV2lkdGg7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckNlbnRlckFs
aWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJpZGlSdW4qIHRyYWlsaW5n
U3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBm
bG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCi17Ci0gICAgZmxvYXQgdHJhaWxpbmdTcGFjZVdp
ZHRoID0gMDsKLSAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikgewotICAgICAgICB0b3RhbExvZ2lj
YWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCk7Ci0gICAg
ICAgIHRyYWlsaW5nU3BhY2VXaWR0aCA9IHN0ZDo6bWluKHRyYWlsaW5nU3BhY2VSdW4tPmJveCgp
LT5sb2dpY2FsV2lkdGgoKSwgKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdp
ZHRoICsgMSkgLyAyKTsKLSAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2lj
YWxXaWR0aChzdGQ6Om1heDxmbG9hdD4oMCwgdHJhaWxpbmdTcGFjZVdpZHRoKSk7Ci0gICAgfQot
ICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQotICAgICAgICBsb2dpY2FsTGVmdCArPSBz
dGQ6Om1heDxmbG9hdD4oKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRo
KSAvIDIsIDApOwotICAgIGVsc2UKLSAgICAgICAgbG9naWNhbExlZnQgKz0gdG90YWxMb2dpY2Fs
V2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGggPyAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0g
dG90YWxMb2dpY2FsV2lkdGgpIDogKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNh
bFdpZHRoKSAvIDIgLSB0cmFpbGluZ1NwYWNlV2lkdGg7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tG
bG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4sIFJlbmRlclJ1YnlSdW4mIHJl
bmRlcmVyLCBSZW5kZXJPYmplY3QqIHByZXZpb3VzT2JqZWN0LCBjb25zdCBMaW5lSW5mbyYgbGlu
ZUluZm8pCi17Ci0gICAgZmxvYXQgc3RhcnRPdmVyaGFuZzsKLSAgICBmbG9hdCBlbmRPdmVyaGFu
ZzsKLSAgICBSZW5kZXJPYmplY3QqIG5leHRPYmplY3QgPSAwOwotICAgIGZvciAoQmlkaVJ1biog
cnVuV2l0aE5leHRPYmplY3QgPSBydW4tPm5leHQoKTsgcnVuV2l0aE5leHRPYmplY3Q7IHJ1bldp
dGhOZXh0T2JqZWN0ID0gcnVuV2l0aE5leHRPYmplY3QtPm5leHQoKSkgewotICAgICAgICBpZiAo
IXJ1bldpdGhOZXh0T2JqZWN0LT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYm
ICFydW5XaXRoTmV4dE9iamVjdC0+Ym94KCktPmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAg
IG5leHRPYmplY3QgPSAmcnVuV2l0aE5leHRPYmplY3QtPnJlbmRlcmVyKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZW5kZXJlci5nZXRPdmVyaGFuZyhsaW5l
SW5mby5pc0ZpcnN0TGluZSgpLCByZW5kZXJlci5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSA/IHByZXZpb3VzT2JqZWN0IDogbmV4dE9iamVjdCwgcmVuZGVyZXIuc3R5bGUoKS5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBuZXh0T2JqZWN0IDogcHJldmlvdXNPYmplY3QsIHN0YXJ0
T3ZlcmhhbmcsIGVuZE92ZXJoYW5nKTsKLSAgICBzZXRNYXJnaW5TdGFydEZvckNoaWxkKHJlbmRl
cmVyLCBMYXlvdXRVbml0KC1zdGFydE92ZXJoYW5nKSk7Ci0gICAgc2V0TWFyZ2luRW5kRm9yQ2hp
bGQocmVuZGVyZXIsIExheW91dFVuaXQoLWVuZE92ZXJoYW5nKSk7Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExp
bmVJbmZvJiBsaW5lSW5mbywKLSAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYg
dGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNh
Y2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAgIEhhc2hTZXQ8
Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7Ci0gICAgR2x5cGhPdmVyZmxvdyBnbHlwaE92ZXJm
bG93OwotCi0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBsaW5lU3R5bGUoKnJlbmRlcmVy
LnBhcmVudCgpLCBsaW5lSW5mbykuZm9udENhc2NhZGUoKTsKLSAgICAvLyBBbHdheXMgY29tcHV0
ZSBnbHlwaCBvdmVyZmxvdyBpZiB0aGUgYmxvY2sncyBsaW5lLWJveC1jb250YWluIHZhbHVlIGlz
ICJnbHlwaHMiLgotICAgIGlmIChsaW5lQm94LT5maXRzVG9HbHlwaHMoKSkgewotICAgICAgICAv
LyBJZiB3ZSBkb24ndCBzdGljayBvdXQgb2YgdGhlIHJvb3QgbGluZSdzIGZvbnQgYm94LCB0aGVu
IGRvbid0IGJvdGhlciBjb21wdXRpbmcgb3VyIGdseXBoIG92ZXJmbG93LiBUaGlzIG9wdGltaXph
dGlvbgotICAgICAgICAvLyB3aWxsIGtlZXAgdXMgZnJvbSBjb21wdXRpbmcgZ2x5cGggYm91bmRz
IGluIG5lYXJseSBhbGwgY2FzZXMuCi0gICAgICAgIGJvb2wgaW5jbHVkZVJvb3RMaW5lID0gbGlu
ZUJveC0+aW5jbHVkZXNSb290TGluZUJveEZvbnRPckxlYWRpbmcoKTsKLSAgICAgICAgaW50IGJh
c2VsaW5lU2hpZnQgPSBsaW5lQm94LT52ZXJ0aWNhbFBvc2l0aW9uRm9yQm94KHJ1bi0+Ym94KCks
IHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7Ci0gICAgICAgIGludCByb290RGVzY2VudCA9IGluY2x1
ZGVSb290TGluZSA/IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkgOiAwOwotICAgICAgICBp
bnQgcm9vdEFzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9udE1ldHJpY3MoKS5hc2Nl
bnQoKSA6IDA7Ci0gICAgICAgIGludCBib3hBc2NlbnQgPSBmb250LmZvbnRNZXRyaWNzKCkuYXNj
ZW50KCkgLSBiYXNlbGluZVNoaWZ0OwotICAgICAgICBpbnQgYm94RGVzY2VudCA9IGZvbnQuZm9u
dE1ldHJpY3MoKS5kZXNjZW50KCkgKyBiYXNlbGluZVNoaWZ0OwotICAgICAgICBpZiAoYm94QXNj
ZW50ID4gcm9vdERlc2NlbnQgfHwgIGJveERlc2NlbnQgPiByb290QXNjZW50KQotICAgICAgICAg
ICAgZ2x5cGhPdmVyZmxvdy5jb21wdXRlQm91bmRzID0gdHJ1ZTsgCi0gICAgfQotICAgIAotICAg
IExheW91dFVuaXQgaHlwaGVuV2lkdGg7Ci0gICAgaWYgKGRvd25jYXN0PElubGluZVRleHRCb3g+
KCpydW4tPmJveCgpKS5oYXNIeXBoZW4oKSkKLSAgICAgICAgaHlwaGVuV2lkdGggPSBtZWFzdXJl
SHlwaGVuV2lkdGgocmVuZGVyZXIsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLQotICAgIGZsb2F0
IG1lYXN1cmVkV2lkdGggPSAwOwotCi0gICAgYm9vbCBrZXJuaW5nSXNFbmFibGVkID0gZm9udC5l
bmFibGVLZXJuaW5nKCk7Ci0gICAgYm9vbCBjYW5Vc2VTaW1wbGVGb250Q29kZVBhdGggPSByZW5k
ZXJlci5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKLSAgICAKLSAgICAvLyBTaW5jZSB3ZSBk
b24ndCBjYWNoZSBnbHlwaCBvdmVyZmxvd3MsIHdlIG5lZWQgdG8gcmUtbWVhc3VyZSB0aGUgcnVu
IGlmCi0gICAgLy8gdGhlIHN0eWxlIGlzIGxpbmVib3gtY29udGFpbjogZ2x5cGguCi0gICAgaWYg
KCFsaW5lQm94LT5maXRzVG9HbHlwaHMoKSAmJiBjYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgpIHsK
LSAgICAgICAgdW5zaWduZWQgbGFzdEVuZE9mZnNldCA9IHJ1bi0+bV9zdGFydDsKLSAgICAgICAg
Ym9vbCBhdEZpcnN0V29yZE1lYXN1cmVtZW50ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDAsIHNpemUgPSB3b3JkTWVhc3VyZW1lbnRzLnNpemUoKTsgaSA8IHNpemUgJiYgbGFzdEVu
ZE9mZnNldCA8IHJ1bi0+bV9zdG9wOyArK2kpIHsKLSAgICAgICAgICAgIFdvcmRNZWFzdXJlbWVu
dCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50c1tpXTsKLSAgICAgICAgICAgIGlm
ICh3b3JkTWVhc3VyZW1lbnQud2lkdGggPD0gMCB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZz
ZXQgPT0gd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgIT0gJnJlbmRlcmVy
IHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCAhPSBsYXN0RW5kT2Zmc2V0IHx8IHdvcmRN
ZWFzdXJlbWVudC5lbmRPZmZzZXQgPiBydW4tPm1fc3RvcCkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICAgICAgbGFzdEVuZE9mZnNldCA9IHdvcmRNZWFzdXJlbWVudC5lbmRP
ZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoa2VybmluZ0lzRW5hYmxlZCAmJiBsYXN0RW5kT2Zmc2V0
ID09IHJ1bi0+bV9zdG9wKSB7Ci0gICAgICAgICAgICAgICAgaW50IHdvcmRMZW5ndGggPSBsYXN0
RW5kT2Zmc2V0IC0gd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgICAg
IEdseXBoT3ZlcmZsb3cgb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCAr
PSByZW5kZXJlci53aWR0aCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQsIHdvcmRMZW5ndGgs
IHhQb3MgKyBtZWFzdXJlZFdpZHRoLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLAotICAgICAgICAg
ICAgICAgICAgICAmd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsICZvdmVyZmxvdyk7Ci0g
ICAgICAgICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVyLmNoYXJhY3RlckF0KHdvcmRNZWFzdXJl
bWVudC5zdGFydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgLy8gcmVuZGVyZXIud2lkdGgoKSBv
bWl0cyB3b3JkLXNwYWNpbmcgdmFsdWUgZm9yIGxlYWRpbmcgd2hpdGVzcGFjZSwgc28gbGV0J3Mg
anVzdCBhZGQgaXQgYmFjayBoZXJlLgotICAgICAgICAgICAgICAgIGlmICghYXRGaXJzdFdvcmRN
ZWFzdXJlbWVudCAmJiBGb250Q2FzY2FkZTo6dHJlYXRBc1NwYWNlKGMpKQotICAgICAgICAgICAg
ICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLnN0eWxlKCkuZm9udENhc2NhZGUoKS53
b3JkU3BhY2luZygpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgbWVhc3Vy
ZWRXaWR0aCArPSB3b3JkTWVhc3VyZW1lbnQud2lkdGg7Ci0gICAgICAgICAgICBhdEZpcnN0V29y
ZE1lYXN1cmVtZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmICghd29yZE1lYXN1cmVtZW50
LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgSGFzaFNldDxjb25z
dCBGb250Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0Zv
bnRzLmVuZCgpOwotICAgICAgICAgICAgICAgIGZvciAoSGFzaFNldDxjb25zdCBGb250Kj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmFkZCgq
aXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZWFzdXJlZFdpZHRo
ICYmIGxhc3RFbmRPZmZzZXQgIT0gcnVuLT5tX3N0b3ApIHsKLSAgICAgICAgICAgIC8vIElmIHdl
IGRvbid0IGhhdmUgZW5vdWdoIGNhY2hlZCBkYXRhLCB3ZSdsbCBtZWFzdXJlIHRoZSBydW4gYWdh
aW4uCi0gICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gMDsKLSAgICAgICAgICAgIGZhbGxiYWNr
Rm9udHMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghbWVhc3VyZWRXaWR0
aCkKLSAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHJlbmRlcmVyLndpZHRoKHJ1bi0+bV9zdGFydCwg
cnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCks
ICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7Ci0KLSAgICBydW4tPmJveCgpLT5zZXRM
b2dpY2FsV2lkdGgobWVhc3VyZWRXaWR0aCArIGh5cGhlbldpZHRoKTsKLSAgICBpZiAoIWZhbGxi
YWNrRm9udHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChydW4tPmJveCgpLT5iZWhhdmVz
TGlrZVRleHQoKSk7Ci0gICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwOjpp
dGVyYXRvciBpdCA9IHRleHRCb3hEYXRhTWFwLmFkZChkb3duY2FzdDxJbmxpbmVUZXh0Qm94Pihy
dW4tPmJveCgpKSwgc3RkOjptYWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZvbnQqPigpLCBHbHlwaE92
ZXJmbG93KCkpKS5pdGVyYXRvcjsKLSAgICAgICAgQVNTRVJUKGl0LT52YWx1ZS5maXJzdC5pc0Vt
cHR5KCkpOwotICAgICAgICBpdC0+dmFsdWUuZmlyc3QgPSBjb3B5VG9WZWN0b3IoZmFsbGJhY2tG
b250cyk7Ci0gICAgICAgIHJ1bi0+Ym94KCktPnBhcmVudCgpLT5jbGVhckRlc2NlbmRhbnRzSGF2
ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUoKTsKLSAgICB9Ci0KLSAgICAvLyBJbmNsdWRlIHRl
eHQgZGVjb3JhdGlvbiB2aXN1YWwgb3ZlcmZsb3cgYXMgcGFydCBvZiB0aGUgZ2x5cGggb3ZlcmZs
b3cuCi0gICAgaWYgKCFyZW5kZXJlci5zdHlsZSgpLnRleHREZWNvcmF0aW9uc0luRWZmZWN0KCku
aXNFbXB0eSgpKQotICAgICAgICBnbHlwaE92ZXJmbG93LmV4dGVuZFRvKHZpc3VhbE92ZXJmbG93
Rm9yRGVjb3JhdGlvbnMocnVuLT5ib3goKS0+bGluZVN0eWxlKCksIGRvd25jYXN0PElubGluZVRl
eHRCb3g+KHJ1bi0+Ym94KCkpKSk7Ci0KLSAgICBpZiAoIWdseXBoT3ZlcmZsb3cuaXNFbXB0eSgp
KSB7Ci0gICAgICAgIEFTU0VSVChydW4tPmJveCgpLT5iZWhhdmVzTGlrZVRleHQoKSk7Ci0gICAg
ICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwOjppdGVyYXRvciBpdCA9IHRleHRC
b3hEYXRhTWFwLmFkZChkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihydW4tPmJveCgpKSwgc3RkOjpt
YWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZvbnQqPigpLCBHbHlwaE92ZXJmbG93KCkpKS5pdGVyYXRv
cjsKLSAgICAgICAgaXQtPnZhbHVlLnNlY29uZCA9IGdseXBoT3ZlcmZsb3c7Ci0gICAgICAgIHJ1
bi0+Ym94KCktPmNsZWFyS25vd25Ub0hhdmVOb092ZXJmbG93KCk7Ci0gICAgfQotfQotCi12b2lk
IFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlUnVieUZvckp1c3RpZmllZFRleHQoUmVuZGVyUnVieVJ1
biYgcnVieVJ1biwgQmlkaVJ1biYgciwgY29uc3QgVmVjdG9yPHVuc2lnbmVkLCAxNj4mIGV4cGFu
c2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBm
bG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgc2l6
ZV90JiBpKQotewotICAgIGlmICghcnVieVJ1bi5ydWJ5QmFzZSgpIHx8ICFydWJ5UnVuLnJ1YnlC
YXNlKCktPmZpcnN0Um9vdEJveCgpIHx8IHJ1YnlSdW4ucnVieUJhc2UoKS0+Zmlyc3RSb290Qm94
KCktPm5leHRSb290Qm94KCkgfHwgIXIucmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVT
cGFjZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvJiBydWJ5QmFzZSA9ICpydWJ5UnVu
LnJ1YnlCYXNlKCk7Ci0gICAgYXV0byYgcm9vdEJveCA9ICpydWJ5QmFzZS5maXJzdFJvb3RCb3go
KTsKLQotICAgIGZsb2F0IHRvdGFsRXhwYW5zaW9uID0gMDsKLSAgICB1bnNpZ25lZCB0b3RhbE9w
cG9ydHVuaXRpZXNJblJ1biA9IDA7Ci0gICAgZm9yIChhdXRvKiBsZWFmQ2hpbGQgPSByb290Qm94
LmZpcnN0TGVhZkNoaWxkKCk7IGxlYWZDaGlsZDsgbGVhZkNoaWxkID0gbGVhZkNoaWxkLT5uZXh0
TGVhZkNoaWxkKCkpIHsKLSAgICAgICAgaWYgKCFsZWFmQ2hpbGQtPmlzSW5saW5lVGV4dEJveCgp
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgdW5zaWduZWQgb3Bwb3J0dW5pdGll
c0luUnVuID0gZXhwYW5zaW9uT3Bwb3J0dW5pdGllc1tpKytdOwotICAgICAgICBBU1NFUlQob3Bw
b3J0dW5pdGllc0luUnVuIDw9IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwotICAgICAgICBh
dXRvIGV4cGFuc2lvbiA9IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0
aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4gLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OwotICAg
ICAgICB0b3RhbEV4cGFuc2lvbiArPSBleHBhbnNpb247Ci0gICAgICAgIHRvdGFsT3Bwb3J0dW5p
dGllc0luUnVuICs9IG9wcG9ydHVuaXRpZXNJblJ1bjsKLSAgICB9Ci0KLSAgICBBU1NFUlQoIXJ1
YnlSdW4uaGFzT3ZlcnJpZGVDb250ZW50TG9naWNhbFdpZHRoKCkpOwotICAgIGZsb2F0IG5ld0Jh
c2VXaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdpZHRoKCkgKyB0b3RhbEV4cGFuc2lvbiArIG1hcmdp
blN0YXJ0Rm9yQ2hpbGQocnVieVJ1bikgKyBtYXJnaW5FbmRGb3JDaGlsZChydWJ5UnVuKTsKLSAg
ICBmbG9hdCBuZXdSdWJ5UnVuV2lkdGggPSBydWJ5UnVuLmxvZ2ljYWxXaWR0aCgpICsgdG90YWxF
eHBhbnNpb247Ci0gICAgcnVieUJhc2Uuc2V0SW5pdGlhbE9mZnNldCgobmV3UnVieVJ1bldpZHRo
IC0gbmV3QmFzZVdpZHRoKSAvIDIpOwotICAgIHJ1YnlSdW4uc2V0T3ZlcnJpZGVDb250ZW50TG9n
aWNhbFdpZHRoKExheW91dFVuaXQobmV3UnVieVJ1bldpZHRoKSk7Ci0gICAgcnVieVJ1bi5zZXRO
ZWVkc0xheW91dChNYXJrT25seVRoaXMpOwotICAgIHJvb3RCb3gubWFya0RpcnR5KCk7Ci0gICAg
aWYgKFJlbmRlclJ1YnlUZXh0KiBydWJ5VGV4dCA9IHJ1YnlSdW4ucnVieVRleHQoKSkgewotICAg
ICAgICBpZiAoUm9vdElubGluZUJveCogdGV4dFJvb3RCb3ggPSBydWJ5VGV4dC0+Zmlyc3RSb290
Qm94KCkpCi0gICAgICAgICAgICB0ZXh0Um9vdEJveC0+bWFya0RpcnR5KCk7Ci0gICAgfQotICAg
IHJ1YnlSdW4ubGF5b3V0QmxvY2sodHJ1ZSk7Ci0gICAgcnVieVJ1bi5jbGVhck92ZXJyaWRlQ29u
dGVudExvZ2ljYWxXaWR0aCgpOwotICAgIHIuYm94KCktPnNldEV4cGFuc2lvbihuZXdSdWJ5UnVu
V2lkdGggLSByLmJveCgpLT5sb2dpY2FsV2lkdGgoKSk7Ci0KLSAgICB0b3RhbExvZ2ljYWxXaWR0
aCArPSB0b3RhbEV4cGFuc2lvbjsKLSAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IC09IHRv
dGFsT3Bwb3J0dW5pdGllc0luUnVuOwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0
ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRy
YWlsaW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBv
cnR1bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3Rh
bExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQotewotICAgIGlmICgh
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCB8fCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPD0gdG90
YWxMb2dpY2FsV2lkdGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNpemVfdCBpID0gMDsKLSAg
ICBmb3IgKEJpZGlSdW4qIHJ1biA9IGZpcnN0UnVuOyBydW47IHJ1biA9IHJ1bi0+bmV4dCgpKSB7
Ci0gICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4gPT0gdHJhaWxpbmdTcGFjZVJ1bikKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzPFJlbmRlclRleHQ+
KHJ1bi0+cmVuZGVyZXIoKSkpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG9wcG9ydHVuaXRpZXNJ
blJ1biA9IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXNbaSsrXTsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgQVNTRVJUKG9wcG9ydHVuaXRpZXNJblJ1biA8PSBleHBhbnNpb25PcHBvcnR1bml0eUNv
dW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gT25seSBqdXN0aWZ5IHRleHQgaWYg
d2hpdGVzcGFjZSBpcyBjb2xsYXBzZWQuCi0gICAgICAgICAgICBpZiAocnVuLT5yZW5kZXJlcigp
LnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBJbmxpbmVU
ZXh0Qm94JiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpOwot
ICAgICAgICAgICAgICAgIGZsb2F0IGV4cGFuc2lvbiA9IChhdmFpbGFibGVMb2dpY2FsV2lkdGgg
LSB0b3RhbExvZ2ljYWxXaWR0aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4gLyBleHBhbnNpb25PcHBv
cnR1bml0eUNvdW50OwotICAgICAgICAgICAgICAgIHRleHRCb3guc2V0RXhwYW5zaW9uKGV4cGFu
c2lvbik7Ci0gICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gZXhwYW5zaW9uOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCAtPSBv
cHBvcnR1bml0aWVzSW5SdW47Ci0gICAgICAgIH0gZWxzZSBpZiAoaXM8UmVuZGVyUnVieVJ1bj4o
cnVuLT5yZW5kZXJlcigpKSkKLSAgICAgICAgICAgIHVwZGF0ZVJ1YnlGb3JKdXN0aWZpZWRUZXh0
KGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSksICpydW4sIGV4cGFuc2lv
bk9wcG9ydHVuaXRpZXMsIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIHRvdGFsTG9naWNhbFdp
ZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGkpOwotCi0gICAgICAgIGlmICghZXhwYW5zaW9u
T3Bwb3J0dW5pdHlDb3VudCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudChjb25zdCBUZXh0
QWxpZ25Nb2RlJiB0ZXh0QWxpZ24sIGNvbnN0IFJvb3RJbmxpbmVCb3gqIHJvb3RJbmxpbmVCb3gs
IEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRv
dGFsTG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpbnQgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCkKLXsKLSAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbjsKLSAg
ICBpZiAocm9vdElubGluZUJveCAmJiBzdHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0gUGxhaW50ZXh0
KQotICAgICAgICBkaXJlY3Rpb24gPSByb290SW5saW5lQm94LT5kaXJlY3Rpb24oKTsKLSAgICBl
bHNlCi0gICAgICAgIGRpcmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9uKCk7Ci0KLSAgICAvLyBB
cm1lZCB3aXRoIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSAod2l0aG91dCBqdXN0aWZpY2F0
aW9uKSwKLSAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGlnbiBwcm9wZXJ0eSBpbiBv
cmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCi0gICAgLy8gb2JqZWN0cyBo
b3Jpem9udGFsbHkuIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2Vk
IGlmIHdlIGVuZCB1cAotICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBzd2l0Y2ggKHRleHRB
bGlnbikgewotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6TGVmdDoKLSAgICBjYXNlIFRleHRBbGln
bk1vZGU6OldlYktpdExlZnQ6Ci0gICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckxlZnRBbGln
bmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VS
dW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRo
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpSaWdodDoKLSAgICBj
YXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgotICAgICAgICB1cGRhdGVMb2dpY2FsV2lk
dGhGb3JSaWdodEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwg
dHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6
OkNlbnRlcjoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdENlbnRlcjoKLSAgICAgICAg
dXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dp
Y2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgVGV4dEFsaWduTW9kZTo6SnVzdGlmeToKLSAgICAgICAgYWRqdXN0SW5saW5lRGlyZWN0aW9u
TGluZUJvdW5kcyhleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBsb2dpY2FsTGVmdCwgYXZhaWxh
YmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAgaWYgKGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQp
IHsKLSAgICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAgICAgICAgICAgICAg
dG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0
aCgpOwotICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2Fs
V2lkdGgoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBGQUxMVEhST1VHSDsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlN0YXJ0OgotICAg
ICAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikKLSAgICAgICAgICAgIHVw
ZGF0ZUxvZ2ljYWxXaWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxX
aWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
dXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2lj
YWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2Fz
ZSBUZXh0QWxpZ25Nb2RlOjpFbmQ6Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4dERpcmVj
dGlvbjo6TFRSKQotICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVk
QmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4s
IGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVmdEFsaWdu
ZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1
biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgp
OwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxJ
bmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgZmxvYXQmIGxpbmVMb2dpY2Fs
TGVmdCwgZmxvYXQmIGxpbmVMb2dpY2FsUmlnaHQsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lk
dGgsIGJvb2wgZmlyc3RMaW5lLAotICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0
LCBMYXlvdXRVbml0IGJveExvZ2ljYWxIZWlnaHQpCi17Ci0gICAgTGF5b3V0VW5pdCBsaW5lTG9n
aWNhbEhlaWdodCA9IGJsb2NrLm1pbkxpbmVIZWlnaHRGb3JSZXBsYWNlZFJlbmRlcmVyKGZpcnN0
TGluZSwgYm94TG9naWNhbEhlaWdodCk7Ci0gICAgbGluZUxvZ2ljYWxMZWZ0ID0gYmxvY2subG9n
aWNhbExlZnRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgc2hvdWxkSW5kZW50
VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOwotICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBibG9jay5s
b2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgc2hvdWxkSW5k
ZW50VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOwotICAgIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9
IGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQ7Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5l
Qm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJpZGlSdW4qIGZpcnN0UnVu
LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3ZlcmZs
b3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNh
Y2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJl
bWVudHMpCi17Ci0gICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSB0ZXh0QWxpZ25tZW50Rm9y
TGluZSghcmVhY2hlZEVuZCAmJiAhbGluZUJveC0+ZW5kc1dpdGhCcmVhaygpKTsKLSAgICAKLSAg
ICAvLyBDU1MgMi4xOiAiJ1RleHQtaW5kZW50JyBvbmx5IGFmZmVjdHMgYSBsaW5lIGlmIGl0IGlz
IHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZSBvZiBhbiBlbGVtZW50LiBGb3IgZXhhbXBsZSwgdGhl
IGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIAotICAgIC8vIGJveCBpcyBvbmx5IGFm
ZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuIgot
ICAgIC8vIENTUzMgInRleHQtaW5kZW50IiwgIi13ZWJraXQtZWFjaC1saW5lIiBhZmZlY3RzIHRo
ZSBmaXJzdCBsaW5lIG9mIHRoZSBibG9jayBjb250YWluZXIgYXMgd2VsbCBhcyBlYWNoIGxpbmUg
YWZ0ZXIgYSBmb3JjZWQgbGluZSBicmVhaywKLSAgICAvLyBidXQgZG9lcyBub3QgYWZmZWN0IGxp
bmVzIGFmdGVyIGEgc29mdCB3cmFwIGJyZWFrLgotICAgIGJvb2wgaXNGaXJzdExpbmUgPSBsaW5l
SW5mby5pc0ZpcnN0TGluZSgpICYmICEoaXNBbm9ueW1vdXNCbG9jaygpICYmIHBhcmVudCgpLT5m
aXJzdENoaWxkKCkgIT0gdGhpcyk7Ci0gICAgYm9vbCBpc0FmdGVySGFyZExpbmVCcmVhayA9IGxp
bmVCb3gtPnByZXZSb290Qm94KCkgJiYgbGluZUJveC0+cHJldlJvb3RCb3goKS0+ZW5kc1dpdGhC
cmVhaygpOwotICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0gcmVxdWlyZXNJ
bmRlbnQoaXNGaXJzdExpbmUsIGlzQWZ0ZXJIYXJkTGluZUJyZWFrLCBzdHlsZSgpKTsKLSAgICBm
bG9hdCBsaW5lTG9naWNhbExlZnQ7Ci0gICAgZmxvYXQgbGluZUxvZ2ljYWxSaWdodDsKLSAgICBm
bG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGg7Ci0gICAgdXBkYXRlTG9naWNhbElubGluZVBvc2l0
aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJpZ2h0LCBhdmFpbGFibGVM
b2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0LCAwKTsKLSAgICBib29s
IG5lZWRzV29yZFNwYWNpbmc7Ci0KLSAgICBpZiAoZmlyc3RSdW4gJiYgZmlyc3RSdW4tPnJlbmRl
cmVyKCkuaXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgIFJlbmRlckJveCYgcmVuZGVyQm94ID0gZG93
bmNhc3Q8UmVuZGVyQm94PihmaXJzdFJ1bi0+cmVuZGVyZXIoKSk7Ci0gICAgICAgIHVwZGF0ZUxv
Z2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRoaXMsIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxS
aWdodCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwgc2hvdWxkSW5kZW50VGV4
dCwgcmVuZGVyQm94LmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgY29tcHV0ZUlubGlu
ZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQobGluZUJveCwgbGluZUluZm8sIHRleHRBbGln
biwgbGluZUxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGZpcnN0UnVuLCB0cmFp
bGluZ1NwYWNlUnVuLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB3b3Jk
TWVhc3VyZW1lbnRzKTsKLSAgICAvLyBUaGUgd2lkdGhzIG9mIGFsbCBydW5zIGFyZSBub3cga25v
d24uIFdlIGNhbiBub3cgcGxhY2UgZXZlcnkgaW5saW5lIGJveCAoYW5kCi0gICAgLy8gY29tcHV0
ZSBhY2N1cmF0ZSB3aWR0aHMgZm9yIHRoZSBpbmxpbmUgZmxvdyBib3hlcykuCi0gICAgbmVlZHNX
b3JkU3BhY2luZyA9IGZhbHNlOwotICAgIGxpbmVCb3gtPnBsYWNlQm94ZXNJbklubGluZURpcmVj
dGlvbihsaW5lTG9naWNhbExlZnQsIG5lZWRzV29yZFNwYWNpbmcpOwotfQotCi1zdGF0aWMgaW5s
aW5lIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9yRm9ySW5saW5lVGV4dEJveChS
ZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBJbmxpbmVUZXh0Qm94JiB0ZXh0Qm94LCBCaWRpUnVuKiBw
cmV2aW91c1J1biwgQmlkaVJ1biogbmV4dFJ1biwgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIGJv
b2wgaXNBZnRlckV4cGFuc2lvbikKLXsKLSAgICAvLyBUYXRlY2h1eW9rbyBpcyBtb2RlbGVkIGFz
IHRoZSBPYmplY3QgUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIChVK0ZGRkMpLCB3aGljaCBjYW4gbmV2
ZXIgaGF2ZSBleHBhbnNpb24gb3Bwb3J0dW5pdGllcyBpbnNpZGUgbm9yIGludHJpbnNpY2FsbHkg
YWRqYWNlbnQgdG8gaXQuCi0gICAgaWYgKHRleHRCb3gucmVuZGVyZXIoKS5zdHlsZSgpLnRleHRD
b21iaW5lKCkgPT0gVGV4dENvbWJpbmU6Okhvcml6b250YWwpCi0gICAgICAgIHJldHVybiBGb3Ji
aWRMZWFkaW5nRXhwYW5zaW9uIHwgRm9yYmlkVHJhaWxpbmdFeHBhbnNpb247Ci0KLSAgICBFeHBh
bnNpb25CZWhhdmlvciByZXN1bHQgPSAwOwotICAgIGJvb2wgc2V0TGVhZGluZ0V4cGFuc2lvbiA9
IGZhbHNlOwotICAgIGJvb2wgc2V0VHJhaWxpbmdFeHBhbnNpb24gPSBmYWxzZTsKLSAgICBpZiAo
dGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpIHsKLSAgICAgICAgLy8gSWYgdGhl
IG5leHQgYm94IGlzIHJ1YnksIGFuZCB3ZSdyZSBqdXN0aWZ5aW5nLCBhbmQgdGhlIGZpcnN0IGJv
eCBpbiB0aGUgcnVieSBiYXNlIGhhcyBhIGxlYWRpbmcgZXhwYW5zaW9uLCBhbmQgd2UgYXJlIGEg
dGV4dCBib3gsIHRoZW4gZm9yY2UgYSB0cmFpbGluZyBleHBhbnNpb24uCi0gICAgICAgIGlmIChu
ZXh0UnVuICYmIGlzPFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpICYmIGRvd25j
YXN0PFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkgJiYgbmV4
dFJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAg
ICAgICBhdXRvJiBydWJ5QmFzZSA9ICpkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihuZXh0UnVuLT5y
ZW5kZXJlcigpKS5ydWJ5QmFzZSgpOwotICAgICAgICAgICAgaWYgKHJ1YnlCYXNlLmZpcnN0Um9v
dEJveCgpICYmICFydWJ5QmFzZS5maXJzdFJvb3RCb3goKS0+bmV4dFJvb3RCb3goKSkgewotICAg
ICAgICAgICAgICAgIGlmIChhdXRvKiBsZWFmQ2hpbGQgPSBydWJ5QmFzZS5maXJzdFJvb3RCb3go
KS0+Zmlyc3RMZWFmQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXM8SW5saW5l
VGV4dEJveD4oKmxlYWZDaGlsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBUaGlzIGxlYWRpbmdFeHBhbnNpb25PcHBvcnR1bml0eSBkb2Vzbid0IGFjdHVhbGx5IHdvcmsg
YmVjYXVzZSBpdCBkb2Vzbid0IHBlcmZvcm0gdGhlIFVCQQotICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKEZvbnRDYXNjYWRlOjpsZWFkaW5nRXhwYW5zaW9uT3Bwb3J0dW5pdHkoZG93bmNhc3Q8
UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5kZXJlcigpKS5zdHJpbmdWaWV3KCksIGxlYWZDaGls
ZC0+ZGlyZWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VHJhaWxp
bmdFeHBhbnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8
PSBGb3JjZVRyYWlsaW5nRXhwYW5zaW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgICAgIC8vIFNhbWUgdGhpbmcsIGV4Y2VwdCBpZiB3ZSdyZSBmb2xsb3dpbmcg
YSBydWJ5Ci0gICAgICAgIGlmIChwcmV2aW91c1J1biAmJiBpczxSZW5kZXJSdWJ5UnVuPihwcmV2
aW91c1J1bi0+cmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocHJldmlvdXNS
dW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkgJiYgcHJldmlvdXNSdW4tPnJlbmRlcmVyKCkuc3R5
bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgYXV0byYgcnVieUJhc2Ug
PSAqZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocHJldmlvdXNSdW4tPnJlbmRlcmVyKCkpLnJ1YnlC
YXNlKCk7Ci0gICAgICAgICAgICBpZiAocnVieUJhc2UuZmlyc3RSb290Qm94KCkgJiYgIXJ1YnlC
YXNlLmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGF1dG8qIGxlYWZDaGlsZCA9IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5sYXN0TGVhZkNoaWxk
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzPElubGluZVRleHRCb3g+KCpsZWFmQ2hp
bGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBsZWFkaW5nRXhw
YW5zaW9uT3Bwb3J0dW5pdHkgZG9lc24ndCBhY3R1YWxseSB3b3JrIGJlY2F1c2UgaXQgZG9lc24n
dCBwZXJmb3JtIHRoZSBVQkEKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGb250Q2FzY2Fk
ZTo6dHJhaWxpbmdFeHBhbnNpb25PcHBvcnR1bml0eShkb3duY2FzdDxSZW5kZXJUZXh0PihsZWFm
Q2hpbGQtPnJlbmRlcmVyKCkpLnN0cmluZ1ZpZXcoKSwgbGVhZkNoaWxkLT5kaXJlY3Rpb24oKSkp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMZWFkaW5nRXhwYW5zaW9uID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gRm9yY2VMZWFkaW5nRXhw
YW5zaW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8v
IElmIHdlJ3JlIHRoZSBmaXJzdCBib3ggaW5zaWRlIGEgcnVieSBiYXNlLCBmb3JiaWQgYSBsZWFk
aW5nIGV4cGFuc2lvbiwgYW5kIHZpY2UtdmVyc2EKLSAgICAgICAgaWYgKGlzPFJlbmRlclJ1YnlC
YXNlPihibG9jaykpIHsKLSAgICAgICAgICAgIFJlbmRlclJ1YnlCYXNlJiBydWJ5QmFzZSA9IGRv
d25jYXN0PFJlbmRlclJ1YnlCYXNlPihibG9jayk7Ci0gICAgICAgICAgICBpZiAoJnRleHRCb3gg
PT0gcnVieUJhc2UuZmlyc3RSb290Qm94KCktPmZpcnN0TGVhZkNoaWxkKCkpIHsKLSAgICAgICAg
ICAgICAgICBzZXRMZWFkaW5nRXhwYW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXN1
bHQgfD0gRm9yYmlkTGVhZGluZ0V4cGFuc2lvbjsKLSAgICAgICAgICAgIH0gaWYgKCZ0ZXh0Qm94
ID09IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5sYXN0TGVhZkNoaWxkKCkpIHsKLSAgICAgICAg
ICAgICAgICBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVz
dWx0IHw9IEZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotICAgIGlmICghc2V0TGVhZGluZ0V4cGFuc2lvbikKLSAgICAgICAgcmVzdWx0IHw9
IGlzQWZ0ZXJFeHBhbnNpb24gPyBGb3JiaWRMZWFkaW5nRXhwYW5zaW9uIDogQWxsb3dMZWFkaW5n
RXhwYW5zaW9uOwotICAgIGlmICghc2V0VHJhaWxpbmdFeHBhbnNpb24pCi0gICAgICAgIHJlc3Vs
dCB8PSBBbGxvd1RyYWlsaW5nRXhwYW5zaW9uOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgdm9pZCBhcHBseUV4cGFuc2lvbkJlaGF2aW9yKElubGluZVRleHRCb3gmIHRl
eHRCb3gsIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9yKQotewotICAgIHN3aXRj
aCAoZXhwYW5zaW9uQmVoYXZpb3IgJiBMZWFkaW5nRXhwYW5zaW9uTWFzaykgewotICAgIGNhc2Ug
Rm9yY2VMZWFkaW5nRXhwYW5zaW9uOgotICAgICAgICB0ZXh0Qm94LnNldEZvcmNlTGVhZGluZ0V4
cGFuc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZvcmJpZExlYWRpbmdFeHBhbnNp
b246Ci0gICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZUxlYWRpbmdFeHBhbnNpb24oZmFsc2UpOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIEFsbG93TGVhZGluZ0V4cGFuc2lvbjoKLSAgICAgICAg
dGV4dEJveC5zZXRDYW5IYXZlTGVhZGluZ0V4cGFuc2lvbih0cnVlKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGV4cGFuc2lvbkJlaGF2aW9yICYgVHJhaWxpbmdFeHBh
bnNpb25NYXNrKSB7Ci0gICAgY2FzZSBGb3JjZVRyYWlsaW5nRXhwYW5zaW9uOgotICAgICAgICB0
ZXh0Qm94LnNldEZvcmNlVHJhaWxpbmdFeHBhbnNpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBGb3JiaWRUcmFpbGluZ0V4cGFuc2lvbjoKLSAgICAgICAgdGV4dEJveC5zZXRDYW5IYXZl
VHJhaWxpbmdFeHBhbnNpb24oZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFsbG93
VHJhaWxpbmdFeHBhbnNpb246Ci0gICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZVRyYWlsaW5nRXhw
YW5zaW9uKHRydWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9v
bCBpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luKGNvbnN0IFJlbmRl
ckJsb2NrRmxvdyYgYmxvY2ssIGNvbnN0IElubGluZUJveCYgYm94KQotewotICAgIGJvb2wgaXNM
VFIgPSBibG9jay5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICBmb3IgKGF1
dG8qIGN1cnJlbnRCb3ggPSBib3gucGFyZW50KCk7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBj
dXJyZW50Qm94LT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoKGlzTFRSICYmIGN1cnJlbnRCb3gt
Pm1hcmdpbkJvcmRlclBhZGRpbmdMb2dpY2FsTGVmdCgpID4gMCkKLSAgICAgICAgICAgIHx8ICgh
aXNMVFIgJiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xvZ2ljYWxSaWdodCgpID4g
MCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1zdGF0aWMgYm9vbCBpbmxpbmVBbmNlc3Rvckhhc0VuZEJvcmRlclBhZGRpbmdPck1hcmdp
bihjb25zdCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBJbmxpbmVCb3gmIGJveCkKLXsK
LSAgICBib29sIGlzTFRSID0gYmxvY2suc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7
Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50Qm94ID0gYm94LnBhcmVudCgpOyBjdXJyZW50Qm94OyBj
dXJyZW50Qm94ID0gY3VycmVudEJveC0+cGFyZW50KCkpIHsKLSAgICAgICAgaWYgKChpc0xUUiAm
JiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9naWNhbFJpZ2h0KCkgPiAwKQotICAg
ICAgICAgICAgfHwgKCFpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9n
aWNhbExlZnQoKSA+IDApKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJl
dHVybiBmYWxzZTsKLX0KLSAgICAKLXN0YXRpYyBib29sIGlzTGFzdEluRmxvd1J1bihCaWRpUnVu
JiBydW5Ub0NoZWNrKQotewotICAgIGZvciAoYXV0byogcnVuID0gcnVuVG9DaGVjay5uZXh0KCk7
IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKLSAgICAgICAgaWYgKCFydW4tPmJveCgpIHx8IHJ1
bi0+cmVuZGVyZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBydW4tPmJveCgpLT5pc0xp
bmVCcmVhaygpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0gICAgCi1CaWRpUnVuKiBSZW5kZXJCbG9ja0Zs
b3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVC
b3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgVGV4dEFsaWduTW9kZSB0ZXh0
QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwgCi0gICAgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIEdseXBo
T3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3Np
dGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsCi0gICAgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKLXsKLSAgICBib29sIG5lZWRzV29yZFNwYWNpbmcgPSBmYWxzZTsK
LSAgICBib29sIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgPSBzdHlsZSgpLmhhbmdpbmdQdW5j
dHVhdGlvbigpLmNvbnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6Rmlyc3QpOwotICAgIGJvb2wg
Y2FuSGFuZ1B1bmN0dWF0aW9uQXRFbmQgPSBzdHlsZSgpLmhhbmdpbmdQdW5jdHVhdGlvbigpLmNv
bnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6TGFzdCk7Ci0gICAgYm9vbCBpc0xUUiA9IHN0eWxl
KCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRo
ID0gbGluZUJveC0+Z2V0Rmxvd1NwYWNpbmdMb2dpY2FsV2lkdGgoKTsKLSAgICB1bnNpZ25lZCBl
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKLSAgICBib29sIGlzQWZ0ZXJFeHBhbnNpb24g
PSBpczxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpID8gZG93bmNhc3Q8UmVuZGVyUnVieUJhc2U+KCp0
aGlzKS5pc0FmdGVyRXhwYW5zaW9uKCkgOiB0cnVlOwotICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+
IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXM7Ci0KLSAgICBCaWRpUnVuKiBydW4gPSBmaXJzdFJ1bjsK
LSAgICBCaWRpUnVuKiBwcmV2aW91c1J1biA9IG51bGxwdHI7Ci0gICAgZm9yICg7IHJ1bjsgcnVu
ID0gcnVuLT5uZXh0KCkpIHsKLSAgICAgICAgYXV0byBjb21wdXRlRXhwYW5zaW9uT3Bwb3J0dW5p
dGllcyA9IFsmZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgJmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQsIHRleHRBbGlnbiwgJmlzQWZ0ZXJFeHBhbnNpb25dIChSZW5kZXJCbG9ja0Zsb3cmIGJsb2Nr
LAotICAgICAgICAgICAgSW5saW5lVGV4dEJveCYgdGV4dEJveCwgQmlkaVJ1biogcHJldmlvdXNS
dW4sIEJpZGlSdW4qIG5leHRSdW4sIGNvbnN0IFN0cmluZ1ZpZXcmIHN0cmluZ1ZpZXcsIFRleHRE
aXJlY3Rpb24gZGlyZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nVmll
dy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBFbXB0eSBydW5zIHNob3VsZCBzdGls
bCBwcm9kdWNlIGFuIGVudHJ5IGluIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMgbGlzdCBzbyB0aGF0
IHRoZSBudW1iZXIgb2YgaXRlbXMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHJ1bnMuCi0gICAgICAg
ICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hcHBlbmQoMCk7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRXhwYW5zaW9uQmVoYXZpb3Ig
ZXhwYW5zaW9uQmVoYXZpb3IgPSBleHBhbnNpb25CZWhhdmlvckZvcklubGluZVRleHRCb3goYmxv
Y2ssIHRleHRCb3gsIHByZXZpb3VzUnVuLCBuZXh0UnVuLCB0ZXh0QWxpZ24sIGlzQWZ0ZXJFeHBh
bnNpb24pOwotICAgICAgICAgICAgYXBwbHlFeHBhbnNpb25CZWhhdmlvcih0ZXh0Qm94LCBleHBh
bnNpb25CZWhhdmlvcik7Ci0gICAgICAgICAgICB1bnNpZ25lZCBvcHBvcnR1bml0aWVzSW5SdW47
Ci0gICAgICAgICAgICBzdGQ6OnRpZShvcHBvcnR1bml0aWVzSW5SdW4sIGlzQWZ0ZXJFeHBhbnNp
b24pID0gRm9udENhc2NhZGU6OmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoc3RyaW5nVmlldywg
ZGlyZWN0aW9uLCBleHBhbnNpb25CZWhhdmlvcik7Ci0gICAgICAgICAgICBleHBhbnNpb25PcHBv
cnR1bml0aWVzLmFwcGVuZChvcHBvcnR1bml0aWVzSW5SdW4pOwotICAgICAgICAgICAgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCArPSBvcHBvcnR1bml0aWVzSW5SdW47Ci0gICAgICAgIH07Ci0g
ICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4tPnJlbmRlcmVyKCkuaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkgfHwgcnVuLT5ib3goKS0+aXNMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgY29u
dGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0aW5nIHRvIGZp
Z3VyZSBvdXQgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHN0YXRpYyB4
IHBvc2l0aW9uLiAgVGhleSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguCi0gICAgICAgICAg
ICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBsaW5lIGJyZWFrIGJveGVzIGhhdmUgbm8gZWZmZWN0
IG9uIHRoZSB3aWR0aC4KLSAgICAgICAgfQotICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocnVu
LT5yZW5kZXJlcigpKSkgewotICAgICAgICAgICAgYXV0byYgcmVuZGVyVGV4dCA9IGRvd25jYXN0
PFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBhdXRvJiB0ZXh0Qm94
ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpOwotICAgICAgICAgICAgaWYg
KGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgJiYgbGluZUluZm8uaXNGaXJzdExpbmUoKSAmJiAo
aXNMVFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQotICAgICAgICAgICAgICAgICYmICFpbmxp
bmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0aGlzLCAqcnVuLT5ib3go
KSkpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBoYW5nU3RhcnRXaWR0aCA9IHJlbmRlclRleHQu
aGFuZ2FibGVQdW5jdHVhdGlvblN0YXJ0V2lkdGgocnVuLT5tX3N0YXJ0KTsKLSAgICAgICAgICAg
ICAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ1N0YXJ0V2lkdGg7Ci0gICAgICAgICAg
ICAgICAgaWYgKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICAgICAg
ICAgICAgICBsb2dpY2FsTGVmdCAtPSBoYW5nU3RhcnRXaWR0aDsKLSAgICAgICAgICAgICAgICBj
YW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25BdEVuZCAmJiBsaW5lSW5m
by5pc0xhc3RMaW5lKCkgJiYgcnVuLT5tX3N0b3AgPiAwICYmICghaXNMVFIgfHwgaXNMYXN0SW5G
bG93UnVuKCpydW4pKQotICAgICAgICAgICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc0VuZEJv
cmRlclBhZGRpbmdPck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7Ci0gICAgICAgICAgICAg
ICAgZmxvYXQgaGFuZ0VuZFdpZHRoID0gcmVuZGVyVGV4dC5oYW5nYWJsZVB1bmN0dWF0aW9uRW5k
V2lkdGgocnVuLT5tX3N0b3AgLSAxKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2Fs
V2lkdGggKz0gaGFuZ0VuZFdpZHRoOwotICAgICAgICAgICAgICAgIGlmICghc3R5bGUoKS5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxMZWZ0IC09
IGhhbmdFbmRXaWR0aDsKLSAgICAgICAgICAgICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdEVuZCA9
IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGV4
dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5nU3BhY2VS
dW4pCi0gICAgICAgICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMoKnRoaXMs
IHRleHRCb3gsIHByZXZpb3VzUnVuLCBydW4tPm5leHQoKSwgcmVuZGVyVGV4dC5zdHJpbmdWaWV3
KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3ApLCBydW4tPmJveCgpLT5kaXJlY3Rpb24oKSk7Ci0K
LSAgICAgICAgICAgIGlmICh1bnNpZ25lZCBsZW5ndGggPSByZW5kZXJUZXh0LnRleHQoKS5sZW5n
dGgoKSkgewotICAgICAgICAgICAgICAgIGlmICghcnVuLT5tX3N0YXJ0ICYmIG5lZWRzV29yZFNw
YWNpbmcgJiYgaXNTcGFjZU9yTmV3bGluZShyZW5kZXJUZXh0LmNoYXJhY3RlckF0KHJ1bi0+bV9z
dGFydCkpKQotICAgICAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCArPSBsaW5lU3R5
bGUoKnJlbmRlclRleHQucGFyZW50KCksIGxpbmVJbmZvKS5mb250Q2FzY2FkZSgpLndvcmRTcGFj
aW5nKCk7Ci0gICAgICAgICAgICAgICAgLy8gcnVuLT5tX3N0YXJ0ID09IHJ1bi0+bV9zdG9wIHNo
b3VsZCBvbmx5IGJlIHRydWUgaWZmIHRoZSBydW4gaXMgYSByZXBsYWNlZCBydW4gZm9yIGJpZGk6
IGlzb2xhdGUuCi0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi0+bV9zdG9wID4gMCB8fCBydW4t
Pm1fc3RhcnQgPT0gcnVuLT5tX3N0b3ApOwotICAgICAgICAgICAgICAgIG5lZWRzV29yZFNwYWNp
bmcgPSBydW4tPm1fc3RvcCA9PSBsZW5ndGggJiYgIWlzU3BhY2VPck5ld2xpbmUocmVuZGVyVGV4
dC5jaGFyYWN0ZXJBdChydW4tPm1fc3RvcCAtIDEpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgc2V0TG9naWNhbFdpZHRoRm9yVGV4dFJ1bihsaW5lQm94LCBydW4sIHJlbmRlclRleHQs
IHRvdGFsTG9naWNhbFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9z
aXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICBib29s
IGVuY291bnRlcmVkSnVzdGlmaWVkUnVieSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGlzPFJl
bmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSkgJiYgdGV4dEFsaWduID09IFRleHRBbGlnbk1v
ZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5nU3BhY2VSdW4gJiYgZG93bmNhc3Q8UmVuZGVy
UnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpKSB7Ci0gICAgICAgICAgICAgICAg
YXV0byogcnVieUJhc2UgPSBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkp
LnJ1YnlCYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1YnlCYXNlLT5maXJzdFJvb3RCb3go
KSAmJiAhcnVieUJhc2UtPmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpICYmIHJ1bi0+cmVu
ZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJ1YnlCYXNlLT5zZXRJc0FmdGVyRXhwYW5zaW9uKGlzQWZ0ZXJFeHBhbnNpb24pOwotICAg
ICAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1YnlCYXNlLT5maXJzdFJv
b3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKTsgbGVhZkNoaWxkOyBsZWFmQ2hpbGQgPSBsZWFmQ2hp
bGQtPm5leHRMZWFmQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpczxJ
bmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkSnVzdGlmaWVkUnVi
eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlRXhwYW5zaW9uT3Bwb3J0
dW5pdGllcygqcnVieUJhc2UsIGRvd25jYXN0PElubGluZVRleHRCb3g+KCpsZWFmQ2hpbGQpLCBu
dWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJl
bmRlclRleHQ+KGxlYWZDaGlsZC0+cmVuZGVyZXIoKSkuc3RyaW5nVmlldygpLCBsZWFmQ2hpbGQt
PmRpcmVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlbmNvdW50ZXJlZEp1c3RpZmllZFJ1
YnkpCi0gICAgICAgICAgICAgICAgaXNBZnRlckV4cGFuc2lvbiA9IGZhbHNlOwotCi0gICAgICAg
ICAgICBpZiAoIWlzPFJlbmRlcklubGluZT4ocnVuLT5yZW5kZXJlcigpKSkgewotICAgICAgICAg
ICAgICAgIGF1dG8mIHJlbmRlckJveCA9IGRvd25jYXN0PFJlbmRlckJveD4ocnVuLT5yZW5kZXJl
cigpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXM8UmVuZGVyUnVieVJ1bj4ocmVuZGVyQm94KSkK
LSAgICAgICAgICAgICAgICAgICAgc2V0TWFyZ2luc0ZvclJ1YnlSdW4ocnVuLCBkb3duY2FzdDxS
ZW5kZXJSdWJ5UnVuPihyZW5kZXJCb3gpLCBwcmV2aW91c1J1biA/ICZwcmV2aW91c1J1bi0+cmVu
ZGVyZXIoKSA6IG51bGxwdHIsIGxpbmVJbmZvKTsKLSAgICAgICAgICAgICAgICBydW4tPmJveCgp
LT5zZXRMb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoRm9yQ2hpbGQocmVuZGVyQm94KSk7Ci0gICAg
ICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gbWFyZ2luU3RhcnRGb3JDaGlsZChyZW5k
ZXJCb3gpICsgbWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyQm94KTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IHJ1bi0+Ym94KCktPmxvZ2lj
YWxXaWR0aCgpOwotICAgICAgICBwcmV2aW91c1J1biA9IHJ1bjsKLSAgICB9Ci0KLSAgICBpZiAo
aXNBZnRlckV4cGFuc2lvbiAmJiAhZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5pc0VtcHR5KCkpIHsK
LSAgICAgICAgLy8gRklYTUU6IHNlZSA8d2Via2l0Lm9yZy9iLzEzOTM5MyNjMTE+Ci0gICAgICAg
IGludCBsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXggPSBleHBhbnNpb25PcHBv
cnR1bml0aWVzLnNpemUoKSAtIDE7Ci0gICAgICAgIHdoaWxlIChsYXN0VmFsaWRFeHBhbnNpb25P
cHBvcnR1bml0aWVzSW5kZXggPj0gMCAmJiAhZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hdChsYXN0
VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgpKQotICAgICAgICAgICAgLS1sYXN0VmFs
aWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXg7Ci0gICAgICAgIGlmIChsYXN0VmFsaWRFeHBh
bnNpb25PcHBvcnR1bml0aWVzSW5kZXggPj0gMCkgewotICAgICAgICAgICAgQVNTRVJUKGV4cGFu
c2lvbk9wcG9ydHVuaXRpZXMuYXQobGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0luZGV4
KSk7Ci0gICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmF0KGxhc3RWYWxpZEV4cGFu
c2lvbk9wcG9ydHVuaXRpZXNJbmRleCktLTsKLSAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9ydHVu
aXR5Q291bnQtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpczxSZW5kZXJSdWJ5QmFz
ZT4oKnRoaXMpICYmICFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQotICAgICAgICB0ZXh0QWxp
Z24gPSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI7Ci0KLSAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JB
bGlnbm1lbnQodGV4dEFsaWduLCBsaW5lQm94LCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVm
dCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudCk7Ci0KLSAgICBjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dChm
aXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCk7Ci0KLSAgICByZXR1cm4gcnVuOwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVt
b3ZlSW5saW5lQm94KEJpZGlSdW4mIHJ1biwgY29uc3QgUm9vdElubGluZUJveCYgcm9vdExpbmVC
b3gpIGNvbnN0Ci17Ci0gICAgYXV0byogaW5saW5lQm94ID0gcnVuLmJveCgpOwotI2lmICFBU1NF
UlRfRElTQUJMRUQKLSAgICBhdXRvKiBpbmxpbmVQYXJlbnQgPSBpbmxpbmVCb3gtPnBhcmVudCgp
OwotICAgIHdoaWxlIChpbmxpbmVQYXJlbnQgJiYgaW5saW5lUGFyZW50ICE9ICZyb290TGluZUJv
eCkgewotICAgICAgICBBU1NFUlQoIWlubGluZVBhcmVudC0+aXNEaXJ0eSgpKTsKLSAgICAgICAg
aW5saW5lUGFyZW50ID0gaW5saW5lUGFyZW50LT5wYXJlbnQoKTsKLSAgICB9Ci0gICAgQVNTRVJU
KCFyb290TGluZUJveC5pc0RpcnR5KCkpOwotI2VuZGlmCi0gICAgYXV0byogcGFyZW50ID0gaW5s
aW5lQm94LT5wYXJlbnQoKTsKLSAgICBpbmxpbmVCb3gtPnJlbW92ZUZyb21QYXJlbnQoKTsKLQot
ICAgIGF1dG8mIHJlbmRlcmVyID0gcnVuLnJlbmRlcmVyKCk7Ci0gICAgaWYgKGlzPFJlbmRlclRl
eHQ+KHJlbmRlcmVyKSkKLSAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4ocmVuZGVyZXIpLnJl
bW92ZVRleHRCb3goZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKmlubGluZUJveCkpOwotICAgIGRl
bGV0ZSBpbmxpbmVCb3g7Ci0gICAgcnVuLnNldEJveChudWxscHRyKTsKLSAgICAvLyByZW1vdmVG
cm9tUGFyZW50KCkgdW5uZWNlc3NhcmlseSBkaXJ0aWVzIHRoZSBhbmNlc3RvciBzdWJ0cmVlLgot
ICAgIGF1dG8qIGFuY2VzdG9yID0gcGFyZW50OwotICAgIHdoaWxlIChhbmNlc3RvcikgewotICAg
ICAgICBhbmNlc3Rvci0+bWFya0RpcnR5KGZhbHNlKTsKLSAgICAgICAgaWYgKGFuY2VzdG9yID09
ICZyb290TGluZUJveCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBhbmNlc3RvciA9IGFu
Y2VzdG9yLT5wYXJlbnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21w
dXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hl
KQotewotICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJl
Y3Rpb24obG9naWNhbEhlaWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNh
Y2hlKSk7Ci0KLSAgICAvLyBOb3cgbWFrZSBzdXJlIHdlIHBsYWNlIHJlcGxhY2VkIHJlbmRlciBv
YmplY3RzIGNvcnJlY3RseS4KLSAgICBmb3IgKGF1dG8qIHJ1biA9IGZpcnN0UnVuOyBydW47IHJ1
biA9IHJ1bi0+bmV4dCgpKSB7Ci0gICAgICAgIEFTU0VSVChydW4tPmJveCgpKTsKLSAgICAgICAg
aWYgKCFydW4tPmJveCgpKQotICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgcnVucyB3aXRo
IG5vIGxpbmUgYm94ZXMuCi0KLSAgICAgICAgLy8gQWxpZ24gcG9zaXRpb25lZCBib3hlcyB3aXRo
IHRoZSB0b3Agb2YgdGhlIGxpbmUgYm94LiAgVGhpcyBpcwotICAgICAgICAvLyBhIHJlYXNvbmFi
bGUgYXBwcm94aW1hdGlvbiBvZiBhbiBhcHByb3ByaWF0ZSB5IHBvc2l0aW9uLgotICAgICAgICBh
dXRvJiByZW5kZXJlciA9IHJ1bi0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKHJlbmRlcmVyLmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgcnVuLT5ib3goKS0+c2V0TG9naWNh
bFRvcChsb2dpY2FsSGVpZ2h0KCkpOwotCi0gICAgICAgIC8vIFBvc2l0aW9uIGlzIHVzZWQgdG8g
cHJvcGVybHkgcG9zaXRpb24gYm90aCByZXBsYWNlZCBlbGVtZW50cyBhbmQKLSAgICAgICAgLy8g
dG8gdXBkYXRlIHRoZSBzdGF0aWMgbm9ybWFsIGZsb3cgeC95IG9mIHBvc2l0aW9uZWQgZWxlbWVu
dHMuCi0gICAgICAgIGJvb2wgaW5saW5lQm94SXNSZWR1bmRhbnQgPSBmYWxzZTsKLSAgICAgICAg
aWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkgewotICAgICAgICAgICAgYXV0byYgaW5saW5l
VGV4dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+KCpydW4tPmJveCgpKTsKLSAgICAgICAg
ICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKS5wb3NpdGlvbkxpbmVCb3goaW5saW5l
VGV4dEJveCk7Ci0gICAgICAgICAgICBpbmxpbmVCb3hJc1JlZHVuZGFudCA9ICFpbmxpbmVUZXh0
Qm94Lmhhc1RleHRDb250ZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXM8UmVuZGVyQm94Pihy
ZW5kZXJlcikpIHsKLSAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJveD4ocmVuZGVyZXIpLnBv
c2l0aW9uTGluZUJveChkb3duY2FzdDxJbmxpbmVFbGVtZW50Qm94PigqcnVuLT5ib3goKSkpOwot
ICAgICAgICAgICAgaW5saW5lQm94SXNSZWR1bmRhbnQgPSByZW5kZXJlci5pc091dE9mRmxvd1Bv
c2l0aW9uZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KHJlbmRl
cmVyKSkKLSAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckxpbmVCcmVhaz4ocmVuZGVyZXIpLnJl
cGxhY2VJbmxpbmVCb3hXcmFwcGVyKGRvd25jYXN0PElubGluZUVsZW1lbnRCb3g+KCpydW4tPmJv
eCgpKSk7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8ga2VlcCB0aGlzIGJveCBvbiB0
aGUgbGluZSBhdCBhbGwuCi0gICAgICAgIGlmIChpbmxpbmVCb3hJc1JlZHVuZGFudCkKLSAgICAg
ICAgICAgIHJlbW92ZUlubGluZUJveCgqcnVuLCAqbGluZUJveCk7Ci0gICAgfQotfQotCi1zdGF0
aWMgaW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgY29uc3Qg
UmVuZGVyVGV4dCYgcmVuZGVyZXIpCi17Ci0gICAgaWYgKGNoYXJhY3RlciA9PSAnICcgfHwgY2hh
cmFjdGVyID09ICdcdCcgfHwgY2hhcmFjdGVyID09IHNvZnRIeXBoZW4pCi0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykKLSAgICAgICAgcmV0dXJuICFyZW5k
ZXJlci5zdHlsZSgpLnByZXNlcnZlTmV3bGluZSgpOwotICAgIGlmIChjaGFyYWN0ZXIgPT0gbm9C
cmVha1NwYWNlKQotICAgICAgICByZXR1cm4gcmVuZGVyZXIuc3R5bGUoKS5uYnNwTW9kZSgpID09
IE5CU1BNb2RlOjpTcGFjZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlIDx0eXBl
bmFtZSBDaGFyYWN0ZXJUeXBlPgotc3RhdGljIGlubGluZSB1bnNpZ25lZCBmaW5kRmlyc3RUcmFp
bGluZ1NwYWNlKGNvbnN0IFJlbmRlclRleHQmIGxhc3RUZXh0LCBjb25zdCBDaGFyYWN0ZXJUeXBl
KiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCkKLXsKLSAgICB1bnNp
Z25lZCBmaXJzdFNwYWNlID0gc3RvcDsKLSAgICB3aGlsZSAoZmlyc3RTcGFjZSA+IHN0YXJ0KSB7
Ci0gICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0U3BhY2UgLSAxXTsKLSAg
ICAgICAgaWYgKCFpc0NvbGxhcHNpYmxlU3BhY2UoY3VycmVudCwgbGFzdFRleHQpKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGZpcnN0U3BhY2UtLTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
Zmlyc3RTcGFjZTsKLX0KLQotaW5saW5lIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6aGFuZGxl
VHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBCaWRpQ29udGV4
dCogY3VycmVudENvbnRleHQpCi17Ci0gICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpCi0gICAg
ICAgIHx8ICFiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkuc3R5bGUoKS5i
cmVha09ubHlBZnRlcldoaXRlU3BhY2UoKQotICAgICAgICB8fCAhYmlkaVJ1bnMubG9naWNhbGx5
TGFzdFJ1bigpLT5yZW5kZXJlcigpLnN0eWxlKCkuYXV0b1dyYXAoKSkKLSAgICAgICAgcmV0dXJu
IG51bGxwdHI7Ci0KLSAgICBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuID0gYmlkaVJ1bnMubG9n
aWNhbGx5TGFzdFJ1bigpOwotICAgIGNvbnN0IFJlbmRlck9iamVjdCYgbGFzdE9iamVjdCA9IHRy
YWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCk7Ci0gICAgaWYgKCFpczxSZW5kZXJUZXh0PihsYXN0
T2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBjb25zdCBSZW5kZXJUZXh0
JiBsYXN0VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KGxhc3RPYmplY3QpOwotICAgIHVuc2ln
bmVkIGZpcnN0U3BhY2U7Ci0gICAgaWYgKGxhc3RUZXh0LnRleHQoKS5pczhCaXQoKSkKLSAgICAg
ICAgZmlyc3RTcGFjZSA9IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UobGFzdFRleHQsIGxhc3RUZXh0
LnRleHQoKS5jaGFyYWN0ZXJzOCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdGFydCgpLCB0cmFpbGlu
Z1NwYWNlUnVuLT5zdG9wKCkpOwotICAgIGVsc2UKLSAgICAgICAgZmlyc3RTcGFjZSA9IGZpbmRG
aXJzdFRyYWlsaW5nU3BhY2UobGFzdFRleHQsIGxhc3RUZXh0LnRleHQoKS5jaGFyYWN0ZXJzMTYo
KSwgdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSwgdHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpKTsK
LQotICAgIGlmIChmaXJzdFNwYWNlID09IHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSkKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0eWxl
KCkuZGlyZWN0aW9uKCk7Ci0gICAgYm9vbCBzaG91bGRSZW9yZGVyID0gdHJhaWxpbmdTcGFjZVJ1
biAhPSAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUiA/IGJpZGlSdW5zLmxhc3RSdW4o
KSA6IGJpZGlSdW5zLmZpcnN0UnVuKCkpOwotICAgIGlmIChmaXJzdFNwYWNlICE9IHRyYWlsaW5n
U3BhY2VSdW4tPnN0YXJ0KCkpIHsKLSAgICAgICAgQmlkaUNvbnRleHQqIGJhc2VDb250ZXh0ID0g
Y3VycmVudENvbnRleHQ7Ci0gICAgICAgIHdoaWxlIChCaWRpQ29udGV4dCogcGFyZW50ID0gYmFz
ZUNvbnRleHQtPnBhcmVudCgpKQotICAgICAgICAgICAgYmFzZUNvbnRleHQgPSBwYXJlbnQ7Ci0K
LSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJpZGlSdW4+IG5ld1RyYWlsaW5nUnVuID0gc3RkOjpt
YWtlX3VuaXF1ZTxCaWRpUnVuPihmaXJzdFNwYWNlLCB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0b3As
IHRyYWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCksIGJhc2VDb250ZXh0LCBVX09USEVSX05FVVRS
QUwpOwotICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0b3AgPSBmaXJzdFNwYWNlOwotICAg
ICAgICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3VHJhaWxpbmdSdW4uZ2V0KCk7Ci0gICAgICAgIGlm
IChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQotICAgICAgICAgICAgYmlkaVJ1bnMu
YXBwZW5kUnVuKFdURk1vdmUobmV3VHJhaWxpbmdSdW4pKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgYmlkaVJ1bnMucHJlcGVuZFJ1bihXVEZNb3ZlKG5ld1RyYWlsaW5nUnVuKSk7Ci0gICAg
ICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOwotICAgIH0KLSAgICBpZiAoIXNob3VsZFJlb3Jk
ZXIpCi0gICAgICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOwotCi0gICAgaWYgKGRpcmVjdGlv
biA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpIHsKLSAgICAgICAgYmlkaVJ1bnMubW92ZVJ1blRvRW5k
KHRyYWlsaW5nU3BhY2VSdW4pOwotICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX2xldmVsID0g
MDsKLSAgICB9IGVsc2UgewotICAgICAgICBiaWRpUnVucy5tb3ZlUnVuVG9CZWdpbm5pbmcodHJh
aWxpbmdTcGFjZVJ1bik7Ci0gICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1fbGV2ZWwgPSAxOwot
ICAgIH0KLSAgICByZXR1cm4gdHJhaWxpbmdTcGFjZVJ1bjsKLX0KLQotdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9hdGluZ09iamVjdCYgZmxv
YXRpbmdPYmplY3QpCi17Ci0gICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIWZs
b2F0aW5nT2JqZWN0Lm9yaWdpbmF0aW5nTGluZSgpKTsKLSAgICBBU1NFUlQobGFzdFJvb3RCb3go
KSk7Ci0gICAgZmxvYXRpbmdPYmplY3Quc2V0T3JpZ2luYXRpbmdMaW5lKCpsYXN0Um9vdEJveCgp
KTsKLSAgICBsYXN0Um9vdEJveCgpLT5hcHBlbmRGbG9hdChmbG9hdGluZ09iamVjdC5yZW5kZXJl
cigpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5vdGlmeVJlc29sdmVyVG9SZXN1bWVJbklz
b2xhdGUoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgUmVuZGVyT2JqZWN0KiByb290LCBS
ZW5kZXJPYmplY3QqIHN0YXJ0T2JqZWN0KQotewotICAgIGlmIChyb290ICE9IHN0YXJ0T2JqZWN0
KSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50ID0gc3RhcnRPYmplY3QtPnBhcmVudCgp
OwotICAgICAgICBub3RpZnlSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRlKHJlc29sdmVyLCByb290
LCBwYXJlbnQpOwotICAgICAgICBub3RpZnlPYnNlcnZlckVudGVyZWRPYmplY3QoJnJlc29sdmVy
LCBzdGFydE9iamVjdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0VXBSZXNv
bHZlclRvUmVzdW1lSW5Jc29sYXRlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIElubGlu
ZUJpZGlSZXNvbHZlciYgdG9wUmVzb2x2ZXIsIEJpZGlSdW4mIGlzb2xhdGVkUnVuLCBSZW5kZXJP
YmplY3QqIHJvb3QsIFJlbmRlck9iamVjdCogc3RhcnRPYmplY3QpCi17Ci0gICAgLy8gU2V0IHVw
IG1fd2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZQotICAgIHJlc29sdmVyLndoaXRlc3BhY2VDb2xs
YXBzaW5nU3RhdGUoKSA9IHRvcFJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKTsK
LSAgICByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCkuc2V0Q3VycmVudFRyYW5z
aXRpb24odG9wUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFuc2l0aW9uRm9ySXNvbGF0
ZWRSdW4oaXNvbGF0ZWRSdW4pKTsKLQotICAgIC8vIFNldCB1cCBtX25lc3RlZElzb2xhdGVDb3Vu
dAotICAgIG5vdGlmeVJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUocmVzb2x2ZXIsIHJvb3QsIHN0
YXJ0T2JqZWN0KTsKLX0KLQotLy8gRklYTUU6IEJpZGlSZXNvbHZlciBzaG91bGQgaGF2ZSB0aGlz
IGxvZ2ljLgotc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlSdW5zRm9yU2VnbWVudChJ
bmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29sdmVyLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlk
aVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRPZlJ1bnMsIFZpc3VhbERpcmVjdGlvbk92
ZXJyaWRlIG92ZXJyaWRlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkKLXsKLSAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgYSBCaWRpUnVuTGlzdCBpbnRvIGNyZWF0ZUJpZGlSdW5z
Rm9yTGluZSBpbnN0ZWFkCi0gICAgLy8gb2YgdGhlIHJlc29sdmVyIG93bmluZyB0aGUgcnVucy4K
LSAgICBBU1NFUlQoJnRvcFJlc29sdmVyLnJ1bnMoKSA9PSAmYmlkaVJ1bnMpOwotICAgIEFTU0VS
VCh0b3BSZXNvbHZlci5wb3NpdGlvbigpICE9IGVuZE9mUnVucyk7Ci0gICAgUmVuZGVyT2JqZWN0
KiBjdXJyZW50Um9vdCA9IHRvcFJlc29sdmVyLnBvc2l0aW9uKCkucm9vdCgpOwotICAgIHRvcFJl
c29sdmVyLmNyZWF0ZUJpZGlSdW5zRm9yTGluZShlbmRPZlJ1bnMsIG92ZXJyaWRlLCBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkpOwotCi0gICAgd2hpbGUgKCF0b3BSZXNvbHZlci5pc29sYXRlZFJ1
bnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gSXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIG9y
ZGVyIHdlIHJlc29sdmUgdGhlIHJ1bnMgYXMgbG9uZyBhcyB3ZSByZXNvbHZlIHRoZW0gYWxsLgot
ICAgICAgICBhdXRvIGlzb2xhdGVkUnVuID0gV1RGTW92ZSh0b3BSZXNvbHZlci5pc29sYXRlZFJ1
bnMoKS5sYXN0KCkpOwotICAgICAgICB0b3BSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5yZW1vdmVM
YXN0KCk7Ci0gICAgICAgIGN1cnJlbnRSb290ID0gJmlzb2xhdGVkUnVuLnJvb3Q7Ci0KLSAgICAg
ICAgUmVuZGVyT2JqZWN0JiBzdGFydE9iamVjdCA9IGlzb2xhdGVkUnVuLm9iamVjdDsKLQotICAg
ICAgICAvLyBPbmx5IGlubGluZXMgbWFrZSBzZW5zZSB3aXRoIHVuaWNvZGUtYmlkaTogaXNvbGF0
ZSAoYmxvY2tzIGFyZSBhbHJlYWR5IGlzb2xhdGVkKS4KLSAgICAgICAgLy8gRklYTUU6IEJlY2F1
c2UgZW50ZXJJc29sYXRlIGlzIG5vdCBwYXNzZWQgYSBSZW5kZXJPYmplY3QsIHdlIGhhdmUgdG8g
Y3Jhd2wgdXAgdGhlCi0gICAgICAgIC8vIHRyZWUgdG8gc2VlIHdoaWNoIHBhcmVudCBpbmxpbmUg
aXMgdGhlIGlzb2xhdGUuIFdlIGNvdWxkIGNoYW5nZSBlbnRlcklzb2xhdGUKLSAgICAgICAgLy8g
dG8gdGFrZSBhIFJlbmRlck9iamVjdCBhbmQgZG8gdGhpcyBsb2dpYyB0aGVyZSwgYnV0IHRoYXQg
d291bGQgYmUgYSBsYXllcmluZwotICAgICAgICAvLyB2aW9sYXRpb24gZm9yIEJpZGlSZXNvbHZl
ciAod2hpY2gga25vd3Mgbm90aGluZyBhYm91dCBSZW5kZXJPYmplY3QpLgotICAgICAgICBSZW5k
ZXJJbmxpbmUqIGlzb2xhdGVkSW5saW5lID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPihoaWdoZXN0
Q29udGFpbmluZ0lzb2xhdGVXaXRoaW5Sb290KHN0YXJ0T2JqZWN0LCBjdXJyZW50Um9vdCkpOwot
ICAgICAgICBBU1NFUlQoaXNvbGF0ZWRJbmxpbmUpOwotCi0gICAgICAgIElubGluZUJpZGlSZXNv
bHZlciBpc29sYXRlZFJlc29sdmVyOwotICAgICAgICBFVW5pY29kZUJpZGkgdW5pY29kZUJpZGkg
PSBpc29sYXRlZElubGluZS0+c3R5bGUoKS51bmljb2RlQmlkaSgpOwotICAgICAgICBUZXh0RGly
ZWN0aW9uIGRpcmVjdGlvbjsKLSAgICAgICAgaWYgKHVuaWNvZGVCaWRpID09IFBsYWludGV4dCkK
LSAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRpcmVjdGlvbiwgSW5saW5lSXRl
cmF0b3IoaXNvbGF0ZWRJbmxpbmUsICZpc29sYXRlZFJ1bi5vYmplY3QsIDApKTsKLSAgICAgICAg
ZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQodW5pY29kZUJpZGkgPT0gSXNvbGF0ZSB8fCB1bmlj
b2RlQmlkaSA9PSBJc29sYXRlT3ZlcnJpZGUpOwotICAgICAgICAgICAgZGlyZWN0aW9uID0gaXNv
bGF0ZWRJbmxpbmUtPnN0eWxlKCkuZGlyZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaXNv
bGF0ZWRSZXNvbHZlci5zZXRTdGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rpb24sIGlzT3ZlcnJpZGUo
dW5pY29kZUJpZGkpKSk7Ci0KLSAgICAgICAgc2V0VXBSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRl
KGlzb2xhdGVkUmVzb2x2ZXIsIHRvcFJlc29sdmVyLCBpc29sYXRlZFJ1bi5ydW5Ub1JlcGxhY2Us
IGlzb2xhdGVkSW5saW5lLCAmc3RhcnRPYmplY3QpOwotCi0gICAgICAgIC8vIFRoZSBzdGFydGlu
ZyBwb3NpdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBydW4gd2l0aGluIHRoZSBp
c29sYXRlIHRoYXQgd2FzIGlkZW50aWZpZWQKLSAgICAgICAgLy8gZHVyaW5nIHRoZSBlYXJsaWVy
IGNhbGwgdG8gY3JlYXRlQmlkaVJ1bnNGb3JMaW5lLiBUaGlzIGNhbiBiZSBidXQgaXMgbm90IG5l
Y2Vzc2FyaWx5IHRoZQotICAgICAgICAvLyBmaXJzdCBydW4gd2l0aGluIHRoZSBpc29sYXRlLgot
ICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0b3IoaXNvbGF0ZWRJbmxp
bmUsICZzdGFydE9iamVjdCwgaXNvbGF0ZWRSdW4ucG9zaXRpb24pOwotICAgICAgICBpc29sYXRl
ZFJlc29sdmVyLnNldFBvc2l0aW9uSWdub3JpbmdOZXN0ZWRJc29sYXRlcyhpdGVyKTsKLQotICAg
ICAgICAvLyBXZSBzdG9wIGF0IHRoZSBuZXh0IGVuZCBvZiBsaW5lOyB3ZSBtYXkgcmUtZW50ZXIg
dGhpcyBpc29sYXRlIGluIHRoZSBuZXh0IGNhbGwgdG8gY29uc3RydWN0QmlkaVJ1bnMoKS4KLSAg
ICAgICAgLy8gRklYTUU6IFdoYXQgc2hvdWxkIGVuZCBhbmQgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5IGJlPwotICAgICAgICAvLyBybml3YSBzYXlzIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSBp
cyBqdXN0IGEgV2luSUUgaGFjayBhbmQgY291bGQgYWx3YXlzIGJlIGZhbHNlIGhlcmU/Ci0gICAg
ICAgIGlzb2xhdGVkUmVzb2x2ZXIuY3JlYXRlQmlkaVJ1bnNGb3JMaW5lKGVuZE9mUnVucywgTm9W
aXN1YWxPdmVycmlkZSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKLSAgICAgICAgLy8gTm90
ZSB0aGF0IHdlIGRvIG5vdCBkZWxldGUgdGhlIHJ1bnMgZnJvbSB0aGUgcmVzb2x2ZXIuCi0gICAg
ICAgIC8vIFdlJ3JlIG5vdCBndWFyYW50ZWVkIHRvIGdldCBhbnkgQmlkaVJ1bnMgaW4gdGhlIHBy
ZXZpb3VzIHN0ZXAuIElmIHdlIGRvbid0LCB3ZSBhbGxvdyB0aGUgcGxhY2Vob2xkZXIKLSAgICAg
ICAgLy8gaXRzZWxmIHRvIGJlIHR1cm5lZCBpbnRvIGFuIElubGluZUJveC4gV2UgY2FuJ3QgcmVt
b3ZlIGl0IGhlcmUgd2l0aG91dCBwb3RlbnRpYWxseSBsb3NpbmcgdHJhY2sgb2YKLSAgICAgICAg
Ly8gdGhlIGxvZ2ljYWxseSBsYXN0IHJ1bi4KLSAgICAgICAgaWYgKGlzb2xhdGVkUmVzb2x2ZXIu
cnVucygpLnJ1bkNvdW50KCkpCi0gICAgICAgICAgICBiaWRpUnVucy5yZXBsYWNlUnVuV2l0aFJ1
bnMoJmlzb2xhdGVkUnVuLnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRSZXNvbHZlci5ydW5zKCkpOwot
Ci0gICAgICAgIC8vIElmIHdlIGVuY291bnRlcmVkIGFueSBuZXN0ZWQgaXNvbGF0ZSBydW5zLCBq
dXN0IG1vdmUgdGhlbQotICAgICAgICAvLyB0byB0aGUgdG9wIHJlc29sdmVyJ3MgbGlzdCBmb3Ig
bGF0ZXIgcHJvY2Vzc2luZy4KLSAgICAgICAgd2hpbGUgKCFpc29sYXRlZFJlc29sdmVyLmlzb2xh
dGVkUnVucygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXV0byBydW5XaXRoQ29udGV4dCA9
IFdURk1vdmUoaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5sYXN0KCkpOwotICAgICAg
ICAgICAgaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5yZW1vdmVMYXN0KCk7Ci0gICAg
ICAgICAgICB0b3BSZXNvbHZlci5zZXRXaGl0ZXNwYWNlQ29sbGFwc2luZ1RyYW5zaXRpb25Gb3JJ
c29sYXRlZFJ1bihydW5XaXRoQ29udGV4dC5ydW5Ub1JlcGxhY2UsIGlzb2xhdGVkUmVzb2x2ZXIu
d2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFuc2l0aW9uRm9ySXNvbGF0ZWRSdW4ocnVuV2l0aENvbnRl
eHQucnVuVG9SZXBsYWNlKSk7Ci0gICAgICAgICAgICB0b3BSZXNvbHZlci5pc29sYXRlZFJ1bnMo
KS5hcHBlbmQoV1RGTW92ZShydW5XaXRoQ29udGV4dCkpOwotICAgICAgICB9Ci0gICAgfQotfQot
Ci0vLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBmb3IgYWxsIG9mIHRoZSB0
ZXh0IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVpciBwb3NpdGlvbi4KLVJv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5z
KHVuc2lnbmVkIGJpZGlMZXZlbCwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25z
dCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9zaXRp
b25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVu
LCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAgIGlmICghYmlkaVJ1
bnMucnVuQ291bnQoKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAvLyBGSVhNRTog
V2h5IGlzIHRoaXMgb25seSBkb25lIHdoZW4gd2UgaGFkIHJ1bnM/Ci0gICAgbGluZUluZm8uc2V0
TGFzdExpbmUoIWVuZC5yZW5kZXJlcigpKTsKLQotICAgIFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gg
PSBjb25zdHJ1Y3RMaW5lKGJpZGlSdW5zLCBsaW5lSW5mbyk7Ci0gICAgaWYgKCFsaW5lQm94KQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGxpbmVCb3gtPnNldEJpZGlMZXZlbChiaWRp
TGV2ZWwpOwotICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsobGluZUluZm8ucHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KCkpOwotICAgIAotICAgIGJvb2wgaXNTVkdSb290SW5saW5lQm94ID0g
aXM8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpOwotICAgIAotICAgIEdseXBoT3ZlcmZsb3dB
bmRGYWxsYmFja0ZvbnRzTWFwIHRleHRCb3hEYXRhTWFwOwotICAgIAotICAgIC8vIE5vdyB3ZSBw
b3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHkuCi0gICAgaWYgKCFpc1NW
R1Jvb3RJbmxpbmVCb3gpCi0gICAgICAgIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNG
b3JMaW5lKGxpbmVCb3gsIGxpbmVJbmZvLCBiaWRpUnVucy5maXJzdFJ1bigpLCB0cmFpbGluZ1Nw
YWNlUnVuLCBlbmQuYXRFbmQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNo
ZSwgd29yZE1lYXN1cmVtZW50cyk7Ci0gICAgCi0gICAgLy8gTm93IHBvc2l0aW9uIG91ciB0ZXh0
IHJ1bnMgdmVydGljYWxseS4KLSAgICBjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JM
aW5lKGxpbmVCb3gsIGJpZGlSdW5zLmZpcnN0UnVuKCksIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUpOwotICAgIAotICAgIC8vIFNWRyB0ZXh0IGxheW91dCBjb2RlIGNvbXB1
dGVzIHZlcnRpY2FsICYgaG9yaXpvbnRhbCBwb3NpdGlvbnMgb24gaXRzIG93bi4KLSAgICAvLyBO
b3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBleGVjdXRlIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9u
c0ZvckxpbmUoKSBhcwotICAgIC8vIGl0IGNhbGxzIElubGluZVRleHRCb3g6OnBvc2l0aW9uTGlu
ZUJveCgpLCB3aGljaCB0cmFja3Mgd2hldGhlciB0aGUgYm94Ci0gICAgLy8gY29udGFpbnMgcmV2
ZXJzZWQgdGV4dCBvciBub3QuIElmIHdlIHdvdWxkbid0IGRvIHRoYXQgZWRpdGluZyBhbmQgdGh1
cwotICAgIC8vIHRleHQgc2VsZWN0aW9uIGluIFJUTCBib3hlcyB3b3VsZCBub3Qgd29yayBhcyBl
eHBlY3RlZC4KLSAgICBpZiAoaXNTVkdSb290SW5saW5lQm94KSB7Ci0gICAgICAgIEFTU0VSVF9X
SVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlzU1ZHVGV4dCgpKTsKLSAgICAgICAgZG93bmNhc3Q8
U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpLmNvbXB1dGVQZXJDaGFyYWN0ZXJMYXlvdXRJbmZv
cm1hdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvLyBDb21wdXRlIG91ciBvdmVyZmxvdyBub3cu
Ci0gICAgbGluZUJveC0+Y29tcHV0ZU92ZXJmbG93KGxpbmVCb3gtPmxpbmVUb3AoKSwgbGluZUJv
eC0+bGluZUJvdHRvbSgpLCB0ZXh0Qm94RGF0YU1hcCk7Ci0gICAgCi0gICAgcmV0dXJuIGxpbmVC
b3g7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZUxpbmVSYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxh
eW91dFN0YXRlLCBSb290SW5saW5lQm94KiBzdGFydExpbmUsIFJvb3RJbmxpbmVCb3gqIHN0b3BM
aW5lID0gMCkKLXsKLSAgICBSb290SW5saW5lQm94KiBib3hUb0RlbGV0ZSA9IHN0YXJ0TGluZTsK
LSAgICB3aGlsZSAoYm94VG9EZWxldGUgJiYgYm94VG9EZWxldGUgIT0gc3RvcExpbmUpIHsKLSAg
ICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChib3hUb0RlbGV0ZSk7
Ci0gICAgICAgIC8vIE5vdGU6IGRlbGV0ZUxpbmVSYW5nZShmaXJzdFJvb3RCb3goKSkgaXMgbm90
IGlkZW50aWNhbCB0byBkZWxldGVMaW5lQm94VHJlZSgpLgotICAgICAgICAvLyBkZWxldGVMaW5l
Qm94VHJlZSB1c2VzIG5leHRMaW5lQm94KCkgaW5zdGVhZCBvZiBuZXh0Um9vdEJveCgpIHdoZW4g
dHJhdmVyc2luZy4KLSAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9IGJveFRvRGVsZXRlLT5u
ZXh0Um9vdEJveCgpOwotICAgICAgICBib3hUb0RlbGV0ZS0+ZGVsZXRlTGluZSgpOwotICAgICAg
ICBib3hUb0RlbGV0ZSA9IG5leHQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCByZXBhaW50RGly
dHlGbG9hdHMoTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykKLXsKLSAgICAvLyBG
bG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVwYWludCB3aGVuIHdlIGxh
aWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQotICAgIC8vIHBhaW50ZWQgYnkgbm93IGlmIHRo
ZXkgaGFkIG1vdmVkLCBidXQgaWYgdGhleSBzdGF5ZWQgYXQgKDAsIDApLCB0aGV5IHN0aWxsIG5l
ZWQgdG8gYmUKLSAgICAvLyBwYWludGVkLgotICAgIGZvciAoYXV0byYgZmxvYXRCb3ggOiBmbG9h
dHMpIHsKLSAgICAgICAgaWYgKGZsb2F0Qm94LT5ldmVySGFkTGF5b3V0KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgYXV0byYgYm94ID0gZmxvYXRCb3gtPnJlbmRlcmVyKCk7Ci0g
ICAgICAgIGlmICghYm94LngoKSAmJiAhYm94LnkoKSAmJiBib3guY2hlY2tGb3JSZXBhaW50RHVy
aW5nTGF5b3V0KCkpCi0gICAgICAgICAgICBib3gucmVwYWludCgpOwotICAgIH0KLX0KLQotdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHMoTGluZUxheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSwgYm9vbCBoYXNJbmxpbmVDaGlsZCkKLXsKLSAgICAvLyBXZSB3YW50IHRvIHNr
aXAgYWhlYWQgdG8gdGhlIGZpcnN0IGRpcnR5IGxpbmUKLSAgICBJbmxpbmVCaWRpUmVzb2x2ZXIg
cmVzb2x2ZXI7Ci0gICAgUm9vdElubGluZUJveCogc3RhcnRMaW5lID0gZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbihsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIpOwotICAgIAotICAgIHVuc2lnbmVkIGNvbnNl
Y3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKLSAgICBpZiAoc3RhcnRMaW5lKSB7Ci0gICAgICAg
IGZvciAoUm9vdElubGluZUJveCogbGluZSA9IHN0YXJ0TGluZS0+cHJldlJvb3RCb3goKTsgbGlu
ZSAmJiBsaW5lLT5pc0h5cGhlbmF0ZWQoKTsgbGluZSA9IGxpbmUtPnByZXZSb290Qm94KCkpCi0g
ICAgICAgICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcysrOwotICAgIH0KLQotICAgIC8v
IEZJWE1FOiBUaGlzIHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rp
b24sIGJ1dCBzaW5jZQotICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRpb24gY2FuIGNoYW5nZSB0
aGUgZnVsbExheW91dCBmbGFnIHdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlLiBGYWlsdXJlIHRvIGNh
bGwKLSAgICAvLyBkZXRlcm1pbmVTdGFydFBvc2l0aW9uIGZpcnN0IHdpbGwgYnJlYWsgZmFzdC9y
ZXBhaW50L2xpbmUtZmxvdy13aXRoLWZsb2F0cy05Lmh0bWwuCi0gICAgaWYgKGxheW91dFN0YXRl
LmlzRnVsbExheW91dCgpICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxmTmVlZHNMYXlvdXQoKSkg
ewotICAgICAgICBzZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOyAvLyBNYXJrIGFzIG5lZWRp
bmcgYSBmdWxsIGxheW91dCB0byBmb3JjZSB1cyB0byByZXBhaW50LgotICAgICAgICBpZiAoIXZp
ZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubmVlZHNGdWxsUmVwYWludCgpICYmIGhh
c1NlbGZQYWludGluZ0xheWVyKCkgJiYgaGFzUmVwYWludExheW91dFJlY3RzKCkpIHsKLSAgICAg
ICAgICAgIC8vIEJlY2F1c2Ugd2Ugd2FpdGVkIHVudGlsIHdlIHdlcmUgYWxyZWFkeSBpbnNpZGUg
bGF5b3V0IHRvIGRpc2NvdmVyCi0gICAgICAgICAgICAvLyB0aGF0IHRoZSBibG9jayByZWFsbHkg
bmVlZGVkIGEgZnVsbCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNlIHRvIHJlcGFpbnQgdGhl
IGxheWVyCi0gICAgICAgICAgICAvLyBiZWZvcmUgbGF5b3V0IHN0YXJ0ZWQuICBMdWNraWx5IHRo
ZSBsYXllciBoYXMgY2FjaGVkIHRoZSByZXBhaW50IHJlY3QgZm9yIGl0cyBvcmlnaW5hbAotICAg
ICAgICAgICAgLy8gcG9zaXRpb24gYW5kIHNpemUsIGFuZCBzbyB3ZSBjYW4gdXNlIHRoYXQgdG8g
bWFrZSBhIHJlcGFpbnQgaGFwcGVuIG5vdy4KLSAgICAgICAgICAgIHJlcGFpbnRVc2luZ0NvbnRh
aW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIHJlcGFpbnRMYXlvdXRSZWN0cygpLm1fcmVwYWlu
dFJlY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkpCi0g
ICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLnNldExhc3RGbG9hdChtX2Zsb2F0aW5nT2Jq
ZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpKTsKLQotICAgIC8vIFdlIGFsc28gZmluZCB0aGUgZmly
c3QgY2xlYW4gbGluZSBhbmQgZXh0cmFjdCB0aGVzZSBsaW5lcy4gIFdlIHdpbGwgYWRkIHRoZW0g
YmFjawotICAgIC8vIGlmIHdlIGRldGVybWluZSB0aGF0IHdlJ3JlIGFibGUgdG8gc3luY2hyb25p
emUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBkaXJ0eSBsaW5lcy4KLSAgICBJbmxpbmVJdGVyYXRv
ciBjbGVhbkxpbmVTdGFydDsKLSAgICBCaWRpU3RhdHVzIGNsZWFuTGluZUJpZGlTdGF0dXM7Ci0g
ICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAmJiBzdGFydExpbmUpCi0gICAgICAg
IGRldGVybWluZUVuZFBvc2l0aW9uKGxheW91dFN0YXRlLCBzdGFydExpbmUsIGNsZWFuTGluZVN0
YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKLQotICAgIGlmIChzdGFydExpbmUpIHsKLSAgICAg
ICAgaWYgKCFsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQotICAgICAgICAgICAgbGF5
b3V0U3RhdGUuc2V0UmVwYWludFJhbmdlKGxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIGRlbGV0
ZUxpbmVSYW5nZShsYXlvdXRTdGF0ZSwgc3RhcnRMaW5lKTsKLSAgICB9Ci0KLSAgICBpZiAoIWxh
eW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIGxhc3RSb290Qm94KCkgJiYgbGFzdFJvb3RCb3go
KS0+ZW5kc1dpdGhCcmVhaygpKSB7Ci0gICAgICAgIC8vIElmIHRoZSBsYXN0IGxpbmUgYmVmb3Jl
IHRoZSBzdGFydCBsaW5lIGVuZHMgd2l0aCBhIGxpbmUgYnJlYWsgdGhhdCBjbGVhciBmbG9hdHMs
Ci0gICAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5LgotICAgICAgICAvLyBB
IGxpbmUgYnJlYWsgY2FuIGJlIGVpdGhlciB0aGUgZmlyc3Qgb3IgdGhlIGxhc3Qgb2JqZWN0IG9u
IGEgbGluZSwgZGVwZW5kaW5nIG9uIGl0cyBkaXJlY3Rpb24uCi0gICAgICAgIGlmIChJbmxpbmVC
b3gqIGxhc3RMZWFmQ2hpbGQgPSBsYXN0Um9vdEJveCgpLT5sYXN0TGVhZkNoaWxkKCkpIHsKLSAg
ICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9ICZsYXN0TGVhZkNoaWxkLT5yZW5k
ZXJlcigpOwotICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JSKCkpCi0gICAgICAgICAg
ICAgICAgbGFzdE9iamVjdCA9ICZsYXN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgpLT5yZW5k
ZXJlcigpOwotICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzQlIoKSkgewotICAgICAgICAg
ICAgICAgIENsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5bGUoKS5jbGVhcigpOwotICAgICAg
ICAgICAgICAgIGlmIChjbGVhciAhPSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgICAgICAgICAgICAg
Y2xlYXJGbG9hdHMoY2xlYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UobGF5b3V0U3RhdGUsIHJlc29sdmVyLCBjbGVh
bkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cywgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGlu
ZXMpOwotICAgIGxpbmtUb0VuZExpbmVJZk5lZWRlZChsYXlvdXRTdGF0ZSk7Ci0gICAgcmVwYWlu
dERpcnR5RmxvYXRzKGxheW91dFN0YXRlLmZsb2F0TGlzdCgpKTsKLX0KLQotLy8gQmVmb3JlIHJl
c3RhcnRpbmcgdGhlIGxheW91dCBsb29wIHdpdGggYSBuZXcgbG9naWNhbEhlaWdodCwgcmVtb3Zl
IGFsbCBmbG9hdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCByZXNldCB0aGUgcmVzb2x2ZXIuCi1pbmxp
bmUgY29uc3QgSW5saW5lSXRlcmF0b3ImIFJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91dFJ1
bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5p
dCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgb2xkRW5kKQotewotICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0JlbG93KGxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQpOwotICAgIHNldExvZ2ljYWxIZWlnaHQo
bmV3TG9naWNhbEhlaWdodCk7Ci0gICAgcmVzb2x2ZXIuc2V0UG9zaXRpb25JZ25vcmluZ05lc3Rl
ZElzb2xhdGVzKG9sZEVuZCk7Ci0gICAgcmV0dXJuIG9sZEVuZDsKLX0KLQotdm9pZCBSZW5kZXJC
bG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5
b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJh
dG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1
cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCi17Ci0gICAgY29uc3QgUmVu
ZGVyU3R5bGUmIHN0eWxlVG9Vc2UgPSBzdHlsZSgpOwotICAgIGJvb2wgcGFnaW5hdGVkID0gdmll
dygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5m
cmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsK
LSAgICBMaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdoaXRlc3BhY2VDb2xsYXBz
aW5nU3RhdGUgPSByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7Ci0gICAgSW5s
aW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKLSAgICBib29sIGNoZWNrRm9y
RW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwotICAgIFJlbmRlclRleHRJbmZv
IHJlbmRlclRleHRJbmZvOwotICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGU7Ci0KLSAgICBMaW5lQnJlYWtlciBsaW5lQnJlYWtlcigqdGhpcyk7Ci0KLSAgICB3
aGlsZSAoIWVuZC5hdEVuZCgpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBJcyB0aGlzIGNoZWNrIG5l
Y2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvciBjYW4gaXQgYmUgbW92ZWQgdG8g
dGhlIGVuZD8KLSAgICAgICAgaWYgKGNoZWNrRm9yRW5kTGluZU1hdGNoKSB7Ci0gICAgICAgICAg
ICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTWF0Y2hlZChtYXRjaGVkRW5kTGluZShsYXlvdXRTdGF0
ZSwgcmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzKSk7Ci0gICAg
ICAgICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkgewotICAgICAgICAgICAg
ICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9u
KCkucm9vdCgpLCAwLCAwKSwgMCk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2lu
SW5mbygpLmNsZWFyTWFyZ2luKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5y
ZXNldCgpOwotCi0gICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0RW1wdHkodHJ1ZSk7
Ci0gICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkucmVzZXRSdW5zRnJvbUxlYWRpbmdXaGl0
ZXNwYWNlKCk7Ci0KLSAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Igb2xkRW5kID0gZW5kOwot
ICAgICAgICBib29sIGlzTmV3VUJBUGFyYWdyYXBoID0gbGF5b3V0U3RhdGUubGluZUluZm8oKS5w
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKTsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIGxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUgPSAoY29udGFpbnNGbG9hdHMoKSkgPyBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpIDogbnVsbHB0cjsKLQotICAgICAgICBXb3JkTWVhc3Vy
ZW1lbnRzIHdvcmRNZWFzdXJlbWVudHM7Ci0gICAgICAgIGVuZCA9IGxpbmVCcmVha2VyLm5leHRM
aW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHJlbmRlclRleHRJbmZv
LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywg
d29yZE1lYXN1cmVtZW50cyk7Ci0gICAgICAgIGNhY2hlUHJpb3JDaGFyYWN0ZXJzSWZOZWVkZWQo
cmVuZGVyVGV4dEluZm8ubGluZUJyZWFrSXRlcmF0b3IpOwotICAgICAgICByZW5kZXJUZXh0SW5m
by5saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOwotICAgICAgICBpZiAocmVz
b2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hv
dWxkbid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5leHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0
aCEKLSAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxpc3QgaXMgc2VwYXJhdGVkIGZyb20gQmlk
aVJlc29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVkLgotICAgICAgICAgICAgcmVzb2x2ZXIu
cnVucygpLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXNvbHZlci5tYXJrQ3VycmVudFJ1bkVtcHR5
KCk7IC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBiZSByZXBsYWNlZCBieSBhbiBBU1NFUlQg
KG9yIGp1c3QgcmVtb3ZlZCkuCi0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRDaGVja0ZvckZs
b2F0c0Zyb21MYXN0TGluZSh0cnVlKTsKLSAgICAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9u
KElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkucm9vdCgpLCAwLCAwKSwgMCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIEFTU0VSVChlbmQgIT0gcmVz
b2x2ZXIucG9zaXRpb24oKSk7Ci0KLSAgICAgICAgLy8gVGhpcyBpcyBhIHNob3J0LWN1dCBmb3Ig
ZW1wdHkgbGluZXMuCi0gICAgICAgIGlmIChsYXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgaWYgKGxhc3RSb290Qm94KCkpCi0gICAgICAgICAgICAgICAgbGFz
dFJvb3RCb3goKS0+c2V0TGluZUJyZWFrSW5mbyhlbmQucmVuZGVyZXIoKSwgZW5kLm9mZnNldCgp
LCByZXNvbHZlci5zdGF0dXMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBWaXN1
YWxEaXJlY3Rpb25PdmVycmlkZSBvdmVycmlkZSA9IChzdHlsZVRvVXNlLnJ0bE9yZGVyaW5nKCkg
PT0gT3JkZXI6OlZpc3VhbCA/IChzdHlsZVRvVXNlLmRpcmVjdGlvbigpID09IFRleHREaXJlY3Rp
b246OkxUUiA/IFZpc3VhbExlZnRUb1JpZ2h0T3ZlcnJpZGUgOiBWaXN1YWxSaWdodFRvTGVmdE92
ZXJyaWRlKSA6IE5vVmlzdWFsT3ZlcnJpZGUpOwotCi0gICAgICAgICAgICBpZiAoaXNOZXdVQkFQ
YXJhZ3JhcGggJiYgc3R5bGVUb1VzZS51bmljb2RlQmlkaSgpID09IFBsYWludGV4dCAmJiAhcmVz
b2x2ZXIuY29udGV4dCgpLT5wYXJlbnQoKSkgewotICAgICAgICAgICAgICAgIFRleHREaXJlY3Rp
b24gZGlyZWN0aW9uID0gc3R5bGVUb1VzZS5kaXJlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBk
ZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24sIHJlc29sdmVyLnBvc2l0aW9uKCkpOwot
ICAgICAgICAgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhCaWRpU3RhdHVzKGRpcmVjdGlvbiwg
aXNPdmVycmlkZShzdHlsZVRvVXNlLnVuaWNvZGVCaWRpKCkpKSk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBvd25lcnNoaXAgaXMgcmV2ZXJzZWQuIFdlIHNob3Vs
ZCBvd24gdGhlIEJpZGlSdW5MaXN0IGFuZCBwYXNzIGl0IHRvIGNyZWF0ZUJpZGlSdW5zRm9yTGlu
ZS4KLSAgICAgICAgICAgIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucyA9IHJlc29sdmVy
LnJ1bnMoKTsKLSAgICAgICAgICAgIGNvbnN0cnVjdEJpZGlSdW5zRm9yU2VnbWVudChyZXNvbHZl
ciwgYmlkaVJ1bnMsIGVuZCwgb3ZlcnJpZGUsIGxheW91dFN0YXRlLmxpbmVJbmZvKCkucHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5KCkpOwotICAgICAgICAgICAgQVNTRVJUKHJlc29sdmVyLnBvc2l0
aW9uKCkgPT0gZW5kKTsKLQotICAgICAgICAgICAgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biA9
ICFsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpID8gaGFu
ZGxlVHJhaWxpbmdTcGFjZXMoYmlkaVJ1bnMsIHJlc29sdmVyLmNvbnRleHQoKSkgOiBudWxscHRy
OwotCi0gICAgICAgICAgICBpZiAoYmlkaVJ1bnMucnVuQ291bnQoKSAmJiBsaW5lQnJlYWtlci5s
aW5lV2FzSHlwaGVuYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgYmlkaVJ1bnMubG9naWNhbGx5
TGFzdFJ1bigpLT5tX2hhc0h5cGhlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMrKzsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAg
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKLQotICAgICAgICAgICAgLy8gTm93IHRo
YXQgdGhlIHJ1bnMgaGF2ZSBiZWVuIG9yZGVyZWQsIHdlIGNyZWF0ZSB0aGUgbGluZSBib3hlcy4K
LSAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJlIG91dCB3aGVyZSBib3Jk
ZXIvcGFkZGluZy9tYXJnaW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCi0gICAgICAgICAgICAvLyBp
bmxpbmUgZmxvdyBib3hlcy4KLQotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVp
Z2h0ID0gbG9naWNhbEhlaWdodCgpOwotICAgICAgICAgICAgUm9vdElubGluZUJveCogbGluZUJv
eCA9IGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhyZXNvbHZlci5zdGF0dXMoKS5jb250ZXh0
LT5sZXZlbCgpLCBiaWRpUnVucywgZW5kLCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLCB2ZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUsIHRyYWlsaW5nU3BhY2VSdW4sIHdvcmRNZWFzdXJlbWVudHMpOwotCi0g
ICAgICAgICAgICBiaWRpUnVucy5jbGVhcigpOwotICAgICAgICAgICAgcmVzb2x2ZXIubWFya0N1
cnJlbnRSdW5FbXB0eSgpOyAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFibHkgYmUgcmVwbGFjZWQg
YnkgYW4gQVNTRVJUIChvciBqdXN0IHJlbW92ZWQpLgotCi0gICAgICAgICAgICBpZiAobGluZUJv
eCkgewotICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVha0luZm8oZW5kLnJlbmRl
cmVyKCksIGVuZC5vZmZzZXQoKSwgcmVzb2x2ZXIuc3RhdHVzKCkpOwotICAgICAgICAgICAgICAg
IGlmIChsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQotICAgICAgICAgICAgICAgICAg
ICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmVCb3gpOwotICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgIExheW91dFVuaXQgYWRqdXN0bWVudDsKLSAgICAg
ICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2luSW5mbygpLnNldEF0QmVmb3Jl
U2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkKLSAg
ICAgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94
LCBhZGp1c3RtZW50LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZs
b3coKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsKLSAgICAgICAgICAgICAg
ICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLmlzRmlyc3RMaW5lKCkgPyBJbmRlbnRUZXh0IDogRG9Ob3RJbmRlbnRUZXh0OwotICAg
ICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExpbmVXaWR0aCA9IGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5kZW50VGV4dCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24oYWRq
dXN0bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS51c2VzUmVwYWlu
dEJvdW5kcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVw
YWludFJhbmdlRnJvbUJveChsaW5lQm94KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXZh
aWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwg
c2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBXZSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGxpbmUsIHJlbW92ZSBhbGwgZmxvYXRzIHRo
YXQgZ290IGFkZGVkLCBhbmQgbGV0IGxpbmUgbGF5b3V0IHJlLXJ1bi4KLSAgICAgICAgICAgICAg
ICAgICAgICAgIGxpbmVCb3gtPmRlbGV0ZUxpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGVuZCA9IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShvbGRMb2dpY2FsSGVpZ2h0
LCBvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgcmVzb2x2ZXIsIG9sZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNldExvZ2ljYWxI
ZWlnaHQobGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkg
ewotICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShsaW5lQm94KTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGxpbmVCcmVha2VyLnBvc2l0aW9uZWRPYmplY3RzKCkuc2l6
ZSgpOyArK2kpCi0gICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMoKnRoaXMsICpsaW5lQnJl
YWtlci5wb3NpdGlvbmVkT2JqZWN0cygpW2ldLCBEb05vdEluZGVudFRleHQpOwotCi0gICAgICAg
IGlmICghbGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGxh
eW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKGZhbHNlKTsKLSAgICAgICAgICAgIGNs
ZWFyRmxvYXRzKGxpbmVCcmVha2VyLmNsZWFyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KG1fZmxvYXRpbmdPYmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgIGNvbnN0
IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3Rz
LT5zZXQoKTsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigp
OwotICAgICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICAg
ICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5sYXN0
RmxvYXQoKSkgewotICAgICAgICAgICAgICAgIGF1dG8gbGFzdEZsb2F0SXRlcmF0b3IgPSBmbG9h
dGluZ09iamVjdFNldC5maW5kKGxhc3RGbG9hdCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGxh
c3RGbG9hdEl0ZXJhdG9yICE9IGVuZCk7Ci0gICAgICAgICAgICAgICAgKytsYXN0RmxvYXRJdGVy
YXRvcjsKLSAgICAgICAgICAgICAgICBpdCA9IGxhc3RGbG9hdEl0ZXJhdG9yOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAg
ICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0OwotICAgICAgICAgICAgICAgIGFwcGVuZEZs
b2F0aW5nT2JqZWN0VG9MYXN0TGluZSgqZmxvYXRpbmdPYmplY3QpOwotICAgICAgICAgICAgICAg
IC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hhbmdlZCwgZ2l2ZSB1cCBvbiBzeW5jaW5n
IHdpdGggY2xlYW4gbGluZXMuCi0gICAgICAgICAgICAgICAgYXV0byogZmxvYXRXaXRoUmVjdCA9
IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmZsb2F0V2l0aFJlY3QoZmxvYXRpbmdPYmplY3QtPnJl
bmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmICghZmxvYXRXaXRoUmVjdCB8fCBmbG9hdFdp
dGhSZWN0LT5yZWN0KCkgIT0gZmxvYXRpbmdPYmplY3QtPmZyYW1lUmVjdCgpKQotICAgICAgICAg
ICAgICAgICAgICBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuc2V0TGFzdEZsb2F0KCFmbG9hdGlu
Z09iamVjdFNldC5pc0VtcHR5KCkgPyBmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCkgOiBu
dWxscHRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0
YXRlLnJlc2V0KCk7Ci0gICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKGVuZCwgbnVtYmVyT2ZJ
c29sYXRlQW5jZXN0b3JzKGVuZCkpOwotICAgIH0KLQotICAgIC8vIEluIGNhc2Ugd2UgYWxyZWFk
eSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMgbGF5b3V0IHRvIGF2b2lk
IHdpZG93cwotICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IG9m
IGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgotICAgIC8vIE90aGVyd2lzZSwgd2Ugcmlz
ayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5zdCB0aGUgYmxvY2sgZnJh
Z21lbnRhdGlvbiBwcmluY2lwbGVzLgotICAgIGlmIChwYWdpbmF0ZWQgJiYgIXN0eWxlKCkuaGFz
QXV0b1dpZG93cygpICYmICFkaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7Ci0gICAgICAg
IC8vIENoZWNrIHRoZSBsaW5lIGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHVu
YWNjZXB0YWJsZSB3aWRvd3MuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHdlJ2xsIHByaW9yaXRpemUg
b3JwaGFucyAtIHNvIG5vdGhpbmcgd2UgZG8gaGVyZSBzaG91bGQgY3JlYXRlCi0gICAgICAgIC8v
IGEgbmV3IG9ycGhhbi4KLQotICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gbGFzdFJv
b3RCb3goKTsKLQotICAgICAgICAvLyBDb3VudCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGJh
Y2t3YXJkcywgdG8gc2VlIGhvdyBtYW55IGhhbmdpbmcKLSAgICAgICAgLy8gbGluZXMgd2UgaGF2
ZS4KLSAgICAgICAgUm9vdElubGluZUJveCogZmlyc3RMaW5lSW5CbG9jayA9IGZpcnN0Um9vdEJv
eCgpOwotICAgICAgICBpbnQgbnVtTGluZXNIYW5naW5nID0gMTsKLSAgICAgICAgd2hpbGUgKGxp
bmVCb3ggJiYgbGluZUJveCAhPSBmaXJzdExpbmVJbkJsb2NrICYmICFsaW5lQm94LT5pc0ZpcnN0
QWZ0ZXJQYWdlQnJlYWsoKSkgewotICAgICAgICAgICAgKytudW1MaW5lc0hhbmdpbmc7Ci0gICAg
ICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gYnJlYWtzIGluIHRoZSBibG9jaywgd2UgZGlkbid0
IGNyZWF0ZSBhbnkgd2lkb3dzLgotICAgICAgICBpZiAoIWxpbmVCb3ggfHwgIWxpbmVCb3gtPmlz
Rmlyc3RBZnRlclBhZ2VCcmVhaygpIHx8IGxpbmVCb3ggPT0gZmlyc3RMaW5lSW5CbG9jaykKLSAg
ICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAobnVtTGluZXNIYW5naW5nIDwgc3R5bGUo
KS53aWRvd3MoKSkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBkZXRlY3RlZCBhIHdpZG93LiBO
b3cgd2UgbmVlZCB0byB3b3JrIG91dCBob3cgbWFueQotICAgICAgICAgICAgLy8gbGluZXMgdGhl
cmUgYXJlIG9uIHRoZSBwcmV2aW91cyBwYWdlLCBhbmQgaG93IG1hbnkgd2UgbmVlZAotICAgICAg
ICAgICAgLy8gdG8gc3RlYWwuCi0gICAgICAgICAgICBpbnQgbnVtTGluZXNOZWVkZWQgPSBzdHls
ZSgpLndpZG93cygpIC0gbnVtTGluZXNIYW5naW5nOwotICAgICAgICAgICAgUm9vdElubGluZUJv
eCogY3VycmVudEZpcnN0TGluZU9mTmV3UGFnZSA9IGxpbmVCb3g7Ci0KLSAgICAgICAgICAgIC8v
IENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHByZXZpb3VzIHBhZ2UuCi0gICAgICAg
ICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKLSAgICAgICAgICAgIGludCBu
dW1MaW5lc0luUHJldmlvdXNQYWdlID0gMTsKLSAgICAgICAgICAgIHdoaWxlIChsaW5lQm94ICYm
IGxpbmVCb3ggIT0gZmlyc3RMaW5lSW5CbG9jayAmJiAhbGluZUJveC0+aXNGaXJzdEFmdGVyUGFn
ZUJyZWFrKCkpIHsKLSAgICAgICAgICAgICAgICArK251bUxpbmVzSW5QcmV2aW91c1BhZ2U7Ci0g
ICAgICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gtPnByZXZSb290Qm94KCk7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBleHBsaWNpdCB2YWx1ZSBm
b3Igb3JwaGFucywgcmVzcGVjdCB0aGF0LiBJZiBub3QsIHdlIHN0aWxsCi0gICAgICAgICAgICAv
LyBzaG91bGRuJ3QgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdlIG1ha2UgYW4gb3JwaGFuIGJp
Z2dlciB0aGFuIHRoZSBpbml0aWFsIHZhbHVlLgotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0
aGF0IHNldHRpbmcgd2lkb3dzIGltcGxpZXMgd2UgYWxzbyBjYXJlIGFib3V0IG9ycGhhbnMsIGJ1
dCBnaXZlbgotICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmljYXRpb24gc2F5cyB0aGUgaW5pdGlh
bCBvcnBoYW4gdmFsdWUgaXMgbm9uLXplcm8sIHRoaXMgaXMgb2suIFRoZQotICAgICAgICAgICAg
Ly8gYXV0aG9yIGlzIGFsd2F5cyBmcmVlIHRvIHNldCBvcnBoYW5zIGV4cGxpY2l0bHkgYXMgd2Vs
bC4KLSAgICAgICAgICAgIGludCBvcnBoYW5zID0gc3R5bGUoKS5oYXNBdXRvT3JwaGFucygpID8g
c3R5bGUoKS5pbml0aWFsT3JwaGFucygpIDogc3R5bGUoKS5vcnBoYW5zKCk7Ci0gICAgICAgICAg
ICBpbnQgbnVtTGluZXNBdmFpbGFibGUgPSBudW1MaW5lc0luUHJldmlvdXNQYWdlIC0gb3JwaGFu
czsKLSAgICAgICAgICAgIGlmIChudW1MaW5lc0F2YWlsYWJsZSA8PSAwKQotICAgICAgICAgICAg
ICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IG51bUxpbmVzVG9UYWtlID0gc3RkOjptaW4o
bnVtTGluZXNBdmFpbGFibGUsIG51bUxpbmVzTmVlZGVkKTsKLSAgICAgICAgICAgIC8vIFdpbmQg
YmFjayBmcm9tIG91ciBmaXJzdCB3aWRvd2VkIGxpbmUuCi0gICAgICAgICAgICBsaW5lQm94ID0g
Y3VycmVudEZpcnN0TGluZU9mTmV3UGFnZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbnVtTGluZXNUb1Rha2U7ICsraSkKLSAgICAgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJv
eC0+cHJldlJvb3RCb3goKTsKLQotICAgICAgICAgICAgLy8gV2Ugbm93IHdhbnQgdG8gYnJlYWsg
YXQgdGhpcyBsaW5lLiBSZW1lbWJlciBmb3IgbmV4dCBsYXlvdXQgYW5kIHRyaWdnZXIgcmVsYXlv
dXQuCi0gICAgICAgICAgICBzZXRCcmVha0F0TGluZVRvQXZvaWRXaWRvdyhsaW5lQ291bnQobGlu
ZUJveCkpOwotICAgICAgICAgICAgbWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UobGFzdFJvb3RC
b3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gtPmxpbmVCb3R0b21XaXRoTGVh
ZGluZygpLCBsaW5lQm94KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbGVhckRpZEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZWF0dGFjaENs
ZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIExheW91dFVuaXQgZGVsdGEs
IGJvb2wgaXNGaXJzdENsZWFuTGluZSkKLXsKLSAgICBhdXRvKiBjbGVhbkxpbmVGbG9hdHMgPSBj
bGVhbkxpbmUuZmxvYXRzUHRyKCk7Ci0gICAgaWYgKCFjbGVhbkxpbmVGbG9hdHMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAqY2xlYW5MaW5lRmxvYXRz
KSB7Ci0gICAgICAgIGlmICghZmxvYXRpbmdCb3gpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGluZ09iamVjdCgqZmxvYXRp
bmdCb3gpOwotICAgICAgICBpZiAoaXNGaXJzdENsZWFuTGluZSAmJiBmbG9hdGluZ09iamVjdC0+
b3JpZ2luYXRpbmdMaW5lKCkpIHsKLSAgICAgICAgICAgIC8vIEZsb2F0IGJveCBkb2VzIG5vdCBi
ZWxvbmcgdG8gdGhpcyBsaW5lIGFueW1vcmUuCi0gICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihjbGVhbkxpbmUucHJldlJvb3RCb3goKSA9PSBmbG9hdGluZ09iamVj
dC0+b3JpZ2luYXRpbmdMaW5lKCkpOwotICAgICAgICAgICAgY2xlYW5MaW5lLnJlbW92ZUZsb2F0
KCpmbG9hdGluZ0JveCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAg
ICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdPYmplY3QtPm9yaWdp
bmF0aW5nTGluZSgpKTsKLSAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldE9yaWdpbmF0aW5nTGlu
ZShjbGVhbkxpbmUpOwotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxUb3BGb3JDaGls
ZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSArIGRl
bHRhKTsKLSAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSkKLXsKLSAgICBhdXRvKiBmaXJzdENsZWFuTGluZSA9IGxheW91dFN0YXRlLmVuZExp
bmUoKTsKLSAgICBpZiAoZmlyc3RDbGVhbkxpbmUpIHsKLSAgICAgICAgaWYgKGxheW91dFN0YXRl
LmVuZExpbmVNYXRjaGVkKCkpIHsKLSAgICAgICAgICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygp
LmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFt
ZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKLSAg
ICAgICAgICAgIC8vIEF0dGFjaCBhbGwgdGhlIHJlbWFpbmluZyBsaW5lcywgYW5kIHRoZW4gYWRq
dXN0IHRoZWlyIHktcG9zaXRpb25zIGFzIG5lZWRlZC4KLSAgICAgICAgICAgIExheW91dFVuaXQg
ZGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgp
OwotICAgICAgICAgICAgZm9yIChhdXRvKiBsaW5lID0gZmlyc3RDbGVhbkxpbmU7IGxpbmU7IGxp
bmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgbGluZS0+YXR0YWNo
TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAg
ICAgICAgZGVsdGEgLT0gbGluZS0+cGFnaW5hdGlvblN0cnV0KCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGFkanVzdExp
bmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZSwgZGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBs
YXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgaWYgKGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLnVw
ZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZSwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAg
ICBsaW5lLT5hZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9uKGRlbHRhKTsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkp
Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShsaW5lKTsKLSAgICAg
ICAgICAgICAgICByZWF0dGFjaENsZWFuTGluZUZsb2F0cygqbGluZSwgZGVsdGEsIGxpbmUgPT0g
Zmlyc3RDbGVhbkxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0TG9naWNhbEhl
aWdodChsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSByZW1haW5pbmcgbGluZXMuCi0g
ICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0U3RhdGUsIGxheW91dFN0YXRlLmVuZExp
bmUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3Rz
ICYmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSgpIHx8IHBvc2l0aW9u
TmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgLy8gSW4gY2FzZSB3ZSBo
YXZlIGEgZmxvYXQgb24gdGhlIGxhc3QgbGluZSwgaXQgbWlnaHQgbm90IGJlIHBvc2l0aW9uZWQg
dXAgdG8gbm93LgotICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBhZGRpbmcg
aW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0IHdpbGwKLSAgICAgICAg
Ly8gaW5jbHVkZSB0aGUgcGFkZGluZyBpbmNvcnJlY3RseS4gLWR3aAotICAgICAgICBpZiAobGF5
b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUoKSkgewotICAgICAgICAgICAgTGF5
b3V0VW5pdCBib3R0b21WaXN1YWxPdmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmxvZ2ljYWxCb3R0
b21WaXN1YWxPdmVyZmxvdygpOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBib3R0b21MYXlvdXRP
dmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmxvZ2ljYWxCb3R0b21MYXlvdXRPdmVyZmxvdygpOwot
ICAgICAgICAgICAgYXV0byBuZXdMaW5lQm94ID0gc3RkOjptYWtlX3VuaXF1ZTxUcmFpbGluZ0Zs
b2F0c1Jvb3RJbmxpbmVCb3g+KCp0aGlzKTsKLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdGbG9h
dHNMaW5lQm94ID0gbmV3TGluZUJveC5nZXQoKTsKLSAgICAgICAgICAgIG1fbGluZUJveGVzLmFw
cGVuZExpbmVCb3goV1RGTW92ZShuZXdMaW5lQm94KSk7Ci0gICAgICAgICAgICB0cmFpbGluZ0Zs
b2F0c0xpbmVCb3gtPnNldENvbnN0cnVjdGVkKCk7Ci0gICAgICAgICAgICBHbHlwaE92ZXJmbG93
QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94RGF0YU1hcDsKLSAgICAgICAgICAgIFZlcnRpY2Fs
UG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7Ci0gICAgICAgICAgICBMYXlvdXRV
bml0IGJsb2NrTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgICAgIHRy
YWlsaW5nRmxvYXRzTGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJlY3Rpb24oYmxvY2tMb2dp
Y2FsSGVpZ2h0LCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsKLSAgICAg
ICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhi
bG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0
LCBibG9ja0xvZ2ljYWxIZWlnaHQpOwotICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94
LT5zZXRQYWdpbmF0ZWRMaW5lV2lkdGgoYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChi
bG9ja0xvZ2ljYWxIZWlnaHQpKTsKLSAgICAgICAgICAgIExheW91dFJlY3QgbG9naWNhbExheW91
dE92ZXJmbG93KDBfbHUsIGJsb2NrTG9naWNhbEhlaWdodCwgMV9sdSwgYm90dG9tTGF5b3V0T3Zl
cmZsb3cgLSBibG9ja0xvZ2ljYWxIZWlnaHQpOwotICAgICAgICAgICAgTGF5b3V0UmVjdCBsb2dp
Y2FsVmlzdWFsT3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2FsSGVpZ2h0LCAxX2x1LCBib3R0b21W
aXN1YWxPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7Ci0gICAgICAgICAgICB0cmFpbGlu
Z0Zsb2F0c0xpbmVCb3gtPnNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0cyhsb2dpY2FsTGF5b3V0
T3ZlcmZsb3csIGxvZ2ljYWxWaXN1YWxPdmVyZmxvdywgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5s
aW5lVG9wKCksIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+bGluZUJvdHRvbSgpKTsKLSAgICAgICAg
ICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQotICAgICAgICAgICAgICAgIHVw
ZGF0ZUZyYWdtZW50Rm9yTGluZSh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gpOwotICAgICAgICB9Ci0K
LSAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9m
bG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgICAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RT
ZXQuYmVnaW4oKTsKLSAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsK
LSAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9hdCA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmxh
c3RGbG9hdCgpKSB7Ci0gICAgICAgICAgICBhdXRvIGxhc3RGbG9hdEl0ZXJhdG9yID0gZmxvYXRp
bmdPYmplY3RTZXQuZmluZChsYXN0RmxvYXQpOwotICAgICAgICAgICAgQVNTRVJUKGxhc3RGbG9h
dEl0ZXJhdG9yICE9IGVuZCk7Ci0gICAgICAgICAgICArK2xhc3RGbG9hdEl0ZXJhdG9yOwotICAg
ICAgICAgICAgaXQgPSBsYXN0RmxvYXRJdGVyYXRvcjsKLSAgICAgICAgfQotICAgICAgICBmb3Ig
KDsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xh
c3RMaW5lKCoqaXQpOwotICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0Rmxv
YXQoIWZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSA/IGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3Qo
KS5nZXQoKSA6IG51bGxwdHIpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6Omxh
eW91dExpbmVCb3hlcyhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQmIHJlcGFpbnRM
b2dpY2FsVG9wLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbEJvdHRvbSkKLXsKLSAgICBBU1NF
UlQoIW1fc2ltcGxlTGluZUxheW91dCk7Ci0KLSAgICBzZXRMb2dpY2FsSGVpZ2h0KGJvcmRlckFu
ZFBhZGRpbmdCZWZvcmUoKSk7Ci0gICAgCi0gICAgLy8gTGF5IG91dCBvdXIgaHlwb3RoZXRpY2Fs
IGdyaWQgbGluZSBhcyB0aG91Z2ggaXQgb2NjdXJzIGF0IHRoZSB0b3Agb2YgdGhlIGJsb2NrLgot
ICAgIGlmICh2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkg
JiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5saW5l
R3JpZCgpID09IHRoaXMpCi0gICAgICAgIGxheW91dExpbmVHcmlkQm94KCk7Ci0KLSAgICBSZW5k
ZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRlZEZsb3cgPSBlbmNsb3NpbmdGcmFnbWVudGVkRmxv
dygpOwotICAgIGJvb2wgY2xlYXJMaW5lc0ZvclBhZ2luYXRpb24gPSBmaXJzdFJvb3RCb3goKSAm
JiBmcmFnbWVudGVkRmxvdyAmJiAhZnJhZ21lbnRlZEZsb3ctPmhhc0ZyYWdtZW50cygpOwotCi0g
ICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgot
ICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCi0gICAgYm9vbCBpc0Z1bGxM
YXlvdXQgPSAhZmlyc3RSb290Qm94KCkgfHwgc2VsZk5lZWRzTGF5b3V0KCkgfHwgcmVsYXlvdXRD
aGlsZHJlbiB8fCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbjsKLSAgICBMaW5lTGF5b3V0U3RhdGUg
bGF5b3V0U3RhdGUoKnRoaXMsIGlzRnVsbExheW91dCwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFp
bnRMb2dpY2FsQm90dG9tLCBmcmFnbWVudGVkRmxvdyk7Ci0KLSAgICBpZiAoaXNGdWxsTGF5b3V0
KQotICAgICAgICBsaW5lQm94ZXMoKS5kZWxldGVMaW5lQm94ZXMoKTsKLQotICAgIC8vIFRleHQg
dHJ1bmNhdGlvbiBraWNrcyBpbiBpbiB0d28gY2FzZXM6Ci0gICAgLy8gICAgIDEpIElmIHlvdXIg
b3ZlcmZsb3cgaXNuJ3QgdmlzaWJsZSBhbmQgeW91ciB0ZXh0LW92ZXJmbG93LW1vZGUgaXNuJ3Qg
Y2xpcC4KLSAgICAvLyAgICAgMikgSWYgeW91J3JlIGFuIGFub255bW91cyBibG9jayB3aXRoIGEg
YmxvY2sgcGFyZW50IHRoYXQgc2F0aXNmaWVzICMxLgotICAgIC8vIEZJWE1FOiBDU1MzIHNheXMg
dGhhdCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjbGlwcGVkIG11c3QgYWxzbyBrbm93IGhvdyB0byB0
cnVuY2F0ZS4gIFRoaXMgaXMgaW5zYW5lbHkKLSAgICAvLyBkaWZmaWN1bHQgdG8gZmlndXJlIG91
dCBpbiBnZW5lcmFsIChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2YgZG9pbmcgbGF5b3V0KSwg
c28gd2Ugb25seSBoYW5kbGUgdGhlCi0gICAgLy8gc2ltcGxlIGNhc2Ugb2YgYW4gYW5vbnltb3Vz
IGJsb2NrIHRydW5jYXRpbmcgd2hlbiBpdCdzIHBhcmVudCBpcyBjbGlwcGVkLgotICAgIGJvb2wg
aGFzVGV4dE92ZXJmbG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4dE92ZXJmbG93
OjpFbGxpcHNpcyAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgfHwgKGlzQW5vbnltb3Vz
QmxvY2soKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpICYmIHBhcmVu
dCgpLT5zdHlsZSgpLnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxvdzo6RWxsaXBzaXMgJiYg
cGFyZW50KCktPmhhc092ZXJmbG93Q2xpcCgpKTsKLQotICAgIC8vIFdhbGsgYWxsIHRoZSBsaW5l
cyBhbmQgZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRoZXkgZXhpc3QuCi0gICAg
aWYgKGhhc1RleHRPdmVyZmxvdykKLSAgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7
Ci0KLSAgICBpZiAoZmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgIC8vIEluIGZ1bGwgbGF5b3V0IG1v
ZGUsIGNsZWFyIHRoZSBsaW5lIGJveGVzIG9mIGNoaWxkcmVuIHVwZnJvbnQuIE90aGVyd2lzZSwK
LSAgICAgICAgLy8gc2libGluZ3MgY2FuIHJ1biBpbnRvIHN0YWxlIHJvb3QgbGluZWJveGVzIGR1
cmluZyBsYXlvdXQuIFRoZW4gbGF5b3V0Ci0gICAgICAgIC8vIHRoZSByZXBsYWNlZCBlbGVtZW50
cyBsYXRlci4gSW4gcGFydGlhbCBsYXlvdXQgbW9kZSwgbGluZSBib3hlcyBhcmUgbm90Ci0gICAg
ICAgIC8vIGRlbGV0ZWQgYW5kIG9ubHkgZGlydGllZC4gSW4gdGhhdCBjYXNlLCB3ZSBjYW4gbGF5
b3V0IHRoZSByZXBsYWNlZAotICAgICAgICAvLyBlbGVtZW50cyBhdCB0aGUgc2FtZSB0aW1lLgot
ICAgICAgICBib29sIGhhc0lubGluZUNoaWxkID0gZmFsc2U7Ci0gICAgICAgIFZlY3RvcjxSZW5k
ZXJCb3gqPiByZXBsYWNlZENoaWxkcmVuOwotICAgICAgICBmb3IgKElubGluZVdhbGtlciB3YWxr
ZXIoKnRoaXMpOyAhd2Fsa2VyLmF0RW5kKCk7IHdhbGtlci5hZHZhbmNlKCkpIHsKLSAgICAgICAg
ICAgIFJlbmRlck9iamVjdCYgbyA9ICp3YWxrZXIuY3VycmVudCgpOwotCi0gICAgICAgICAgICBp
ZiAoIWhhc0lubGluZUNoaWxkICYmIG8uaXNJbmxpbmUoKSkKLSAgICAgICAgICAgICAgICBoYXNJ
bmxpbmVDaGlsZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChvLmlzUmVwbGFjZWQoKSB8fCBv
LmlzRmxvYXRpbmcoKSB8fCBvLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgICAg
ICAgICAgUmVuZGVyQm94JiBib3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KG8pOwotCi0gICAgICAg
ICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgYm94Lmhhc1JlbGF0aXZlRGltZW5zaW9u
cygpKQotICAgICAgICAgICAgICAgICAgICBib3guc2V0Q2hpbGROZWVkc0xheW91dChNYXJrT25s
eVRoaXMpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRDaGlsZHJlbiBpcyBzZXQg
YW5kIHRoZSBjaGlsZCBoYXMgcGVyY2VudGFnZSBwYWRkaW5nIG9yIGFuIGVtYmVkZGVkIGNvbnRl
bnQgYm94LCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2hpbGRzIHByZWYgd2lkdGhz
LgotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIGJveC5uZWVkc1ByZWZl
cnJlZFdpZHRoc1JlY2FsY3VsYXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgYm94LnNldFBy
ZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSh0cnVlLCBNYXJrT25seVRoaXMpOwotCi0gICAgICAg
ICAgICAgICAgaWYgKGJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAg
ICAgICAgYm94LmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7
Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYm94LmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAg
ICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuYXBwZW5kKEZsb2F0V2l0aFJlY3Q6OmNy
ZWF0ZShib3gpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0Z1bGxMYXlvdXQgfHwgYm94
Lm5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZWQgZWxlbWVu
dC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCAmJiBpczxSZW5kZXJSdWJ5
UnVuPihib3gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyByZXNl
dHMgdGhlIG92ZXJoYW5naW5nIG1hcmdpbnMgdGhhdCB3ZSBzZXQgZHVyaW5nIGxpbmUgbGF5b3V0
IChzZWUgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgbW9yZSBzdWl0YWJsZSBwbGFjZSBmb3IgdGhpcy4K
LSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpblN0YXJ0Rm9yQ2hpbGQoYm94LCAwKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpbkVuZEZvckNoaWxkKGJveCwgMCk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYm94LmRpcnR5TGluZUJv
eGVzKGlzRnVsbExheW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bGxMYXlvdXQp
Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVuLmFwcGVuZCgmYm94KTsK
LSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYm94Lmxh
eW91dElmTmVlZGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlm
IChvLmlzVGV4dE9yTGluZUJyZWFrKCkgfHwgKGlzPFJlbmRlcklubGluZT4obykgJiYgIXdhbGtl
ci5hdEVuZE9mSW5saW5lKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzPFJlbmRlcklubGlu
ZT4obykpCi0gICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlcklubGluZT4obykudXBk
YXRlQWx3YXlzQ3JlYXRlTGluZUJveGVzKGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKTsKLSAg
ICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkgfHwgby5zZWxmTmVl
ZHNMYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAgICAgZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJl
cihvLCBsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSk7Ci0gICAgICAgICAgICAgICAgby5jbGVh
ck5lZWRzTGF5b3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHJlcGxhY2VkQ2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgICAg
ICAgICAgcmVwbGFjZWRDaGlsZHJlbltpXS0+bGF5b3V0SWZOZWVkZWQoKTsKLQotICAgICAgICBs
YXlvdXRSdW5zQW5kRmxvYXRzKGxheW91dFN0YXRlLCBoYXNJbmxpbmVDaGlsZCk7Ci0gICAgfQot
Ci0gICAgLy8gRXhwYW5kIHRoZSBsYXN0IGxpbmUgdG8gYWNjb21tb2RhdGUgUnVieSBhbmQgZW1w
aGFzaXMgbWFya3MuCi0gICAgaW50IGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gMDsK
LSAgICBpZiAobGFzdFJvb3RCb3goKSkgewotICAgICAgICBMYXlvdXRVbml0IGxvd2VzdEFsbG93
ZWRQb3NpdGlvbiA9IHN0ZDo6bWF4KGxhc3RSb290Qm94KCktPmxpbmVCb3R0b20oKSwgbG9naWNh
bEhlaWdodCgpICsgcGFkZGluZ0FmdGVyKCkpOwotICAgICAgICBpZiAoIXN0eWxlKCkuaXNGbGlw
cGVkTGluZXNXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgbGFzdExpbmVBbm5vdGF0aW9uc0Fk
anVzdG1lbnQgPSBsYXN0Um9vdEJveCgpLT5jb21wdXRlVW5kZXJBbm5vdGF0aW9uQWRqdXN0bWVu
dChsb3dlc3RBbGxvd2VkUG9zaXRpb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYXN0
TGluZUFubm90YXRpb25zQWRqdXN0bWVudCA9IGxhc3RSb290Qm94KCktPmNvbXB1dGVPdmVyQW5u
b3RhdGlvbkFkanVzdG1lbnQobG93ZXN0QWxsb3dlZFBvc2l0aW9uKTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRk
aW5nIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5kCi0gICAgLy8gZGV0ZXJtaW5pbmcg
dGhlIGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uIFRoaXMgY29s
bGFwc2UgaXMgb25seSBuZWNlc3NhcnkKLSAgICAvLyBpZiBvdXIgbGFzdCBjaGlsZCB3YXMgYW4g
YW5vbnltb3VzIGlubGluZSBibG9jayB0aGF0IG1pZ2h0IG5lZWQgdG8gcHJvcGFnYXRlIG1hcmdp
biBpbmZvcm1hdGlvbiBvdXQgdG8KLSAgICAvLyB1cy4KLSAgICBMYXlvdXRVbml0IGFmdGVyRWRn
ZSA9IGJvcmRlckFuZFBhZGRpbmdBZnRlcigpICsgc2Nyb2xsYmFyTG9naWNhbEhlaWdodCgpICsg
bGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQ7Ci0gICAgc2V0TG9naWNhbEhlaWdodChsb2dp
Y2FsSGVpZ2h0KCkgKyBhZnRlckVkZ2UpOwotCi0gICAgaWYgKCFmaXJzdFJvb3RCb3goKSAmJiBo
YXNMaW5lSWZFbXB0eSgpKQotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQo
KSArIGxpbmVIZWlnaHQodHJ1ZSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IEhvcml6b250
YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpKTsKLQot
ICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNwaWxsIG91dCBvZiBvdXIgYmxv
Y2suICBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQgdG8KLSAgICAvLyB0cnVu
Y2F0ZSB0ZXh0LgotICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCi0gICAgICAgIGNoZWNrTGluZXNG
b3JUZXh0T3ZlcmZsb3coKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrRmxvYXRJ
bkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRlckJveCYgZmxvYXRCb3hP
bkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LAotICAgIGJv
b2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZsb2F0KQotewotICAgIEFT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxl
KCkuZGVsZXRpb25IYXNCZWd1bigpKTsKLSAgICBpZiAoJm1hdGNoaW5nRmxvYXRXaXRoUmVjdC5y
ZW5kZXJlcigpICE9ICZmbG9hdEJveE9uQ2xlYW5MaW5lKSB7Ci0gICAgICAgIGVuY291bnRlcmVk
TmV3RmxvYXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZsb2F0Qm94T25D
bGVhbkxpbmUubGF5b3V0SWZOZWVkZWQoKTsKLSAgICBMYXlvdXRSZWN0IG9yaWdpbmFsRmxvYXRS
ZWN0ID0gbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LnJlY3QoKTsKLSAgICBMYXlvdXRTaXplIG5ld1Np
emUoCi0gICAgICAgIGZsb2F0Qm94T25DbGVhbkxpbmUud2lkdGgoKSArIGZsb2F0Qm94T25DbGVh
bkxpbmUuaG9yaXpvbnRhbE1hcmdpbkV4dGVudCgpLAotICAgICAgICBmbG9hdEJveE9uQ2xlYW5M
aW5lLmhlaWdodCgpICsgZmxvYXRCb3hPbkNsZWFuTGluZS52ZXJ0aWNhbE1hcmdpbkV4dGVudCgp
KTsKLSAgICAKLSAgICAvLyBXZSBoYXZlIHRvIHJlc2V0IHRoZSBjYXAtaGVpZ2h0IGFsaWdubWVu
dCBkb25lIGJ5IHRoZSBmaXJzdC1sZXR0ZXIgZmxvYXRzIHdoZW4gaW5pdGlhbC1sZXR0ZXIgaXMg
c2V0LCBzbyBqdXN0IGFsd2F5cyB0cmVhdCBmaXJzdC1sZXR0ZXIgZmxvYXRzIGFzIGRpcnR5Lgot
ICAgIGlmIChvcmlnaW5hbEZsb2F0UmVjdC5zaXplKCkgPT0gbmV3U2l6ZSAmJiAoZmxvYXRCb3hP
bkNsZWFuTGluZS5zdHlsZSgpLnN0eWxlVHlwZSgpICE9IFBzZXVkb0lkOjpGaXJzdExldHRlciB8
fCAhZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLmluaXRpYWxMZXR0ZXJEcm9wKCkpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBMYXlvdXRVbml0IGZsb2F0VG9wID0gaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSA/IG9yaWdpbmFsRmxvYXRSZWN0LnkoKSA6IG9yaWdpbmFsRmxvYXRSZWN0Lngo
KTsKLSAgICBMYXlvdXRVbml0IGZsb2F0SGVpZ2h0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUo
KSA/IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBuZXdTaXplLmhlaWdodCgp
KQotICAgICAgICA6IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LndpZHRoKCksIG5ld1NpemUu
d2lkdGgoKSk7Ci0gICAgZmxvYXRIZWlnaHQgPSBzdGQ6Om1pbihmbG9hdEhlaWdodCwgTGF5b3V0
VW5pdDo6bWF4KCkgLSBmbG9hdFRvcCk7Ci0gICAgY2xlYW5MaW5lLm1hcmtEaXJ0eSgpOwotICAg
IG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5lQm90dG9tV2l0aExlYWRp
bmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7Ci0gICAgTGF5b3V0UmVj
dCBuZXdGbG9hdFJlY3QgPSBvcmlnaW5hbEZsb2F0UmVjdDsKLSAgICBuZXdGbG9hdFJlY3Quc2V0
U2l6ZShuZXdTaXplKTsKLSAgICBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QuYWRqdXN0UmVjdChuZXdG
bG9hdFJlY3QpOwotICAgIGRpcnRpZWRCeUZsb2F0ID0gdHJ1ZTsKLX0KLQotUm9vdElubGluZUJv
eCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCi17Ci0gICAgUm9v
dElubGluZUJveCogY3VycmVudExpbmUgPSBudWxscHRyOwotICAgIFJvb3RJbmxpbmVCb3gqIGxh
c3RMaW5lID0gbnVsbHB0cjsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGVudGlyZSBmbG9hdC1jaGVj
a2luZyBibG9jayBuZWVkcyB0byBiZSBicm9rZW4gaW50byBhIG5ldyBmdW5jdGlvbi4KLSAgICBh
dXRvJiBmbG9hdHMgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKTsKLSAgICBib29sIGRpcnRpZWRC
eUZsb2F0ID0gZmFsc2U7Ci0gICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSkgewot
ICAgICAgICAvLyBQYWdpbmF0ZSBhbGwgb2YgdGhlIGNsZWFuIGxpbmVzLgotICAgICAgICBib29s
IHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3Rh
dGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkt
PmlzUGFnaW5hdGVkKCk7Ci0gICAgICAgIExheW91dFVuaXQgcGFnaW5hdGlvbkRlbHRhOwotICAg
ICAgICBhdXRvIGZsb2F0c0l0ZXJhdG9yID0gZmxvYXRzLmJlZ2luKCk7Ci0gICAgICAgIGF1dG8g
ZW5kID0gZmxvYXRzLmVuZCgpOwotICAgICAgICBmb3IgKGN1cnJlbnRMaW5lID0gZmlyc3RSb290
Qm94KCk7IGN1cnJlbnRMaW5lICYmICFjdXJyZW50TGluZS0+aXNEaXJ0eSgpOyBjdXJyZW50TGlu
ZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICBpZiAocGFnaW5h
dGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFu
Z2VkKGN1cnJlbnRMaW5lLCAwLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKSkgewotICAg
ICAgICAgICAgICAgICAgICBjdXJyZW50TGluZS0+bWFya0RpcnR5KCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYWdpbmF0
aW9uRGVsdGEgLT0gY3VycmVudExpbmUtPnBhZ2luYXRpb25TdHJ1dCgpOwotICAgICAgICAgICAg
ICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgYWRqdXN0TGluZVBv
c2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyZW50TGluZSwgcGFnaW5hdGlvbkRlbHRhLCBvdmVyZmxv
d3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKHBhZ2luYXRpb25EZWx0YSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFp
bnNGbG9hdHMoKSB8fCAhZmxvYXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IERvIGJldHRlciBldmVudHVhbGx5LiAgRm9yIG5vdyBpZiB3ZSBldmVyIHNo
aWZ0IGJlY2F1c2Ugb2YgcGFnaW5hdGlvbiBhbmQgZmxvYXRzIGFyZSBwcmVzZW50IGp1c3QgZ28g
dG8gYSBmdWxsIGxheW91dC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLm1h
cmtGb3JGdWxsTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLnVwZGF0
ZVJlcGFpbnRSYW5nZUZyb21Cb3goY3VycmVudExpbmUsIHBhZ2luYXRpb25EZWx0YSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLT5hZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9u
KHBhZ2luYXRpb25EZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlm
IChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQotICAgICAgICAgICAgICAgICAgICB1cGRh
dGVGcmFnbWVudEZvckxpbmUoY3VycmVudExpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gY3VycmVudExpbmUtPmZsb2F0c1B0cigp
KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYSBuZXcgZmxvYXQgaGFzIGJlZW4gaW5zZXJ0ZWQg
YmVmb3JlIHRoaXMgbGluZSBvciBiZWZvcmUgaXRzIGxhc3Qga25vd24gZmxvYXQsIGp1c3QgZG8g
YSBmdWxsIGxheW91dC4KLSAgICAgICAgICAgICAgICBib29sIGVuY291bnRlcmVkTmV3RmxvYXQg
PSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0Qm94T25DbGVhbkxpbmUg
OiAqY2xlYW5MaW5lRmxvYXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChmbG9hdHNJ
dGVyYXRvciAhPSBlbmQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0Qm94T25DbGVh
bkxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGluZSwgKmZsb2F0Qm94T25DbGVh
bkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdGbG9hdCwgZGlydGllZEJ5Rmxv
YXQpOwotICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJhdG9yOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVuY291bnRlcmVkTmV3RmxvYXQp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLm1hcmtGb3JGdWxsTGF5b3V0
KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGlydGllZEJ5RmxvYXQg
fHwgZW5jb3VudGVyZWROZXdGbG9hdCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYSBuZXcgZmxvYXQgaGFz
IGJlZW4gaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gZmxvYXQuCi0gICAgICAgIGlmIChm
bG9hdHNJdGVyYXRvciAhPSBlbmQpIHsKLSAgICAgICAgICAgIGlmICghY3VycmVudExpbmUpCi0g
ICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKLSAgICAgICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoOyBmbG9hdHNJdGVyYXRvciAhPSBlbmQ7
ICsrZmxvYXRzSXRlcmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byYgZmxvYXRXaXRo
UmVjdCA9ICpmbG9hdHNJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmbG9hdFdp
dGhSZWN0LT5yZW5kZXJlcigpLm5lZWRzTGF5b3V0KCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxM
YXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxheW91dFN0YXRlLmlz
RnVsbExheW91dCgpKSB7Ci0gICAgICAgIG1fbGluZUJveGVzLmRlbGV0ZUxpbmVCb3hUcmVlKCk7
Ci0gICAgICAgIGN1cnJlbnRMaW5lID0gbnVsbHB0cjsKLSAgICAgICAgQVNTRVJUKCFmaXJzdFJv
b3RCb3goKSAmJiAhbGFzdFJvb3RCb3goKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGN1
cnJlbnRMaW5lKSB7Ci0gICAgICAgICAgICAvLyBXZSBoYXZlIGEgZGlydHkgbGluZS4KLSAgICAg
ICAgICAgIGlmIChSb290SW5saW5lQm94KiBwcmV2Um9vdEJveCA9IGN1cnJlbnRMaW5lLT5wcmV2
Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHByZXZpb3VzIGxpbmUu
Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAoIXByZXZSb290Qm94LT5l
bmRzV2l0aEJyZWFrKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIXByZXZSb290Qm94LT5saW5l
QnJlYWtPYmooKQotICAgICAgICAgICAgICAgICAgICB8fCAoaXM8UmVuZGVyVGV4dD4oKnByZXZS
b290Qm94LT5saW5lQnJlYWtPYmooKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgcHJldlJvb3RC
b3gtPmxpbmVCcmVha1BvcygpID49IGRvd25jYXN0PFJlbmRlclRleHQ+KCpwcmV2Um9vdEJveC0+
bGluZUJyZWFrT2JqKCkpLnRleHQoKS5sZW5ndGgoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IC8vIFRoZSBwcmV2aW91cyBsaW5lIGRpZG4ndCBicmVhayBjbGVhbmx5IG9yIGJyb2tlIGF0IGEg
bmV3bGluZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQsIHNv
IHRyZWF0IGl0IGFzIGRpcnR5IHRvby4KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmUg
PSBwcmV2Um9vdEJveDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBkaXJ0eSBsaW5lcywgdGhlbiBsYXN0IGlzIGp1
c3QgdGhlIGxhc3Qgcm9vdCBib3guCi0gICAgICAgIGxhc3RMaW5lID0gY3VycmVudExpbmUgPyBj
dXJyZW50TGluZS0+cHJldlJvb3RCb3goKSA6IGxhc3RSb290Qm94KCk7Ci0gICAgfQotCi0gICAg
aWYgKCFmbG9hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgc2F2ZWRMb2dpY2Fs
SGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOwotICAgICAgICAvLyBSZXN0b3JlIGZsb2F0cyBmcm9t
IGNsZWFuIGxpbmVzLgotICAgICAgICBSb290SW5saW5lQm94KiBsaW5lID0gZmlyc3RSb290Qm94
KCk7Ci0gICAgICAgIHdoaWxlIChsaW5lICE9IGN1cnJlbnRMaW5lKSB7Ci0gICAgICAgICAgICBp
ZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRyKCkpIHsKLSAgICAgICAg
ICAgICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFuTGluZUZsb2F0cykgewotICAg
ICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQotICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8qIGZsb2F0aW5nT2JqZWN0ID0g
aW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKLSAgICAgICAgICAgICAgICAgICAg
QVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIWZsb2F0aW5nT2JqZWN0LT5vcmlnaW5h
dGluZ0xpbmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRPcmln
aW5hdGluZ0xpbmUoKmxpbmUpOwotICAgICAgICAgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0
KGxvZ2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2luQmVmb3JlRm9yQ2hpbGQo
KmZsb2F0aW5nQm94KSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7
Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0cy5zZXRMYXN0Q2xlYW5GbG9hdCgqZmxvYXRpbmdC
b3gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmUg
PSBsaW5lLT5uZXh0Um9vdEJveCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldExvZ2ljYWxIZWln
aHQoc2F2ZWRMb2dpY2FsSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBsYXlvdXRTdGF0ZS5saW5lSW5m
bygpLnNldEZpcnN0TGluZSghbGFzdExpbmUpOwotICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCku
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCFsYXN0TGluZSB8fCBsYXN0TGluZS0+ZW5kc1dp
dGhCcmVhaygpKTsKLQotICAgIGlmIChsYXN0TGluZSkgewotICAgICAgICBzZXRMb2dpY2FsSGVp
Z2h0KGxhc3RMaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Ci0gICAgICAgIElubGluZUl0
ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVyYXRvcih0aGlzLCBsYXN0TGluZS0+bGluZUJyZWFrT2Jq
KCksIGxhc3RMaW5lLT5saW5lQnJlYWtQb3MoKSk7Ci0gICAgICAgIHJlc29sdmVyLnNldFBvc2l0
aW9uKGl0ZXIsIG51bWJlck9mSXNvbGF0ZUFuY2VzdG9ycyhpdGVyKSk7Ci0gICAgICAgIHJlc29s
dmVyLnNldFN0YXR1cyhsYXN0TGluZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpKTsKLSAgICB9IGVs
c2UgewotICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9u
KCk7Ci0gICAgICAgIGlmIChzdHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0gUGxhaW50ZXh0KQotICAg
ICAgICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGlyZWN0aW9uLCBJbmxpbmVJdGVyYXRv
cih0aGlzLCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcygqdGhpcyksIDApKTsKLSAgICAg
ICAgcmVzb2x2ZXIuc2V0U3RhdHVzKEJpZGlTdGF0dXMoZGlyZWN0aW9uLCBpc092ZXJyaWRlKHN0
eWxlKCkudW5pY29kZUJpZGkoKSkpKTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgaXRlciA9IElu
bGluZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKCp0aGlzLCAm
cmVzb2x2ZXIpLCAwKTsKLSAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oaXRlciwgbnVtYmVy
T2ZJc29sYXRlQW5jZXN0b3JzKGl0ZXIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGN1cnJlbnRMaW5l
OwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJ
dGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMp
Ci17Ci0gICAgYXV0byBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9hdCA9IFtdKExpbmVMYXlvdXRT
dGF0ZTo6RmxvYXRMaXN0JiBmbG9hdHMpIHsKLSAgICAgICAgYXV0byBsYXN0Q2xlYW5GbG9hdCA9
IGZsb2F0cy5sYXN0Q2xlYW5GbG9hdCgpOwotICAgICAgICBpZiAoIWxhc3RDbGVhbkZsb2F0KQot
ICAgICAgICAgICAgcmV0dXJuIGZsb2F0cy5iZWdpbigpOwotICAgICAgICBhdXRvKiBsYXN0Q2xl
YW5GbG9hdFdpdGhSZWN0ID0gZmxvYXRzLmZsb2F0V2l0aFJlY3QoKmxhc3RDbGVhbkZsb2F0KTsK
LSAgICAgICAgQVNTRVJUKGxhc3RDbGVhbkZsb2F0V2l0aFJlY3QpOwotICAgICAgICByZXR1cm4g
KytmbG9hdHMuZmluZCgqbGFzdENsZWFuRmxvYXRXaXRoUmVjdCk7Ci0gICAgfTsKLQotICAgIEFT
U0VSVCghbGF5b3V0U3RhdGUuZW5kTGluZSgpKTsKLSAgICBhdXRvIGZsb2F0c0l0ZXJhdG9yID0g
aXRlcmF0b3JGb3JGaXJzdERpcnR5RmxvYXQobGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkpOwotICAg
IGF1dG8gZW5kID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuZW5kKCk7Ci0gICAgUm9vdElubGlu
ZUJveCogbGFzdExpbmUgPSBudWxscHRyOwotICAgIGZvciAoUm9vdElubGluZUJveCogY3VycmVu
dExpbmUgPSBzdGFydExpbmUtPm5leHRSb290Qm94KCk7IGN1cnJlbnRMaW5lOyBjdXJyZW50TGlu
ZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIGlmICghY3VycmVudExp
bmUtPmlzRGlydHkoKSkgewotICAgICAgICAgICAgaWYgKGF1dG8qIGNsZWFuTGluZUZsb2F0cyA9
IGN1cnJlbnRMaW5lLT5mbG9hdHNQdHIoKSkgewotICAgICAgICAgICAgICAgIGJvb2wgZW5jb3Vu
dGVyZWROZXdGbG9hdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2wgZGlydGllZEJ5Rmxv
YXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0Qm94T25DbGVhbkxp
bmUgOiAqY2xlYW5MaW5lRmxvYXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmxvYXRC
b3hPbkNsZWFuTGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQoZmxvYXRzSXRlcmF0b3IgIT0gZW5kKTsKLSAgICAgICAgICAg
ICAgICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGluZSwgKmZsb2F0Qm94T25D
bGVhbkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdGbG9hdCwgZGlydGllZEJ5
RmxvYXQpOwotICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJhdG9yOwotICAgICAgICAg
ICAgICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVuY291bnRlcmVkTmV3Rmxv
YXQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50TGluZS0+aXNEaXJ0
eSgpKQotICAgICAgICAgICAgbGFzdExpbmUgPSBudWxscHRyOwotICAgICAgICBlbHNlIGlmICgh
bGFzdExpbmUpCi0gICAgICAgICAgICBsYXN0TGluZSA9IGN1cnJlbnRMaW5lOwotICAgIH0KLQot
ICAgIGlmICghbGFzdExpbmUpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEF0IHRoaXMgcG9p
bnQsIHxsYXN0fCBpcyB0aGUgZmlyc3QgbGluZSBpbiBhIHJ1biBvZiBjbGVhbiBsaW5lcyB0aGF0
IGVuZHMgd2l0aCB0aGUgbGFzdCBsaW5lCi0gICAgLy8gaW4gdGhlIGJsb2NrLgotICAgIFJvb3RJ
bmxpbmVCb3gqIHByZXZpb3VzTGluZSA9IGxhc3RMaW5lLT5wcmV2Um9vdEJveCgpOwotICAgIGNs
ZWFuTGluZVN0YXJ0ID0gSW5saW5lSXRlcmF0b3IodGhpcywgcHJldmlvdXNMaW5lLT5saW5lQnJl
YWtPYmooKSwgcHJldmlvdXNMaW5lLT5saW5lQnJlYWtQb3MoKSk7Ci0gICAgY2xlYW5MaW5lQmlk
aVN0YXR1cyA9IHByZXZpb3VzTGluZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpOwotICAgIGxheW91
dFN0YXRlLnNldEVuZExpbmVMb2dpY2FsVG9wKHByZXZpb3VzTGluZS0+bGluZUJvdHRvbVdpdGhM
ZWFkaW5nKCkpOwotCi0gICAgZm9yIChSb290SW5saW5lQm94KiBsaW5lID0gbGFzdExpbmU7IGxp
bmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIC8vIERpc2Nvbm5lY3Qg
YWxsIGxpbmUgYm94ZXMgZnJvbSB0aGVpciByZW5kZXIgb2JqZWN0cyB3aGlsZSBwcmVzZXJ2aW5n
IHRoZWlyIGNvbm5lY3Rpb25zIHRvIG9uZSBhbm90aGVyLgotICAgICAgICBsaW5lLT5leHRyYWN0
TGluZSgpOwotICAgIH0KLSAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lKGxhc3RMaW5lKTsKLX0K
LQotYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGlu
ZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQotewotICAgIExheW91dFVuaXQgbGluZURl
bHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsK
LQotICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQo
KS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5
b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKLSAgICBpZiAocGFnaW5hdGVkICYmIGxheW91dFN0
YXRlLmZyYWdtZW50ZWRGbG93KCkpIHsKLSAgICAgICAgLy8gQ2hlY2sgYWxsIGxpbmVzIGZyb20g
aGVyZSB0byB0aGUgZW5kLCBhbmQgc2VlIGlmIHRoZSBoeXBvdGhldGljYWwgbmV3IHBvc2l0aW9u
IGZvciB0aGUgbGluZXMgd2lsbCByZXN1bHQKLSAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgYXZh
aWxhYmxlIGxpbmUgd2lkdGguCi0gICAgICAgIGZvciAoUm9vdElubGluZUJveCogbGluZUJveCA9
IGxheW91dFN0YXRlLmVuZExpbmUoKTsgbGluZUJveDsgbGluZUJveCA9IGxpbmVCb3gtPm5leHRS
b290Qm94KCkpIHsKLSAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAg
ICAvLyBUaGlzIGlzbid0IHRoZSByZWFsIG1vdmUgd2UncmUgZ29pbmcgdG8gZG8sIHNvIGRvbid0
IHVwZGF0ZSB0aGUgbGluZSBib3gncyBwYWdpbmF0aW9uCi0gICAgICAgICAgICAgICAgLy8gc3Ry
dXQgeWV0LgotICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkUGFnaW5hdGlvblN0cnV0ID0g
bGluZUJveC0+cGFnaW5hdGlvblN0cnV0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxv
d3NGcmFnbWVudDsKLSAgICAgICAgICAgICAgICBsaW5lRGVsdGEgLT0gb2xkUGFnaW5hdGlvblN0
cnV0OwotICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGlu
ZUJveCwgbGluZURlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRl
ZEZsb3coKSk7Ci0gICAgICAgICAgICAgICAgbGluZUJveC0+c2V0UGFnaW5hdGlvblN0cnV0KG9s
ZFBhZ2luYXRpb25TdHJ1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZVdp
ZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQobGluZUJveCwgbGluZURlbHRhLCBsYXlvdXRTdGF0
ZS5mcmFnbWVudGVkRmxvdygpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFsaW5lRGVsdGEgfHwgIW1fZmxvYXRpbmdPYmpl
Y3RzKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICAvLyBTZWUgaWYgYW55IGZsb2F0
cyBlbmQgaW4gdGhlIHJhbmdlIGFsb25nIHdoaWNoIHdlIHdhbnQgdG8gc2hpZnQgdGhlIGxpbmVz
IHZlcnRpY2FsbHkuCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0gc3RkOjptaW4obG9naWNh
bEhlaWdodCgpLCBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgpKTsKLQotICAgIFJvb3RJ
bmxpbmVCb3gqIGxhc3RMaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwotICAgIHdoaWxlIChS
b290SW5saW5lQm94KiBuZXh0TGluZSA9IGxhc3RMaW5lLT5uZXh0Um9vdEJveCgpKQotICAgICAg
ICBsYXN0TGluZSA9IG5leHRMaW5lOwotCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0g
bGFzdExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpICsgYWJzb2x1dGVWYWx1ZShsaW5lRGVs
dGEpOwotCi0gICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0g
bV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RT
ZXQuZW5kKCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0g
Kml0LT5nZXQoKTsKLSAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b21Gb3JGbG9hdChmbG9hdGluZ09i
amVjdCkgPj0gbG9naWNhbFRvcCAmJiBsb2dpY2FsQm90dG9tRm9yRmxvYXQoZmxvYXRpbmdPYmpl
Y3QpIDwgbG9naWNhbEJvdHRvbSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmVXaWR0aEZv
clBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqIHJvb3RCb3gsIExheW91dFVuaXQg
bGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRlZEZsb3cpIGNvbnN0Ci17
Ci0gICAgaWYgKCFmcmFnbWVudGVkRmxvdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
UmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGN1cnJlbnRGcmFnbWVudCA9IGZyYWdtZW50QXRCbG9j
a09mZnNldChyb290Qm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSArIGxpbmVEZWx0YSk7Ci0gICAg
Ly8gSnVzdCBiYWlsIGlmIHRoZSBmcmFnbWVudCBkaWRuJ3QgY2hhbmdlLgotICAgIGlmIChyb290
Qm94LT5jb250YWluaW5nRnJhZ21lbnQoKSA9PSBjdXJyZW50RnJhZ21lbnQpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICByZXR1cm4gcm9vdEJveC0+cGFnaW5hdGVkTGluZVdpZHRoKCkgIT0g
YXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChjdXJyZW50RnJhZ21lbnQpOwotfQotCi1i
b29sIFJlbmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5l
SXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cykK
LXsKLSAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3RhcnQpIHsKLSAgICAg
ICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVu
ZExpbmUobGF5b3V0U3RhdGUpOwotICAgIH0KLQotICAgIC8vIFRoZSBmaXJzdCBjbGVhbiBsaW5l
IGRvZXNuJ3QgbWF0Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgYSBoYW5kZnVsIG9mIGZvbGxvd2luZyBs
aW5lcyB0byB0cnkKLSAgICAvLyB0byBtYXRjaCBiYWNrIHVwLgotICAgIHN0YXRpYyBjb25zdCBp
bnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3aWxsaW5nIHRvIG1hdGNo
IGFnYWluc3QuCi0gICAgUm9vdElubGluZUJveCogb3JpZ2luYWxFbmRMaW5lID0gbGF5b3V0U3Rh
dGUuZW5kTGluZSgpOwotICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBvcmlnaW5hbEVuZExpbmU7
Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5lOyBpKyssIGxpbmUgPSBs
aW5lLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIGlmIChsaW5lLT5saW5lQnJlYWtPYmooKSA9
PSByZXNvbHZlci5wb3NpdGlvbigpLnJlbmRlcmVyKCkgJiYgbGluZS0+bGluZUJyZWFrUG9zKCkg
PT0gcmVzb2x2ZXIucG9zaXRpb24oKS5vZmZzZXQoKSkgewotICAgICAgICAgICAgLy8gV2UgaGF2
ZSBhIG1hdGNoLgotICAgICAgICAgICAgaWYgKGxpbmUtPmxpbmVCcmVha0JpZGlTdGF0dXMoKSAh
PSByZXNvbHZlci5zdGF0dXMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIC4u
LmJ1dCB0aGUgYmlkaSBzdGF0ZSBkb2Vzbid0IG1hdGNoLgotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBib29sIG1hdGNoZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIHJl
c3VsdCA9IGxpbmUtPm5leHRSb290Qm94KCk7Ci0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRF
bmRMaW5lKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAg
ICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxUb3AobGluZS0+bGluZUJvdHRvbVdpdGhM
ZWFkaW5nKCkpOwotICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBjaGVja1BhZ2luYXRpb25BbmRG
bG9hdHNBdEVuZExpbmUobGF5b3V0U3RhdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICAvLyBOb3cgZGVsZXRlIHRoZSBsaW5lcyB0aGF0IHdlIGZhaWxlZCB0byBzeW5jLgotICAgICAg
ICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBvcmlnaW5hbEVuZExpbmUsIHJlc3Vs
dCk7Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6Z2VuZXJhdGVzTGluZUJveGVz
Rm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCi17Ci0gICAgQVNTRVJUKGlu
bGluZU9iai0+cGFyZW50KCkgPT0gdGhpcyk7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciBpdCh0aGlz
LCBpbmxpbmVPYmosIDApOwotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcGFzcyBjb3JyZWN0IHZh
bHVlIGZvciBXaGl0ZXNwYWNlUG9zaXRpb24uCi0gICAgd2hpbGUgKCFpdC5hdEVuZCgpICYmICFy
ZXF1aXJlc0xpbmVCb3goaXQpKQotICAgICAgICBpdC5pbmNyZW1lbnQoKTsKLQotICAgIHJldHVy
biAhaXQuYXRFbmQoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJv
bUlubGluZUNoaWxkcmVuKCkKLXsKLSAgICBpZiAoYXV0byBsYXlvdXQgPSBzaW1wbGVMaW5lTGF5
b3V0KCkpIHsKLSAgICAgICAgQVNTRVJUKCFoYXNPdmVyZmxvd0NsaXAoKSk7Ci0gICAgICAgIFNp
bXBsZUxpbmVMYXlvdXQ6OmNvbGxlY3RGbG93T3ZlcmZsb3coKnRoaXMsICpsYXlvdXQpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIExheW91dFVuaXQgZW5kUGFkZGluZyA9IGhhc092ZXJm
bG93Q2xpcCgpID8gcGFkZGluZ0VuZCgpIDogMF9sdTsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBm
aW5kIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMsIHNpbmNlIHNjcm9sbGJhcnMgY291bGQgc2hvdyB3
aGVuIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KLSAgICBpZiAoaGFzT3ZlcmZsb3dDbGlwKCkgJiYg
IWVuZFBhZGRpbmcgJiYgZWxlbWVudCgpICYmIGVsZW1lbnQoKS0+aXNSb290RWRpdGFibGVFbGVt
ZW50KCkgJiYgc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGVuZFBh
ZGRpbmcgPSAxOwotICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgp
OyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICBhZGRMYXlvdXRP
dmVyZmxvdyhjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3QoZW5kUGFkZGluZykpOwotICAg
ICAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogZnJhZ21lbnQgPSBlbmNsb3NpbmdGcmFnbWVu
dGVkRmxvdygpID8gY3Vyci0+Y29udGFpbmluZ0ZyYWdtZW50KCkgOiBudWxscHRyOwotICAgICAg
ICBpZiAoZnJhZ21lbnQpCi0gICAgICAgICAgICBmcmFnbWVudC0+YWRkTGF5b3V0T3ZlcmZsb3dG
b3JCb3godGhpcywgY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0KGVuZFBhZGRpbmcpKTsK
LSAgICAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSkgewotICAgICAgICAgICAgTGF5b3V0UmVj
dCBjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCA9IGN1cnItPnZpc3VhbE92ZXJmbG93UmVjdChjdXJy
LT5saW5lVG9wKCksIGN1cnItPmxpbmVCb3R0b20oKSk7Ci0gICAgICAgICAgICBhZGRWaXN1YWxP
dmVyZmxvdyhjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7Ci0gICAgICAgICAgICBpZiAoZnJhZ21l
bnQpCi0gICAgICAgICAgICAgICAgZnJhZ21lbnQtPmFkZFZpc3VhbE92ZXJmbG93Rm9yQm94KHRo
aXMsIGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKLXsKLSAgICBUZXh0
QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7Ci0gICAgYm9vbCBsdHIg
PSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICBJbmRlbnRUZXh0T3JOb3Qg
c2hvdWxkSW5kZW50VGV4dCA9IEluZGVudFRleHQ7Ci0gICAgZm9yIChSb290SW5saW5lQm94KiBj
dXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7
Ci0gICAgICAgIGlmIChjdXJyLT5oYXNFbGxpcHNpc0JveCgpKSB7Ci0gICAgICAgICAgICBjdXJy
LT5jbGVhclRydW5jYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gU2hpZnQgdGhlIGxpbmUgYmFj
ayB3aGVyZSBpdCBiZWxvbmdzIGlmIHdlIGNhbm5vdCBhY2NvbW9kYXRlIGFuIGVsbGlwc2lzLgot
ICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmUo
Y3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgICAgIGZsb2F0IGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGlu
ZVRvcCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExlZnQ7Ci0gICAgICAgICAgICBmbG9h
dCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1cnItPmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAg
dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgY3VyciwgMCwgbG9naWNh
bExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIDApOwotCi0g
ICAgICAgICAgICBpZiAobHRyKQotICAgICAgICAgICAgICAgIGN1cnItPmFkanVzdExvZ2ljYWxQ
b3NpdGlvbigobG9naWNhbExlZnQgLSBjdXJyLT5sb2dpY2FsTGVmdCgpKSwgMCk7Ci0gICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0aW9uKC0o
Y3Vyci0+bG9naWNhbExlZnQoKSAtIGxvZ2ljYWxMZWZ0KSwgMCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgc2hvdWxkSW5kZW50VGV4dCA9IERvTm90SW5kZW50VGV4dDsKLSAgICB9Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2tGbG93OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCkKLXsKLSAgICAvLyBE
ZXRlcm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNpcyB1c2luZyB0aGUgY3VycmVudCBmb250
LgotICAgIC8vIEZJWE1FOiBDU1MzIHNheXMgdGhpcyBpcyBjb25maWd1cmFibGUsIGFsc28gbmVl
ZCB0byB1c2UgMHgwMDJFIChGVUxMIFNUT1ApIGlmIGhvcml6b250YWwgZWxsaXBzaXMgaXMgIm5v
dCByZW5kZXJhYmxlIgotICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUoKS5mb250
Q2FzY2FkZSgpOwotICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxBdG9tU3RyaW5nPiBlbGxpcHNp
c1N0cigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxKTsKLSAgICBjb25zdCBGb250Q2FzY2FkZSYgZmly
c3RMaW5lRm9udCA9IGZpcnN0TGluZVN0eWxlKCkuZm9udENhc2NhZGUoKTsKLSAgICBmbG9hdCBm
aXJzdExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53aWR0aChjb25zdHJ1Y3RUZXh0
UnVuKCZob3Jpem9udGFsRWxsaXBzaXMsIDEsIGZpcnN0TGluZVN0eWxlKCkpKTsKLSAgICBmbG9h
dCBlbGxpcHNpc1dpZHRoID0gKGZvbnQgPT0gZmlyc3RMaW5lRm9udCkgPyBmaXJzdExpbmVFbGxp
cHNpc1dpZHRoIDogZm9udC53aWR0aChjb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9udGFsRWxsaXBz
aXMsIDEsIHN0eWxlKCkpKTsKLQotICAgIC8vIEZvciBMVFIgdGV4dCB0cnVuY2F0aW9uLCB3ZSB3
YW50IHRvIGdldCB0aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBib3gsIGFuZCB0aGVuIHdl
IHdhbnQgdG8gc2VlCi0gICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2YgYSBsaW5lIGJveCBleGNl
ZWRzIHRoYXQuICBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcGFkZGluZyBi
b3ggYW5kCi0gICAgLy8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbGluZSBib3ggdG8gc2Vl
IGlmIGl0IGlzIGxlc3MKLSAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxiYXIgZm9yIG92ZXJmbG93
IGJsb2Nrcywgd2hpY2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRlbnRXaWR0aCgpIgotICAg
IGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7Ci0gICAgVGV4dEFs
aWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgpLnRleHRBbGlnbigpOwotICAgIGJvb2wgZmlyc3RM
aW5lID0gdHJ1ZTsKLSAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdFJvb3RCb3go
KTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgSW5kZW50VGV4
dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBmaXJzdExpbmUgPyBJbmRlbnRUZXh0IDogRG9Ob3RJ
bmRlbnRUZXh0OwotICAgICAgICBMYXlvdXRVbml0IGJsb2NrUmlnaHRFZGdlID0gbG9naWNhbFJp
Z2h0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwotICAg
ICAgICBMYXlvdXRVbml0IGJsb2NrTGVmdEVkZ2UgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmUo
Y3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBs
aW5lQm94RWRnZSB7IGx0ciA/IGN1cnItPngoKSArIGN1cnItPmxvZ2ljYWxXaWR0aCgpIDogY3Vy
ci0+eCgpIH07Ci0gICAgICAgIGlmICgobHRyICYmIGxpbmVCb3hFZGdlID4gYmxvY2tSaWdodEVk
Z2UpIHx8ICghbHRyICYmIGxpbmVCb3hFZGdlIDwgYmxvY2tMZWZ0RWRnZSkpIHsKLSAgICAgICAg
ICAgIC8vIFRoaXMgbGluZSBzcGlsbHMgb3V0IG9mIG91ciBib3ggaW4gdGhlIGFwcHJvcHJpYXRl
IGRpcmVjdGlvbi4gIE5vdyB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgbGluZQotICAgICAgICAgICAg
Ly8gY2FuIGJlIHRydW5jYXRlZC4gIEluIG9yZGVyIGZvciB0cnVuY2F0aW9uIHRvIGJlIHBvc3Np
YmxlLCB0aGUgbGluZSBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZSB0bwotICAgICAgICAgICAg
Ly8gYWNjb21tb2RhdGUgb3VyIHRydW5jYXRpb24gc3RyaW5nLCBhbmQgbm8gcmVwbGFjZWQgZWxl
bWVudHMgKGltYWdlcywgdGFibGVzKSBjYW4gb3ZlcmxhcCB0aGUgZWxsaXBzaXMKLSAgICAgICAg
ICAgIC8vIHNwYWNlLgotICAgICAgICAgICAgTGF5b3V0VW5pdCB3aWR0aCB7IGZpcnN0TGluZSA/
IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBlbGxpcHNpc1dpZHRoIH07Ci0gICAgICAgICAgICBM
YXlvdXRVbml0IGJsb2NrRWRnZSB7IGx0ciA/IGJsb2NrUmlnaHRFZGdlIDogYmxvY2tMZWZ0RWRn
ZSB9OwotICAgICAgICAgICAgaWYgKGN1cnItPmxpbmVDYW5BY2NvbW1vZGF0ZUVsbGlwc2lzKGx0
ciwgYmxvY2tFZGdlLCBsaW5lQm94RWRnZSwgd2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgZmxv
YXQgdG90YWxMb2dpY2FsV2lkdGggPSBjdXJyLT5wbGFjZUVsbGlwc2lzKGVsbGlwc2lzU3RyLCBs
dHIsIGJsb2NrTGVmdEVkZ2UsIGJsb2NrUmlnaHRFZGdlLCB3aWR0aCk7Ci0KLSAgICAgICAgICAg
ICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IDA7IC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4g
dGhlIGRlbHRhIGZyb20gdGhlIGJhc2UgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgZmxvYXQg
dHJ1bmNhdGVkV2lkdGggPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKGN1cnItPmxpbmVU
b3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdp
ZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgY3VyciwgbnVsbHB0ciwgbG9naWNhbExlZnQsIHRv
dGFsTG9naWNhbFdpZHRoLCB0cnVuY2F0ZWRXaWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYg
KGx0cikKLSAgICAgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0aW9uKGxv
Z2ljYWxMZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAg
IGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbigtKHRydW5jYXRlZFdpZHRoIC0gKGxvZ2ljYWxM
ZWZ0ICsgdG90YWxMb2dpY2FsV2lkdGgpKSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIFJlbmRlckJsb2Nr
Rmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25zdCBGbG9hdGluZ09iamVjdCYgbmV3Rmxv
YXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYg
bGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCi17Ci0gICAgaWYgKCFwb3NpdGlvbk5ld0Zsb2F0
cygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aWR0aC5zaHJpbmtBdmFpbGFibGVX
aWR0aEZvck5ld0Zsb2F0SWZOZWVkZWQobmV3RmxvYXQpOwotCi0gICAgLy8gV2Ugb25seSBjb25u
ZWN0IGZsb2F0cyB0byBsaW5lcyBmb3IgcGFnaW5hdGlvbiBwdXJwb3NlcyBpZiB0aGUgZmxvYXRz
IG9jY3VyIGF0IHRoZSBzdGFydCBvZgotICAgIC8vIHRoZSBsaW5lIGFuZCB0aGUgcHJldmlvdXMg
bGluZSBoYWQgYSBoYXJkIGJyZWFrIChzbyB0aGlzIGxpbmUgaXMgZWl0aGVyIHRoZSBmaXJzdCBp
biB0aGUgYmxvY2sKLSAgICAvLyBvciBmb2xsb3dzIGEgPGJyPikuCi0gICAgaWYgKCFuZXdGbG9h
dC5wYWdpbmF0aW9uU3RydXQoKSB8fCAhbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KCkgfHwgIWxpbmVJbmZvLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBj
b25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+c2V0KCk7Ci0gICAgQVNTRVJUKGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS5nZXQoKSA9
PSAmbmV3RmxvYXQpOwotCi0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxUb3AgPSBsb2dpY2Fs
VG9wRm9yRmxvYXQobmV3RmxvYXQpOwotICAgIExheW91dFVuaXQgcGFnaW5hdGlvblN0cnV0ID0g
bmV3RmxvYXQucGFnaW5hdGlvblN0cnV0KCk7Ci0KLSAgICBpZiAoZmxvYXRMb2dpY2FsVG9wIC0g
cGFnaW5hdGlvblN0cnV0ICE9IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5h
dGlvblN0cnV0KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgYXV0byBpdCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmVuZCgpOwotICAgIC0taXQ7IC8vIExhc3QgZmxvYXQgaXMgbmV3RmxvYXQs
IHNraXAgdGhhdCBvbmUuCi0gICAgYXV0byBiZWdpbiA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2lu
KCk7Ci0gICAgd2hpbGUgKGl0ICE9IGJlZ2luKSB7Ci0gICAgICAgIC0taXQ7Ci0gICAgICAgIGF1
dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKLSAgICAgICAgaWYgKCZmbG9hdGluZ09i
amVjdCA9PSBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGlmIChsb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpID09IGxvZ2ljYWxI
ZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpIHsKLSAgICAgICAgICAg
IGZsb2F0aW5nT2JqZWN0LnNldFBhZ2luYXRpb25TdHJ1dChwYWdpbmF0aW9uU3RydXQgKyBmbG9h
dGluZ09iamVjdC5wYWdpbmF0aW9uU3RydXQoKSk7Ci0gICAgICAgICAgICBSZW5kZXJCb3gmIGZs
b2F0Qm94ID0gZmxvYXRpbmdPYmplY3QucmVuZGVyZXIoKTsKLSAgICAgICAgICAgIHNldExvZ2lj
YWxUb3BGb3JDaGlsZChmbG9hdEJveCwgbG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94KSArIG1h
cmdpbkJlZm9yZUZvckNoaWxkKGZsb2F0Qm94KSArIHBhZ2luYXRpb25TdHJ1dCk7Ci0KLSAgICAg
ICAgICAgIGlmICh1cGRhdGVGcmFnbWVudFJhbmdlRm9yQm94Q2hpbGQoZmxvYXRCb3gpKQotICAg
ICAgICAgICAgICAgIGZsb2F0Qm94LnNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAg
ICAgICAgICBlbHNlIGlmIChpczxSZW5kZXJCbG9jaz4oZmxvYXRCb3gpKQotICAgICAgICAgICAg
ICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPihmbG9hdEJveCkuc2V0Q2hpbGROZWVkc0xheW91dChN
YXJrT25seVRoaXMpOwotICAgICAgICAgICAgZmxvYXRCb3gubGF5b3V0SWZOZWVkZWQoKTsKLQot
ICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb2xkIGxvZ2ljYWwgdG9wIGJlZm9yZSBjYWxsaW5nIHJl
bW92ZVBsYWNlZE9iamVjdCB3aGljaCB3aWxsIHNldAotICAgICAgICAgICAgLy8gaXNQbGFjZWQg
dG8gZmFsc2UuIE90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0IGluIGxvZ2ljYWxU
b3BGb3JGbG9hdC4KLSAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbFRvcCA9IGxvZ2lj
YWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCk7Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+cmVtb3ZlUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVjdCk7Ci0gICAgICAgICAgICBz
ZXRMb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QsIG9sZExvZ2ljYWxUb3AgKyBwYWdp
bmF0aW9uU3RydXQpOwotICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZFBsYWNlZE9i
amVjdCgmZmxvYXRpbmdPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSnVzdCB1
cGRhdGUgdGhlIGxpbmUgaW5mbydzIHBhZ2luYXRpb24gc3RydXQgd2l0aG91dCBhbHRlcmluZyBv
dXIgbG9naWNhbCBoZWlnaHQgeWV0LiBJZiB0aGUgbGluZSBlbmRzIHVwIGNvbnRhaW5pbmcKLSAg
ICAvLyBubyBjb250ZW50LCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gaW1wcm9wZXJseSBncm93IHRo
ZSBoZWlnaHQgb2YgdGhlIGJsb2NrLgotICAgIGxpbmVJbmZvLnNldEZsb2F0UGFnaW5hdGlvblN0
cnV0KGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkgKyBwYWdpbmF0aW9uU3RydXQpOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6c3RhcnRB
bGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJbmRlbnRUZXh0T3JOb3Qg
c2hvdWxkSW5kZW50VGV4dCkKLXsKLSAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxl
KCkudGV4dEFsaWduKCk7Ci0gICAgYm9vbCBzaG91bGRBcHBseUluZGVudFRleHQgPSBmYWxzZTsK
LSAgICBzd2l0Y2ggKHRleHRBbGlnbikgewotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6TGVmdDoK
LSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6Ci0gICAgICAgIHNob3VsZEFwcGx5
SW5kZW50VGV4dCA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlJpZ2h0OgotICAgIGNhc2UgVGV4dEFsaWdu
TW9kZTo6V2ViS2l0UmlnaHQ6Ci0gICAgICAgIHNob3VsZEFwcGx5SW5kZW50VGV4dCA9ICFzdHls
ZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBU
ZXh0QWxpZ25Nb2RlOjpTdGFydDoKLSAgICAgICAgc2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gdHJ1
ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2hvdWxkQXBwbHlJbmRl
bnRUZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIC8vIDxyZGFyOi8vcHJvYmxlbS8xNTQyNzU3MT4K
LSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NTIyCi0g
ICAgLy8gVGhpcyBxdWlyayBpcyBmb3IgbGVnYWN5IGNvbnRlbnQgdGhhdCBkb2Vzbid0IHdvcmsg
cHJvcGVybHkgd2l0aCB0aGUgY2VudGVyIHBvc2l0aW9uaW5nIHNjaGVtZQotICAgIC8vIGJlaW5n
IGhvbm9yZWQgKGUuZy4sIGVwdWJzKS4KLSAgICBpZiAoc2hvdWxkQXBwbHlJbmRlbnRUZXh0IHx8
IHNldHRpbmdzKCkudXNlTGVnYWN5VGV4dEFsaWduUG9zaXRpb25lZEVsZW1lbnRCZWhhdmlvcigp
KSAvLyBGSVhNRTogSGFuZGxlIFRleHRBbGlnbk1vZGU6OkVuZCBoZXJlCi0gICAgICAgIHJldHVy
biBzdGFydE9mZnNldEZvckxpbmUocG9zaXRpb24sIHNob3VsZEluZGVudFRleHQpOwotCi0gICAg
Ly8gdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KCkgaGFuZGxlcyB0aGUgZGlyZWN0aW9u
IG9mIHRoZSBibG9jayBzbyBubyBuZWVkIHRvIGNvbnNpZGVyIGl0IGhlcmUKLSAgICBmbG9hdCB0
b3RhbExvZ2ljYWxXaWR0aCA9IDA7Ci0gICAgZmxvYXQgbG9naWNhbExlZnQgPSBsb2dpY2FsTGVm
dE9mZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpOwotICAgIGZs
b2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUobG9n
aWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExlZnQ7Ci0KLSAgICAvLyBG
SVhNRTogQnVnIDEyOTMxMTogV2UgbmVlZCB0byBwYXNzIGEgdmFsaWQgUm9vdElubGluZUJveCBo
ZXJlLCBjb25zaWRlcmluZyB0aGUgYmlkaSBsZXZlbCB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbGlu
ZS4KLSAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCAwLCAwLCBs
b2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgMCk7
Ci0KLSAgICBpZiAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICBy
ZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsV2lkdGgoKSAtIGxvZ2ljYWxMZWZ0KTsKLSAgICByZXR1
cm4gTGF5b3V0VW5pdChsb2dpY2FsTGVmdCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1
cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCkgY29uc3QKLXsKLSAg
ICBBU1NFUlQobGluZUJveCk7Ci0KLSAgICBpZiAoIWhhc0ZyYWdtZW50UmFuZ2VJbkZyYWdtZW50
ZWRGbG93KCkpCi0gICAgICAgIGxpbmVCb3gtPmNsZWFyQ29udGFpbmluZ0ZyYWdtZW50KCk7Ci0g
ICAgZWxzZSB7Ci0gICAgICAgIGlmIChhdXRvIGNvbnRhaW5pbmdGcmFnbWVudCA9IGZyYWdtZW50
QXRCbG9ja09mZnNldChsaW5lQm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSkpCi0gICAgICAgICAg
ICBsaW5lQm94LT5zZXRDb250YWluaW5nRnJhZ21lbnQoKmNvbnRhaW5pbmdGcmFnbWVudCk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29udGFpbmluZ0ZyYWdtZW50
KCk7Ci0gICAgfQotCi0gICAgUm9vdElubGluZUJveCogcHJldkxpbmVCb3ggPSBsaW5lQm94LT5w
cmV2Um9vdEJveCgpOwotICAgIGlmICghcHJldkxpbmVCb3gpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIC8vIFRoaXMgY2hlY2sgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBvbmUgaW4gfGFkanVz
dExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb258IGJlY2F1c2UgaXQgdGFrZXMgaW50bwotICAgIC8v
IGFjY291bnQganVzdCB0aGUgY29udGFpbmVyIGNoYW5nZXMgYmV0d2VlbiBsaW5lcy4gVGhlIGJl
Zm9yZSBtZW50aW9uZWQgZnVuY3Rpb24gZG9lc24ndCBzZXQgdGhlIGZsYWcKLSAgICAvLyBjb3Jy
ZWN0bHkgaWYgdGhlIGxpbmUgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mIHRoZSBsYXN0IGZy
YWdtZW50IGNvbnRhaW5lci4KLSAgICBpZiAobGluZUJveC0+Y29udGFpbmluZ0ZyYWdtZW50KCkg
IT0gcHJldkxpbmVCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpKQotICAgICAgICBsaW5lQm94LT5z
ZXRJc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsodHJ1ZSk7Ci19Ci0KLX0KClByb3BlcnR5IGNoYW5nZXMg
b246IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCl9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KRGVsZXRlZDogc3ZuOmVvbC1zdHlsZQojIyAtMSArMCwwICMjCi1uYXRpdmUKXCBO
byBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlclJ1YnlCYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCw3
ICs2MCw3IEBAIFJlbmRlclJ1YnlSdW4qIFJlbmRlclJ1YnlCYXNlOjpydWJ5UnVuKCkKICAgICBy
ZXR1cm4gZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocGFyZW50KCkpOwogfQogCi1UZXh0QWxpZ25N
b2RlIFJlbmRlclJ1YnlCYXNlOjp0ZXh0QWxpZ25tZW50Rm9yTGluZShib29sIC8qIGVuZHNXaXRo
U29mdEJyZWFrICovKSBjb25zdAorT3B0aW9uYWw8VGV4dEFsaWduTW9kZT4gUmVuZGVyUnVieUJh
c2U6Om92ZXJyaWRlVGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCAvKiBlbmRzV2l0aFNvZnRCcmVh
ayAqLykgY29uc3QKIHsKICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKIH0KSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5oCShyZXZpc2lvbiAy
NDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuaAkod29y
a2luZyBjb3B5KQpAQCAtNjIsNyArNjIsNyBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIGJvb2wg
aXNSdWJ5QmFzZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KICAgICBib29sIGlz
Q2hpbGRBbGxvd2VkKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFJlbmRlclN0eWxlJikgY29u
c3Qgb3ZlcnJpZGU7Ci0gICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ25tZW50Rm9yTGluZShib29s
IGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdCBvdmVycmlkZTsKKyAgICBPcHRpb25hbDxUZXh0QWxp
Z25Nb2RlPiBvdmVycmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJl
YWspIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgYWRqdXN0SW5saW5lRGlyZWN0aW9uTGluZUJv
dW5kcyhpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBm
bG9hdCYgbG9naWNhbFdpZHRoKSBjb25zdCBvdmVycmlkZTsKIAogICAgIGZsb2F0IG1faW5pdGlh
bE9mZnNldDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlUZXh0
LmNwcAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clJ1YnlUZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcsMTIgKzU3LDEyIEBAIGJvb2wgUmVu
ZGVyUnVieVRleHQ6OmlzQ2hpbGRBbGxvd2VkKGNvbnMKICAgICByZXR1cm4gY2hpbGQuaXNJbmxp
bmUoKTsKIH0KIAotVGV4dEFsaWduTW9kZSBSZW5kZXJSdWJ5VGV4dDo6dGV4dEFsaWdubWVudEZv
ckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3QKK09wdGlvbmFsPFRleHRBbGlnbk1v
ZGU+IFJlbmRlclJ1YnlUZXh0OjpvdmVycmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wpIGNv
bnN0CiB7CiAgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgpLnRleHRBbGlnbigp
OwogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGJvZ3VzIHNpbmNlIHVzZXIgY2FuIHNldCB0
aGUgaW5pdGlhbCB2YWx1ZS4KICAgICBpZiAodGV4dEFsaWduICE9IFJlbmRlclN0eWxlOjppbml0
aWFsVGV4dEFsaWduKCkpCi0gICAgICAgIHJldHVybiBSZW5kZXJCbG9ja0Zsb3c6OnRleHRBbGln
bm1lbnRGb3JMaW5lKGVuZHNXaXRoU29mdEJyZWFrKTsKKyAgICAgICAgcmV0dXJuIHsgfTsKIAog
ICAgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFsbG93IHJ1YnkgdGV4dCB0byBleHBh
bmQgaWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBydWJ5IGJhc2UuCiAgICAgcmV0dXJuIFRleHRB
bGlnbk1vZGU6Okp1c3RpZnk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
UnVieVRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
UnVieVRleHQuaAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclJ1YnlUZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTU0LDcgKzU0LDcgQEAgcHJpdmF0
ZToKIAogICAgIGJvb2wgYXZvaWRzRmxvYXRzKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBUZXh0
QWxpZ25Nb2RlIHRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNv
bnN0IG92ZXJyaWRlOworICAgIE9wdGlvbmFsPFRleHRBbGlnbk1vZGU+IG92ZXJyaWRlVGV4dEFs
aWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3Qgb3ZlcnJpZGU7CiAg
ICAgdm9pZCBhZGp1c3RJbmxpbmVEaXJlY3Rpb25MaW5lQm91bmRzKGludCBleHBhbnNpb25PcHBv
cnR1bml0eUNvdW50LCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiBsb2dpY2FsV2lkdGgpIGNv
bnN0IG92ZXJyaWRlOwogfTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1NpbXBs
ZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9TaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcAkocmV2aXNpb24gMjQ4NTAwKQor
KysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1NpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zNTYsNyArMzU2LDcgQEAgdm9pZCBnZW5lcmF0ZUxpbmVCb3hU
cmVlKFJlbmRlckJsb2NrRmxvdwogICAgICAgICAvLyBsaW5lSW5mby5zZXRMYXN0TGluZShsYXN0
TGluZSk7CiAgICAgICAgIGxpbmVJbmZvLnNldEVtcHR5KCFiaWRpUnVucy5ydW5Db3VudCgpKTsK
ICAgICAgICAgYmlkaVJ1bnMuc2V0TG9naWNhbGx5TGFzdFJ1bihiaWRpUnVucy5sYXN0UnVuKCkp
OwotICAgICAgICBhdXRvKiByb290ID0gZmxvdy5jb25zdHJ1Y3RMaW5lKGJpZGlSdW5zLCBsaW5l
SW5mbyk7CisgICAgICAgIGF1dG8qIHJvb3QgPSBmbG93LmNvbXBsZXhMaW5lTGF5b3V0KCkuY29u
c3RydWN0TGluZShiaWRpUnVucywgbGluZUluZm8pOwogICAgICAgICBiaWRpUnVucy5jbGVhcigp
OwogICAgICAgICBpZiAoIXJvb3QpCiAgICAgICAgICAgICBjb250aW51ZTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAJKHJldmlzaW9uIDI0
ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNjYsNyArNjYsNyBAQCB2b2lkIExpbmVCcmVha2VyOjpza2lwTGVh
ZGluZ1doaXRlc3BhY2UoCiAgICAgICAgICAgICAgICAgbGluZUluZm8uaW5jcmVtZW50UnVuc0Zy
b21MZWFkaW5nV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYg
KG9iamVjdC5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICBtX2Jsb2NrLnBvc2l0aW9uTmV3Rmxv
YXRPbkxpbmUoKm1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmplY3QoZG93bmNhc3Q8UmVuZGVyQm94
PihvYmplY3QpKSwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbGluZUluZm8sIHdpZHRoKTsK
KyAgICAgICAgICAgIG1fYmxvY2suY29tcGxleExpbmVMYXlvdXQoKS5wb3NpdGlvbk5ld0Zsb2F0
T25MaW5lKCptX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KGRvd25jYXN0PFJlbmRlckJveD4o
b2JqZWN0KSksIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7CiAg
ICAgICAgIGVsc2UgaWYgKG9iamVjdC5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgaXM8UmVu
ZGVyQ29tYmluZVRleHQ+KG9iamVjdCkpIHsKICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckNv
bWJpbmVUZXh0PihvYmplY3QpLmNvbWJpbmVUZXh0SWZOZWVkZWQoKTsKICAgICAgICAgICAgIGlm
IChkb3duY2FzdDxSZW5kZXJDb21iaW5lVGV4dD4ob2JqZWN0KS5pc0NvbWJpbmVkKCkpCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmgJKHJldmlzaW9u
IDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTY2LDcgKzY2LDcgQEAgcHJpdmF0ZToKICAgICBGbG9hdGluZ09i
amVjdCogaW5zZXJ0RmxvYXRpbmdPYmplY3QoUmVuZGVyQm94JiBmbG9hdEJveCkgeyByZXR1cm4g
bV9ibG9jay5pbnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7IH0KICAgICBib29sIHBvc2l0
aW9uTmV3RmxvYXRPbkxpbmUoY29uc3QgRmxvYXRpbmdPYmplY3QmIG5ld0Zsb2F0LCBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBM
aW5lV2lkdGgmIHdpZHRoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYmxvY2sucG9zaXRpb25O
ZXdGbG9hdE9uTGluZShuZXdGbG9hdCwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbGluZUlu
Zm8sIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuIG1fYmxvY2suY29tcGxleExpbmVMYXlvdXQoKS5w
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKG5ld0Zsb2F0LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCBsaW5lSW5mbywgd2lkdGgpOwogICAgIH0KIAogICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9j
azsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJz
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L2xpbmUvTGluZUlubGluZUhlYWRlcnMuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBA
QAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgIkxpbmVJbmZvLmgiCiAjaW5jbHVkZSAiUmVu
ZGVyTGF5ZXIuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMTI5LDcgKzEzMCw3IEBAIGlu
bGluZSB2b2lkIHNldFN0YXRpY1Bvc2l0aW9ucyhSZW5kZXJCbG8KICAgICAgICAgLy8gQSByZWxh
dGl2ZSBwb3NpdGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gSW4gdGhpcyBjYXNlLCB3ZSBhbHNv
IGhhdmUgdG8gZGV0ZXJtaW5lIG91cgogICAgICAgICAvLyBwb3NpdGlvbiBhcyB0aG91Z2ggd2Ug
d2VyZSBhbiBpbmxpbmUuIFNldCB8c3RhdGljSW5saW5lUG9zaXRpb258IGFuZCB8c3RhdGljQmxv
Y2tQb3NpdGlvbnwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKICAgICAgICAgLy8gaW5saW5l
IHNvIHRoYXQgd2UgY2FuIG9idGFpbiB0aGUgdmFsdWUgbGF0ZXIuCi0gICAgICAgIGRvd25jYXN0
PFJlbmRlcklubGluZT4oKmNvbnRhaW5lckJsb2NrKS5sYXllcigpLT5zZXRTdGF0aWNJbmxpbmVQ
b3NpdGlvbihibG9jay5zdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKGJsb2NrSGVpZ2h0LCBEb05v
dEluZGVudFRleHQpKTsKKyAgICAgICAgZG93bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGFpbmVy
QmxvY2spLmxheWVyKCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLmNvbXBsZXhMaW5l
TGF5b3V0KCkuc3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShibG9ja0hlaWdodCwgRG9Ob3RJbmRl
bnRUZXh0KSk7CiAgICAgICAgIGRvd25jYXN0PFJlbmRlcklubGluZT4oKmNvbnRhaW5lckJsb2Nr
KS5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9uKGJsb2NrSGVpZ2h0KTsKICAgICB9CiAg
ICAgYmxvY2sudXBkYXRlU3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgYmxvY2tI
ZWlnaHQsIHNob3VsZEluZGVudFRleHQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L3N2Zy9SZW5kZXJTVkdUZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00MjUsMTMgKzQyNSw2IEBAIHZvaWQgUmVuZGVyU1ZHVGV4dDo6bGF5b3V0KCkKICAgICBjbGVh
ck5lZWRzTGF5b3V0KCk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBSZW5k
ZXJTVkdUZXh0OjpjcmVhdGVSb290SW5saW5lQm94KCkKLXsKLSAgICBhdXRvIGJveCA9IHN0ZDo6
bWFrZV91bmlxdWU8U1ZHUm9vdElubGluZUJveD4oKnRoaXMpOwotICAgIGJveC0+c2V0SGFzVmly
dHVhbExvZ2ljYWxIZWlnaHQoKTsKLSAgICByZXR1cm4gYm94OwotfQotCiBib29sIFJlbmRlclNW
R1RleHQ6Om5vZGVBdEZsb2F0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhp
dFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnRJblBhcmVudCwgSGl0
VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQogewogICAgIFBvaW50ZXJFdmVudHNIaXRSdWxlcyBo
aXRSdWxlcyhQb2ludGVyRXZlbnRzSGl0UnVsZXM6OlNWR19URVhUX0hJVFRFU1RJTkcsIHJlcXVl
c3QsIHN0eWxlKCkucG9pbnRlckV2ZW50cygpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQuaAkod29ya2luZyBjb3B5KQpAQCAt
ODcsNyArODcsNiBAQCBwcml2YXRlOgogCiAgICAgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBsb2Nh
bFRvUGFyZW50VHJhbnNmb3JtKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9sb2NhbFRyYW5z
Zm9ybTsgfQogICAgIEFmZmluZVRyYW5zZm9ybSBsb2NhbFRyYW5zZm9ybSgpIGNvbnN0IG92ZXJy
aWRlIHsgcmV0dXJuIG1fbG9jYWxUcmFuc2Zvcm07IH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Um9v
dElubGluZUJveD4gY3JlYXRlUm9vdElubGluZUJveCgpIG92ZXJyaWRlOwogCiAgICAgUmVuZGVy
QmxvY2sqIGZpcnN0TGluZUJsb2NrKCkgY29uc3Qgb3ZlcnJpZGU7CiAKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy91cGRhdGluZy9SZW5kZXJUcmVlQnVpbGRlckxpc3QuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy91cGRhdGluZy9SZW5kZXJUcmVlQnVp
bGRlckxpc3QuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvdXBkYXRpbmcvUmVuZGVyVHJlZUJ1aWxkZXJMaXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjQsNiArMjQsOCBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlJlbmRlclRyZWVC
dWlsZGVyTGlzdC5oIgogCisjaW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJM
aW5lSW5saW5lSGVhZGVycy5oIgogI2luY2x1ZGUgIlJlbmRlckNoaWxkSXRlcmF0b3IuaCIKICNp
bmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyTXVsdGlDb2x1bW5G
bG93LmgiCkBAIC0zMiw2ICszNCwxNSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8vIEZJ
WE1FOiBUaGlzIHNob3VsZG4ndCBuZWVkIElubGluZUl0ZXJhdG9yCitzdGF0aWMgYm9vbCBnZW5l
cmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJCbG9jayYgY3VycmVudCwgUmVuZGVy
T2JqZWN0KiBpbmxpbmVPYmopCit7CisgICAgSW5saW5lSXRlcmF0b3IgaXQoJmN1cnJlbnQsIGlu
bGluZU9iaiwgMCk7CisgICAgd2hpbGUgKCFpdC5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3go
aXQpKQorICAgICAgICBpdC5pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gIWl0LmF0RW5kKCk7Cit9
CisKIHN0YXRpYyBSZW5kZXJCbG9jayogZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3goUmVuZGVyQmxv
Y2smIGN1cnJlbnQsIFJlbmRlck9iamVjdCYgbWFya2VyKQogewogICAgIGJvb2wgaW5RdWlya3NN
b2RlID0gY3VycmVudC5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpOwpAQCAtMzksNyArNTAsNyBA
QCBzdGF0aWMgUmVuZGVyQmxvY2sqIGdldFBhcmVudE9mRmlyc3RMaW5lCiAgICAgICAgIGlmICgm
Y2hpbGQgPT0gJm1hcmtlcikKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChj
aGlsZC5pc0lubGluZSgpICYmICghaXM8UmVuZGVySW5saW5lPihjaGlsZCkgfHwgY3VycmVudC5n
ZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZCgmY2hpbGQpKSkKKyAgICAgICAgaWYgKGNo
aWxkLmlzSW5saW5lKCkgJiYgKCFpczxSZW5kZXJJbmxpbmU+KGNoaWxkKSB8fCBnZW5lcmF0ZXNM
aW5lQm94ZXNGb3JJbmxpbmVDaGlsZChjdXJyZW50LCAmY2hpbGQpKSkKICAgICAgICAgICAgIHJl
dHVybiAmY3VycmVudDsKIAogICAgICAgICBpZiAoY2hpbGQuaXNGbG9hdGluZygpIHx8IGNoaWxk
LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>376014</attachid>
            <date>2019-08-10 10:20:47 -0700</date>
            <delta_ts>2019-08-11 00:37:35 -0700</delta_ts>
            <desc>patch</desc>
            <filename>complex-line-layout-separate-10.patch</filename>
            <type>text/plain</type>
            <size>360166</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0NyBAQAorMjAxOS0wOC0xMCAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgRmFjdG9yIGNvbXBsZXggbGlu
ZSBsYXlvdXQgcGF0aCBvdXQgZnJvbSBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDYxMgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggZmFjdG9ycyB0aGUgbGlu
ZSBsYXlvdXQgY29kZSB0aGF0IGlzIGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBSZW5kZXJCbG9ja0Zs
b3cgYW5kIGxpdmVzIGluIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKyAgICAgICAgaW50byBh
IG5ldyBDb21wbGV4TGluZUxheW91dCBjbGFzcy4gQ29tcGxleExpbmVMYXlvdXQgaXMgYSBtZW1i
ZXIgb2YgUmVuZGVyQmxvY2tGbG93LgorCisgICAgICAgIEluIHRoZSBmdXR1cmUgd2UgY2FuIHN0
b3AgY29uc3RydWN0aW5nIENvbXBsZXhMaW5lTGF5b3V0IGF0IGFsbCB3aGVuIHVzaW5nIG90aGVy
IGxpbmUgbGF5b3V0IHBhdGhzLgorCisgICAgICAgICogU291cmNlcy50eHQ6CisgICAgICAgICog
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHJlbmRlcmluZy9D
b21wbGV4TGluZUxheW91dC5jcHA6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExp
bmVMYXlvdXQ6OkNvbXBsZXhMaW5lTGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhM
aW5lTGF5b3V0OjphcHBlbmRSdW5zRm9yT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBs
ZXhMaW5lTGF5b3V0OjpjcmVhdGVSb290SW5saW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhMaW5lTGF5b3V0OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcik6
CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlTGluZUJveGVzKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpjb25zdHJ1Y3RMaW5lKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZSBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6c2V0TWFyZ2luc0Zv
clJ1YnlSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnVwZGF0ZVJ1
YnlGb3JKdXN0aWZpZWRUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0
Ojpjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpD
b21wbGV4TGluZUxheW91dDo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9z
aXRpb25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29t
cHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleExpbmVMYXlvdXQ6OnJlbW92ZUlubGluZUJveCBjb25zdCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25z
Rm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6aGFuZGxlVHJh
aWxpbmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmFwcGVu
ZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGlu
ZUxheW91dDo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXlvdXRSdW5zQW5kRmxvYXRzKToKKyAgICAgICAgKFdlYkNv
cmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2Up
OgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxheW91dFJ1bnNBbmRGbG9h
dHNJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpyZWF0dGFj
aENsZWFuTGluZUZsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6
bGlua1RvRW5kTGluZUlmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5
b3V0OjpsYXlvdXRMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlv
dXQ6OmNoZWNrRmxvYXRJbkNsZWFuTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGlu
ZUxheW91dDo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4TGluZUxheW91dDo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleExpbmVMYXlvdXQ6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6bGluZVdpZHRoRm9yUGFnaW5hdGVk
TGluZUNoYW5nZWQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6
Om1hdGNoZWRFbmRMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojph
ZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
TGluZUxheW91dDo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleExpbmVMYXlvdXQ6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3cpOgorICAgICAgICAo
V2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxp
bmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnVwZGF0ZUZyYWdtZW50
Rm9yTGluZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6c3R5
bGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxheW91dENv
bnRleHQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjphcHBlbmRS
dW5zRm9yT2JqZWN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6Y3JlYXRlUm9vdElubGluZUJveCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3gpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXMpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6dGV4dEFsaWdubWVudEZv
ckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpzZXRNYXJnaW5zRm9yUnVieVJ1bik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnVwZGF0ZVJ1YnlGb3JKdXN0aWZpZWRUZXh0KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmll
ZFRleHQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp1cGRh
dGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZSk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxp
bmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6cmVtb3ZlSW5saW5lQm94IGNvbnN0KTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9z
aXRpb25zRm9yTGluZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6YXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJp
ZGlSdW5zKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5
b3V0UnVuc0FuZEZsb2F0cyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdl
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6cmVhdHRhY2hD
bGVhbkxpbmVGbG9hdHMpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0SW5DbGVhbkxpbmUpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9u
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5l
RW5kUG9zaXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdl
ZCBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1h
dGNoZWRFbmRMaW5lKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpn
ZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBzaXNM
aW5lQm94ZXMpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpj
aGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6IERlbGV0ZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVGcmFnbWVu
dEZvckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAqIHJlbmRlcmluZy9Db21wbGV4TGlu
ZUxheW91dC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojps
aW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxpbmVCb3hl
cyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Zmlyc3RSb290
Qm94IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXN0Um9v
dEJveCBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmg6CisgICAg
ICAgIChXZWJDb3JlOjpJc29sYXRlVHJhY2tlcjo6YWRkRmFrZVJ1bklmTmVjZXNzYXJ5KToKKyAg
ICAgICAgKFdlYkNvcmU6OklubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuSW50ZXJuYWwpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9ja0Zsb3cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpS
ZW5kZXJCbG9ja0Zsb3cpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp3aWxs
QmVEZXN0cm95ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRJ
bmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0
ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpkZWxldGVMaW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmhpdFRlc3RJbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6cGFpbnRJbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFNpbXBsZUxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6ZW5zdXJlTGluZUJveGVzKToKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyQmxvY2tGbG93Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Omxp
bmVCb3hlcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxpbmVCb3hlcyBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmZpcnN0Um9vdEJveCBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Omxhc3RSb290Qm94IGNv
bnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZmxvYXRpbmdPYmplY3Rz
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcGxleExpbmVMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpvdmVycmlkZVRleHRBbGlnbm1l
bnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6YWRq
dXN0SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlclJ1YnlCYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclJ1YnlCYXNlOjpv
dmVycmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclJ1YnlCYXNlOjp0ZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6IERlbGV0ZWQuCisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmg6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlclJ1YnlUZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclJ1YnlUZXh0OjpvdmVy
cmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clJ1YnlUZXh0Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6IERlbGV0ZWQuCisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlclJ1YnlUZXh0Lmg6CisgICAgICAgICogcmVuZGVyaW5nL1NpbXBs
ZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlTGluZUxh
eW91dDo6Z2VuZXJhdGVMaW5lQm94VHJlZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGlu
ZUJyZWFrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OnNraXBMZWFkaW5n
V2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKToKKyAg
ICAgICAgKiByZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oOgorICAgICAgICAoV2Vi
Q29yZTo6c2V0U3RhdGljUG9zaXRpb25zKToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1JlbmRl
clNWR1RleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHVGV4dDo6Y3JlYXRlUm9v
dElubGluZUJveCk6IERlbGV0ZWQuCisgICAgICAgICogcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdU
ZXh0Lmg6CisgICAgICAgICogcmVuZGVyaW5nL3VwZGF0aW5nL1JlbmRlclRyZWVCdWlsZGVyTGlz
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRQYXJlbnRPZkZpcnN0TGluZUJveCk6CisKIDIwMTkt
MDgtMTAgIFRoaWJhdWx0IFNhdW5pZXIgIDx0c2F1bmllckBpZ2FsaWEuY29tPgogCiAgICAgICAg
IFtHU3RyZWFtZXJdW1dlYlJUQ10gUmVtb3ZlIHVudXNlZCBHc3RBZGFwdGVyCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Tb3Vy
Y2VzLnR4dAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTIwMjUsNiArMjAyNSw3IEBAIHJlbmRlcmluZy9Cb3JkZXJFZGdl
LmNwcAogcmVuZGVyaW5nL0JyZWFrTGluZXMuY3BwCiByZW5kZXJpbmcvQ1NTRmlsdGVyLmNwcAog
cmVuZGVyaW5nL0NsaXBSZWN0LmNwcAorcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAog
cmVuZGVyaW5nL0NvdW50ZXJOb2RlLmNwcAogcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAogcmVu
ZGVyaW5nL0V2ZW50UmVnaW9uLmNwcApAQCAtMjA1NCw3ICsyMDU1LDYgQEAgcmVuZGVyaW5nL1Bv
aW50ZXJFdmVudHNIaXRSdWxlcy5jcHAKIHJlbmRlcmluZy9SZW5kZXJBdHRhY2htZW50LmNwcAog
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAK
LXJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCiByZW5kZXJpbmcvUmVuZGVyQm94
LmNwcAogcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAogcmVuZGVyaW5nL1JlbmRl
ckJ1dHRvbi5jcHAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDgyNCw2
ICs0ODI0LDcgQEAKIAkJRTRFMzlBRkIxMzMwRUZBODAwM0FCMjc0IC8qIExlZ2FjeVRpbGVMYXll
clBvb2wuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0
RTM5QUZBMTMzMEVGQTgwMDNBQjI3NCAvKiBMZWdhY3lUaWxlTGF5ZXJQb29sLmggKi87IH07CiAJ
CUU0RThCNEVDMjE2Qjc5RTUwMEI4ODM0RCAvKiBTeXN0ZW1Gb250RGF0YWJhc2VDb3JlVGV4dC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOEI0RUEy
MTZCNzlFNTAwQjg4MzREIC8qIFN5c3RlbUZvbnREYXRhYmFzZUNvcmVUZXh0LmggKi87IH07CiAJ
CUU0RThCNEY1MjE2Qjk1NjUwMEI4ODM0RCAvKiBGb250Q2FzY2FkZURlc2NyaXB0aW9uLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEU4QjRGMjIxNkI4
QjYwMDBCODgzNEQgLyogRm9udENhc2NhZGVEZXNjcmlwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUU0RTk0RDYxMjJGRjE1OEEwMEREMTkx
RiAvKiBDb21wbGV4TGluZUxheW91dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRTRBMUFDNzgyMkZBRkQ1MDAwMTdCNzVCIC8qIENvbXBsZXhMaW5lTGF5
b3V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
RTRFOUIxMTkxODEwOTE2RjAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRSZXNvbHZlci5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOUIxMTgxODEw
OTE2RjAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRSZXNvbHZlci5oICovOyB9OwogCQlFNEU5
QjExRDE4MTQ1NjlDMDAzQUNDREYgLyogU2ltcGxlTGluZUxheW91dEZ1bmN0aW9ucy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRFOUIxMUMxODE0NTY5
QzAwM0FDQ0RGIC8qIFNpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuaCAqLzsgfTsKIAkJRTRGOUVF
RjMxNTZEQTAwNzAwRDIzRTdFIC8qIFN0eWxlU2hlZXRDb250ZW50cy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRGOUVFRjExNTZEODRDNDAwRDIzRTdF
IC8qIFN0eWxlU2hlZXRDb250ZW50cy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFBy
aXZhdGUsICk7IH07IH07CkBAIC0xMzEwMiw3ICsxMzEwMyw3IEBACiAJCUJDRUE0NzdDMDk3Q0FB
QzgwMDk0QzlFNCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0NzdEMDk3Q0FBQzgwMDk0QzlF
NCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlCQ0VBNDc4QzA5N0NBQUM4MDA5NEM5RTQgLyogQ1NTVmFsdWVLZXl3
b3Jkcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
bGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ1NTVmFsdWVLZXl3b3Jkcy5pbjsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlckJsb2NrTGluZUxheW91dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIENvbXBsZXhMaW5lTGF5b3V0LmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDb21wbGV4TGluZUxheW91dC5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODE1MDk3RDkzMDIwMDk0QzlF
NCAvKiBCcmVha0xpbmVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBCcmVha0xpbmVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4MTYw
OTdEOTMwMjAwOTRDOUU0IC8qIEJyZWFrTGluZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEJyZWFrTGluZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNF
QTQ4MUEwOTdEOTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRCb3guY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZVRleHRCb3guY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwpAQCAtMTQ5NTYsNiArMTQ5NTcsNyBAQAogCQlFNEEwMDc4MjFCODIwRUM4
MDAyQzVBNkUgLyogRGF0YVVSTERlY29kZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gRGF0YVVSTERlY29kZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRB
MDA3ODQxQjgyMEVEMzAwMkM1QTZFIC8qIERhdGFVUkxEZWNvZGVyLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERhdGFVUkxEZWNvZGVyLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJRTRBMTgyMkYxRjEzQkU1ODAwRkVGNjk4IC8qIFN0eWxlSW52YWxp
ZGF0aW9uRnVuY3Rpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0eWxlSW52YWxpZGF0aW9uRnVuY3Rp
b25zLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0QTFBQzc4MjJGQUZENTAwMDE3
Qjc1QiAvKiBDb21wbGV4TGluZUxheW91dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBDb21wbGV4TGluZUxheW91dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlF
NEE3OTk0RTIwRUU0QUUxMDBDMTk1NjggLyogQ1NTUGFyc2VyQ29udGV4dC5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBDU1NQYXJzZXJDb250ZXh0Lmg7IHBhdGggPSBwYXJzZXIv
Q1NTUGFyc2VyQ29udGV4dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEE3OTk1
MDIwRUU0QUUyMDBDMTk1NjggLyogQ1NTUGFyc2VyQ29udGV4dC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBDU1NQYXJzZXJDb250ZXh0LmNwcDsgcGF0aCA9IHBhcnNl
ci9DU1NQYXJzZXJDb250ZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRB
ODE0RDMxQzZERUM0MDAwQkY4NUFDIC8qIENsYXNzQ2hhbmdlSW52YWxpZGF0aW9uLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENsYXNzQ2hhbmdlSW52YWxpZGF0aW9uLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNjk4NSw2ICsyNjk4Nyw4IEBACiAJCQkJNTgw
MzcxNUYxQTY2RjAwQTAwQkFGNTE5IC8qIENsaXBSZWN0LmNwcCAqLywKIAkJCQk1ODAzNzE2MDFB
NjZGMDBBMDBCQUY1MTkgLyogQ2xpcFJlY3QuaCAqLywKIAkJCQlCQ0RENDU0RDEyMzZDOTVDMDA5
QTc5ODUgLyogQ29sdW1uSW5mby5oICovLAorCQkJCUJDRUE0ODEzMDk3RDkzMDIwMDk0QzlFNCAv
KiBDb21wbGV4TGluZUxheW91dC5jcHAgKi8sCisJCQkJRTRBMUFDNzgyMkZBRkQ1MDAwMTdCNzVC
IC8qIENvbXBsZXhMaW5lTGF5b3V0LmggKi8sCiAJCQkJOTM5MkYxNEYwQUQxODYyMzAwNjkxQkQ0
IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKIAkJCQk5MzkyRjE0QjBBRDE4NjFCMDA2OTFCRDQgLyog
Q291bnRlck5vZGUuaCAqLywKIAkJCQkwRjUzRkI4MTIxM0IxQkI4MDBDNDBEMzQgLyogQ1NTRmls
dGVyLmNwcCAqLywKQEAgLTI3MDUyLDcgKzI3MDU2LDYgQEAKIAkJCQlCQ0VBNDgyMTA5N0Q5MzAy
MDA5NEM5RTQgLyogUmVuZGVyQmxvY2suaCAqLywKIAkJCQlCQ0ZCNDVGNDE3RDhFNDk0MDA0NDQ0
NDYgLyogUmVuZGVyQmxvY2tGbG93LmNwcCAqLywKIAkJCQlCQ0ZCNDVGMzE3RDhFMzkyMDA0NDQ0
NDYgLyogUmVuZGVyQmxvY2tGbG93LmggKi8sCi0JCQkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAgKi8sCiAJCQkJQkNFQTQ4MjIwOTdEOTMwMjAw
OTRDOUU0IC8qIFJlbmRlckJveC5jcHAgKi8sCiAJCQkJQkNFQTQ4MjMwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckJveC5oICovLAogCQkJCUJDRUIxNzlCMTQzMzc5RjUwMDUyRUFFOSAvKiBSZW5k
ZXJCb3hGcmFnbWVudEluZm8uaCAqLywKQEAgLTMwODEyLDYgKzMwODE1LDcgQEAKIAkJCQkxQTdG
QTYxOTBEREEzQjNBMDAyOEY4QTUgLyogTmV0d29ya1N0YXRlTm90aWZpZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUUxM0VGMzQ0MTY4NEVDRjQwMDM0QzgzRiAvKiBOZXR3b3JrU3RvcmFnZVNlc3Np
b24uaCBpbiBIZWFkZXJzICovLAogCQkJCTI2OTM5NzI0MUE0QTVCNjQwMEU4MzQ5RCAvKiBORkEu
aCBpbiBIZWFkZXJzICovLAorCQkJCUU0RTk0RDYxMjJGRjE1OEEwMEREMTkxRiAvKiBDb21wbGV4
TGluZUxheW91dC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMjY5Mzk3MjIxQTRBNDEyRjAwRTgzNDlE
IC8qIE5GQU5vZGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTI2NzcyNjAxMUE1QjNBRDkwMDNDMjRE
RCAvKiBORkFUb0RGQS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFRjQzREQwRTY3NDAxMjAwMUMx
Mjg3IC8qIE5pbmVQaWVjZUltYWdlLmggaW4gSGVhZGVycyAqLywKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9Db21wbGV4TGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gMjQ4NDA0
KQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cDoyNDg0MDQpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI4OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwMCBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAz
LCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxs
IHJpZ2h0IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2
YW1pZG93QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIElu
Yy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVk
ZSAiQVhPYmplY3RDYWNoZS5oIgorI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgorI2luY2x1ZGUg
IkJyZWFraW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgorI2luY2x1
ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJJbmxpbmVFbGVtZW50Qm94LmgiCisj
aW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCisj
aW5jbHVkZSAiSW5saW5lVGV4dEJveFN0eWxlLmgiCisjaW5jbHVkZSAiTGluZUxheW91dFN0YXRl
LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYWdtZW50Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyRnJh
Z21lbnRlZEZsb3cuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUg
IlJlbmRlckxpbmVCcmVhay5oIgorI2luY2x1ZGUgIlJlbmRlclJ1YnlCYXNlLmgiCisjaW5jbHVk
ZSAiUmVuZGVyUnVieVRleHQuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAi
U1ZHUm9vdElubGluZUJveC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU2lt
cGxlTGluZUxheW91dEZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElu
bGluZUJveC5oIgorI2luY2x1ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgorI2luY2x1ZGUg
PHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9p
ZCBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShUZXh0RGlyZWN0aW9uJiBkaXIsIElubGluZUl0ZXJh
dG9yIGl0ZXIpCit7CisgICAgd2hpbGUgKCFpdGVyLmF0RW5kKCkpIHsKKyAgICAgICAgaWYgKGl0
ZXIuYXRQYXJhZ3JhcGhTZXBhcmF0b3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKFVDaGFyIGN1cnJlbnQgPSBpdGVyLmN1cnJlbnQoKSkgeworICAgICAgICAgICAgVUNoYXJE
aXJlY3Rpb24gY2hhckRpcmVjdGlvbiA9IHVfY2hhckRpcmVjdGlvbihjdXJyZW50KTsKKyAgICAg
ICAgICAgIGlmIChjaGFyRGlyZWN0aW9uID09IFVfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAg
ICAgICAgIGRpciA9IFRleHREaXJlY3Rpb246OkxUUjsKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhckRpcmVjdGlvbiA9PSBVX1JJR0hU
X1RPX0xFRlQgfHwgY2hhckRpcmVjdGlvbiA9PSBVX1JJR0hUX1RPX0xFRlRfQVJBQklDKSB7Cisg
ICAgICAgICAgICAgICAgZGlyID0gVGV4dERpcmVjdGlvbjo6UlRMOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdGVyLmluY3JlbWVu
dCgpOworICAgIH0KK30KKworaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxCaWRpUnVuPiBjcmVhdGVS
dW4oaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlcikKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihz
dGFydCwgZW5kLCBvYmosIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIuZGlyKCkpOworfQor
Cit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxC
aWRpUnVuPiogcnVucywgaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5s
aW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKK3sKKyAgICBpZiAoc3RhcnQgPiBlbmQgfHwgc2hv
dWxkU2tpcENyZWF0aW5nUnVuc0Zvck9iamVjdChvYmopKQorICAgICAgICByZXR1cm47CisKKyAg
ICBMaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5n
U3RhdGUgPSByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7CisgICAgYm9vbCBo
YXZlTmV4dFRyYW5zaXRpb24gPSAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuY3VycmVu
dFRyYW5zaXRpb24oKSA8IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLm51bVRyYW5zaXRp
b25zKCkpOworICAgIElubGluZUl0ZXJhdG9yIG5leHRUcmFuc2l0aW9uOworICAgIGlmIChoYXZl
TmV4dFRyYW5zaXRpb24pCisgICAgICAgIG5leHRUcmFuc2l0aW9uID0gbGluZVdoaXRlc3BhY2VD
b2xsYXBzaW5nU3RhdGUudHJhbnNpdGlvbnMoKVtsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0
ZS5jdXJyZW50VHJhbnNpdGlvbigpXTsKKyAgICBpZiAobGluZVdoaXRlc3BhY2VDb2xsYXBzaW5n
U3RhdGUuYmV0d2VlblRyYW5zaXRpb25zKCkpIHsKKyAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5z
aXRpb24gfHwgKCZvYmogIT0gbmV4dFRyYW5zaXRpb24ucmVuZGVyZXIoKSkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgc3RhcnQgcG9pbnQuIFN0b3AgaWdu
b3Jpbmcgb2JqZWN0cyBhbmQKKyAgICAgICAgLy8gYWRqdXN0IG91ciBzdGFydC4KKyAgICAgICAg
c3RhcnQgPSBuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKTsKKyAgICAgICAgbGluZVdoaXRlc3BhY2VD
b2xsYXBzaW5nU3RhdGUuaW5jcmVtZW50Q3VycmVudFRyYW5zaXRpb24oKTsKKyAgICAgICAgaWYg
KHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICBhcHBlbmRSdW5zRm9yT2JqZWN0KHJ1bnMsIHN0
YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFoYXZlTmV4dFRyYW5zaXRpb24gfHwgKCZvYmog
IT0gbmV4dFRyYW5zaXRpb24ucmVuZGVyZXIoKSkpIHsKKyAgICAgICAgICAgIGlmIChydW5zKQor
ICAgICAgICAgICAgICAgIHJ1bnMtPmFwcGVuZFJ1bihjcmVhdGVSdW4oc3RhcnQsIGVuZCwgb2Jq
LCByZXNvbHZlcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQW4gZW5kIHRyYW5zaXRpb24gaGFzIGJlZW4gZW5jb3VudGVyZWQgd2l0aGluIG91ciBvYmpl
Y3QuIFdlIG5lZWQgdG8gYXBwZW5kIGEgcnVuIHdpdGggb3VyIGVuZHBvaW50LgorICAgICAgICBp
ZiAoc3RhdGljX2Nhc3Q8aW50PihuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEpIDw9IGVuZCkg
eworICAgICAgICAgICAgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUuaW5jcmVtZW50Q3Vy
cmVudFRyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIGxpbmUgaXMg
YmVmb3JlIHRoZSBvYmplY3Qgd2UncmUgaW5zcGVjdGluZy4gU2tpcCBldmVyeXRoaW5nIGFuZCBy
ZXR1cm4KKyAgICAgICAgICAgIGlmIChuZXh0VHJhbnNpdGlvbi5yZWZlcnNUb0VuZE9mUHJldmlv
dXNOb2RlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKHN0YXRp
Y19jYXN0PGludD4obmV4dFRyYW5zaXRpb24ub2Zmc2V0KCkgKyAxKSA+IHN0YXJ0ICYmIHJ1bnMp
CisgICAgICAgICAgICAgICAgcnVucy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgbmV4dFRy
YW5zaXRpb24ub2Zmc2V0KCkgKyAxLCBvYmosIHJlc29sdmVyKSk7CisgICAgICAgICAgICBhcHBl
bmRSdW5zRm9yT2JqZWN0KHJ1bnMsIG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSwgZW5kLCBv
YmosIHJlc29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChydW5zKQorICAgICAgICAgICAgcnVu
cy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyKSk7CisgICAg
fQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyQmxvY2tGbG93Ojpj
cmVhdGVSb290SW5saW5lQm94KCkKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSb290
SW5saW5lQm94PigqdGhpcyk7Cit9CisKK1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6
Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCit7CisgICAgYXV0byBuZXdSb290Qm94ID0g
Y3JlYXRlUm9vdElubGluZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBuZXdS
b290Qm94LmdldCgpOworICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdS
b290Qm94KSk7CisKKyAgICBpZiAoVU5MSUtFTFkoQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0
eUVuYWJsZWQoKSkgJiYgZmlyc3RSb290Qm94KCkgPT0gcm9vdEJveCkgeworICAgICAgICBpZiAo
QVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb2N1bWVudCgpLmV4aXN0aW5nQVhPYmplY3RDYWNoZSgp
KQorICAgICAgICAgICAgY2FjaGUtPmRlZmVyUmVjb21wdXRlSXNJZ25vcmVkKGVsZW1lbnQoKSk7
CisgICAgfQorCisgICAgcmV0dXJuIHJvb3RCb3g7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW5saW5l
Qm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBi
b29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCit7CisgICAgaWYgKGlz
Um9vdExpbmVCb3gpCisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpy
ZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOworCisgICAgaWYgKGlzPFJl
bmRlclRleHQ+KCpyZW5kZXJlcikpCisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0
PigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZVRleHRCb3goKTsKKworICAgIGlmIChpczxSZW5kZXJC
b3g+KCpyZW5kZXJlcikpIHsKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVycmlibGUuIFRo
aXMgYnJhbmNoIHJldHVybnMgYW4gKm93bmVkKiBwb2ludGVyIQorICAgICAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVyQm94PigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZUJveCgpLnJlbGVhc2UoKTsK
KyAgICB9CisKKyAgICBpZiAoaXM8UmVuZGVyTGluZUJyZWFrPigqcmVuZGVyZXIpKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRlcnJpYmxlLiBUaGlzIGJyYW5jaCByZXR1cm5zIGFuICpv
d25lZCogcG9pbnRlciEKKyAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBkb3duY2FzdDxSZW5kZXJM
aW5lQnJlYWs+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lQm94KCkucmVsZWFzZSgpOworICAgICAg
ICAvLyBXZSBvbmx5IHRyZWF0IGEgYm94IGFzIHRleHQgZm9yIGEgPGJyPiBpZiB3ZSBhcmUgb24g
YSBsaW5lIGJ5IG91cnNlbGYgb3IgaW4gc3RyaWN0IG1vZGUKKyAgICAgICAgLy8gKE5vdGUgdGhl
IHVzZSBvZiBzdHJpY3QgbW9kZS4gSW4gImFsbW9zdCBzdHJpY3QiIG1vZGUsIHdlIGRvbid0IHRy
ZWF0IHRoZSBib3ggZm9yIDxicj4gYXMgdGV4dC4pCisgICAgICAgIGlubGluZUJveC0+c2V0QmVo
YXZlc0xpa2VUZXh0KGlzT25seVJ1biB8fCByZW5kZXJlci0+ZG9jdW1lbnQoKS5pbk5vUXVpcmtz
TW9kZSgpIHx8IHJlbmRlcmVyLT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpOworICAgICAgICBy
ZXR1cm4gaW5saW5lQm94OworICAgIH0KKworICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJJbmxp
bmU+KCpyZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveCgpOworfQorCitzdGF0
aWMgaW5saW5lIHZvaWQgZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QmIHJl
bmRlcmVyLCBib29sIGZ1bGxMYXlvdXQpCit7CisgICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRl
cmVyKSkgeworICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVy
VGV4dD4ocmVuZGVyZXIpOworICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVkZWQocmVuZGVyVGV4
dCk7CisgICAgICAgIHJlbmRlclRleHQuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CisgICAg
fSBlbHNlIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKSkKKyAgICAgICAgZG93bmNh
c3Q8UmVuZGVyTGluZUJyZWFrPihyZW5kZXJlcikuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7
CisgICAgZWxzZQorICAgICAgICBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5kaXJ0
eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKK30KKworc3RhdGljIGJvb2wgcGFyZW50SXNDb25zdHJ1
Y3RlZE9ySGF2ZU5leHQoSW5saW5lRmxvd0JveCogcGFyZW50Qm94KQoreworICAgIGRvIHsKKyAg
ICAgICAgaWYgKHBhcmVudEJveC0+aXNDb25zdHJ1Y3RlZCgpIHx8IHBhcmVudEJveC0+bmV4dE9u
TGluZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHBhcmVudEJveCA9IHBh
cmVudEJveC0+cGFyZW50KCk7CisgICAgfSB3aGlsZSAocGFyZW50Qm94KTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK0lubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJv
eGVzKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGluZUJv
eCogY2hpbGRCb3gpCit7CisgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBs
aW5lIGJveCBmb3IgdGhpcyBvYmplY3QgdGhhdCBpcyBhbHNvCisgICAgLy8gdGhlIGxhc3QgaXRl
bSBvbiB0aGUgbGluZS4KKyAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOworICAgIElubGluZUZs
b3dCb3gqIHBhcmVudEJveCA9IG51bGxwdHI7CisgICAgSW5saW5lRmxvd0JveCogcmVzdWx0ID0g
bnVsbHB0cjsKKyAgICBib29sIGhhc0RlZmF1bHRMaW5lQm94Q29udGFpbiA9IHN0eWxlKCkubGlu
ZUJveENvbnRhaW4oKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVCb3hDb250YWluKCk7Cisg
ICAgZG8geworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihpczxSZW5k
ZXJJbmxpbmU+KCpvYmopIHx8IG9iaiA9PSB0aGlzKTsKKworICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZUZsb3cgPSBvYmogIT0gdGhpcyA/IGRvd25jYXN0PFJlbmRlcklubGluZT4ob2JqKSA6
IG51bGxwdHI7CisKKyAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGJveCB3ZSBtYWRlIGZvciB0aGlz
IHJlbmRlciBvYmplY3QuCisgICAgICAgIHBhcmVudEJveCA9IGlubGluZUZsb3cgPyBpbmxpbmVG
bG93LT5sYXN0TGluZUJveCgpIDogZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93Pigqb2JqKS5sYXN0
Um9vdEJveCgpOworCisgICAgICAgIC8vIElmIHRoaXMgYm94IG9yIGl0cyBhbmNlc3RvciBpcyBj
b25zdHJ1Y3RlZCB0aGVuIGl0IGlzIGZyb20gYSBwcmV2aW91cyBsaW5lLCBhbmQgd2UgbmVlZAor
ICAgICAgICAvLyB0byBtYWtlIGEgbmV3IGJveCBmb3Igb3VyIGxpbmUuICBJZiB0aGlzIGJveCBv
ciBpdHMgYW5jZXN0b3IgaXMgdW5jb25zdHJ1Y3RlZCBidXQgaXQgaGFzCisgICAgICAgIC8vIHNv
bWV0aGluZyBmb2xsb3dpbmcgaXQgb24gdGhlIGxpbmUsIHRoZW4gd2Uga25vdyB3ZSBoYXZlIHRv
IG1ha2UgYSBuZXcgYm94CisgICAgICAgIC8vIGFzIHdlbGwuICBJbiB0aGlzIHNpdHVhdGlvbiBv
dXIgaW5saW5lIGhhcyBhY3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBvbgorICAgICAgICAvLyB0
aGUgc2FtZSBsaW5lICh0aGlzIGNhbiBoYXBwZW4gd2l0aCB2ZXJ5IGZhbmN5IGxhbmd1YWdlIG1p
eHR1cmVzKS4KKyAgICAgICAgYm9vbCBjb25zdHJ1Y3RlZE5ld0JveCA9IGZhbHNlOworICAgICAg
ICBib29sIGFsbG93ZWRUb0NvbnN0cnVjdE5ld0JveCA9ICFoYXNEZWZhdWx0TGluZUJveENvbnRh
aW4gfHwgIWlubGluZUZsb3cgfHwgaW5saW5lRmxvdy0+YWx3YXlzQ3JlYXRlTGluZUJveGVzKCk7
CisgICAgICAgIGJvb2wgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3ggPSBwYXJlbnRCb3ggJiYgIXBh
cmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXh0KHBhcmVudEJveCk7CisgICAgICAgIGlmIChhbGxv
d2VkVG9Db25zdHJ1Y3ROZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CisgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBvYmpl
Y3QuICBPbmNlCisgICAgICAgICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0IHRo
ZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgIElubGluZUJveCogbmV3Qm94
ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7CisgICAgICAg
ICAgICBwYXJlbnRCb3ggPSBkb3duY2FzdDxJbmxpbmVGbG93Qm94PihuZXdCb3gpOworICAgICAg
ICAgICAgcGFyZW50Qm94LT5zZXRJc0ZpcnN0TGluZShsaW5lSW5mby5pc0ZpcnN0TGluZSgpKTsK
KyAgICAgICAgICAgIHBhcmVudEJveC0+c2V0SXNIb3Jpem9udGFsKGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlKCkpOworICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0TGluZUJveENvbnRhaW4pCisg
ICAgICAgICAgICAgICAgcGFyZW50Qm94LT5jbGVhckRlc2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVp
Z2h0QW5kQmFzZWxpbmUoKTsKKyAgICAgICAgICAgIGNvbnN0cnVjdGVkTmV3Qm94ID0gdHJ1ZTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25zdHJ1Y3RlZE5ld0JveCB8fCBjYW5Vc2VFeGlz
dGluZ1BhcmVudEJveCkgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAg
ICAgcmVzdWx0ID0gcGFyZW50Qm94OworCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0
aGUgYmxvY2sgaXRzZWxmLCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKKyAgICAgICAg
ICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJl
IGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKKyAgICAgICAgICAgIC8vIGlubGluZS4KKyAgICAgICAg
ICAgIGlmIChjaGlsZEJveCkKKyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShj
aGlsZEJveCk7CisKKyAgICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09
IHRoaXMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNoaWxkQm94ID0g
cGFyZW50Qm94OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3Vy
IGxpbmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwg
dGhlIHJlbWFpbmluZworICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgorICAg
ICAgICBvYmogPSAoKytsaW5lRGVwdGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5w
YXJlbnQoKTsKKworICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
KwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4gc3RhdGljIGlubGluZSBib29sIGVu
ZHNXaXRoSFRNTFNwYWNlcyhjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25l
ZCBwb3NpdGlvbiwgdW5zaWduZWQgZW5kKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IHBvc2l0
aW9uOyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgaWYgKCFpc0hUTUxTcGFjZShjaGFyYWN0ZXJz
W2ldKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3N0YXRpYyBib29sIHJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihjb25zdCBCaWRpUnVu
TGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMpCit7CisgICAgQmlkaVJ1biogcnVuID0gYmlkaVJ1bnMu
bG9naWNhbGx5TGFzdFJ1bigpOworICAgIGlmICghcnVuKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBpZiAoIWlzPFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBhdXRvJiB0ZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5k
ZXJlcigpKS50ZXh0KCk7CisgICAgdW5zaWduZWQgcG9zaXRpb24gPSBydW4tPnN0b3AoKTsKKyAg
ICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgIGlmICh0ZXh0LmlzOEJpdCgp
KQorICAgICAgICByZXR1cm4gZW5kc1dpdGhIVE1MU3BhY2VzKHRleHQuY2hhcmFjdGVyczgoKSwg
cG9zaXRpb24sIGxlbmd0aCk7CisgICAgcmV0dXJuIGVuZHNXaXRoSFRNTFNwYWNlcyh0ZXh0LmNo
YXJhY3RlcnMxNigpLCBwb3NpdGlvbiwgbGVuZ3RoKTsKK30KKworUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVu
cywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQoreworICAgIEFTU0VSVChiaWRpUnVucy5maXJz
dFJ1bigpKTsKKworICAgIGJvb2wgcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSBmYWxzZTsKKyAg
ICBJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3ggPSAwOworICAgIGludCBydW5Db3VudCA9IGJpZGlS
dW5zLnJ1bkNvdW50KCkgLSBsaW5lSW5mby5ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7Cisg
ICAgCisgICAgZm9yIChCaWRpUnVuKiByID0gYmlkaVJ1bnMuZmlyc3RSdW4oKTsgcjsgciA9IHIt
Pm5leHQoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBib3ggZm9yIG91ciBvYmplY3QuCisgICAg
ICAgIGJvb2wgaXNPbmx5UnVuID0gKHJ1bkNvdW50ID09IDEpOworICAgICAgICBpZiAocnVuQ291
bnQgPT0gMiAmJiAhci0+cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIoKSkKKyAgICAgICAgICAgIGlz
T25seVJ1biA9ICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBiaWRpUnVucy5s
YXN0UnVuKCkgOiBiaWRpUnVucy5maXJzdFJ1bigpKS0+cmVuZGVyZXIoKS5pc0xpc3RNYXJrZXIo
KTsKKworICAgICAgICBpZiAobGluZUluZm8uaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJl
cigmci0+cmVuZGVyZXIoKSwgZmFsc2UsIGlzT25seVJ1bik7CisgICAgICAgIHItPnNldEJveChi
b3gpOworCisgICAgICAgIGlmICghcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gJiYgYm94LT5yZW5k
ZXJlcigpLnNlbGVjdGlvblN0YXRlKCkgIT0gUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25Ob25lKQor
ICAgICAgICAgICAgcm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4gPSB0cnVlOworICAgICAgICAKKyAg
ICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBu
b3Qgc2ltcGx5IGEgc2libGluZywKKyAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVj
dCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Blcmx5IGVuY2xvc2UgdGhlCisgICAg
ICAgIC8vIHJ1bidzIGlubGluZSBib3guIFNlZ21lbnRzIGNhbiBvbmx5IGJlIHNpYmxpbmdzIGF0
IHRoZSByb290IGxldmVsLCBhcworICAgICAgICAvLyB0aGV5IGFyZSBwb3NpdGlvbmVkIHNlcGFy
YXRlbHkuCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8ICZwYXJlbnRCb3gtPnJlbmRlcmVyKCkg
IT0gci0+cmVuZGVyZXIoKS5wYXJlbnQoKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBp
bmxpbmUgYm94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9u
IHBvaW50LgorICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnRUb1VzZSA9IHItPnJlbmRl
cmVyKCkucGFyZW50KCk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMo
cGFyZW50VG9Vc2UsIGxpbmVJbmZvLCBib3gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KKyAgICAgICAgICAgIHBh
cmVudEJveC0+YWRkVG9MaW5lKGJveCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIHZpc3Vh
bGx5T3JkZXJlZCA9IHItPnJlbmRlcmVyKCkuc3R5bGUoKS5ydGxPcmRlcmluZygpID09IE9yZGVy
OjpWaXN1YWw7CisgICAgICAgIGJveC0+c2V0QmlkaUxldmVsKHItPmxldmVsKCkpOworCisgICAg
ICAgIGlmIChpczxJbmxpbmVUZXh0Qm94PigqYm94KSkgeworICAgICAgICAgICAgYXV0byYgdGV4
dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+KCpib3gpOworICAgICAgICAgICAgdGV4dEJv
eC5zZXRTdGFydChyLT5tX3N0YXJ0KTsKKyAgICAgICAgICAgIHRleHRCb3guc2V0TGVuKHItPm1f
c3RvcCAtIHItPm1fc3RhcnQpOworICAgICAgICAgICAgdGV4dEJveC5zZXREaXJPdmVycmlkZShy
LT5kaXJPdmVycmlkZSh2aXN1YWxseU9yZGVyZWQpKTsKKyAgICAgICAgICAgIGlmIChyLT5tX2hh
c0h5cGhlbikKKyAgICAgICAgICAgICAgICB0ZXh0Qm94LnNldEhhc0h5cGhlbih0cnVlKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94
LiAgSXQgc2hvdWxkIGJlIHVuY29uc3RydWN0ZWQgYW5kCisgICAgLy8gYmUgdGhlIGxhc3QgY29u
dGludWF0aW9uIG9mIG91ciBsaW5lIGxpc3QuCisgICAgQVNTRVJUKGxhc3RSb290Qm94KCkgJiYg
IWxhc3RSb290Qm94KCktPmlzQ29uc3RydWN0ZWQoKSk7CisKKyAgICAvLyBTZXQgdGhlIG1fc2Vs
ZWN0ZWRDaGlsZHJlbiBmbGFnIG9uIHRoZSByb290IGlubGluZSBib3ggaWYgb25lIG9mIHRoZSBs
ZWFmIGlubGluZSBib3gKKyAgICAvLyBmcm9tIHRoZSBiaWRpIHJ1bnMgd2FsayBhYm92ZSBoYXMg
YSBzZWxlY3Rpb24gc3RhdGUuCisgICAgaWYgKHJvb3RIYXNTZWxlY3RlZENoaWxkcmVuKQorICAg
ICAgICBsYXN0Um9vdEJveCgpLT5yb290KCkuc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbih0cnVlKTsK
KworICAgIC8vIFNldCBiaXRzIG9uIG91ciBpbmxpbmUgZmxvdyBib3hlcyB0aGF0IGluZGljYXRl
IHdoaWNoIHNpZGVzIHNob3VsZAorICAgIC8vIHBhaW50IGJvcmRlcnMvbWFyZ2lucy9wYWRkaW5n
LiAgVGhpcyBrbm93bGVkZ2Ugd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgd2hlbgorICAgIC8vIHdl
IGRldGVybWluZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbnMgYW5kIHdpZHRocyBvZiBhbGwgdGhl
IGlubGluZSBib3hlcyBvbgorICAgIC8vIHRoZSBsaW5lLgorICAgIGJvb2wgaXNMb2dpY2FsbHlM
YXN0UnVuV3JhcHBlZCA9IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5p
c1RleHQoKSA/ICFyZWFjaGVkRW5kT2ZUZXh0UmVuZGVyZXIoYmlkaVJ1bnMpIDogIWlzPFJlbmRl
cklubGluZT4oYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpKTsKKyAgICBs
YXN0Um9vdEJveCgpLT5kZXRlcm1pbmVTcGFjaW5nRm9yRmxvd0JveGVzKGxpbmVJbmZvLmlzTGFz
dExpbmUoKSwgaXNMb2dpY2FsbHlMYXN0UnVuV3JhcHBlZCwgJmJpZGlSdW5zLmxvZ2ljYWxseUxh
c3RSdW4oKS0+cmVuZGVyZXIoKSk7CisKKyAgICAvLyBOb3cgbWFyayB0aGUgbGluZSBib3hlcyBh
cyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICBsYXN0Um9vdEJveCgpLT5zZXRDb25zdHJ1Y3RlZCgp
OworCisgICAgLy8gUmV0dXJuIHRoZSBsYXN0IGxpbmUuCisgICAgcmV0dXJuIGxhc3RSb290Qm94
KCk7Cit9CisKK1RleHRBbGlnbk1vZGUgUmVuZGVyQmxvY2tGbG93Ojp0ZXh0QWxpZ25tZW50Rm9y
TGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdAoreworICAgIFRleHRBbGlnbk1vZGUg
YWxpZ25tZW50ID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKKyNpZiBFTkFCTEUoQ1NTM19URVhUKQor
ICAgIFRleHRKdXN0aWZ5IHRleHRKdXN0aWZ5ID0gc3R5bGUoKS50ZXh0SnVzdGlmeSgpOworICAg
IGlmIChhbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiB0ZXh0SnVzdGlmeSA9
PSBUZXh0SnVzdGlmeTo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHN0eWxlKCkuZGlyZWN0aW9uKCkg
PT0gVGV4dERpcmVjdGlvbjo6TFRSID8gVGV4dEFsaWduTW9kZTo6TGVmdCA6IFRleHRBbGlnbk1v
ZGU6OlJpZ2h0OworI2VuZGlmCisKKyAgICBpZiAoZW5kc1dpdGhTb2Z0QnJlYWspCisgICAgICAg
IHJldHVybiBhbGlnbm1lbnQ7CisKKyNpZiAhRU5BQkxFKENTUzNfVEVYVCkKKyAgICByZXR1cm4g
KGFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KSA/IFRleHRBbGlnbk1vZGU6OlN0
YXJ0IDogYWxpZ25tZW50OworI2Vsc2UKKyAgICBpZiAoYWxpZ25tZW50ICE9IFRleHRBbGlnbk1v
ZGU6Okp1c3RpZnkpCisgICAgICAgIHJldHVybiBhbGlnbm1lbnQ7CisKKyAgICBUZXh0QWxpZ25M
YXN0IGFsaWdubWVudExhc3QgPSBzdHlsZSgpLnRleHRBbGlnbkxhc3QoKTsKKyAgICBzd2l0Y2gg
KGFsaWdubWVudExhc3QpIHsKKyAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OlN0YXJ0OgorICAgICAg
ICByZXR1cm4gVGV4dEFsaWduTW9kZTo6U3RhcnQ7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpF
bmQ6CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpFbmQ7CisgICAgY2FzZSBUZXh0QWxp
Z25MYXN0OjpMZWZ0OgorICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6TGVmdDsKKyAgICBj
YXNlIFRleHRBbGlnbkxhc3Q6OlJpZ2h0OgorICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6
UmlnaHQ7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpDZW50ZXI6CisgICAgICAgIHJldHVybiBU
ZXh0QWxpZ25Nb2RlOjpDZW50ZXI7CisgICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpKdXN0aWZ5Ogor
ICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKKyAgICBjYXNlIFRleHRBbGln
bkxhc3Q6OkF1dG86CisgICAgICAgIGlmICh0ZXh0SnVzdGlmeSA9PSBUZXh0SnVzdGlmeTo6RGlz
dHJpYnV0ZSkKKyAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OworICAg
ICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6U3RhcnQ7CisgICAgfQorICAgIHJldHVybiBhbGln
bm1lbnQ7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVm
dEFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJpZGlSdW4qIHRyYWls
aW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRo
LCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCit7CisgICAgLy8gVGhlIGRpcmVjdGlvbiBv
ZiB0aGUgYmxvY2sgc2hvdWxkIGRldGVybWluZSB3aGF0IGhhcHBlbnMgd2l0aCB3aWRlIGxpbmVz
LgorICAgIC8vIEluIHBhcnRpY3VsYXIgd2l0aCBSVEwgYmxvY2tzLCB3aWRlIGxpbmVzIHNob3Vs
ZCBzdGlsbCBzcGlsbCBvdXQgdG8gdGhlIGxlZnQuCisgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24pIHsKKyAgICAgICAgaWYgKHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNh
bFdpZHRoICYmIHRyYWlsaW5nU3BhY2VSdW4pCisgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVu
LT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0PigwLCB0cmFpbGluZ1NwYWNl
UnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCkgLSB0b3RhbExvZ2ljYWxXaWR0aCArIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRyYWls
aW5nU3BhY2VSdW4pCisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2Fs
V2lkdGgoMCk7CisgICAgZWxzZSBpZiAodG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dp
Y2FsV2lkdGgpCisgICAgICAgIGxvZ2ljYWxMZWZ0IC09ICh0b3RhbExvZ2ljYWxXaWR0aCAtIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxXaWR0
aEZvclJpZ2h0QWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlvbiwgQmlkaVJ1
biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dp
Y2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBXaWRlIGxp
bmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2sgYmFzZWQgb2ZmIGRpcmVjdGlvbi4KKyAgICAvLyBT
byBldmVuIGlmIHRleHQtYWxpZ24gaXMgcmlnaHQsIGlmIGRpcmVjdGlvbiBpcyBMVFIsIHdpZGUg
bGluZXMgc2hvdWxkIG92ZXJmbG93IG91dCBvZiB0aGUgcmlnaHQKKyAgICAvLyBzaWRlIG9mIHRo
ZSBibG9jay4KKyAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICBpZiAo
dHJhaWxpbmdTcGFjZVJ1bikgeworICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJh
aWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgdHJhaWxp
bmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKKyAgICAgICAgfQorICAgICAg
ICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgwLmYsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0b3Rh
bExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAmJiB0cmFpbGluZ1NwYWNlUnVu
KSB7CisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3Rk
OjptYXg8ZmxvYXQ+KDAsIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSAt
IHRvdGFsTG9naWNhbFdpZHRoICsgYXZhaWxhYmxlTG9naWNhbFdpZHRoKSk7CisgICAgICAgIHRv
dGFsTG9naWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgo
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgbG9naWNhbExlZnQgKz0gYXZhaWxhYmxlTG9naWNhbFdp
ZHRoIC0gdG90YWxMb2dpY2FsV2lkdGg7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxX
aWR0aEZvckNlbnRlckFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24sIEJp
ZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFs
TG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCit7CisgICAgZmxvYXQg
dHJhaWxpbmdTcGFjZVdpZHRoID0gMDsKKyAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikgeworICAg
ICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNh
bFdpZHRoKCk7CisgICAgICAgIHRyYWlsaW5nU3BhY2VXaWR0aCA9IHN0ZDo6bWluKHRyYWlsaW5n
U3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSwgKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAt
IHRvdGFsTG9naWNhbFdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+
Ym94KCktPnNldExvZ2ljYWxXaWR0aChzdGQ6Om1heDxmbG9hdD4oMCwgdHJhaWxpbmdTcGFjZVdp
ZHRoKSk7CisgICAgfQorICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQorICAgICAgICBs
b2dpY2FsTGVmdCArPSBzdGQ6Om1heDxmbG9hdD4oKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKSAvIDIsIDApOworICAgIGVsc2UKKyAgICAgICAgbG9naWNhbExlZnQg
Kz0gdG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGggPyAoYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIDogKGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCAtIHRvdGFsTG9naWNhbFdpZHRoKSAvIDIgLSB0cmFpbGluZ1NwYWNlV2lkdGg7Cit9CisKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4sIFJl
bmRlclJ1YnlSdW4mIHJlbmRlcmVyLCBSZW5kZXJPYmplY3QqIHByZXZpb3VzT2JqZWN0LCBjb25z
dCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgZmxvYXQgc3RhcnRPdmVyaGFuZzsKKyAgICBm
bG9hdCBlbmRPdmVyaGFuZzsKKyAgICBSZW5kZXJPYmplY3QqIG5leHRPYmplY3QgPSAwOworICAg
IGZvciAoQmlkaVJ1biogcnVuV2l0aE5leHRPYmplY3QgPSBydW4tPm5leHQoKTsgcnVuV2l0aE5l
eHRPYmplY3Q7IHJ1bldpdGhOZXh0T2JqZWN0ID0gcnVuV2l0aE5leHRPYmplY3QtPm5leHQoKSkg
eworICAgICAgICBpZiAoIXJ1bldpdGhOZXh0T2JqZWN0LT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpICYmICFydW5XaXRoTmV4dE9iamVjdC0+Ym94KCktPmlzTGluZUJyZWFrKCkp
IHsKKyAgICAgICAgICAgIG5leHRPYmplY3QgPSAmcnVuV2l0aE5leHRPYmplY3QtPnJlbmRlcmVy
KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZW5kZXJlci5n
ZXRPdmVyaGFuZyhsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCByZW5kZXJlci5zdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IHByZXZpb3VzT2JqZWN0IDogbmV4dE9iamVjdCwgcmVuZGVy
ZXIuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBuZXh0T2JqZWN0IDogcHJldmlv
dXNPYmplY3QsIHN0YXJ0T3ZlcmhhbmcsIGVuZE92ZXJoYW5nKTsKKyAgICBzZXRNYXJnaW5TdGFy
dEZvckNoaWxkKHJlbmRlcmVyLCBMYXlvdXRVbml0KC1zdGFydE92ZXJoYW5nKSk7CisgICAgc2V0
TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLWVuZE92ZXJoYW5nKSk7Cit9
CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGZsb2F0
IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKKyAgICBHbHlwaE92ZXJmbG93QW5kRmFs
bGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVy
dGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQor
eworICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7CisgICAgR2x5cGhPdmVy
ZmxvdyBnbHlwaE92ZXJmbG93OworCisgICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBsaW5l
U3R5bGUoKnJlbmRlcmVyLnBhcmVudCgpLCBsaW5lSW5mbykuZm9udENhc2NhZGUoKTsKKyAgICAv
LyBBbHdheXMgY29tcHV0ZSBnbHlwaCBvdmVyZmxvdyBpZiB0aGUgYmxvY2sncyBsaW5lLWJveC1j
b250YWluIHZhbHVlIGlzICJnbHlwaHMiLgorICAgIGlmIChsaW5lQm94LT5maXRzVG9HbHlwaHMo
KSkgeworICAgICAgICAvLyBJZiB3ZSBkb24ndCBzdGljayBvdXQgb2YgdGhlIHJvb3QgbGluZSdz
IGZvbnQgYm94LCB0aGVuIGRvbid0IGJvdGhlciBjb21wdXRpbmcgb3VyIGdseXBoIG92ZXJmbG93
LiBUaGlzIG9wdGltaXphdGlvbgorICAgICAgICAvLyB3aWxsIGtlZXAgdXMgZnJvbSBjb21wdXRp
bmcgZ2x5cGggYm91bmRzIGluIG5lYXJseSBhbGwgY2FzZXMuCisgICAgICAgIGJvb2wgaW5jbHVk
ZVJvb3RMaW5lID0gbGluZUJveC0+aW5jbHVkZXNSb290TGluZUJveEZvbnRPckxlYWRpbmcoKTsK
KyAgICAgICAgaW50IGJhc2VsaW5lU2hpZnQgPSBsaW5lQm94LT52ZXJ0aWNhbFBvc2l0aW9uRm9y
Qm94KHJ1bi0+Ym94KCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7CisgICAgICAgIGludCByb290
RGVzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkg
OiAwOworICAgICAgICBpbnQgcm9vdEFzY2VudCA9IGluY2x1ZGVSb290TGluZSA/IGZvbnQuZm9u
dE1ldHJpY3MoKS5hc2NlbnQoKSA6IDA7CisgICAgICAgIGludCBib3hBc2NlbnQgPSBmb250LmZv
bnRNZXRyaWNzKCkuYXNjZW50KCkgLSBiYXNlbGluZVNoaWZ0OworICAgICAgICBpbnQgYm94RGVz
Y2VudCA9IGZvbnQuZm9udE1ldHJpY3MoKS5kZXNjZW50KCkgKyBiYXNlbGluZVNoaWZ0OworICAg
ICAgICBpZiAoYm94QXNjZW50ID4gcm9vdERlc2NlbnQgfHwgIGJveERlc2NlbnQgPiByb290QXNj
ZW50KQorICAgICAgICAgICAgZ2x5cGhPdmVyZmxvdy5jb21wdXRlQm91bmRzID0gdHJ1ZTsgCisg
ICAgfQorICAgIAorICAgIExheW91dFVuaXQgaHlwaGVuV2lkdGg7CisgICAgaWYgKGRvd25jYXN0
PElubGluZVRleHRCb3g+KCpydW4tPmJveCgpKS5oYXNIeXBoZW4oKSkKKyAgICAgICAgaHlwaGVu
V2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyZXIsIGZvbnQsICZmYWxsYmFja0ZvbnRz
KTsKKworICAgIGZsb2F0IG1lYXN1cmVkV2lkdGggPSAwOworCisgICAgYm9vbCBrZXJuaW5nSXNF
bmFibGVkID0gZm9udC5lbmFibGVLZXJuaW5nKCk7CisgICAgYm9vbCBjYW5Vc2VTaW1wbGVGb250
Q29kZVBhdGggPSByZW5kZXJlci5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKTsKKyAgICAKKyAg
ICAvLyBTaW5jZSB3ZSBkb24ndCBjYWNoZSBnbHlwaCBvdmVyZmxvd3MsIHdlIG5lZWQgdG8gcmUt
bWVhc3VyZSB0aGUgcnVuIGlmCisgICAgLy8gdGhlIHN0eWxlIGlzIGxpbmVib3gtY29udGFpbjog
Z2x5cGguCisgICAgaWYgKCFsaW5lQm94LT5maXRzVG9HbHlwaHMoKSAmJiBjYW5Vc2VTaW1wbGVG
b250Q29kZVBhdGgpIHsKKyAgICAgICAgdW5zaWduZWQgbGFzdEVuZE9mZnNldCA9IHJ1bi0+bV9z
dGFydDsKKyAgICAgICAgYm9vbCBhdEZpcnN0V29yZE1lYXN1cmVtZW50ID0gdHJ1ZTsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDAsIHNpemUgPSB3b3JkTWVhc3VyZW1lbnRzLnNpemUoKTsgaSA8
IHNpemUgJiYgbGFzdEVuZE9mZnNldCA8IHJ1bi0+bV9zdG9wOyArK2kpIHsKKyAgICAgICAgICAg
IFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50c1tpXTsK
KyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQud2lkdGggPD0gMCB8fCB3b3JkTWVhc3Vy
ZW1lbnQuc3RhcnRPZmZzZXQgPT0gd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQucmVuZGVy
ZXIgIT0gJnJlbmRlcmVyIHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCAhPSBsYXN0RW5k
T2Zmc2V0IHx8IHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPiBydW4tPm1fc3RvcCkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbGFzdEVuZE9mZnNldCA9IHdvcmRN
ZWFzdXJlbWVudC5lbmRPZmZzZXQ7CisgICAgICAgICAgICBpZiAoa2VybmluZ0lzRW5hYmxlZCAm
JiBsYXN0RW5kT2Zmc2V0ID09IHJ1bi0+bV9zdG9wKSB7CisgICAgICAgICAgICAgICAgaW50IHdv
cmRMZW5ndGggPSBsYXN0RW5kT2Zmc2V0IC0gd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0Owor
ICAgICAgICAgICAgICAgIEdseXBoT3ZlcmZsb3cgb3ZlcmZsb3c7CisgICAgICAgICAgICAgICAg
bWVhc3VyZWRXaWR0aCArPSByZW5kZXJlci53aWR0aCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZz
ZXQsIHdvcmRMZW5ndGgsIHhQb3MgKyBtZWFzdXJlZFdpZHRoLCBsaW5lSW5mby5pc0ZpcnN0TGlu
ZSgpLAorICAgICAgICAgICAgICAgICAgICAmd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMs
ICZvdmVyZmxvdyk7CisgICAgICAgICAgICAgICAgVUNoYXIgYyA9IHJlbmRlcmVyLmNoYXJhY3Rl
ckF0KHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgLy8gcmVu
ZGVyZXIud2lkdGgoKSBvbWl0cyB3b3JkLXNwYWNpbmcgdmFsdWUgZm9yIGxlYWRpbmcgd2hpdGVz
cGFjZSwgc28gbGV0J3MganVzdCBhZGQgaXQgYmFjayBoZXJlLgorICAgICAgICAgICAgICAgIGlm
ICghYXRGaXJzdFdvcmRNZWFzdXJlbWVudCAmJiBGb250Q2FzY2FkZTo6dHJlYXRBc1NwYWNlKGMp
KQorICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLnN0eWxlKCku
Zm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSB3b3JkTWVhc3VyZW1lbnQud2lkdGg7CisgICAgICAg
ICAgICBhdEZpcnN0V29yZE1lYXN1cmVtZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICgh
d29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAg
ICAgSGFzaFNldDxjb25zdCBGb250Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciAoSGFzaFNldDxj
b25zdCBGb250Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd29yZE1lYXN1cmVtZW50LmZhbGxiYWNr
Rm9udHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgICAgICAgICBmYWxs
YmFja0ZvbnRzLmFkZCgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
IChtZWFzdXJlZFdpZHRoICYmIGxhc3RFbmRPZmZzZXQgIT0gcnVuLT5tX3N0b3ApIHsKKyAgICAg
ICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGNhY2hlZCBkYXRhLCB3ZSdsbCBtZWFz
dXJlIHRoZSBydW4gYWdhaW4uCisgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gMDsKKyAgICAg
ICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
ICghbWVhc3VyZWRXaWR0aCkKKyAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHJlbmRlcmVyLndpZHRo
KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3AgLSBydW4tPm1fc3RhcnQsIHhQb3MsIGxpbmVJbmZv
LmlzRmlyc3RMaW5lKCksICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CisKKyAgICBy
dW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgobWVhc3VyZWRXaWR0aCArIGh5cGhlbldpZHRoKTsK
KyAgICBpZiAoIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChydW4t
PmJveCgpLT5iZWhhdmVzTGlrZVRleHQoKSk7CisgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwOjppdGVyYXRvciBpdCA9IHRleHRCb3hEYXRhTWFwLmFkZChkb3duY2FzdDxJ
bmxpbmVUZXh0Qm94PihydW4tPmJveCgpKSwgc3RkOjptYWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZv
bnQqPigpLCBHbHlwaE92ZXJmbG93KCkpKS5pdGVyYXRvcjsKKyAgICAgICAgQVNTRVJUKGl0LT52
YWx1ZS5maXJzdC5pc0VtcHR5KCkpOworICAgICAgICBpdC0+dmFsdWUuZmlyc3QgPSBjb3B5VG9W
ZWN0b3IoZmFsbGJhY2tGb250cyk7CisgICAgICAgIHJ1bi0+Ym94KCktPnBhcmVudCgpLT5jbGVh
ckRlc2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUoKTsKKyAgICB9CisKKyAg
ICAvLyBJbmNsdWRlIHRleHQgZGVjb3JhdGlvbiB2aXN1YWwgb3ZlcmZsb3cgYXMgcGFydCBvZiB0
aGUgZ2x5cGggb3ZlcmZsb3cuCisgICAgaWYgKCFyZW5kZXJlci5zdHlsZSgpLnRleHREZWNvcmF0
aW9uc0luRWZmZWN0KCkuaXNFbXB0eSgpKQorICAgICAgICBnbHlwaE92ZXJmbG93LmV4dGVuZFRv
KHZpc3VhbE92ZXJmbG93Rm9yRGVjb3JhdGlvbnMocnVuLT5ib3goKS0+bGluZVN0eWxlKCksIGRv
d25jYXN0PElubGluZVRleHRCb3g+KHJ1bi0+Ym94KCkpKSk7CisKKyAgICBpZiAoIWdseXBoT3Zl
cmZsb3cuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChydW4tPmJveCgpLT5iZWhhdmVzTGlr
ZVRleHQoKSk7CisgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwOjppdGVy
YXRvciBpdCA9IHRleHRCb3hEYXRhTWFwLmFkZChkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihydW4t
PmJveCgpKSwgc3RkOjptYWtlX3BhaXIoVmVjdG9yPGNvbnN0IEZvbnQqPigpLCBHbHlwaE92ZXJm
bG93KCkpKS5pdGVyYXRvcjsKKyAgICAgICAgaXQtPnZhbHVlLnNlY29uZCA9IGdseXBoT3ZlcmZs
b3c7CisgICAgICAgIHJ1bi0+Ym94KCktPmNsZWFyS25vd25Ub0hhdmVOb092ZXJmbG93KCk7Cisg
ICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlUnVieUZvckp1c3RpZmllZFRl
eHQoUmVuZGVyUnVieVJ1biYgcnVieVJ1biwgQmlkaVJ1biYgciwgY29uc3QgVmVjdG9yPHVuc2ln
bmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25PcHBv
cnR1bml0eUNvdW50LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgc2l6ZV90JiBpKQoreworICAgIGlmICghcnVieVJ1bi5ydWJ5QmFzZSgpIHx8
ICFydWJ5UnVuLnJ1YnlCYXNlKCktPmZpcnN0Um9vdEJveCgpIHx8IHJ1YnlSdW4ucnVieUJhc2Uo
KS0+Zmlyc3RSb290Qm94KCktPm5leHRSb290Qm94KCkgfHwgIXIucmVuZGVyZXIoKS5zdHlsZSgp
LmNvbGxhcHNlV2hpdGVTcGFjZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvJiBydWJ5
QmFzZSA9ICpydWJ5UnVuLnJ1YnlCYXNlKCk7CisgICAgYXV0byYgcm9vdEJveCA9ICpydWJ5QmFz
ZS5maXJzdFJvb3RCb3goKTsKKworICAgIGZsb2F0IHRvdGFsRXhwYW5zaW9uID0gMDsKKyAgICB1
bnNpZ25lZCB0b3RhbE9wcG9ydHVuaXRpZXNJblJ1biA9IDA7CisgICAgZm9yIChhdXRvKiBsZWFm
Q2hpbGQgPSByb290Qm94LmZpcnN0TGVhZkNoaWxkKCk7IGxlYWZDaGlsZDsgbGVhZkNoaWxkID0g
bGVhZkNoaWxkLT5uZXh0TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgaWYgKCFsZWFmQ2hpbGQtPmlz
SW5saW5lVGV4dEJveCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgdW5zaWdu
ZWQgb3Bwb3J0dW5pdGllc0luUnVuID0gZXhwYW5zaW9uT3Bwb3J0dW5pdGllc1tpKytdOworICAg
ICAgICBBU1NFUlQob3Bwb3J0dW5pdGllc0luUnVuIDw9IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQpOworICAgICAgICBhdXRvIGV4cGFuc2lvbiA9IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0
b3RhbExvZ2ljYWxXaWR0aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4gLyBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50OworICAgICAgICB0b3RhbEV4cGFuc2lvbiArPSBleHBhbnNpb247CisgICAgICAg
IHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuICs9IG9wcG9ydHVuaXRpZXNJblJ1bjsKKyAgICB9CisK
KyAgICBBU1NFUlQoIXJ1YnlSdW4uaGFzT3ZlcnJpZGVDb250ZW50TG9naWNhbFdpZHRoKCkpOwor
ICAgIGZsb2F0IG5ld0Jhc2VXaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdpZHRoKCkgKyB0b3RhbEV4
cGFuc2lvbiArIG1hcmdpblN0YXJ0Rm9yQ2hpbGQocnVieVJ1bikgKyBtYXJnaW5FbmRGb3JDaGls
ZChydWJ5UnVuKTsKKyAgICBmbG9hdCBuZXdSdWJ5UnVuV2lkdGggPSBydWJ5UnVuLmxvZ2ljYWxX
aWR0aCgpICsgdG90YWxFeHBhbnNpb247CisgICAgcnVieUJhc2Uuc2V0SW5pdGlhbE9mZnNldCgo
bmV3UnVieVJ1bldpZHRoIC0gbmV3QmFzZVdpZHRoKSAvIDIpOworICAgIHJ1YnlSdW4uc2V0T3Zl
cnJpZGVDb250ZW50TG9naWNhbFdpZHRoKExheW91dFVuaXQobmV3UnVieVJ1bldpZHRoKSk7Cisg
ICAgcnVieVJ1bi5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgIHJvb3RCb3gubWFy
a0RpcnR5KCk7CisgICAgaWYgKFJlbmRlclJ1YnlUZXh0KiBydWJ5VGV4dCA9IHJ1YnlSdW4ucnVi
eVRleHQoKSkgeworICAgICAgICBpZiAoUm9vdElubGluZUJveCogdGV4dFJvb3RCb3ggPSBydWJ5
VGV4dC0+Zmlyc3RSb290Qm94KCkpCisgICAgICAgICAgICB0ZXh0Um9vdEJveC0+bWFya0RpcnR5
KCk7CisgICAgfQorICAgIHJ1YnlSdW4ubGF5b3V0QmxvY2sodHJ1ZSk7CisgICAgcnVieVJ1bi5j
bGVhck92ZXJyaWRlQ29udGVudExvZ2ljYWxXaWR0aCgpOworICAgIHIuYm94KCktPnNldEV4cGFu
c2lvbihuZXdSdWJ5UnVuV2lkdGggLSByLmJveCgpLT5sb2dpY2FsV2lkdGgoKSk7CisKKyAgICB0
b3RhbExvZ2ljYWxXaWR0aCArPSB0b3RhbEV4cGFuc2lvbjsKKyAgICBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50IC09IHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuOworfQorCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RS
dW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+
JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNv
dW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRo
KQoreworICAgIGlmICghZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCB8fCBhdmFpbGFibGVMb2dp
Y2FsV2lkdGggPD0gdG90YWxMb2dpY2FsV2lkdGgpCisgICAgICAgIHJldHVybjsKKworICAgIHNp
emVfdCBpID0gMDsKKyAgICBmb3IgKEJpZGlSdW4qIHJ1biA9IGZpcnN0UnVuOyBydW47IHJ1biA9
IHJ1bi0+bmV4dCgpKSB7CisgICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4gPT0gdHJhaWxp
bmdTcGFjZVJ1bikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgaWYg
KGlzPFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IG9wcG9ydHVuaXRpZXNJblJ1biA9IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXNbaSsrXTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG9wcG9ydHVuaXRpZXNJblJ1biA8PSBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT25seSBq
dXN0aWZ5IHRleHQgaWYgd2hpdGVzcGFjZSBpcyBjb2xsYXBzZWQuCisgICAgICAgICAgICBpZiAo
cnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKKyAgICAgICAg
ICAgICAgICBJbmxpbmVUZXh0Qm94JiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4o
KnJ1bi0+Ym94KCkpOworICAgICAgICAgICAgICAgIGZsb2F0IGV4cGFuc2lvbiA9IChhdmFpbGFi
bGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgKiBvcHBvcnR1bml0aWVzSW5SdW4g
LyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OworICAgICAgICAgICAgICAgIHRleHRCb3guc2V0
RXhwYW5zaW9uKGV4cGFuc2lvbik7CisgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGgg
Kz0gZXhwYW5zaW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCAtPSBvcHBvcnR1bml0aWVzSW5SdW47CisgICAgICAgIH0gZWxzZSBpZiAoaXM8
UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSkKKyAgICAgICAgICAgIHVwZGF0ZVJ1YnlG
b3JKdXN0aWZpZWRUZXh0KGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSks
ICpydW4sIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQs
IHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGkpOworCisgICAgICAg
IGlmICghZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAg
IH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdu
bWVudChjb25zdCBUZXh0QWxpZ25Nb2RlJiB0ZXh0QWxpZ24sIGNvbnN0IFJvb3RJbmxpbmVCb3gq
IHJvb3RJbmxpbmVCb3gsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2Fs
TGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdp
ZHRoLCBpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKK3sKKyAgICBUZXh0RGlyZWN0aW9u
IGRpcmVjdGlvbjsKKyAgICBpZiAocm9vdElubGluZUJveCAmJiBzdHlsZSgpLnVuaWNvZGVCaWRp
KCkgPT0gUGxhaW50ZXh0KQorICAgICAgICBkaXJlY3Rpb24gPSByb290SW5saW5lQm94LT5kaXJl
Y3Rpb24oKTsKKyAgICBlbHNlCisgICAgICAgIGRpcmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9u
KCk7CisKKyAgICAvLyBBcm1lZCB3aXRoIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSAod2l0
aG91dCBqdXN0aWZpY2F0aW9uKSwKKyAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGln
biBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCisg
ICAgLy8gb2JqZWN0cyBob3Jpem9udGFsbHkuIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBj
YW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAorICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KKyAg
ICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6TGVmdDoKKyAg
ICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6CisgICAgICAgIHVwZGF0ZUxvZ2ljYWxX
aWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCks
IHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxh
YmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpSaWdodDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAgICAgICB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdodEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNh
bFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFRleHRBbGlnbk1vZGU6OkNlbnRlcjoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdENl
bnRlcjoKKyAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKHN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2Fs
TGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6SnVzdGlmeToKKyAgICAgICAgYWRqdXN0
SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyhleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBsb2dp
Y2FsTGVmdCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgaWYgKGV4cGFuc2lvbk9w
cG9ydHVuaXR5Q291bnQpIHsKKyAgICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7Cisg
ICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94
KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJv
eCgpLT5zZXRMb2dpY2FsV2lkdGgoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBGQUxMVEhST1VHSDsKKyAgICBjYXNlIFRleHRBbGlnbk1v
ZGU6OlN0YXJ0OgorICAgICAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikK
KyAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUo
KS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0
LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxM
ZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpFbmQ6CisgICAgICAgIGlmIChkaXJlY3Rp
b24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRo
Rm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRy
YWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxl
TG9naWNhbFdpZHRoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdp
ZHRoRm9yTGVmdEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwg
dHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lk
IHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgZmxv
YXQmIGxpbmVMb2dpY2FsTGVmdCwgZmxvYXQmIGxpbmVMb2dpY2FsUmlnaHQsIGZsb2F0JiBhdmFp
bGFibGVMb2dpY2FsV2lkdGgsIGJvb2wgZmlyc3RMaW5lLAorICAgIEluZGVudFRleHRPck5vdCBz
aG91bGRJbmRlbnRUZXh0LCBMYXlvdXRVbml0IGJveExvZ2ljYWxIZWlnaHQpCit7CisgICAgTGF5
b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdodCA9IGJsb2NrLm1pbkxpbmVIZWlnaHRGb3JSZXBsYWNl
ZFJlbmRlcmVyKGZpcnN0TGluZSwgYm94TG9naWNhbEhlaWdodCk7CisgICAgbGluZUxvZ2ljYWxM
ZWZ0ID0gYmxvY2subG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWlnaHQo
KSwgc2hvdWxkSW5kZW50VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOworICAgIGxpbmVMb2dpY2Fs
UmlnaHQgPSBibG9jay5sb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGJsb2NrLmxvZ2ljYWxIZWln
aHQoKSwgc2hvdWxkSW5kZW50VGV4dCwgbGluZUxvZ2ljYWxIZWlnaHQpOworICAgIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCA9IGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQ7Cit9CisK
K3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9y
TGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJp
ZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRF
bmQsIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVy
dGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVu
dHMmIHdvcmRNZWFzdXJlbWVudHMpCit7CisgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSB0
ZXh0QWxpZ25tZW50Rm9yTGluZSghcmVhY2hlZEVuZCAmJiAhbGluZUJveC0+ZW5kc1dpdGhCcmVh
aygpKTsKKyAgICAKKyAgICAvLyBDU1MgMi4xOiAiJ1RleHQtaW5kZW50JyBvbmx5IGFmZmVjdHMg
YSBsaW5lIGlmIGl0IGlzIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZSBvZiBhbiBlbGVtZW50LiBG
b3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIAorICAgIC8v
IGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFy
ZW50IGVsZW1lbnQuIgorICAgIC8vIENTUzMgInRleHQtaW5kZW50IiwgIi13ZWJraXQtZWFjaC1s
aW5lIiBhZmZlY3RzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBibG9jayBjb250YWluZXIgYXMgd2Vs
bCBhcyBlYWNoIGxpbmUgYWZ0ZXIgYSBmb3JjZWQgbGluZSBicmVhaywKKyAgICAvLyBidXQgZG9l
cyBub3QgYWZmZWN0IGxpbmVzIGFmdGVyIGEgc29mdCB3cmFwIGJyZWFrLgorICAgIGJvb2wgaXNG
aXJzdExpbmUgPSBsaW5lSW5mby5pc0ZpcnN0TGluZSgpICYmICEoaXNBbm9ueW1vdXNCbG9jaygp
ICYmIHBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gdGhpcyk7CisgICAgYm9vbCBpc0FmdGVySGFy
ZExpbmVCcmVhayA9IGxpbmVCb3gtPnByZXZSb290Qm94KCkgJiYgbGluZUJveC0+cHJldlJvb3RC
b3goKS0+ZW5kc1dpdGhCcmVhaygpOworICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRU
ZXh0ID0gcmVxdWlyZXNJbmRlbnQoaXNGaXJzdExpbmUsIGlzQWZ0ZXJIYXJkTGluZUJyZWFrLCBz
dHlsZSgpKTsKKyAgICBmbG9hdCBsaW5lTG9naWNhbExlZnQ7CisgICAgZmxvYXQgbGluZUxvZ2lj
YWxSaWdodDsKKyAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGg7CisgICAgdXBkYXRlTG9n
aWNhbElubGluZVBvc2l0aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJp
Z2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0
LCAwKTsKKyAgICBib29sIG5lZWRzV29yZFNwYWNpbmc7CisKKyAgICBpZiAoZmlyc3RSdW4gJiYg
Zmlyc3RSdW4tPnJlbmRlcmVyKCkuaXNSZXBsYWNlZCgpKSB7CisgICAgICAgIFJlbmRlckJveCYg
cmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PihmaXJzdFJ1bi0+cmVuZGVyZXIoKSk7Cisg
ICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRoaXMsIGxpbmVMb2dpY2FsTGVm
dCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwg
c2hvdWxkSW5kZW50VGV4dCwgcmVuZGVyQm94LmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgfQorCisg
ICAgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQobGluZUJveCwgbGlu
ZUluZm8sIHRleHRBbGlnbiwgbGluZUxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgs
IGZpcnN0UnVuLCB0cmFpbGluZ1NwYWNlUnVuLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3Np
dGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKKyAgICAvLyBUaGUgd2lkdGhzIG9mIGFsbCBy
dW5zIGFyZSBub3cga25vd24uIFdlIGNhbiBub3cgcGxhY2UgZXZlcnkgaW5saW5lIGJveCAoYW5k
CisgICAgLy8gY29tcHV0ZSBhY2N1cmF0ZSB3aWR0aHMgZm9yIHRoZSBpbmxpbmUgZmxvdyBib3hl
cykuCisgICAgbmVlZHNXb3JkU3BhY2luZyA9IGZhbHNlOworICAgIGxpbmVCb3gtPnBsYWNlQm94
ZXNJbklubGluZURpcmVjdGlvbihsaW5lTG9naWNhbExlZnQsIG5lZWRzV29yZFNwYWNpbmcpOwor
fQorCitzdGF0aWMgaW5saW5lIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9yRm9y
SW5saW5lVGV4dEJveChSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBJbmxpbmVUZXh0Qm94JiB0ZXh0
Qm94LCBCaWRpUnVuKiBwcmV2aW91c1J1biwgQmlkaVJ1biogbmV4dFJ1biwgVGV4dEFsaWduTW9k
ZSB0ZXh0QWxpZ24sIGJvb2wgaXNBZnRlckV4cGFuc2lvbikKK3sKKyAgICAvLyBUYXRlY2h1eW9r
byBpcyBtb2RlbGVkIGFzIHRoZSBPYmplY3QgUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIChVK0ZGRkMp
LCB3aGljaCBjYW4gbmV2ZXIgaGF2ZSBleHBhbnNpb24gb3Bwb3J0dW5pdGllcyBpbnNpZGUgbm9y
IGludHJpbnNpY2FsbHkgYWRqYWNlbnQgdG8gaXQuCisgICAgaWYgKHRleHRCb3gucmVuZGVyZXIo
KS5zdHlsZSgpLnRleHRDb21iaW5lKCkgPT0gVGV4dENvbWJpbmU6Okhvcml6b250YWwpCisgICAg
ICAgIHJldHVybiBGb3JiaWRMZWFkaW5nRXhwYW5zaW9uIHwgRm9yYmlkVHJhaWxpbmdFeHBhbnNp
b247CisKKyAgICBFeHBhbnNpb25CZWhhdmlvciByZXN1bHQgPSAwOworICAgIGJvb2wgc2V0TGVh
ZGluZ0V4cGFuc2lvbiA9IGZhbHNlOworICAgIGJvb2wgc2V0VHJhaWxpbmdFeHBhbnNpb24gPSBm
YWxzZTsKKyAgICBpZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpIHsKKyAg
ICAgICAgLy8gSWYgdGhlIG5leHQgYm94IGlzIHJ1YnksIGFuZCB3ZSdyZSBqdXN0aWZ5aW5nLCBh
bmQgdGhlIGZpcnN0IGJveCBpbiB0aGUgcnVieSBiYXNlIGhhcyBhIGxlYWRpbmcgZXhwYW5zaW9u
LCBhbmQgd2UgYXJlIGEgdGV4dCBib3gsIHRoZW4gZm9yY2UgYSB0cmFpbGluZyBleHBhbnNpb24u
CisgICAgICAgIGlmIChuZXh0UnVuICYmIGlzPFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRl
cmVyKCkpICYmIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpLnJ1
YnlCYXNlKCkgJiYgbmV4dFJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFj
ZSgpKSB7CisgICAgICAgICAgICBhdXRvJiBydWJ5QmFzZSA9ICpkb3duY2FzdDxSZW5kZXJSdWJ5
UnVuPihuZXh0UnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpOworICAgICAgICAgICAgaWYgKHJ1
YnlCYXNlLmZpcnN0Um9vdEJveCgpICYmICFydWJ5QmFzZS5maXJzdFJvb3RCb3goKS0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmIChhdXRvKiBsZWFmQ2hpbGQgPSBydWJ5QmFz
ZS5maXJzdFJvb3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAg
ICBpZiAoaXM8SW5saW5lVGV4dEJveD4oKmxlYWZDaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGxlYWRpbmdFeHBhbnNpb25PcHBvcnR1bml0eSBkb2Vzbid0
IGFjdHVhbGx5IHdvcmsgYmVjYXVzZSBpdCBkb2Vzbid0IHBlcmZvcm0gdGhlIFVCQQorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKEZvbnRDYXNjYWRlOjpsZWFkaW5nRXhwYW5zaW9uT3Bwb3J0
dW5pdHkoZG93bmNhc3Q8UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5kZXJlcigpKS5zdHJpbmdW
aWV3KCksIGxlYWZDaGlsZC0+ZGlyZWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0VHJhaWxpbmdFeHBhbnNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlc3VsdCB8PSBGb3JjZVRyYWlsaW5nRXhwYW5zaW9uOworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNhbWUgdGhpbmcsIGV4Y2VwdCBpZiB3
ZSdyZSBmb2xsb3dpbmcgYSBydWJ5CisgICAgICAgIGlmIChwcmV2aW91c1J1biAmJiBpczxSZW5k
ZXJSdWJ5UnVuPihwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyUnVi
eVJ1bj4ocHJldmlvdXNSdW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkgJiYgcHJldmlvdXNSdW4t
PnJlbmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgeworICAgICAgICAgICAg
YXV0byYgcnVieUJhc2UgPSAqZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocHJldmlvdXNSdW4tPnJl
bmRlcmVyKCkpLnJ1YnlCYXNlKCk7CisgICAgICAgICAgICBpZiAocnVieUJhc2UuZmlyc3RSb290
Qm94KCkgJiYgIXJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgp
LT5sYXN0TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzPElubGluZVRl
eHRCb3g+KCpsZWFmQ2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBsZWFkaW5nRXhwYW5zaW9uT3Bwb3J0dW5pdHkgZG9lc24ndCBhY3R1YWxseSB3b3JrIGJl
Y2F1c2UgaXQgZG9lc24ndCBwZXJmb3JtIHRoZSBVQkEKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChGb250Q2FzY2FkZTo6dHJhaWxpbmdFeHBhbnNpb25PcHBvcnR1bml0eShkb3duY2FzdDxS
ZW5kZXJUZXh0PihsZWFmQ2hpbGQtPnJlbmRlcmVyKCkpLnN0cmluZ1ZpZXcoKSwgbGVhZkNoaWxk
LT5kaXJlY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMZWFkaW5n
RXhwYW5zaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0g
Rm9yY2VMZWFkaW5nRXhwYW5zaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIC8vIElmIHdlJ3JlIHRoZSBmaXJzdCBib3ggaW5zaWRlIGEgcnVieSBiYXNl
LCBmb3JiaWQgYSBsZWFkaW5nIGV4cGFuc2lvbiwgYW5kIHZpY2UtdmVyc2EKKyAgICAgICAgaWYg
KGlzPFJlbmRlclJ1YnlCYXNlPihibG9jaykpIHsKKyAgICAgICAgICAgIFJlbmRlclJ1YnlCYXNl
JiBydWJ5QmFzZSA9IGRvd25jYXN0PFJlbmRlclJ1YnlCYXNlPihibG9jayk7CisgICAgICAgICAg
ICBpZiAoJnRleHRCb3ggPT0gcnVieUJhc2UuZmlyc3RSb290Qm94KCktPmZpcnN0TGVhZkNoaWxk
KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRMZWFkaW5nRXhwYW5zaW9uID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICByZXN1bHQgfD0gRm9yYmlkTGVhZGluZ0V4cGFuc2lvbjsKKyAgICAgICAgICAg
IH0gaWYgKCZ0ZXh0Qm94ID09IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5sYXN0TGVhZkNoaWxk
KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IHRydWU7CisgICAg
ICAgICAgICAgICAgcmVzdWx0IHw9IEZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghc2V0TGVhZGluZ0V4cGFuc2lvbikKKyAg
ICAgICAgcmVzdWx0IHw9IGlzQWZ0ZXJFeHBhbnNpb24gPyBGb3JiaWRMZWFkaW5nRXhwYW5zaW9u
IDogQWxsb3dMZWFkaW5nRXhwYW5zaW9uOworICAgIGlmICghc2V0VHJhaWxpbmdFeHBhbnNpb24p
CisgICAgICAgIHJlc3VsdCB8PSBBbGxvd1RyYWlsaW5nRXhwYW5zaW9uOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBseUV4cGFuc2lvbkJlaGF2aW9yKElu
bGluZVRleHRCb3gmIHRleHRCb3gsIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9y
KQoreworICAgIHN3aXRjaCAoZXhwYW5zaW9uQmVoYXZpb3IgJiBMZWFkaW5nRXhwYW5zaW9uTWFz
aykgeworICAgIGNhc2UgRm9yY2VMZWFkaW5nRXhwYW5zaW9uOgorICAgICAgICB0ZXh0Qm94LnNl
dEZvcmNlTGVhZGluZ0V4cGFuc2lvbigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcmJp
ZExlYWRpbmdFeHBhbnNpb246CisgICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZUxlYWRpbmdFeHBh
bnNpb24oZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFsbG93TGVhZGluZ0V4cGFu
c2lvbjoKKyAgICAgICAgdGV4dEJveC5zZXRDYW5IYXZlTGVhZGluZ0V4cGFuc2lvbih0cnVlKTsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGV4cGFuc2lvbkJlaGF2aW9y
ICYgVHJhaWxpbmdFeHBhbnNpb25NYXNrKSB7CisgICAgY2FzZSBGb3JjZVRyYWlsaW5nRXhwYW5z
aW9uOgorICAgICAgICB0ZXh0Qm94LnNldEZvcmNlVHJhaWxpbmdFeHBhbnNpb24oKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBGb3JiaWRUcmFpbGluZ0V4cGFuc2lvbjoKKyAgICAgICAgdGV4
dEJveC5zZXRDYW5IYXZlVHJhaWxpbmdFeHBhbnNpb24oZmFsc2UpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEFsbG93VHJhaWxpbmdFeHBhbnNpb246CisgICAgICAgIHRleHRCb3guc2V0Q2Fu
SGF2ZVRyYWlsaW5nRXhwYW5zaW9uKHRydWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
fQorCitzdGF0aWMgYm9vbCBpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFy
Z2luKGNvbnN0IFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIGNvbnN0IElubGluZUJveCYgYm94KQor
eworICAgIGJvb2wgaXNMVFIgPSBibG9jay5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSBib3gucGFyZW50KCk7IGN1cnJlbnRCb3g7
IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wYXJlbnQoKSkgeworICAgICAgICBpZiAoKGlzTFRS
ICYmIGN1cnJlbnRCb3gtPm1hcmdpbkJvcmRlclBhZGRpbmdMb2dpY2FsTGVmdCgpID4gMCkKKyAg
ICAgICAgICAgIHx8ICghaXNMVFIgJiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xv
Z2ljYWxSaWdodCgpID4gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpbmxpbmVBbmNlc3Rvckhhc0VuZEJvcmRl
clBhZGRpbmdPck1hcmdpbihjb25zdCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBJbmxp
bmVCb3gmIGJveCkKK3sKKyAgICBib29sIGlzTFRSID0gYmxvY2suc3R5bGUoKS5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCk7CisgICAgZm9yIChhdXRvKiBjdXJyZW50Qm94ID0gYm94LnBhcmVudCgp
OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+cGFyZW50KCkpIHsKKyAgICAg
ICAgaWYgKChpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9naWNhbFJp
Z2h0KCkgPiAwKQorICAgICAgICAgICAgfHwgKCFpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5C
b3JkZXJQYWRkaW5nTG9naWNhbExlZnQoKSA+IDApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKyAgICAKK3N0YXRpYyBib29sIGlzTGFzdElu
Rmxvd1J1bihCaWRpUnVuJiBydW5Ub0NoZWNrKQoreworICAgIGZvciAoYXV0byogcnVuID0gcnVu
VG9DaGVjay5uZXh0KCk7IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAgICAgaWYgKCFy
dW4tPmJveCgpIHx8IHJ1bi0+cmVuZGVyZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBy
dW4tPmJveCgpLT5pc0xpbmVCcmVhaygpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisgICAgCitCaWRpUnVu
KiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdt
ZW50KFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgVGV4
dEFsaWduTW9kZSB0ZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwgCisgICAgZmxvYXQmIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5n
U3BhY2VSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1h
cCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsCisgICAgV29y
ZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBib29sIG5lZWRzV29yZFNw
YWNpbmcgPSBmYWxzZTsKKyAgICBib29sIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgPSBzdHls
ZSgpLmhhbmdpbmdQdW5jdHVhdGlvbigpLmNvbnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6Rmly
c3QpOworICAgIGJvb2wgY2FuSGFuZ1B1bmN0dWF0aW9uQXRFbmQgPSBzdHlsZSgpLmhhbmdpbmdQ
dW5jdHVhdGlvbigpLmNvbnRhaW5zKEhhbmdpbmdQdW5jdHVhdGlvbjo6TGFzdCk7CisgICAgYm9v
bCBpc0xUUiA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAgIGZsb2F0IHRv
dGFsTG9naWNhbFdpZHRoID0gbGluZUJveC0+Z2V0Rmxvd1NwYWNpbmdMb2dpY2FsV2lkdGgoKTsK
KyAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKKyAgICBib29sIGlz
QWZ0ZXJFeHBhbnNpb24gPSBpczxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpID8gZG93bmNhc3Q8UmVu
ZGVyUnVieUJhc2U+KCp0aGlzKS5pc0FmdGVyRXhwYW5zaW9uKCkgOiB0cnVlOworICAgIFZlY3Rv
cjx1bnNpZ25lZCwgMTY+IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXM7CisKKyAgICBCaWRpUnVuKiBy
dW4gPSBmaXJzdFJ1bjsKKyAgICBCaWRpUnVuKiBwcmV2aW91c1J1biA9IG51bGxwdHI7CisgICAg
Zm9yICg7IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAgICAgYXV0byBjb21wdXRlRXhw
YW5zaW9uT3Bwb3J0dW5pdGllcyA9IFsmZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgJmV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQsIHRleHRBbGlnbiwgJmlzQWZ0ZXJFeHBhbnNpb25dIChSZW5kZXJC
bG9ja0Zsb3cmIGJsb2NrLAorICAgICAgICAgICAgSW5saW5lVGV4dEJveCYgdGV4dEJveCwgQmlk
aVJ1biogcHJldmlvdXNSdW4sIEJpZGlSdW4qIG5leHRSdW4sIGNvbnN0IFN0cmluZ1ZpZXcmIHN0
cmluZ1ZpZXcsIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAg
ICBpZiAoc3RyaW5nVmlldy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBFbXB0eSBy
dW5zIHNob3VsZCBzdGlsbCBwcm9kdWNlIGFuIGVudHJ5IGluIGV4cGFuc2lvbk9wcG9ydHVuaXRp
ZXMgbGlzdCBzbyB0aGF0IHRoZSBudW1iZXIgb2YgaXRlbXMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9m
IHJ1bnMuCisgICAgICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hcHBlbmQoMCk7
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhw
YW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IgPSBleHBhbnNpb25CZWhhdmlvckZvcklu
bGluZVRleHRCb3goYmxvY2ssIHRleHRCb3gsIHByZXZpb3VzUnVuLCBuZXh0UnVuLCB0ZXh0QWxp
Z24sIGlzQWZ0ZXJFeHBhbnNpb24pOworICAgICAgICAgICAgYXBwbHlFeHBhbnNpb25CZWhhdmlv
cih0ZXh0Qm94LCBleHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgICAgICB1bnNpZ25lZCBvcHBv
cnR1bml0aWVzSW5SdW47CisgICAgICAgICAgICBzdGQ6OnRpZShvcHBvcnR1bml0aWVzSW5SdW4s
IGlzQWZ0ZXJFeHBhbnNpb24pID0gRm9udENhc2NhZGU6OmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQoc3RyaW5nVmlldywgZGlyZWN0aW9uLCBleHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgICAg
ICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmFwcGVuZChvcHBvcnR1bml0aWVzSW5SdW4pOworICAg
ICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCArPSBvcHBvcnR1bml0aWVzSW5SdW47
CisgICAgICAgIH07CisgICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4tPnJlbmRlcmVyKCku
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgcnVuLT5ib3goKS0+aXNMaW5lQnJlYWsoKSkgewor
ICAgICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0
aWNpcGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgICAvLyBj
b3JyZWN0IHN0YXRpYyB4IHBvc2l0aW9uLiAgVGhleSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lk
dGguCisgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBsaW5lIGJyZWFrIGJveGVz
IGhhdmUgbm8gZWZmZWN0IG9uIHRoZSB3aWR0aC4KKyAgICAgICAgfQorICAgICAgICBpZiAoaXM8
UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkgeworICAgICAgICAgICAgYXV0byYgcmVuZGVy
VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSk7CisgICAgICAgICAg
ICBhdXRvJiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpOwor
ICAgICAgICAgICAgaWYgKGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgJiYgbGluZUluZm8uaXNG
aXJzdExpbmUoKSAmJiAoaXNMVFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQorICAgICAgICAg
ICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0
aGlzLCAqcnVuLT5ib3goKSkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBoYW5nU3RhcnRXaWR0
aCA9IHJlbmRlclRleHQuaGFuZ2FibGVQdW5jdHVhdGlvblN0YXJ0V2lkdGgocnVuLT5tX3N0YXJ0
KTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ1N0YXJ0V2lk
dGg7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KQorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsTGVmdCAtPSBoYW5nU3RhcnRXaWR0aDsKKyAg
ICAgICAgICAgICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25B
dEVuZCAmJiBsaW5lSW5mby5pc0xhc3RMaW5lKCkgJiYgcnVuLT5tX3N0b3AgPiAwICYmICghaXNM
VFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4pKQorICAgICAgICAgICAgICAgICYmICFpbmxpbmVB
bmNlc3Rvckhhc0VuZEJvcmRlclBhZGRpbmdPck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7
CisgICAgICAgICAgICAgICAgZmxvYXQgaGFuZ0VuZFdpZHRoID0gcmVuZGVyVGV4dC5oYW5nYWJs
ZVB1bmN0dWF0aW9uRW5kV2lkdGgocnVuLT5tX3N0b3AgLSAxKTsKKyAgICAgICAgICAgICAgICBh
dmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ0VuZFdpZHRoOworICAgICAgICAgICAgICAgIGlm
ICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgICAg
IGxvZ2ljYWxMZWZ0IC09IGhhbmdFbmRXaWR0aDsKKyAgICAgICAgICAgICAgICBjYW5IYW5nUHVu
Y3R1YXRpb25BdEVuZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9
IHRyYWlsaW5nU3BhY2VSdW4pCisgICAgICAgICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9y
dHVuaXRpZXMoKnRoaXMsIHRleHRCb3gsIHByZXZpb3VzUnVuLCBydW4tPm5leHQoKSwgcmVuZGVy
VGV4dC5zdHJpbmdWaWV3KHJ1bi0+bV9zdGFydCwgcnVuLT5tX3N0b3ApLCBydW4tPmJveCgpLT5k
aXJlY3Rpb24oKSk7CisKKyAgICAgICAgICAgIGlmICh1bnNpZ25lZCBsZW5ndGggPSByZW5kZXJU
ZXh0LnRleHQoKS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGlmICghcnVuLT5tX3N0YXJ0
ICYmIG5lZWRzV29yZFNwYWNpbmcgJiYgaXNTcGFjZU9yTmV3bGluZShyZW5kZXJUZXh0LmNoYXJh
Y3RlckF0KHJ1bi0+bV9zdGFydCkpKQorICAgICAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxX
aWR0aCArPSBsaW5lU3R5bGUoKnJlbmRlclRleHQucGFyZW50KCksIGxpbmVJbmZvKS5mb250Q2Fz
Y2FkZSgpLndvcmRTcGFjaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gcnVuLT5tX3N0YXJ0ID09
IHJ1bi0+bV9zdG9wIHNob3VsZCBvbmx5IGJlIHRydWUgaWZmIHRoZSBydW4gaXMgYSByZXBsYWNl
ZCBydW4gZm9yIGJpZGk6IGlzb2xhdGUuCisgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi0+bV9z
dG9wID4gMCB8fCBydW4tPm1fc3RhcnQgPT0gcnVuLT5tX3N0b3ApOworICAgICAgICAgICAgICAg
IG5lZWRzV29yZFNwYWNpbmcgPSBydW4tPm1fc3RvcCA9PSBsZW5ndGggJiYgIWlzU3BhY2VPck5l
d2xpbmUocmVuZGVyVGV4dC5jaGFyYWN0ZXJBdChydW4tPm1fc3RvcCAtIDEpKTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgc2V0TG9naWNhbFdpZHRoRm9yVGV4dFJ1bihsaW5lQm94LCBy
dW4sIHJlbmRlclRleHQsIHRvdGFsTG9naWNhbFdpZHRoLCBsaW5lSW5mbywgdGV4dEJveERhdGFN
YXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0ID0gZmFsc2U7Cisg
ICAgICAgICAgICBib29sIGVuY291bnRlcmVkSnVzdGlmaWVkUnVieSA9IGZhbHNlOworICAgICAg
ICAgICAgaWYgKGlzPFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSkgJiYgdGV4dEFsaWdu
ID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5nU3BhY2VSdW4gJiYg
ZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpKSB7Cisg
ICAgICAgICAgICAgICAgYXV0byogcnVieUJhc2UgPSBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihy
dW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJ1YnlCYXNl
LT5maXJzdFJvb3RCb3goKSAmJiAhcnVieUJhc2UtPmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJv
eCgpICYmIHJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJ1YnlCYXNlLT5zZXRJc0FmdGVyRXhwYW5zaW9uKGlzQWZ0ZXJF
eHBhbnNpb24pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1
YnlCYXNlLT5maXJzdFJvb3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKTsgbGVhZkNoaWxkOyBsZWFm
Q2hpbGQgPSBsZWFmQ2hpbGQtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFpczxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRl
cmVkSnVzdGlmaWVkUnVieSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRl
RXhwYW5zaW9uT3Bwb3J0dW5pdGllcygqcnVieUJhc2UsIGRvd25jYXN0PElubGluZVRleHRCb3g+
KCpsZWFmQ2hpbGQpLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KGxlYWZDaGlsZC0+cmVuZGVyZXIoKSkuc3RyaW5nVmll
dygpLCBsZWFmQ2hpbGQtPmRpcmVjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFlbmNvdW50
ZXJlZEp1c3RpZmllZFJ1YnkpCisgICAgICAgICAgICAgICAgaXNBZnRlckV4cGFuc2lvbiA9IGZh
bHNlOworCisgICAgICAgICAgICBpZiAoIWlzPFJlbmRlcklubGluZT4ocnVuLT5yZW5kZXJlcigp
KSkgeworICAgICAgICAgICAgICAgIGF1dG8mIHJlbmRlckJveCA9IGRvd25jYXN0PFJlbmRlckJv
eD4ocnVuLT5yZW5kZXJlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXM8UmVuZGVyUnVieVJ1
bj4ocmVuZGVyQm94KSkKKyAgICAgICAgICAgICAgICAgICAgc2V0TWFyZ2luc0ZvclJ1YnlSdW4o
cnVuLCBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihyZW5kZXJCb3gpLCBwcmV2aW91c1J1biA/ICZw
cmV2aW91c1J1bi0+cmVuZGVyZXIoKSA6IG51bGxwdHIsIGxpbmVJbmZvKTsKKyAgICAgICAgICAg
ICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoRm9yQ2hpbGQocmVu
ZGVyQm94KSk7CisgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gbWFyZ2luU3Rh
cnRGb3JDaGlsZChyZW5kZXJCb3gpICsgbWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyQm94KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IHJ1
bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOworICAgICAgICBwcmV2aW91c1J1biA9IHJ1bjsKKyAg
ICB9CisKKyAgICBpZiAoaXNBZnRlckV4cGFuc2lvbiAmJiAhZXhwYW5zaW9uT3Bwb3J0dW5pdGll
cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gRklYTUU6IHNlZSA8d2Via2l0Lm9yZy9iLzEzOTM5
MyNjMTE+CisgICAgICAgIGludCBsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgg
PSBleHBhbnNpb25PcHBvcnR1bml0aWVzLnNpemUoKSAtIDE7CisgICAgICAgIHdoaWxlIChsYXN0
VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXggPj0gMCAmJiAhZXhwYW5zaW9uT3Bwb3J0
dW5pdGllcy5hdChsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgpKQorICAgICAg
ICAgICAgLS1sYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXg7CisgICAgICAgIGlm
IChsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXggPj0gMCkgeworICAgICAgICAg
ICAgQVNTRVJUKGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXQobGFzdFZhbGlkRXhwYW5zaW9uT3Bw
b3J0dW5pdGllc0luZGV4KSk7CisgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmF0
KGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCktLTsKKyAgICAgICAgICAgIGV4
cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChp
czxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpICYmICFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQor
ICAgICAgICB0ZXh0QWxpZ24gPSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI7CisKKyAgICB1cGRhdGVM
b2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBsaW5lQm94LCB0cmFpbGluZ1NwYWNl
UnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCwgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7CisKKyAgICBjb21wdXRlRXhwYW5zaW9uRm9y
SnVzdGlmaWVkVGV4dChmaXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgZXhwYW5zaW9uT3Bwb3J0
dW5pdGllcywgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisKKyAgICByZXR1cm4gcnVuOworfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6cmVtb3ZlSW5saW5lQm94KEJpZGlSdW4mIHJ1biwgY29uc3QgUm9vdElubGlu
ZUJveCYgcm9vdExpbmVCb3gpIGNvbnN0Cit7CisgICAgYXV0byogaW5saW5lQm94ID0gcnVuLmJv
eCgpOworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBhdXRvKiBpbmxpbmVQYXJlbnQgPSBpbmxp
bmVCb3gtPnBhcmVudCgpOworICAgIHdoaWxlIChpbmxpbmVQYXJlbnQgJiYgaW5saW5lUGFyZW50
ICE9ICZyb290TGluZUJveCkgeworICAgICAgICBBU1NFUlQoIWlubGluZVBhcmVudC0+aXNEaXJ0
eSgpKTsKKyAgICAgICAgaW5saW5lUGFyZW50ID0gaW5saW5lUGFyZW50LT5wYXJlbnQoKTsKKyAg
ICB9CisgICAgQVNTRVJUKCFyb290TGluZUJveC5pc0RpcnR5KCkpOworI2VuZGlmCisgICAgYXV0
byogcGFyZW50ID0gaW5saW5lQm94LT5wYXJlbnQoKTsKKyAgICBpbmxpbmVCb3gtPnJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIGF1dG8mIHJlbmRlcmVyID0gcnVuLnJlbmRlcmVyKCk7CisgICAg
aWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkKKyAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4
dD4ocmVuZGVyZXIpLnJlbW92ZVRleHRCb3goZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKmlubGlu
ZUJveCkpOworICAgIGRlbGV0ZSBpbmxpbmVCb3g7CisgICAgcnVuLnNldEJveChudWxscHRyKTsK
KyAgICAvLyByZW1vdmVGcm9tUGFyZW50KCkgdW5uZWNlc3NhcmlseSBkaXJ0aWVzIHRoZSBhbmNl
c3RvciBzdWJ0cmVlLgorICAgIGF1dG8qIGFuY2VzdG9yID0gcGFyZW50OworICAgIHdoaWxlIChh
bmNlc3RvcikgeworICAgICAgICBhbmNlc3Rvci0+bWFya0RpcnR5KGZhbHNlKTsKKyAgICAgICAg
aWYgKGFuY2VzdG9yID09ICZyb290TGluZUJveCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBhbmNlc3RvciA9IGFuY2VzdG9yLT5wYXJlbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVy
QmxvY2tGbG93Ojpjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGlj
YWxQb3NpdGlvbkNhY2hlKQoreworICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25C
b3hlc0luQmxvY2tEaXJlY3Rpb24obG9naWNhbEhlaWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVy
dGljYWxQb3NpdGlvbkNhY2hlKSk7CisKKyAgICAvLyBOb3cgbWFrZSBzdXJlIHdlIHBsYWNlIHJl
cGxhY2VkIHJlbmRlciBvYmplY3RzIGNvcnJlY3RseS4KKyAgICBmb3IgKGF1dG8qIHJ1biA9IGZp
cnN0UnVuOyBydW47IHJ1biA9IHJ1bi0+bmV4dCgpKSB7CisgICAgICAgIEFTU0VSVChydW4tPmJv
eCgpKTsKKyAgICAgICAgaWYgKCFydW4tPmJveCgpKQorICAgICAgICAgICAgY29udGludWU7IC8v
IFNraXAgcnVucyB3aXRoIG5vIGxpbmUgYm94ZXMuCisKKyAgICAgICAgLy8gQWxpZ24gcG9zaXRp
b25lZCBib3hlcyB3aXRoIHRoZSB0b3Agb2YgdGhlIGxpbmUgYm94LiAgVGhpcyBpcworICAgICAg
ICAvLyBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBvZiBhbiBhcHByb3ByaWF0ZSB5IHBvc2l0
aW9uLgorICAgICAgICBhdXRvJiByZW5kZXJlciA9IHJ1bi0+cmVuZGVyZXIoKTsKKyAgICAgICAg
aWYgKHJlbmRlcmVyLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgcnVuLT5i
b3goKS0+c2V0TG9naWNhbFRvcChsb2dpY2FsSGVpZ2h0KCkpOworCisgICAgICAgIC8vIFBvc2l0
aW9uIGlzIHVzZWQgdG8gcHJvcGVybHkgcG9zaXRpb24gYm90aCByZXBsYWNlZCBlbGVtZW50cyBh
bmQKKyAgICAgICAgLy8gdG8gdXBkYXRlIHRoZSBzdGF0aWMgbm9ybWFsIGZsb3cgeC95IG9mIHBv
c2l0aW9uZWQgZWxlbWVudHMuCisgICAgICAgIGJvb2wgaW5saW5lQm94SXNSZWR1bmRhbnQgPSBm
YWxzZTsKKyAgICAgICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkgeworICAgICAgICAg
ICAgYXV0byYgaW5saW5lVGV4dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+KCpydW4tPmJv
eCgpKTsKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKS5wb3NpdGlv
bkxpbmVCb3goaW5saW5lVGV4dEJveCk7CisgICAgICAgICAgICBpbmxpbmVCb3hJc1JlZHVuZGFu
dCA9ICFpbmxpbmVUZXh0Qm94Lmhhc1RleHRDb250ZW50KCk7CisgICAgICAgIH0gZWxzZSBpZiAo
aXM8UmVuZGVyQm94PihyZW5kZXJlcikpIHsKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJv
eD4ocmVuZGVyZXIpLnBvc2l0aW9uTGluZUJveChkb3duY2FzdDxJbmxpbmVFbGVtZW50Qm94Pigq
cnVuLT5ib3goKSkpOworICAgICAgICAgICAgaW5saW5lQm94SXNSZWR1bmRhbnQgPSByZW5kZXJl
ci5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJM
aW5lQnJlYWs+KHJlbmRlcmVyKSkKKyAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckxpbmVCcmVh
az4ocmVuZGVyZXIpLnJlcGxhY2VJbmxpbmVCb3hXcmFwcGVyKGRvd25jYXN0PElubGluZUVsZW1l
bnRCb3g+KCpydW4tPmJveCgpKSk7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8ga2Vl
cCB0aGlzIGJveCBvbiB0aGUgbGluZSBhdCBhbGwuCisgICAgICAgIGlmIChpbmxpbmVCb3hJc1Jl
ZHVuZGFudCkKKyAgICAgICAgICAgIHJlbW92ZUlubGluZUJveCgqcnVuLCAqbGluZUJveCk7Cisg
ICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNo
YXJhY3RlciwgY29uc3QgUmVuZGVyVGV4dCYgcmVuZGVyZXIpCit7CisgICAgaWYgKGNoYXJhY3Rl
ciA9PSAnICcgfHwgY2hhcmFjdGVyID09ICdcdCcgfHwgY2hhcmFjdGVyID09IHNvZnRIeXBoZW4p
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykKKyAgICAg
ICAgcmV0dXJuICFyZW5kZXJlci5zdHlsZSgpLnByZXNlcnZlTmV3bGluZSgpOworICAgIGlmIChj
aGFyYWN0ZXIgPT0gbm9CcmVha1NwYWNlKQorICAgICAgICByZXR1cm4gcmVuZGVyZXIuc3R5bGUo
KS5uYnNwTW9kZSgpID09IE5CU1BNb2RlOjpTcGFjZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPgorc3RhdGljIGlubGluZSB1bnNpZ25l
ZCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGNvbnN0IFJlbmRlclRleHQmIGxhc3RUZXh0LCBjb25z
dCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3Rv
cCkKK3sKKyAgICB1bnNpZ25lZCBmaXJzdFNwYWNlID0gc3RvcDsKKyAgICB3aGlsZSAoZmlyc3RT
cGFjZSA+IHN0YXJ0KSB7CisgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0
U3BhY2UgLSAxXTsKKyAgICAgICAgaWYgKCFpc0NvbGxhcHNpYmxlU3BhY2UoY3VycmVudCwgbGFz
dFRleHQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpcnN0U3BhY2UtLTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmlyc3RTcGFjZTsKK30KKworaW5saW5lIEJpZGlSdW4qIFJlbmRlckJs
b2NrRmxvdzo6aGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlS
dW5zLCBCaWRpQ29udGV4dCogY3VycmVudENvbnRleHQpCit7CisgICAgaWYgKCFiaWRpUnVucy5y
dW5Db3VudCgpCisgICAgICAgIHx8ICFiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRl
cmVyKCkuc3R5bGUoKS5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKQorICAgICAgICB8fCAhYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpLnN0eWxlKCkuYXV0b1dyYXAoKSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVu
ID0gYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpOworICAgIGNvbnN0IFJlbmRlck9iamVjdCYg
bGFzdE9iamVjdCA9IHRyYWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCk7CisgICAgaWYgKCFpczxS
ZW5kZXJUZXh0PihsYXN0T2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBj
b25zdCBSZW5kZXJUZXh0JiBsYXN0VGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KGxhc3RPYmpl
Y3QpOworICAgIHVuc2lnbmVkIGZpcnN0U3BhY2U7CisgICAgaWYgKGxhc3RUZXh0LnRleHQoKS5p
czhCaXQoKSkKKyAgICAgICAgZmlyc3RTcGFjZSA9IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UobGFz
dFRleHQsIGxhc3RUZXh0LnRleHQoKS5jaGFyYWN0ZXJzOCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5z
dGFydCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdG9wKCkpOworICAgIGVsc2UKKyAgICAgICAgZmly
c3RTcGFjZSA9IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UobGFzdFRleHQsIGxhc3RUZXh0LnRleHQo
KS5jaGFyYWN0ZXJzMTYoKSwgdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSwgdHJhaWxpbmdTcGFj
ZVJ1bi0+c3RvcCgpKTsKKworICAgIGlmIChmaXJzdFNwYWNlID09IHRyYWlsaW5nU3BhY2VSdW4t
PnN0b3AoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBUZXh0RGlyZWN0aW9uIGRp
cmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgYm9vbCBzaG91bGRSZW9yZGVyID0g
dHJhaWxpbmdTcGFjZVJ1biAhPSAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUiA/IGJp
ZGlSdW5zLmxhc3RSdW4oKSA6IGJpZGlSdW5zLmZpcnN0UnVuKCkpOworICAgIGlmIChmaXJzdFNw
YWNlICE9IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKKyAgICAgICAgQmlkaUNvbnRleHQq
IGJhc2VDb250ZXh0ID0gY3VycmVudENvbnRleHQ7CisgICAgICAgIHdoaWxlIChCaWRpQ29udGV4
dCogcGFyZW50ID0gYmFzZUNvbnRleHQtPnBhcmVudCgpKQorICAgICAgICAgICAgYmFzZUNvbnRl
eHQgPSBwYXJlbnQ7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJpZGlSdW4+IG5ld1RyYWls
aW5nUnVuID0gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihmaXJzdFNwYWNlLCB0cmFpbGluZ1Nw
YWNlUnVuLT5tX3N0b3AsIHRyYWlsaW5nU3BhY2VSdW4tPnJlbmRlcmVyKCksIGJhc2VDb250ZXh0
LCBVX09USEVSX05FVVRSQUwpOworICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0b3AgPSBm
aXJzdFNwYWNlOworICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3VHJhaWxpbmdSdW4uZ2V0
KCk7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQorICAgICAg
ICAgICAgYmlkaVJ1bnMuYXBwZW5kUnVuKFdURk1vdmUobmV3VHJhaWxpbmdSdW4pKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgYmlkaVJ1bnMucHJlcGVuZFJ1bihXVEZNb3ZlKG5ld1RyYWls
aW5nUnVuKSk7CisgICAgICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOworICAgIH0KKyAgICBp
ZiAoIXNob3VsZFJlb3JkZXIpCisgICAgICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOworCisg
ICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpIHsKKyAgICAgICAgYmlkaVJ1
bnMubW92ZVJ1blRvRW5kKHRyYWlsaW5nU3BhY2VSdW4pOworICAgICAgICB0cmFpbGluZ1NwYWNl
UnVuLT5tX2xldmVsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBiaWRpUnVucy5tb3ZlUnVu
VG9CZWdpbm5pbmcodHJhaWxpbmdTcGFjZVJ1bik7CisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4t
Pm1fbGV2ZWwgPSAxOworICAgIH0KKyAgICByZXR1cm4gdHJhaWxpbmdTcGFjZVJ1bjsKK30KKwor
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9h
dGluZ09iamVjdCYgZmxvYXRpbmdPYmplY3QpCit7CisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlf
SU1QTElDQVRJT04oIWZsb2F0aW5nT2JqZWN0Lm9yaWdpbmF0aW5nTGluZSgpKTsKKyAgICBBU1NF
UlQobGFzdFJvb3RCb3goKSk7CisgICAgZmxvYXRpbmdPYmplY3Quc2V0T3JpZ2luYXRpbmdMaW5l
KCpsYXN0Um9vdEJveCgpKTsKKyAgICBsYXN0Um9vdEJveCgpLT5hcHBlbmRGbG9hdChmbG9hdGlu
Z09iamVjdC5yZW5kZXJlcigpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5vdGlmeVJlc29s
dmVyVG9SZXN1bWVJbklzb2xhdGUoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgUmVuZGVy
T2JqZWN0KiByb290LCBSZW5kZXJPYmplY3QqIHN0YXJ0T2JqZWN0KQoreworICAgIGlmIChyb290
ICE9IHN0YXJ0T2JqZWN0KSB7CisgICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50ID0gc3RhcnRP
YmplY3QtPnBhcmVudCgpOworICAgICAgICBub3RpZnlSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRl
KHJlc29sdmVyLCByb290LCBwYXJlbnQpOworICAgICAgICBub3RpZnlPYnNlcnZlckVudGVyZWRP
YmplY3QoJnJlc29sdmVyLCBzdGFydE9iamVjdCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgc2V0VXBSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRlKElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVzb2x2ZXIsIEJpZGlSdW4mIGlzb2xh
dGVkUnVuLCBSZW5kZXJPYmplY3QqIHJvb3QsIFJlbmRlck9iamVjdCogc3RhcnRPYmplY3QpCit7
CisgICAgLy8gU2V0IHVwIG1fd2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZQorICAgIHJlc29sdmVy
LndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKSA9IHRvcFJlc29sdmVyLndoaXRlc3BhY2VDb2xs
YXBzaW5nU3RhdGUoKTsKKyAgICByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCku
c2V0Q3VycmVudFRyYW5zaXRpb24odG9wUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFu
c2l0aW9uRm9ySXNvbGF0ZWRSdW4oaXNvbGF0ZWRSdW4pKTsKKworICAgIC8vIFNldCB1cCBtX25l
c3RlZElzb2xhdGVDb3VudAorICAgIG5vdGlmeVJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUocmVz
b2x2ZXIsIHJvb3QsIHN0YXJ0T2JqZWN0KTsKK30KKworLy8gRklYTUU6IEJpZGlSZXNvbHZlciBz
aG91bGQgaGF2ZSB0aGlzIGxvZ2ljLgorc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlS
dW5zRm9yU2VnbWVudChJbmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29sdmVyLCBCaWRpUnVuTGlz
dDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRPZlJ1bnMsIFZp
c3VhbERpcmVjdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSkKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgYSBCaWRpUnVuTGlzdCBpbnRv
IGNyZWF0ZUJpZGlSdW5zRm9yTGluZSBpbnN0ZWFkCisgICAgLy8gb2YgdGhlIHJlc29sdmVyIG93
bmluZyB0aGUgcnVucy4KKyAgICBBU1NFUlQoJnRvcFJlc29sdmVyLnJ1bnMoKSA9PSAmYmlkaVJ1
bnMpOworICAgIEFTU0VSVCh0b3BSZXNvbHZlci5wb3NpdGlvbigpICE9IGVuZE9mUnVucyk7Cisg
ICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50Um9vdCA9IHRvcFJlc29sdmVyLnBvc2l0aW9uKCkucm9v
dCgpOworICAgIHRvcFJlc29sdmVyLmNyZWF0ZUJpZGlSdW5zRm9yTGluZShlbmRPZlJ1bnMsIG92
ZXJyaWRlLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOworCisgICAgd2hpbGUgKCF0b3BSZXNv
bHZlci5pc29sYXRlZFJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSXQgZG9lcyBub3Qg
bWF0dGVyIHdoaWNoIG9yZGVyIHdlIHJlc29sdmUgdGhlIHJ1bnMgYXMgbG9uZyBhcyB3ZSByZXNv
bHZlIHRoZW0gYWxsLgorICAgICAgICBhdXRvIGlzb2xhdGVkUnVuID0gV1RGTW92ZSh0b3BSZXNv
bHZlci5pc29sYXRlZFJ1bnMoKS5sYXN0KCkpOworICAgICAgICB0b3BSZXNvbHZlci5pc29sYXRl
ZFJ1bnMoKS5yZW1vdmVMYXN0KCk7CisgICAgICAgIGN1cnJlbnRSb290ID0gJmlzb2xhdGVkUnVu
LnJvb3Q7CisKKyAgICAgICAgUmVuZGVyT2JqZWN0JiBzdGFydE9iamVjdCA9IGlzb2xhdGVkUnVu
Lm9iamVjdDsKKworICAgICAgICAvLyBPbmx5IGlubGluZXMgbWFrZSBzZW5zZSB3aXRoIHVuaWNv
ZGUtYmlkaTogaXNvbGF0ZSAoYmxvY2tzIGFyZSBhbHJlYWR5IGlzb2xhdGVkKS4KKyAgICAgICAg
Ly8gRklYTUU6IEJlY2F1c2UgZW50ZXJJc29sYXRlIGlzIG5vdCBwYXNzZWQgYSBSZW5kZXJPYmpl
Y3QsIHdlIGhhdmUgdG8gY3Jhd2wgdXAgdGhlCisgICAgICAgIC8vIHRyZWUgdG8gc2VlIHdoaWNo
IHBhcmVudCBpbmxpbmUgaXMgdGhlIGlzb2xhdGUuIFdlIGNvdWxkIGNoYW5nZSBlbnRlcklzb2xh
dGUKKyAgICAgICAgLy8gdG8gdGFrZSBhIFJlbmRlck9iamVjdCBhbmQgZG8gdGhpcyBsb2dpYyB0
aGVyZSwgYnV0IHRoYXQgd291bGQgYmUgYSBsYXllcmluZworICAgICAgICAvLyB2aW9sYXRpb24g
Zm9yIEJpZGlSZXNvbHZlciAod2hpY2gga25vd3Mgbm90aGluZyBhYm91dCBSZW5kZXJPYmplY3Qp
LgorICAgICAgICBSZW5kZXJJbmxpbmUqIGlzb2xhdGVkSW5saW5lID0gZG93bmNhc3Q8UmVuZGVy
SW5saW5lPihoaWdoZXN0Q29udGFpbmluZ0lzb2xhdGVXaXRoaW5Sb290KHN0YXJ0T2JqZWN0LCBj
dXJyZW50Um9vdCkpOworICAgICAgICBBU1NFUlQoaXNvbGF0ZWRJbmxpbmUpOworCisgICAgICAg
IElubGluZUJpZGlSZXNvbHZlciBpc29sYXRlZFJlc29sdmVyOworICAgICAgICBFVW5pY29kZUJp
ZGkgdW5pY29kZUJpZGkgPSBpc29sYXRlZElubGluZS0+c3R5bGUoKS51bmljb2RlQmlkaSgpOwor
ICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbjsKKyAgICAgICAgaWYgKHVuaWNvZGVCaWRp
ID09IFBsYWludGV4dCkKKyAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRpcmVj
dGlvbiwgSW5saW5lSXRlcmF0b3IoaXNvbGF0ZWRJbmxpbmUsICZpc29sYXRlZFJ1bi5vYmplY3Qs
IDApKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQodW5pY29kZUJpZGkgPT0g
SXNvbGF0ZSB8fCB1bmljb2RlQmlkaSA9PSBJc29sYXRlT3ZlcnJpZGUpOworICAgICAgICAgICAg
ZGlyZWN0aW9uID0gaXNvbGF0ZWRJbmxpbmUtPnN0eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgICAg
IH0KKyAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5zZXRTdGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rp
b24sIGlzT3ZlcnJpZGUodW5pY29kZUJpZGkpKSk7CisKKyAgICAgICAgc2V0VXBSZXNvbHZlclRv
UmVzdW1lSW5Jc29sYXRlKGlzb2xhdGVkUmVzb2x2ZXIsIHRvcFJlc29sdmVyLCBpc29sYXRlZFJ1
bi5ydW5Ub1JlcGxhY2UsIGlzb2xhdGVkSW5saW5lLCAmc3RhcnRPYmplY3QpOworCisgICAgICAg
IC8vIFRoZSBzdGFydGluZyBwb3NpdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBy
dW4gd2l0aGluIHRoZSBpc29sYXRlIHRoYXQgd2FzIGlkZW50aWZpZWQKKyAgICAgICAgLy8gZHVy
aW5nIHRoZSBlYXJsaWVyIGNhbGwgdG8gY3JlYXRlQmlkaVJ1bnNGb3JMaW5lLiBUaGlzIGNhbiBi
ZSBidXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZQorICAgICAgICAvLyBmaXJzdCBydW4gd2l0aGlu
IHRoZSBpc29sYXRlLgorICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0
b3IoaXNvbGF0ZWRJbmxpbmUsICZzdGFydE9iamVjdCwgaXNvbGF0ZWRSdW4ucG9zaXRpb24pOwor
ICAgICAgICBpc29sYXRlZFJlc29sdmVyLnNldFBvc2l0aW9uSWdub3JpbmdOZXN0ZWRJc29sYXRl
cyhpdGVyKTsKKworICAgICAgICAvLyBXZSBzdG9wIGF0IHRoZSBuZXh0IGVuZCBvZiBsaW5lOyB3
ZSBtYXkgcmUtZW50ZXIgdGhpcyBpc29sYXRlIGluIHRoZSBuZXh0IGNhbGwgdG8gY29uc3RydWN0
QmlkaVJ1bnMoKS4KKyAgICAgICAgLy8gRklYTUU6IFdoYXQgc2hvdWxkIGVuZCBhbmQgcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5IGJlPworICAgICAgICAvLyBybml3YSBzYXlzIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSBpcyBqdXN0IGEgV2luSUUgaGFjayBhbmQgY291bGQgYWx3YXlzIGJlIGZh
bHNlIGhlcmU/CisgICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuY3JlYXRlQmlkaVJ1bnNGb3JMaW5l
KGVuZE9mUnVucywgTm9WaXN1YWxPdmVycmlkZSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsK
KyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBkZWxldGUgdGhlIHJ1bnMgZnJvbSB0aGUg
cmVzb2x2ZXIuCisgICAgICAgIC8vIFdlJ3JlIG5vdCBndWFyYW50ZWVkIHRvIGdldCBhbnkgQmlk
aVJ1bnMgaW4gdGhlIHByZXZpb3VzIHN0ZXAuIElmIHdlIGRvbid0LCB3ZSBhbGxvdyB0aGUgcGxh
Y2Vob2xkZXIKKyAgICAgICAgLy8gaXRzZWxmIHRvIGJlIHR1cm5lZCBpbnRvIGFuIElubGluZUJv
eC4gV2UgY2FuJ3QgcmVtb3ZlIGl0IGhlcmUgd2l0aG91dCBwb3RlbnRpYWxseSBsb3NpbmcgdHJh
Y2sgb2YKKyAgICAgICAgLy8gdGhlIGxvZ2ljYWxseSBsYXN0IHJ1bi4KKyAgICAgICAgaWYgKGlz
b2xhdGVkUmVzb2x2ZXIucnVucygpLnJ1bkNvdW50KCkpCisgICAgICAgICAgICBiaWRpUnVucy5y
ZXBsYWNlUnVuV2l0aFJ1bnMoJmlzb2xhdGVkUnVuLnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRSZXNv
bHZlci5ydW5zKCkpOworCisgICAgICAgIC8vIElmIHdlIGVuY291bnRlcmVkIGFueSBuZXN0ZWQg
aXNvbGF0ZSBydW5zLCBqdXN0IG1vdmUgdGhlbQorICAgICAgICAvLyB0byB0aGUgdG9wIHJlc29s
dmVyJ3MgbGlzdCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgd2hpbGUgKCFpc29sYXRl
ZFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byBy
dW5XaXRoQ29udGV4dCA9IFdURk1vdmUoaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5s
YXN0KCkpOworICAgICAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5yZW1v
dmVMYXN0KCk7CisgICAgICAgICAgICB0b3BSZXNvbHZlci5zZXRXaGl0ZXNwYWNlQ29sbGFwc2lu
Z1RyYW5zaXRpb25Gb3JJc29sYXRlZFJ1bihydW5XaXRoQ29udGV4dC5ydW5Ub1JlcGxhY2UsIGlz
b2xhdGVkUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdUcmFuc2l0aW9uRm9ySXNvbGF0ZWRS
dW4ocnVuV2l0aENvbnRleHQucnVuVG9SZXBsYWNlKSk7CisgICAgICAgICAgICB0b3BSZXNvbHZl
ci5pc29sYXRlZFJ1bnMoKS5hcHBlbmQoV1RGTW92ZShydW5XaXRoQ29udGV4dCkpOworICAgICAg
ICB9CisgICAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBm
b3IgYWxsIG9mIHRoZSB0ZXh0IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVp
ciBwb3NpdGlvbi4KK1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJv
eGVzRnJvbUJpZGlSdW5zKHVuc2lnbmVkIGJpZGlMZXZlbCwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4m
IGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8s
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0
cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQorewor
ICAgIGlmICghYmlkaVJ1bnMucnVuQ291bnQoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgb25seSBkb25lIHdoZW4gd2UgaGFkIHJ1bnM/Cisg
ICAgbGluZUluZm8uc2V0TGFzdExpbmUoIWVuZC5yZW5kZXJlcigpKTsKKworICAgIFJvb3RJbmxp
bmVCb3gqIGxpbmVCb3ggPSBjb25zdHJ1Y3RMaW5lKGJpZGlSdW5zLCBsaW5lSW5mbyk7CisgICAg
aWYgKCFsaW5lQm94KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGxpbmVCb3gtPnNl
dEJpZGlMZXZlbChiaWRpTGV2ZWwpOworICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsobGlu
ZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpOworICAgIAorICAgIGJvb2wgaXNTVkdS
b290SW5saW5lQm94ID0gaXM8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpOworICAgIAorICAg
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwIHRleHRCb3hEYXRhTWFwOworICAgIAor
ICAgIC8vIE5vdyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHku
CisgICAgaWYgKCFpc1NWR1Jvb3RJbmxpbmVCb3gpCisgICAgICAgIGNvbXB1dGVJbmxpbmVEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGxpbmVJbmZvLCBiaWRpUnVucy5maXJzdFJ1
bigpLCB0cmFpbGluZ1NwYWNlUnVuLCBlbmQuYXRFbmQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgCisgICAgLy8gTm93IHBv
c2l0aW9uIG91ciB0ZXh0IHJ1bnMgdmVydGljYWxseS4KKyAgICBjb21wdXRlQmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGJpZGlSdW5zLmZpcnN0UnVuKCksIHRleHRCb3hE
YXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOworICAgIAorICAgIC8vIFNWRyB0ZXh0IGxh
eW91dCBjb2RlIGNvbXB1dGVzIHZlcnRpY2FsICYgaG9yaXpvbnRhbCBwb3NpdGlvbnMgb24gaXRz
IG93bi4KKyAgICAvLyBOb3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBleGVjdXRlIGNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoKSBhcworICAgIC8vIGl0IGNhbGxzIElubGluZVRleHRC
b3g6OnBvc2l0aW9uTGluZUJveCgpLCB3aGljaCB0cmFja3Mgd2hldGhlciB0aGUgYm94CisgICAg
Ly8gY29udGFpbnMgcmV2ZXJzZWQgdGV4dCBvciBub3QuIElmIHdlIHdvdWxkbid0IGRvIHRoYXQg
ZWRpdGluZyBhbmQgdGh1cworICAgIC8vIHRleHQgc2VsZWN0aW9uIGluIFJUTCBib3hlcyB3b3Vs
ZCBub3Qgd29yayBhcyBleHBlY3RlZC4KKyAgICBpZiAoaXNTVkdSb290SW5saW5lQm94KSB7Cisg
ICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlzU1ZHVGV4dCgpKTsKKyAg
ICAgICAgZG93bmNhc3Q8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpLmNvbXB1dGVQZXJDaGFy
YWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigpOworICAgIH0KKyAgICAKKyAgICAvLyBDb21wdXRlIG91
ciBvdmVyZmxvdyBub3cuCisgICAgbGluZUJveC0+Y29tcHV0ZU92ZXJmbG93KGxpbmVCb3gtPmxp
bmVUb3AoKSwgbGluZUJveC0+bGluZUJvdHRvbSgpLCB0ZXh0Qm94RGF0YU1hcCk7CisgICAgCisg
ICAgcmV0dXJuIGxpbmVCb3g7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZUxpbmVSYW5nZShMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQm94KiBzdGFydExpbmUsIFJvb3RJ
bmxpbmVCb3gqIHN0b3BMaW5lID0gMCkKK3sKKyAgICBSb290SW5saW5lQm94KiBib3hUb0RlbGV0
ZSA9IHN0YXJ0TGluZTsKKyAgICB3aGlsZSAoYm94VG9EZWxldGUgJiYgYm94VG9EZWxldGUgIT0g
c3RvcExpbmUpIHsKKyAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJv
eChib3hUb0RlbGV0ZSk7CisgICAgICAgIC8vIE5vdGU6IGRlbGV0ZUxpbmVSYW5nZShmaXJzdFJv
b3RCb3goKSkgaXMgbm90IGlkZW50aWNhbCB0byBkZWxldGVMaW5lQm94VHJlZSgpLgorICAgICAg
ICAvLyBkZWxldGVMaW5lQm94VHJlZSB1c2VzIG5leHRMaW5lQm94KCkgaW5zdGVhZCBvZiBuZXh0
Um9vdEJveCgpIHdoZW4gdHJhdmVyc2luZy4KKyAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9
IGJveFRvRGVsZXRlLT5uZXh0Um9vdEJveCgpOworICAgICAgICBib3hUb0RlbGV0ZS0+ZGVsZXRl
TGluZSgpOworICAgICAgICBib3hUb0RlbGV0ZSA9IG5leHQ7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCByZXBhaW50RGlydHlGbG9hdHMoTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0
cykKK3sKKyAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVw
YWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQorICAgIC8vIHBhaW50
ZWQgYnkgbm93IGlmIHRoZXkgaGFkIG1vdmVkLCBidXQgaWYgdGhleSBzdGF5ZWQgYXQgKDAsIDAp
LCB0aGV5IHN0aWxsIG5lZWQgdG8gYmUKKyAgICAvLyBwYWludGVkLgorICAgIGZvciAoYXV0byYg
ZmxvYXRCb3ggOiBmbG9hdHMpIHsKKyAgICAgICAgaWYgKGZsb2F0Qm94LT5ldmVySGFkTGF5b3V0
KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXV0byYgYm94ID0gZmxvYXRCb3gt
PnJlbmRlcmVyKCk7CisgICAgICAgIGlmICghYm94LngoKSAmJiAhYm94LnkoKSAmJiBib3guY2hl
Y2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpCisgICAgICAgICAgICBib3gucmVwYWludCgpOwor
ICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHMoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgYm9vbCBoYXNJbmxpbmVDaGlsZCkKK3sKKyAgICAv
LyBXZSB3YW50IHRvIHNraXAgYWhlYWQgdG8gdGhlIGZpcnN0IGRpcnR5IGxpbmUKKyAgICBJbmxp
bmVCaWRpUmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgUm9vdElubGluZUJveCogc3RhcnRMaW5lID0g
ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIpOworICAgIAorICAg
IHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKKyAgICBpZiAoc3RhcnRM
aW5lKSB7CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogbGluZSA9IHN0YXJ0TGluZS0+cHJl
dlJvb3RCb3goKTsgbGluZSAmJiBsaW5lLT5pc0h5cGhlbmF0ZWQoKTsgbGluZSA9IGxpbmUtPnBy
ZXZSb290Qm94KCkpCisgICAgICAgICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcysrOwor
ICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBvdXRzaWRl
IG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBzaW5jZQorICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRp
b24gY2FuIGNoYW5nZSB0aGUgZnVsbExheW91dCBmbGFnIHdlIGhhdmUgdG8gZG8gdGhpcyBoZXJl
LiBGYWlsdXJlIHRvIGNhbGwKKyAgICAvLyBkZXRlcm1pbmVTdGFydFBvc2l0aW9uIGZpcnN0IHdp
bGwgYnJlYWsgZmFzdC9yZXBhaW50L2xpbmUtZmxvdy13aXRoLWZsb2F0cy05Lmh0bWwuCisgICAg
aWYgKGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxm
TmVlZHNMYXlvdXQoKSkgeworICAgICAgICBzZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOyAv
LyBNYXJrIGFzIG5lZWRpbmcgYSBmdWxsIGxheW91dCB0byBmb3JjZSB1cyB0byByZXBhaW50Lgor
ICAgICAgICBpZiAoIXZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubmVlZHNGdWxs
UmVwYWludCgpICYmIGhhc1NlbGZQYWludGluZ0xheWVyKCkgJiYgaGFzUmVwYWludExheW91dFJl
Y3RzKCkpIHsKKyAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2Ugd2FpdGVkIHVudGlsIHdlIHdlcmUg
YWxyZWFkeSBpbnNpZGUgbGF5b3V0IHRvIGRpc2NvdmVyCisgICAgICAgICAgICAvLyB0aGF0IHRo
ZSBibG9jayByZWFsbHkgbmVlZGVkIGEgZnVsbCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNl
IHRvIHJlcGFpbnQgdGhlIGxheWVyCisgICAgICAgICAgICAvLyBiZWZvcmUgbGF5b3V0IHN0YXJ0
ZWQuICBMdWNraWx5IHRoZSBsYXllciBoYXMgY2FjaGVkIHRoZSByZXBhaW50IHJlY3QgZm9yIGl0
cyBvcmlnaW5hbAorICAgICAgICAgICAgLy8gcG9zaXRpb24gYW5kIHNpemUsIGFuZCBzbyB3ZSBj
YW4gdXNlIHRoYXQgdG8gbWFrZSBhIHJlcGFpbnQgaGFwcGVuIG5vdy4KKyAgICAgICAgICAgIHJl
cGFpbnRVc2luZ0NvbnRhaW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIHJlcGFpbnRMYXlvdXRS
ZWN0cygpLm1fcmVwYWludFJlY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnRh
aW5zRmxvYXRzKCkpCisgICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLnNldExhc3RGbG9h
dChtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpKTsKKworICAgIC8vIFdlIGFs
c28gZmluZCB0aGUgZmlyc3QgY2xlYW4gbGluZSBhbmQgZXh0cmFjdCB0aGVzZSBsaW5lcy4gIFdl
IHdpbGwgYWRkIHRoZW0gYmFjaworICAgIC8vIGlmIHdlIGRldGVybWluZSB0aGF0IHdlJ3JlIGFi
bGUgdG8gc3luY2hyb25pemUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBkaXJ0eSBsaW5lcy4KKyAg
ICBJbmxpbmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKKyAgICBCaWRpU3RhdHVzIGNsZWFuTGlu
ZUJpZGlTdGF0dXM7CisgICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAmJiBzdGFy
dExpbmUpCisgICAgICAgIGRldGVybWluZUVuZFBvc2l0aW9uKGxheW91dFN0YXRlLCBzdGFydExp
bmUsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKKworICAgIGlmIChzdGFy
dExpbmUpIHsKKyAgICAgICAgaWYgKCFsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQor
ICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0UmVwYWludFJhbmdlKGxvZ2ljYWxIZWlnaHQoKSk7
CisgICAgICAgIGRlbGV0ZUxpbmVSYW5nZShsYXlvdXRTdGF0ZSwgc3RhcnRMaW5lKTsKKyAgICB9
CisKKyAgICBpZiAoIWxheW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIGxhc3RSb290Qm94KCkg
JiYgbGFzdFJvb3RCb3goKS0+ZW5kc1dpdGhCcmVhaygpKSB7CisgICAgICAgIC8vIElmIHRoZSBs
YXN0IGxpbmUgYmVmb3JlIHRoZSBzdGFydCBsaW5lIGVuZHMgd2l0aCBhIGxpbmUgYnJlYWsgdGhh
dCBjbGVhciBmbG9hdHMsCisgICAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5
LgorICAgICAgICAvLyBBIGxpbmUgYnJlYWsgY2FuIGJlIGVpdGhlciB0aGUgZmlyc3Qgb3IgdGhl
IGxhc3Qgb2JqZWN0IG9uIGEgbGluZSwgZGVwZW5kaW5nIG9uIGl0cyBkaXJlY3Rpb24uCisgICAg
ICAgIGlmIChJbmxpbmVCb3gqIGxhc3RMZWFmQ2hpbGQgPSBsYXN0Um9vdEJveCgpLT5sYXN0TGVh
ZkNoaWxkKCkpIHsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9ICZsYXN0
TGVhZkNoaWxkLT5yZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JS
KCkpCisgICAgICAgICAgICAgICAgbGFzdE9iamVjdCA9ICZsYXN0Um9vdEJveCgpLT5maXJzdExl
YWZDaGlsZCgpLT5yZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzQlIo
KSkgeworICAgICAgICAgICAgICAgIENsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5bGUoKS5j
bGVhcigpOworICAgICAgICAgICAgICAgIGlmIChjbGVhciAhPSBDbGVhcjo6Tm9uZSkKKyAgICAg
ICAgICAgICAgICAgICAgY2xlYXJGbG9hdHMoY2xlYXIpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UobGF5b3V0U3RhdGUs
IHJlc29sdmVyLCBjbGVhbkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cywgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMpOworICAgIGxpbmtUb0VuZExpbmVJZk5lZWRlZChsYXlvdXRTdGF0
ZSk7CisgICAgcmVwYWludERpcnR5RmxvYXRzKGxheW91dFN0YXRlLmZsb2F0TGlzdCgpKTsKK30K
KworLy8gQmVmb3JlIHJlc3RhcnRpbmcgdGhlIGxheW91dCBsb29wIHdpdGggYSBuZXcgbG9naWNh
bEhlaWdodCwgcmVtb3ZlIGFsbCBmbG9hdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCByZXNldCB0aGUg
cmVzb2x2ZXIuCitpbmxpbmUgY29uc3QgSW5saW5lSXRlcmF0b3ImIFJlbmRlckJsb2NrRmxvdzo6
cmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhl
aWdodCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25z
dCBJbmxpbmVJdGVyYXRvciYgb2xkRW5kKQoreworICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0Jl
bG93KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQpOworICAgIHNl
dExvZ2ljYWxIZWlnaHQobmV3TG9naWNhbEhlaWdodCk7CisgICAgcmVzb2x2ZXIuc2V0UG9zaXRp
b25JZ25vcmluZ05lc3RlZElzb2xhdGVzKG9sZEVuZCk7CisgICAgcmV0dXJuIG9sZEVuZDsKK30K
Kwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVM
YXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xl
YW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCit7
CisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlVG9Vc2UgPSBzdHlsZSgpOworICAgIGJvb2wg
cGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0
ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+
aXNQYWdpbmF0ZWQoKTsKKyAgICBMaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSYgbGluZVdo
aXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUgPSByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0
YXRlKCk7CisgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKKyAg
ICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOworICAg
IFJlbmRlclRleHRJbmZvIHJlbmRlclRleHRJbmZvOworICAgIFZlcnRpY2FsUG9zaXRpb25DYWNo
ZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CisKKyAgICBMaW5lQnJlYWtlciBsaW5lQnJlYWtlcigq
dGhpcyk7CisKKyAgICB3aGlsZSAoIWVuZC5hdEVuZCgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBJ
cyB0aGlzIGNoZWNrIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvciBjYW4g
aXQgYmUgbW92ZWQgdG8gdGhlIGVuZD8KKyAgICAgICAgaWYgKGNoZWNrRm9yRW5kTGluZU1hdGNo
KSB7CisgICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTWF0Y2hlZChtYXRjaGVkRW5k
TGluZShsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRp
U3RhdHVzKSk7CisgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkg
eworICAgICAgICAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJl
c29sdmVyLnBvc2l0aW9uKCkucm9vdCgpLCAwLCAwKSwgMCk7CisgICAgICAgICAgICAgICAgbGF5
b3V0U3RhdGUubWFyZ2luSW5mbygpLmNsZWFyTWFyZ2luKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsaW5lV2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZS5yZXNldCgpOworCisgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCku
c2V0RW1wdHkodHJ1ZSk7CisgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkucmVzZXRSdW5z
RnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Ig
b2xkRW5kID0gZW5kOworICAgICAgICBib29sIGlzTmV3VUJBUGFyYWdyYXBoID0gbGF5b3V0U3Rh
dGUubGluZUluZm8oKS5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKTsKKyAgICAgICAgRmxvYXRp
bmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUgPSAoY29udGFpbnNGbG9hdHMoKSkg
PyBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpIDogbnVsbHB0cjsKKworICAg
ICAgICBXb3JkTWVhc3VyZW1lbnRzIHdvcmRNZWFzdXJlbWVudHM7CisgICAgICAgIGVuZCA9IGxp
bmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCks
IHJlbmRlclRleHRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcywgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgIGNhY2hlUHJpb3JDaGFy
YWN0ZXJzSWZOZWVkZWQocmVuZGVyVGV4dEluZm8ubGluZUJyZWFrSXRlcmF0b3IpOworICAgICAg
ICByZW5kZXJUZXh0SW5mby5saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOwor
ICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CisgICAgICAgICAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5leHRMaW5lQnJl
YWsgdG8gYmVnaW4gd2l0aCEKKyAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxpc3QgaXMgc2Vw
YXJhdGVkIGZyb20gQmlkaVJlc29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVkLgorICAgICAg
ICAgICAgcmVzb2x2ZXIucnVucygpLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvbHZlci5tYXJr
Q3VycmVudFJ1bkVtcHR5KCk7IC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBiZSByZXBsYWNl
ZCBieSBhbiBBU1NFUlQgKG9yIGp1c3QgcmVtb3ZlZCkuCisgICAgICAgICAgICBsYXlvdXRTdGF0
ZS5zZXRDaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSh0cnVlKTsKKyAgICAgICAgICAgIHJlc29s
dmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkucm9vdCgp
LCAwLCAwKSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFT
U0VSVChlbmQgIT0gcmVzb2x2ZXIucG9zaXRpb24oKSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBh
IHNob3J0LWN1dCBmb3IgZW1wdHkgbGluZXMuCisgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGxhc3RSb290Qm94KCkpCisgICAg
ICAgICAgICAgICAgbGFzdFJvb3RCb3goKS0+c2V0TGluZUJyZWFrSW5mbyhlbmQucmVuZGVyZXIo
KSwgZW5kLm9mZnNldCgpLCByZXNvbHZlci5zdGF0dXMoKSk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBWaXN1YWxEaXJlY3Rpb25PdmVycmlkZSBvdmVycmlkZSA9IChzdHlsZVRvVXNl
LnJ0bE9yZGVyaW5nKCkgPT0gT3JkZXI6OlZpc3VhbCA/IChzdHlsZVRvVXNlLmRpcmVjdGlvbigp
ID09IFRleHREaXJlY3Rpb246OkxUUiA/IFZpc3VhbExlZnRUb1JpZ2h0T3ZlcnJpZGUgOiBWaXN1
YWxSaWdodFRvTGVmdE92ZXJyaWRlKSA6IE5vVmlzdWFsT3ZlcnJpZGUpOworCisgICAgICAgICAg
ICBpZiAoaXNOZXdVQkFQYXJhZ3JhcGggJiYgc3R5bGVUb1VzZS51bmljb2RlQmlkaSgpID09IFBs
YWludGV4dCAmJiAhcmVzb2x2ZXIuY29udGV4dCgpLT5wYXJlbnQoKSkgeworICAgICAgICAgICAg
ICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGVUb1VzZS5kaXJlY3Rpb24oKTsKKyAg
ICAgICAgICAgICAgICBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24sIHJlc29sdmVy
LnBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhCaWRpU3Rh
dHVzKGRpcmVjdGlvbiwgaXNPdmVycmlkZShzdHlsZVRvVXNlLnVuaWNvZGVCaWRpKCkpKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBvd25lcnNoaXAgaXMgcmV2
ZXJzZWQuIFdlIHNob3VsZCBvd24gdGhlIEJpZGlSdW5MaXN0IGFuZCBwYXNzIGl0IHRvIGNyZWF0
ZUJpZGlSdW5zRm9yTGluZS4KKyAgICAgICAgICAgIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRp
UnVucyA9IHJlc29sdmVyLnJ1bnMoKTsKKyAgICAgICAgICAgIGNvbnN0cnVjdEJpZGlSdW5zRm9y
U2VnbWVudChyZXNvbHZlciwgYmlkaVJ1bnMsIGVuZCwgb3ZlcnJpZGUsIGxheW91dFN0YXRlLmxp
bmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpOworICAgICAgICAgICAgQVNTRVJU
KHJlc29sdmVyLnBvc2l0aW9uKCkgPT0gZW5kKTsKKworICAgICAgICAgICAgQmlkaVJ1biogdHJh
aWxpbmdTcGFjZVJ1biA9ICFsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSgpID8gaGFuZGxlVHJhaWxpbmdTcGFjZXMoYmlkaVJ1bnMsIHJlc29sdmVyLmNvbnRl
eHQoKSkgOiBudWxscHRyOworCisgICAgICAgICAgICBpZiAoYmlkaVJ1bnMucnVuQ291bnQoKSAm
JiBsaW5lQnJlYWtlci5saW5lV2FzSHlwaGVuYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5tX2hhc0h5cGhlbiA9IHRydWU7CisgICAgICAgICAg
ICAgICAgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMrKzsKKyAgICAgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsKKworICAgICAg
ICAgICAgLy8gTm93IHRoYXQgdGhlIHJ1bnMgaGF2ZSBiZWVuIG9yZGVyZWQsIHdlIGNyZWF0ZSB0
aGUgbGluZSBib3hlcy4KKyAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJl
IG91dCB3aGVyZSBib3JkZXIvcGFkZGluZy9tYXJnaW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCisg
ICAgICAgICAgICAvLyBpbmxpbmUgZmxvdyBib3hlcy4KKworICAgICAgICAgICAgTGF5b3V0VW5p
dCBvbGRMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgUm9vdElu
bGluZUJveCogbGluZUJveCA9IGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhyZXNvbHZlci5z
dGF0dXMoKS5jb250ZXh0LT5sZXZlbCgpLCBiaWRpUnVucywgZW5kLCBsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHRyYWlsaW5nU3BhY2VSdW4sIHdvcmRNZWFz
dXJlbWVudHMpOworCisgICAgICAgICAgICBiaWRpUnVucy5jbGVhcigpOworICAgICAgICAgICAg
cmVzb2x2ZXIubWFya0N1cnJlbnRSdW5FbXB0eSgpOyAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFi
bHkgYmUgcmVwbGFjZWQgYnkgYW4gQVNTRVJUIChvciBqdXN0IHJlbW92ZWQpLgorCisgICAgICAg
ICAgICBpZiAobGluZUJveCkgeworICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVh
a0luZm8oZW5kLnJlbmRlcmVyKCksIGVuZC5vZmZzZXQoKSwgcmVzb2x2ZXIuc3RhdHVzKCkpOwor
ICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQorICAg
ICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxp
bmVCb3gpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExheW91dFVuaXQgYWRq
dXN0bWVudDsKKyAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50ID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2luSW5m
bygpLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOworCisgICAgICAgICAgICAgICAgaWYg
KHBhZ2luYXRlZCkKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFn
aW5hdGlvbihsaW5lQm94LCBhZGp1c3RtZW50LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3Rh
dGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsK
KyAgICAgICAgICAgICAgICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBs
YXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRmlyc3RMaW5lKCkgPyBJbmRlbnRUZXh0IDogRG9Ob3RJ
bmRlbnRUZXh0OworICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExpbmVXaWR0aCA9
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5k
ZW50VGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0
aW9uUG9zaXRpb24oYWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRT
dGF0ZS51c2VzUmVwYWludEJvdW5kcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0
U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChsaW5lQm94KTsKKworICAgICAgICAgICAg
ICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0
ICsgYWRqdXN0bWVudCwgc2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGxpbmUsIHJlbW92
ZSBhbGwgZmxvYXRzIHRoYXQgZ290IGFkZGVkLCBhbmQgbGV0IGxpbmUgbGF5b3V0IHJlLXJ1bi4K
KyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmRlbGV0ZUxpbmUoKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVuZCA9IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShv
bGRMb2dpY2FsSGVpZ2h0LCBvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgcmVzb2x2ZXIsIG9sZEVuZCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
aWYgKHBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJh
Z21lbnRlZEZsb3coKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9y
TGluZShsaW5lQm94KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpbmVCcmVha2VyLnBvc2l0aW9u
ZWRPYmplY3RzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMo
KnRoaXMsICpsaW5lQnJlYWtlci5wb3NpdGlvbmVkT2JqZWN0cygpW2ldLCBEb05vdEluZGVudFRl
eHQpOworCisgICAgICAgIGlmICghbGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKGZhbHNlKTsK
KyAgICAgICAgICAgIGNsZWFyRmxvYXRzKGxpbmVCcmVha2VyLmNsZWFyKCkpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKKyAg
ICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1f
ZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09i
amVjdFNldC5iZWdpbigpOworICAgICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNl
dC5lbmQoKTsKKyAgICAgICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRTdGF0ZS5m
bG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gbGFzdEZsb2F0
SXRlcmF0b3IgPSBmbG9hdGluZ09iamVjdFNldC5maW5kKGxhc3RGbG9hdCk7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKGxhc3RGbG9hdEl0ZXJhdG9yICE9IGVuZCk7CisgICAgICAgICAgICAgICAg
KytsYXN0RmxvYXRJdGVyYXRvcjsKKyAgICAgICAgICAgICAgICBpdCA9IGxhc3RGbG9hdEl0ZXJh
dG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0OworICAgICAgICAg
ICAgICAgIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSgqZmxvYXRpbmdPYmplY3QpOwor
ICAgICAgICAgICAgICAgIC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hhbmdlZCwgZ2l2
ZSB1cCBvbiBzeW5jaW5nIHdpdGggY2xlYW4gbGluZXMuCisgICAgICAgICAgICAgICAgYXV0byog
ZmxvYXRXaXRoUmVjdCA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmZsb2F0V2l0aFJlY3QoZmxv
YXRpbmdPYmplY3QtPnJlbmRlcmVyKCkpOworICAgICAgICAgICAgICAgIGlmICghZmxvYXRXaXRo
UmVjdCB8fCBmbG9hdFdpdGhSZWN0LT5yZWN0KCkgIT0gZmxvYXRpbmdPYmplY3QtPmZyYW1lUmVj
dCgpKQorICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGZhbHNlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuc2V0TGFz
dEZsb2F0KCFmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5KCkgPyBmbG9hdGluZ09iamVjdFNldC5s
YXN0KCkuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmVXaGl0ZXNw
YWNlQ29sbGFwc2luZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9u
KGVuZCwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGVuZCkpOworICAgIH0KKworICAgIC8vIElu
IGNhc2Ugd2UgYWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMg
bGF5b3V0IHRvIGF2b2lkIHdpZG93cworICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhl
IHBvc3NpYmlsaXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgorICAgIC8vIE90
aGVyd2lzZSwgd2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5z
dCB0aGUgYmxvY2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgorICAgIGlmIChwYWdpbmF0ZWQg
JiYgIXN0eWxlKCkuaGFzQXV0b1dpZG93cygpICYmICFkaWRCcmVha0F0TGluZVRvQXZvaWRXaWRv
dygpKSB7CisgICAgICAgIC8vIENoZWNrIHRoZSBsaW5lIGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBk
aWRuJ3QgY3JlYXRlIHVuYWNjZXB0YWJsZSB3aWRvd3MuCisgICAgICAgIC8vIEhvd2V2ZXIsIHdl
J2xsIHByaW9yaXRpemUgb3JwaGFucyAtIHNvIG5vdGhpbmcgd2UgZG8gaGVyZSBzaG91bGQgY3Jl
YXRlCisgICAgICAgIC8vIGEgbmV3IG9ycGhhbi4KKworICAgICAgICBSb290SW5saW5lQm94KiBs
aW5lQm94ID0gbGFzdFJvb3RCb3goKTsKKworICAgICAgICAvLyBDb3VudCBmcm9tIHRoZSBlbmQg
b2YgdGhlIGJsb2NrIGJhY2t3YXJkcywgdG8gc2VlIGhvdyBtYW55IGhhbmdpbmcKKyAgICAgICAg
Ly8gbGluZXMgd2UgaGF2ZS4KKyAgICAgICAgUm9vdElubGluZUJveCogZmlyc3RMaW5lSW5CbG9j
ayA9IGZpcnN0Um9vdEJveCgpOworICAgICAgICBpbnQgbnVtTGluZXNIYW5naW5nID0gMTsKKyAg
ICAgICAgd2hpbGUgKGxpbmVCb3ggJiYgbGluZUJveCAhPSBmaXJzdExpbmVJbkJsb2NrICYmICFs
aW5lQm94LT5pc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsoKSkgeworICAgICAgICAgICAgKytudW1MaW5l
c0hhbmdpbmc7CisgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gYnJlYWtzIGluIHRoZSBi
bG9jaywgd2UgZGlkbid0IGNyZWF0ZSBhbnkgd2lkb3dzLgorICAgICAgICBpZiAoIWxpbmVCb3gg
fHwgIWxpbmVCb3gtPmlzRmlyc3RBZnRlclBhZ2VCcmVhaygpIHx8IGxpbmVCb3ggPT0gZmlyc3RM
aW5lSW5CbG9jaykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobnVtTGluZXNI
YW5naW5nIDwgc3R5bGUoKS53aWRvd3MoKSkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBkZXRl
Y3RlZCBhIHdpZG93LiBOb3cgd2UgbmVlZCB0byB3b3JrIG91dCBob3cgbWFueQorICAgICAgICAg
ICAgLy8gbGluZXMgdGhlcmUgYXJlIG9uIHRoZSBwcmV2aW91cyBwYWdlLCBhbmQgaG93IG1hbnkg
d2UgbmVlZAorICAgICAgICAgICAgLy8gdG8gc3RlYWwuCisgICAgICAgICAgICBpbnQgbnVtTGlu
ZXNOZWVkZWQgPSBzdHlsZSgpLndpZG93cygpIC0gbnVtTGluZXNIYW5naW5nOworICAgICAgICAg
ICAgUm9vdElubGluZUJveCogY3VycmVudEZpcnN0TGluZU9mTmV3UGFnZSA9IGxpbmVCb3g7CisK
KyAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHByZXZpb3Vz
IHBhZ2UuCisgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKKyAg
ICAgICAgICAgIGludCBudW1MaW5lc0luUHJldmlvdXNQYWdlID0gMTsKKyAgICAgICAgICAgIHdo
aWxlIChsaW5lQm94ICYmIGxpbmVCb3ggIT0gZmlyc3RMaW5lSW5CbG9jayAmJiAhbGluZUJveC0+
aXNGaXJzdEFmdGVyUGFnZUJyZWFrKCkpIHsKKyAgICAgICAgICAgICAgICArK251bUxpbmVzSW5Q
cmV2aW91c1BhZ2U7CisgICAgICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gtPnByZXZSb290
Qm94KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBl
eHBsaWNpdCB2YWx1ZSBmb3Igb3JwaGFucywgcmVzcGVjdCB0aGF0LiBJZiBub3QsIHdlIHN0aWxs
CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdlIG1h
a2UgYW4gb3JwaGFuIGJpZ2dlciB0aGFuIHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAgICAgICAg
Ly8gVGhpcyBtZWFucyB0aGF0IHNldHRpbmcgd2lkb3dzIGltcGxpZXMgd2UgYWxzbyBjYXJlIGFi
b3V0IG9ycGhhbnMsIGJ1dCBnaXZlbgorICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmljYXRpb24g
c2F5cyB0aGUgaW5pdGlhbCBvcnBoYW4gdmFsdWUgaXMgbm9uLXplcm8sIHRoaXMgaXMgb2suIFRo
ZQorICAgICAgICAgICAgLy8gYXV0aG9yIGlzIGFsd2F5cyBmcmVlIHRvIHNldCBvcnBoYW5zIGV4
cGxpY2l0bHkgYXMgd2VsbC4KKyAgICAgICAgICAgIGludCBvcnBoYW5zID0gc3R5bGUoKS5oYXNB
dXRvT3JwaGFucygpID8gc3R5bGUoKS5pbml0aWFsT3JwaGFucygpIDogc3R5bGUoKS5vcnBoYW5z
KCk7CisgICAgICAgICAgICBpbnQgbnVtTGluZXNBdmFpbGFibGUgPSBudW1MaW5lc0luUHJldmlv
dXNQYWdlIC0gb3JwaGFuczsKKyAgICAgICAgICAgIGlmIChudW1MaW5lc0F2YWlsYWJsZSA8PSAw
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IG51bUxpbmVzVG9U
YWtlID0gc3RkOjptaW4obnVtTGluZXNBdmFpbGFibGUsIG51bUxpbmVzTmVlZGVkKTsKKyAgICAg
ICAgICAgIC8vIFdpbmQgYmFjayBmcm9tIG91ciBmaXJzdCB3aWRvd2VkIGxpbmUuCisgICAgICAg
ICAgICBsaW5lQm94ID0gY3VycmVudEZpcnN0TGluZU9mTmV3UGFnZTsKKyAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgbnVtTGluZXNUb1Rha2U7ICsraSkKKyAgICAgICAgICAgICAgICBs
aW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKKworICAgICAgICAgICAgLy8gV2Ugbm93
IHdhbnQgdG8gYnJlYWsgYXQgdGhpcyBsaW5lLiBSZW1lbWJlciBmb3IgbmV4dCBsYXlvdXQgYW5k
IHRyaWdnZXIgcmVsYXlvdXQuCisgICAgICAgICAgICBzZXRCcmVha0F0TGluZVRvQXZvaWRXaWRv
dyhsaW5lQ291bnQobGluZUJveCkpOworICAgICAgICAgICAgbWFya0xpbmVzRGlydHlJbkJsb2Nr
UmFuZ2UobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gtPmxp
bmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBj
bGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjpyZWF0dGFjaENsZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIExh
eW91dFVuaXQgZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFuTGluZSkKK3sKKyAgICBhdXRvKiBjbGVh
bkxpbmVGbG9hdHMgPSBjbGVhbkxpbmUuZmxvYXRzUHRyKCk7CisgICAgaWYgKCFjbGVhbkxpbmVG
bG9hdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAq
Y2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgIGlmICghZmxvYXRpbmdCb3gpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGlu
Z09iamVjdCgqZmxvYXRpbmdCb3gpOworICAgICAgICBpZiAoaXNGaXJzdENsZWFuTGluZSAmJiBm
bG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpIHsKKyAgICAgICAgICAgIC8vIEZsb2F0
IGJveCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaW5lIGFueW1vcmUuCisgICAgICAgICAgICBB
U1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihjbGVhbkxpbmUucHJldlJvb3RCb3goKSA9
PSBmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOworICAgICAgICAgICAgY2xlYW5M
aW5lLnJlbW92ZUZsb2F0KCpmbG9hdGluZ0JveCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRp
bmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKKyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNl
dE9yaWdpbmF0aW5nTGluZShjbGVhbkxpbmUpOworICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxv
Z2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZs
b2F0aW5nQm94KSArIGRlbHRhKTsKKyAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKKyAgICB9
Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK3sKKyAgICBhdXRvKiBmaXJzdENsZWFuTGluZSA9IGxh
eW91dFN0YXRlLmVuZExpbmUoKTsKKyAgICBpZiAoZmlyc3RDbGVhbkxpbmUpIHsKKyAgICAgICAg
aWYgKGxheW91dFN0YXRlLmVuZExpbmVNYXRjaGVkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgcGFn
aW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgp
ICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQ
YWdpbmF0ZWQoKTsKKyAgICAgICAgICAgIC8vIEF0dGFjaCBhbGwgdGhlIHJlbWFpbmluZyBsaW5l
cywgYW5kIHRoZW4gYWRqdXN0IHRoZWlyIHktcG9zaXRpb25zIGFzIG5lZWRlZC4KKyAgICAgICAg
ICAgIExheW91dFVuaXQgZGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRM
aW5lTG9naWNhbFRvcCgpOworICAgICAgICAgICAgZm9yIChhdXRvKiBsaW5lID0gZmlyc3RDbGVh
bkxpbmU7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICAg
ICAgbGluZS0+YXR0YWNoTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgZGVsdGEgLT0gbGluZS0+cGFnaW5hdGlvblN0cnV0KCk7Cisg
ICAgICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7CisgICAgICAgICAgICAg
ICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZSwgZGVsdGEsIG92ZXJm
bG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7CisgICAgICAgICAgICAgICAgICAg
IGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZSwgZGVsdGEpOworICAg
ICAgICAgICAgICAgICAgICBsaW5lLT5hZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9uKGRlbHRh
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZy
YWdtZW50ZWRGbG93KCkpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGlu
ZShsaW5lKTsKKyAgICAgICAgICAgICAgICByZWF0dGFjaENsZWFuTGluZUZsb2F0cygqbGluZSwg
ZGVsdGEsIGxpbmUgPT0gZmlyc3RDbGVhbkxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgc2V0TG9naWNhbEhlaWdodChsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmco
KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSByZW1h
aW5pbmcgbGluZXMuCisgICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0U3RhdGUsIGxh
eW91dFN0YXRlLmVuZExpbmUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKG1f
ZmxvYXRpbmdPYmplY3RzICYmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zyb21MYXN0TGlu
ZSgpIHx8IHBvc2l0aW9uTmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsKKyAgICAgICAg
Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgZmxvYXQgb24gdGhlIGxhc3QgbGluZSwgaXQgbWlnaHQgbm90
IGJlIHBvc2l0aW9uZWQgdXAgdG8gbm93LgorICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25l
IGJlZm9yZSBhZGRpbmcgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0
IHdpbGwKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFkZGluZyBpbmNvcnJlY3RseS4gLWR3aAor
ICAgICAgICBpZiAobGF5b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUoKSkgewor
ICAgICAgICAgICAgTGF5b3V0VW5pdCBib3R0b21WaXN1YWxPdmVyZmxvdyA9IGxhc3RSb290Qm94
KCktPmxvZ2ljYWxCb3R0b21WaXN1YWxPdmVyZmxvdygpOworICAgICAgICAgICAgTGF5b3V0VW5p
dCBib3R0b21MYXlvdXRPdmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmxvZ2ljYWxCb3R0b21MYXlv
dXRPdmVyZmxvdygpOworICAgICAgICAgICAgYXV0byBuZXdMaW5lQm94ID0gc3RkOjptYWtlX3Vu
aXF1ZTxUcmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3g+KCp0aGlzKTsKKyAgICAgICAgICAgIGF1
dG8gdHJhaWxpbmdGbG9hdHNMaW5lQm94ID0gbmV3TGluZUJveC5nZXQoKTsKKyAgICAgICAgICAg
IG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdMaW5lQm94KSk7CisgICAgICAg
ICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldENvbnN0cnVjdGVkKCk7CisgICAgICAgICAg
ICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94RGF0YU1hcDsKKyAgICAg
ICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CisgICAg
ICAgICAgICBMYXlvdXRVbml0IGJsb2NrTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsK
KyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJl
Y3Rpb24oYmxvY2tMb2dpY2FsSGVpZ2h0LCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlv
bkNhY2hlKTsKKyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0TGluZVRvcEJv
dHRvbVBvc2l0aW9ucyhibG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCwgYmxv
Y2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgdHJhaWxp
bmdGbG9hdHNMaW5lQm94LT5zZXRQYWdpbmF0ZWRMaW5lV2lkdGgoYXZhaWxhYmxlTG9naWNhbFdp
ZHRoRm9yQ29udGVudChibG9ja0xvZ2ljYWxIZWlnaHQpKTsKKyAgICAgICAgICAgIExheW91dFJl
Y3QgbG9naWNhbExheW91dE92ZXJmbG93KDBfbHUsIGJsb2NrTG9naWNhbEhlaWdodCwgMV9sdSwg
Ym90dG9tTGF5b3V0T3ZlcmZsb3cgLSBibG9ja0xvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAg
TGF5b3V0UmVjdCBsb2dpY2FsVmlzdWFsT3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2FsSGVpZ2h0
LCAxX2x1LCBib3R0b21WaXN1YWxPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7CisgICAg
ICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0
cyhsb2dpY2FsTGF5b3V0T3ZlcmZsb3csIGxvZ2ljYWxWaXN1YWxPdmVyZmxvdywgdHJhaWxpbmdG
bG9hdHNMaW5lQm94LT5saW5lVG9wKCksIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+bGluZUJvdHRv
bSgpKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQorICAg
ICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZSh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gp
OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5n
T2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgICAgICBhdXRvIGl0ID0g
ZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKKyAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09i
amVjdFNldC5lbmQoKTsKKyAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9hdCA9IGxheW91dFN0YXRl
LmZsb2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7CisgICAgICAgICAgICBhdXRvIGxhc3RGbG9hdEl0
ZXJhdG9yID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZChsYXN0RmxvYXQpOworICAgICAgICAgICAg
QVNTRVJUKGxhc3RGbG9hdEl0ZXJhdG9yICE9IGVuZCk7CisgICAgICAgICAgICArK2xhc3RGbG9h
dEl0ZXJhdG9yOworICAgICAgICAgICAgaXQgPSBsYXN0RmxvYXRJdGVyYXRvcjsKKyAgICAgICAg
fQorICAgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgYXBwZW5kRmxv
YXRpbmdPYmplY3RUb0xhc3RMaW5lKCoqaXQpOworICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExp
c3QoKS5zZXRMYXN0RmxvYXQoIWZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSA/IGZsb2F0aW5n
T2JqZWN0U2V0Lmxhc3QoKS5nZXQoKSA6IG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91
dFVuaXQmIHJlcGFpbnRMb2dpY2FsVG9wLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbEJvdHRv
bSkKK3sKKyAgICBBU1NFUlQoIW1fc2ltcGxlTGluZUxheW91dCk7CisKKyAgICBzZXRMb2dpY2Fs
SGVpZ2h0KGJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKSk7CisgICAgCisgICAgLy8gTGF5IG91dCBv
dXIgaHlwb3RoZXRpY2FsIGdyaWQgbGluZSBhcyB0aG91Z2ggaXQgb2NjdXJzIGF0IHRoZSB0b3Ag
b2YgdGhlIGJsb2NrLgorICAgIGlmICh2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgp
LmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlv
dXRTdGF0ZSgpLT5saW5lR3JpZCgpID09IHRoaXMpCisgICAgICAgIGxheW91dExpbmVHcmlkQm94
KCk7CisKKyAgICBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRlZEZsb3cgPSBlbmNsb3Np
bmdGcmFnbWVudGVkRmxvdygpOworICAgIGJvb2wgY2xlYXJMaW5lc0ZvclBhZ2luYXRpb24gPSBm
aXJzdFJvb3RCb3goKSAmJiBmcmFnbWVudGVkRmxvdyAmJiAhZnJhZ21lbnRlZEZsb3ctPmhhc0Zy
YWdtZW50cygpOworCisgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91
ciBsaW5lIGJveGVzLgorICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCisg
ICAgYm9vbCBpc0Z1bGxMYXlvdXQgPSAhZmlyc3RSb290Qm94KCkgfHwgc2VsZk5lZWRzTGF5b3V0
KCkgfHwgcmVsYXlvdXRDaGlsZHJlbiB8fCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbjsKKyAgICBM
aW5lTGF5b3V0U3RhdGUgbGF5b3V0U3RhdGUoKnRoaXMsIGlzRnVsbExheW91dCwgcmVwYWludExv
Z2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tLCBmcmFnbWVudGVkRmxvdyk7CisKKyAgICBp
ZiAoaXNGdWxsTGF5b3V0KQorICAgICAgICBsaW5lQm94ZXMoKS5kZWxldGVMaW5lQm94ZXMoKTsK
KworICAgIC8vIFRleHQgdHJ1bmNhdGlvbiBraWNrcyBpbiBpbiB0d28gY2FzZXM6CisgICAgLy8g
ICAgIDEpIElmIHlvdXIgb3ZlcmZsb3cgaXNuJ3QgdmlzaWJsZSBhbmQgeW91ciB0ZXh0LW92ZXJm
bG93LW1vZGUgaXNuJ3QgY2xpcC4KKyAgICAvLyAgICAgMikgSWYgeW91J3JlIGFuIGFub255bW91
cyBibG9jayB3aXRoIGEgYmxvY2sgcGFyZW50IHRoYXQgc2F0aXNmaWVzICMxLgorICAgIC8vIEZJ
WE1FOiBDU1MzIHNheXMgdGhhdCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjbGlwcGVkIG11c3QgYWxz
byBrbm93IGhvdyB0byB0cnVuY2F0ZS4gIFRoaXMgaXMgaW5zYW5lbHkKKyAgICAvLyBkaWZmaWN1
bHQgdG8gZmlndXJlIG91dCBpbiBnZW5lcmFsIChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2Yg
ZG9pbmcgbGF5b3V0KSwgc28gd2Ugb25seSBoYW5kbGUgdGhlCisgICAgLy8gc2ltcGxlIGNhc2Ug
b2YgYW4gYW5vbnltb3VzIGJsb2NrIHRydW5jYXRpbmcgd2hlbiBpdCdzIHBhcmVudCBpcyBjbGlw
cGVkLgorICAgIGJvb2wgaGFzVGV4dE92ZXJmbG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkg
PT0gVGV4dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKKyAgICAgICAg
fHwgKGlzQW5vbnltb3VzQmxvY2soKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNSZW5kZXJC
bG9jaygpICYmIHBhcmVudCgpLT5zdHlsZSgpLnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxv
dzo6RWxsaXBzaXMgJiYgcGFyZW50KCktPmhhc092ZXJmbG93Q2xpcCgpKTsKKworICAgIC8vIFdh
bGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRo
ZXkgZXhpc3QuCisgICAgaWYgKGhhc1RleHRPdmVyZmxvdykKKyAgICAgICAgIGRlbGV0ZUVsbGlw
c2lzTGluZUJveGVzKCk7CisKKyAgICBpZiAoZmlyc3RDaGlsZCgpKSB7CisgICAgICAgIC8vIElu
IGZ1bGwgbGF5b3V0IG1vZGUsIGNsZWFyIHRoZSBsaW5lIGJveGVzIG9mIGNoaWxkcmVuIHVwZnJv
bnQuIE90aGVyd2lzZSwKKyAgICAgICAgLy8gc2libGluZ3MgY2FuIHJ1biBpbnRvIHN0YWxlIHJv
b3QgbGluZWJveGVzIGR1cmluZyBsYXlvdXQuIFRoZW4gbGF5b3V0CisgICAgICAgIC8vIHRoZSBy
ZXBsYWNlZCBlbGVtZW50cyBsYXRlci4gSW4gcGFydGlhbCBsYXlvdXQgbW9kZSwgbGluZSBib3hl
cyBhcmUgbm90CisgICAgICAgIC8vIGRlbGV0ZWQgYW5kIG9ubHkgZGlydGllZC4gSW4gdGhhdCBj
YXNlLCB3ZSBjYW4gbGF5b3V0IHRoZSByZXBsYWNlZAorICAgICAgICAvLyBlbGVtZW50cyBhdCB0
aGUgc2FtZSB0aW1lLgorICAgICAgICBib29sIGhhc0lubGluZUNoaWxkID0gZmFsc2U7CisgICAg
ICAgIFZlY3RvcjxSZW5kZXJCb3gqPiByZXBsYWNlZENoaWxkcmVuOworICAgICAgICBmb3IgKElu
bGluZVdhbGtlciB3YWxrZXIoKnRoaXMpOyAhd2Fsa2VyLmF0RW5kKCk7IHdhbGtlci5hZHZhbmNl
KCkpIHsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCYgbyA9ICp3YWxrZXIuY3VycmVudCgpOwor
CisgICAgICAgICAgICBpZiAoIWhhc0lubGluZUNoaWxkICYmIG8uaXNJbmxpbmUoKSkKKyAgICAg
ICAgICAgICAgICBoYXNJbmxpbmVDaGlsZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChvLmlz
UmVwbGFjZWQoKSB8fCBvLmlzRmxvYXRpbmcoKSB8fCBvLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyQm94JiBib3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+
KG8pOworCisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgYm94Lmhhc1Jl
bGF0aXZlRGltZW5zaW9ucygpKQorICAgICAgICAgICAgICAgICAgICBib3guc2V0Q2hpbGROZWVk
c0xheW91dChNYXJrT25seVRoaXMpOworCisgICAgICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRD
aGlsZHJlbiBpcyBzZXQgYW5kIHRoZSBjaGlsZCBoYXMgcGVyY2VudGFnZSBwYWRkaW5nIG9yIGFu
IGVtYmVkZGVkIGNvbnRlbnQgYm94LCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2hp
bGRzIHByZWYgd2lkdGhzLgorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYm
IGJveC5uZWVkc1ByZWZlcnJlZFdpZHRoc1JlY2FsY3VsYXRpb24oKSkKKyAgICAgICAgICAgICAg
ICAgICAgYm94LnNldFByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSh0cnVlLCBNYXJrT25seVRo
aXMpOworCisgICAgICAgICAgICAgICAgaWYgKGJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkK
KyAgICAgICAgICAgICAgICAgICAgYm94LmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlv
bmVkT2JqZWN0KGJveCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYm94LmlzRmxvYXRpbmco
KSkKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuYXBwZW5kKEZs
b2F0V2l0aFJlY3Q6OmNyZWF0ZShib3gpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0Z1
bGxMYXlvdXQgfHwgYm94Lm5lZWRzTGF5b3V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
UmVwbGFjZWQgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCAm
JiBpczxSZW5kZXJSdWJ5UnVuPihib3gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBG
SVhNRTogVGhpcyByZXNldHMgdGhlIG92ZXJoYW5naW5nIG1hcmdpbnMgdGhhdCB3ZSBzZXQgZHVy
aW5nIGxpbmUgbGF5b3V0IChzZWUgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNl
Z21lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgbW9yZSBzdWl0YWJsZSBw
bGFjZSBmb3IgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpblN0YXJ0Rm9y
Q2hpbGQoYm94LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpbkVuZEZvckNo
aWxkKGJveCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
Ym94LmRpcnR5TGluZUJveGVzKGlzRnVsbExheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGlm
IChpc0Z1bGxMYXlvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVu
LmFwcGVuZCgmYm94KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgYm94LmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfSBlbHNlIGlmIChvLmlzVGV4dE9yTGluZUJyZWFrKCkgfHwgKGlzPFJlbmRlcklubGlu
ZT4obykgJiYgIXdhbGtlci5hdEVuZE9mSW5saW5lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYg
KGlzPFJlbmRlcklubGluZT4obykpCisgICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRl
cklubGluZT4obykudXBkYXRlQWx3YXlzQ3JlYXRlTGluZUJveGVzKGxheW91dFN0YXRlLmlzRnVs
bExheW91dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0
KCkgfHwgby5zZWxmTmVlZHNMYXlvdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgZGlydHlMaW5l
Qm94ZXNGb3JSZW5kZXJlcihvLCBsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSk7CisgICAgICAg
ICAgICAgICAgby5jbGVhck5lZWRzTGF5b3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcGxhY2VkQ2hpbGRyZW4uc2l6ZSgp
OyBpKyspCisgICAgICAgICAgICAgcmVwbGFjZWRDaGlsZHJlbltpXS0+bGF5b3V0SWZOZWVkZWQo
KTsKKworICAgICAgICBsYXlvdXRSdW5zQW5kRmxvYXRzKGxheW91dFN0YXRlLCBoYXNJbmxpbmVD
aGlsZCk7CisgICAgfQorCisgICAgLy8gRXhwYW5kIHRoZSBsYXN0IGxpbmUgdG8gYWNjb21tb2Rh
dGUgUnVieSBhbmQgZW1waGFzaXMgbWFya3MuCisgICAgaW50IGxhc3RMaW5lQW5ub3RhdGlvbnNB
ZGp1c3RtZW50ID0gMDsKKyAgICBpZiAobGFzdFJvb3RCb3goKSkgeworICAgICAgICBMYXlvdXRV
bml0IGxvd2VzdEFsbG93ZWRQb3NpdGlvbiA9IHN0ZDo6bWF4KGxhc3RSb290Qm94KCktPmxpbmVC
b3R0b20oKSwgbG9naWNhbEhlaWdodCgpICsgcGFkZGluZ0FmdGVyKCkpOworICAgICAgICBpZiAo
IXN0eWxlKCkuaXNGbGlwcGVkTGluZXNXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgbGFzdExp
bmVBbm5vdGF0aW9uc0FkanVzdG1lbnQgPSBsYXN0Um9vdEJveCgpLT5jb21wdXRlVW5kZXJBbm5v
dGF0aW9uQWRqdXN0bWVudChsb3dlc3RBbGxvd2VkUG9zaXRpb24pOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVudCA9IGxhc3RSb290Qm94KCkt
PmNvbXB1dGVPdmVyQW5ub3RhdGlvbkFkanVzdG1lbnQobG93ZXN0QWxsb3dlZFBvc2l0aW9uKTsK
KyAgICB9CisgICAgCisgICAgLy8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9m
IHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAg
Ly8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3Jt
YXRpb24uIFRoaXMgY29sbGFwc2UgaXMgb25seSBuZWNlc3NhcnkKKyAgICAvLyBpZiBvdXIgbGFz
dCBjaGlsZCB3YXMgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayB0aGF0IG1pZ2h0IG5lZWQgdG8g
cHJvcGFnYXRlIG1hcmdpbiBpbmZvcm1hdGlvbiBvdXQgdG8KKyAgICAvLyB1cy4KKyAgICBMYXlv
dXRVbml0IGFmdGVyRWRnZSA9IGJvcmRlckFuZFBhZGRpbmdBZnRlcigpICsgc2Nyb2xsYmFyTG9n
aWNhbEhlaWdodCgpICsgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQ7CisgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBhZnRlckVkZ2UpOworCisgICAgaWYgKCFmaXJz
dFJvb3RCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQorICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0
KGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVIZWlnaHQodHJ1ZSwgaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JM
aW5lQm94ZXMpKTsKKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNwaWxs
IG91dCBvZiBvdXIgYmxvY2suICBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQg
dG8KKyAgICAvLyB0cnVuY2F0ZSB0ZXh0LgorICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCisgICAg
ICAgIGNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmNoZWNrRmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRl
ckJveCYgZmxvYXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdp
dGhSZWN0LAorICAgIGJvb2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZs
b2F0KQoreworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdEJveE9u
Q2xlYW5MaW5lLnN0eWxlKCkuZGVsZXRpb25IYXNCZWd1bigpKTsKKyAgICBpZiAoJm1hdGNoaW5n
RmxvYXRXaXRoUmVjdC5yZW5kZXJlcigpICE9ICZmbG9hdEJveE9uQ2xlYW5MaW5lKSB7CisgICAg
ICAgIGVuY291bnRlcmVkTmV3RmxvYXQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGZsb2F0Qm94T25DbGVhbkxpbmUubGF5b3V0SWZOZWVkZWQoKTsKKyAgICBMYXlvdXRSZWN0
IG9yaWdpbmFsRmxvYXRSZWN0ID0gbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LnJlY3QoKTsKKyAgICBM
YXlvdXRTaXplIG5ld1NpemUoCisgICAgICAgIGZsb2F0Qm94T25DbGVhbkxpbmUud2lkdGgoKSAr
IGZsb2F0Qm94T25DbGVhbkxpbmUuaG9yaXpvbnRhbE1hcmdpbkV4dGVudCgpLAorICAgICAgICBm
bG9hdEJveE9uQ2xlYW5MaW5lLmhlaWdodCgpICsgZmxvYXRCb3hPbkNsZWFuTGluZS52ZXJ0aWNh
bE1hcmdpbkV4dGVudCgpKTsKKyAgICAKKyAgICAvLyBXZSBoYXZlIHRvIHJlc2V0IHRoZSBjYXAt
aGVpZ2h0IGFsaWdubWVudCBkb25lIGJ5IHRoZSBmaXJzdC1sZXR0ZXIgZmxvYXRzIHdoZW4gaW5p
dGlhbC1sZXR0ZXIgaXMgc2V0LCBzbyBqdXN0IGFsd2F5cyB0cmVhdCBmaXJzdC1sZXR0ZXIgZmxv
YXRzIGFzIGRpcnR5LgorICAgIGlmIChvcmlnaW5hbEZsb2F0UmVjdC5zaXplKCkgPT0gbmV3U2l6
ZSAmJiAoZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLnN0eWxlVHlwZSgpICE9IFBzZXVkb0lk
OjpGaXJzdExldHRlciB8fCAhZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLmluaXRpYWxMZXR0
ZXJEcm9wKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBMYXlvdXRVbml0IGZsb2F0VG9wID0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IG9yaWdpbmFsRmxvYXRSZWN0LnkoKSA6IG9yaWdp
bmFsRmxvYXRSZWN0LngoKTsKKyAgICBMYXlvdXRVbml0IGZsb2F0SGVpZ2h0ID0gaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSA/IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBu
ZXdTaXplLmhlaWdodCgpKQorICAgICAgICA6IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0Lndp
ZHRoKCksIG5ld1NpemUud2lkdGgoKSk7CisgICAgZmxvYXRIZWlnaHQgPSBzdGQ6Om1pbihmbG9h
dEhlaWdodCwgTGF5b3V0VW5pdDo6bWF4KCkgLSBmbG9hdFRvcCk7CisgICAgY2xlYW5MaW5lLm1h
cmtEaXJ0eSgpOworICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5l
Qm90dG9tV2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7
CisgICAgTGF5b3V0UmVjdCBuZXdGbG9hdFJlY3QgPSBvcmlnaW5hbEZsb2F0UmVjdDsKKyAgICBu
ZXdGbG9hdFJlY3Quc2V0U2l6ZShuZXdTaXplKTsKKyAgICBtYXRjaGluZ0Zsb2F0V2l0aFJlY3Qu
YWRqdXN0UmVjdChuZXdGbG9hdFJlY3QpOworICAgIGRpcnRpZWRCeUZsb2F0ID0gdHJ1ZTsKK30K
KworUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9u
KExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIpCit7CisgICAgUm9vdElubGluZUJveCogY3VycmVudExpbmUgPSBudWxscHRyOworICAgIFJv
b3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FOiBUaGlzIGVu
dGlyZSBmbG9hdC1jaGVja2luZyBibG9jayBuZWVkcyB0byBiZSBicm9rZW4gaW50byBhIG5ldyBm
dW5jdGlvbi4KKyAgICBhdXRvJiBmbG9hdHMgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKTsKKyAg
ICBib29sIGRpcnRpZWRCeUZsb2F0ID0gZmFsc2U7CisgICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1
bGxMYXlvdXQoKSkgeworICAgICAgICAvLyBQYWdpbmF0ZSBhbGwgb2YgdGhlIGNsZWFuIGxpbmVz
LgorICAgICAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250
ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgp
LmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7CisgICAgICAgIExheW91dFVuaXQgcGFnaW5h
dGlvbkRlbHRhOworICAgICAgICBhdXRvIGZsb2F0c0l0ZXJhdG9yID0gZmxvYXRzLmJlZ2luKCk7
CisgICAgICAgIGF1dG8gZW5kID0gZmxvYXRzLmVuZCgpOworICAgICAgICBmb3IgKGN1cnJlbnRM
aW5lID0gZmlyc3RSb290Qm94KCk7IGN1cnJlbnRMaW5lICYmICFjdXJyZW50TGluZS0+aXNEaXJ0
eSgpOyBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
ICAgICBpZiAocGFnaW5hdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aEZvclBh
Z2luYXRlZExpbmVDaGFuZ2VkKGN1cnJlbnRMaW5lLCAwLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVk
RmxvdygpKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZS0+bWFya0RpcnR5KCk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBwYWdpbmF0aW9uRGVsdGEgLT0gY3VycmVudExpbmUtPnBhZ2luYXRpb25TdHJ1dCgp
OworICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7CisgICAgICAgICAgICAg
ICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyZW50TGluZSwgcGFnaW5hdGlv
bkRlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7
CisgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb25EZWx0YSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAoY29udGFpbnNGbG9hdHMoKSB8fCAhZmxvYXRzLmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IERvIGJldHRlciBldmVudHVhbGx5LiAgRm9yIG5v
dyBpZiB3ZSBldmVyIHNoaWZ0IGJlY2F1c2Ugb2YgcGFnaW5hdGlvbiBhbmQgZmxvYXRzIGFyZSBw
cmVzZW50IGp1c3QgZ28gdG8gYSBmdWxsIGxheW91dC4KKyAgICAgICAgICAgICAgICAgICAgICAg
IGxheW91dFN0YXRlLm1hcmtGb3JGdWxsTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxh
eW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3goY3VycmVudExpbmUsIHBhZ2luYXRp
b25EZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLT5hZGp1c3RCbG9ja0Rp
cmVjdGlvblBvc2l0aW9uKHBhZ2luYXRpb25EZWx0YSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQorICAgICAgICAg
ICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUoY3VycmVudExpbmUpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gY3VycmVudExp
bmUtPmZsb2F0c1B0cigpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgYSBuZXcgZmxvYXQgaGFz
IGJlZW4gaW5zZXJ0ZWQgYmVmb3JlIHRoaXMgbGluZSBvciBiZWZvcmUgaXRzIGxhc3Qga25vd24g
ZmxvYXQsIGp1c3QgZG8gYSBmdWxsIGxheW91dC4KKyAgICAgICAgICAgICAgICBib29sIGVuY291
bnRlcmVkTmV3RmxvYXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0
Qm94T25DbGVhbkxpbmUgOiAqY2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgICAgICAgICAgICAg
IEFTU0VSVChmbG9hdHNJdGVyYXRvciAhPSBlbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWZsb2F0Qm94T25DbGVhbkxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGluZSwg
KmZsb2F0Qm94T25DbGVhbkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdGbG9h
dCwgZGlydGllZEJ5RmxvYXQpOworICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJhdG9y
OworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVuY291
bnRlcmVkTmV3RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLm1h
cmtGb3JGdWxsTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAo
ZGlydGllZEJ5RmxvYXQgfHwgZW5jb3VudGVyZWROZXdGbG9hdCkKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYg
YSBuZXcgZmxvYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gZmxvYXQu
CisgICAgICAgIGlmIChmbG9hdHNJdGVyYXRvciAhPSBlbmQpIHsKKyAgICAgICAgICAgIGlmICgh
Y3VycmVudExpbmUpCisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlv
dXQoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoOyBmbG9hdHNJ
dGVyYXRvciAhPSBlbmQ7ICsrZmxvYXRzSXRlcmF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAg
YXV0byYgZmxvYXRXaXRoUmVjdCA9ICpmbG9hdHNJdGVyYXRvcjsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCFmbG9hdFdpdGhSZWN0LT5yZW5kZXJlcigpLm5lZWRzTGF5b3V0KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3Rh
dGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYg
KGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKSB7CisgICAgICAgIG1fbGluZUJveGVzLmRlbGV0
ZUxpbmVCb3hUcmVlKCk7CisgICAgICAgIGN1cnJlbnRMaW5lID0gbnVsbHB0cjsKKyAgICAgICAg
QVNTRVJUKCFmaXJzdFJvb3RCb3goKSAmJiAhbGFzdFJvb3RCb3goKSk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgZGly
dHkgbGluZS4KKyAgICAgICAgICAgIGlmIChSb290SW5saW5lQm94KiBwcmV2Um9vdEJveCA9IGN1
cnJlbnRMaW5lLT5wcmV2Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBh
IHByZXZpb3VzIGxpbmUuCisgICAgICAgICAgICAgICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAo
IXByZXZSb290Qm94LT5lbmRzV2l0aEJyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXBy
ZXZSb290Qm94LT5saW5lQnJlYWtPYmooKQorICAgICAgICAgICAgICAgICAgICB8fCAoaXM8UmVu
ZGVyVGV4dD4oKnByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSkKKyAgICAgICAgICAgICAgICAg
ICAgJiYgcHJldlJvb3RCb3gtPmxpbmVCcmVha1BvcygpID49IGRvd25jYXN0PFJlbmRlclRleHQ+
KCpwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkpLnRleHQoKS5sZW5ndGgoKSkpKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBsaW5lIGRpZG4ndCBicmVhayBjbGVhbmx5
IG9yIGJyb2tlIGF0IGEgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBi
ZWVuIGRlbGV0ZWQsIHNvIHRyZWF0IGl0IGFzIGRpcnR5IHRvby4KKyAgICAgICAgICAgICAgICAg
ICAgY3VycmVudExpbmUgPSBwcmV2Um9vdEJveDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBkaXJ0eSBsaW5lcywg
dGhlbiBsYXN0IGlzIGp1c3QgdGhlIGxhc3Qgcm9vdCBib3guCisgICAgICAgIGxhc3RMaW5lID0g
Y3VycmVudExpbmUgPyBjdXJyZW50TGluZS0+cHJldlJvb3RCb3goKSA6IGxhc3RSb290Qm94KCk7
CisgICAgfQorCisgICAgaWYgKCFmbG9hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIExheW91dFVu
aXQgc2F2ZWRMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICAvLyBSZXN0
b3JlIGZsb2F0cyBmcm9tIGNsZWFuIGxpbmVzLgorICAgICAgICBSb290SW5saW5lQm94KiBsaW5l
ID0gZmlyc3RSb290Qm94KCk7CisgICAgICAgIHdoaWxlIChsaW5lICE9IGN1cnJlbnRMaW5lKSB7
CisgICAgICAgICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRy
KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFuTGlu
ZUZsb2F0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQorICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGF1dG8qIGZs
b2F0aW5nT2JqZWN0ID0gaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKKyAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIWZsb2F0aW5n
T2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5n
T2JqZWN0LT5zZXRPcmlnaW5hdGluZ0xpbmUoKmxpbmUpOworICAgICAgICAgICAgICAgICAgICBz
ZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdCb3gpIC0gbWFyZ2lu
QmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0
aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0cy5zZXRMYXN0Q2xlYW5G
bG9hdCgqZmxvYXRpbmdCb3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpOworICAgICAgICB9CisgICAgICAg
IHNldExvZ2ljYWxIZWlnaHQoc2F2ZWRMb2dpY2FsSGVpZ2h0KTsKKyAgICB9CisKKyAgICBsYXlv
dXRTdGF0ZS5saW5lSW5mbygpLnNldEZpcnN0TGluZSghbGFzdExpbmUpOworICAgIGxheW91dFN0
YXRlLmxpbmVJbmZvKCkuc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCFsYXN0TGluZSB8fCBs
YXN0TGluZS0+ZW5kc1dpdGhCcmVhaygpKTsKKworICAgIGlmIChsYXN0TGluZSkgeworICAgICAg
ICBzZXRMb2dpY2FsSGVpZ2h0KGxhc3RMaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Cisg
ICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVyYXRvcih0aGlzLCBsYXN0TGlu
ZS0+bGluZUJyZWFrT2JqKCksIGxhc3RMaW5lLT5saW5lQnJlYWtQb3MoKSk7CisgICAgICAgIHJl
c29sdmVyLnNldFBvc2l0aW9uKGl0ZXIsIG51bWJlck9mSXNvbGF0ZUFuY2VzdG9ycyhpdGVyKSk7
CisgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhsYXN0TGluZS0+bGluZUJyZWFrQmlkaVN0YXR1
cygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0
eWxlKCkuZGlyZWN0aW9uKCk7CisgICAgICAgIGlmIChzdHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0g
UGxhaW50ZXh0KQorICAgICAgICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGlyZWN0aW9u
LCBJbmxpbmVJdGVyYXRvcih0aGlzLCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcygqdGhp
cyksIDApKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0U3RhdHVzKEJpZGlTdGF0dXMoZGlyZWN0aW9u
LCBpc092ZXJyaWRlKHN0eWxlKCkudW5pY29kZUJpZGkoKSkpKTsKKyAgICAgICAgSW5saW5lSXRl
cmF0b3IgaXRlciA9IElubGluZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJ
bmxpbmVzKCp0aGlzLCAmcmVzb2x2ZXIpLCAwKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRp
b24oaXRlciwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGl0ZXIpKTsKKyAgICB9CisgICAgcmV0
dXJuIGN1cnJlbnRMaW5lOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5k
UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3Rh
cnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFu
TGluZUJpZGlTdGF0dXMpCit7CisgICAgYXV0byBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9hdCA9
IFtdKExpbmVMYXlvdXRTdGF0ZTo6RmxvYXRMaXN0JiBmbG9hdHMpIHsKKyAgICAgICAgYXV0byBs
YXN0Q2xlYW5GbG9hdCA9IGZsb2F0cy5sYXN0Q2xlYW5GbG9hdCgpOworICAgICAgICBpZiAoIWxh
c3RDbGVhbkZsb2F0KQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0cy5iZWdpbigpOworICAgICAg
ICBhdXRvKiBsYXN0Q2xlYW5GbG9hdFdpdGhSZWN0ID0gZmxvYXRzLmZsb2F0V2l0aFJlY3QoKmxh
c3RDbGVhbkZsb2F0KTsKKyAgICAgICAgQVNTRVJUKGxhc3RDbGVhbkZsb2F0V2l0aFJlY3QpOwor
ICAgICAgICByZXR1cm4gKytmbG9hdHMuZmluZCgqbGFzdENsZWFuRmxvYXRXaXRoUmVjdCk7Cisg
ICAgfTsKKworICAgIEFTU0VSVCghbGF5b3V0U3RhdGUuZW5kTGluZSgpKTsKKyAgICBhdXRvIGZs
b2F0c0l0ZXJhdG9yID0gaXRlcmF0b3JGb3JGaXJzdERpcnR5RmxvYXQobGF5b3V0U3RhdGUuZmxv
YXRMaXN0KCkpOworICAgIGF1dG8gZW5kID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuZW5kKCk7
CisgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBudWxscHRyOworICAgIGZvciAoUm9vdElu
bGluZUJveCogY3VycmVudExpbmUgPSBzdGFydExpbmUtPm5leHRSb290Qm94KCk7IGN1cnJlbnRM
aW5lOyBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
IGlmICghY3VycmVudExpbmUtPmlzRGlydHkoKSkgeworICAgICAgICAgICAgaWYgKGF1dG8qIGNs
ZWFuTGluZUZsb2F0cyA9IGN1cnJlbnRMaW5lLT5mbG9hdHNQdHIoKSkgeworICAgICAgICAgICAg
ICAgIGJvb2wgZW5jb3VudGVyZWROZXdGbG9hdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJv
b2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZs
b2F0Qm94T25DbGVhbkxpbmUgOiAqY2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICghZmxvYXRCb3hPbkNsZWFuTGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZmxvYXRzSXRlcmF0b3IgIT0gZW5k
KTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tGbG9hdEluQ2xlYW5MaW5lKCpjdXJyZW50TGlu
ZSwgKmZsb2F0Qm94T25DbGVhbkxpbmUsICpmbG9hdHNJdGVyYXRvciwgZW5jb3VudGVyZWROZXdG
bG9hdCwgZGlydGllZEJ5RmxvYXQpOworICAgICAgICAgICAgICAgICAgICArK2Zsb2F0c0l0ZXJh
dG9yOworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgPT0gZW5kIHx8IGVu
Y291bnRlcmVkTmV3RmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjdXJy
ZW50TGluZS0+aXNEaXJ0eSgpKQorICAgICAgICAgICAgbGFzdExpbmUgPSBudWxscHRyOworICAg
ICAgICBlbHNlIGlmICghbGFzdExpbmUpCisgICAgICAgICAgICBsYXN0TGluZSA9IGN1cnJlbnRM
aW5lOworICAgIH0KKworICAgIGlmICghbGFzdExpbmUpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIEF0IHRoaXMgcG9pbnQsIHxsYXN0fCBpcyB0aGUgZmlyc3QgbGluZSBpbiBhIHJ1biBvZiBj
bGVhbiBsaW5lcyB0aGF0IGVuZHMgd2l0aCB0aGUgbGFzdCBsaW5lCisgICAgLy8gaW4gdGhlIGJs
b2NrLgorICAgIFJvb3RJbmxpbmVCb3gqIHByZXZpb3VzTGluZSA9IGxhc3RMaW5lLT5wcmV2Um9v
dEJveCgpOworICAgIGNsZWFuTGluZVN0YXJ0ID0gSW5saW5lSXRlcmF0b3IodGhpcywgcHJldmlv
dXNMaW5lLT5saW5lQnJlYWtPYmooKSwgcHJldmlvdXNMaW5lLT5saW5lQnJlYWtQb3MoKSk7Cisg
ICAgY2xlYW5MaW5lQmlkaVN0YXR1cyA9IHByZXZpb3VzTGluZS0+bGluZUJyZWFrQmlkaVN0YXR1
cygpOworICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVMb2dpY2FsVG9wKHByZXZpb3VzTGluZS0+
bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworCisgICAgZm9yIChSb290SW5saW5lQm94KiBsaW5l
ID0gbGFzdExpbmU7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
IC8vIERpc2Nvbm5lY3QgYWxsIGxpbmUgYm94ZXMgZnJvbSB0aGVpciByZW5kZXIgb2JqZWN0cyB3
aGlsZSBwcmVzZXJ2aW5nIHRoZWlyIGNvbm5lY3Rpb25zIHRvIG9uZSBhbm90aGVyLgorICAgICAg
ICBsaW5lLT5leHRyYWN0TGluZSgpOworICAgIH0KKyAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5l
KGxhc3RMaW5lKTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFu
ZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQoreworICAgIExh
eW91dFVuaXQgbGluZURlbHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGlu
ZUxvZ2ljYWxUb3AoKTsKKworICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygp
LmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlv
dXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAgICBpZiAocGFnaW5h
dGVkICYmIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpIHsKKyAgICAgICAgLy8gQ2hlY2sg
YWxsIGxpbmVzIGZyb20gaGVyZSB0byB0aGUgZW5kLCBhbmQgc2VlIGlmIHRoZSBoeXBvdGhldGlj
YWwgbmV3IHBvc2l0aW9uIGZvciB0aGUgbGluZXMgd2lsbCByZXN1bHQKKyAgICAgICAgLy8gaW4g
YSBkaWZmZXJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGguCisgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogbGluZUJveCA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsgbGluZUJveDsgbGluZUJveCA9
IGxpbmVCb3gtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHRoZSByZWFsIG1vdmUgd2UncmUgZ29pbmcg
dG8gZG8sIHNvIGRvbid0IHVwZGF0ZSB0aGUgbGluZSBib3gncyBwYWdpbmF0aW9uCisgICAgICAg
ICAgICAgICAgLy8gc3RydXQgeWV0LgorICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkUGFn
aW5hdGlvblN0cnV0ID0gbGluZUJveC0+cGFnaW5hdGlvblN0cnV0KCk7CisgICAgICAgICAgICAg
ICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVudDsKKyAgICAgICAgICAgICAgICBsaW5lRGVsdGEgLT0g
b2xkUGFnaW5hdGlvblN0cnV0OworICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZv
clBhZ2luYXRpb24obGluZUJveCwgbGluZURlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0
U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0UGFn
aW5hdGlvblN0cnV0KG9sZFBhZ2luYXRpb25TdHJ1dCk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAobGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQobGluZUJveCwgbGluZURl
bHRhLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFsaW5lRGVsdGEgfHwg
IW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAvLyBT
ZWUgaWYgYW55IGZsb2F0cyBlbmQgaW4gdGhlIHJhbmdlIGFsb25nIHdoaWNoIHdlIHdhbnQgdG8g
c2hpZnQgdGhlIGxpbmVzIHZlcnRpY2FsbHkuCisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0g
c3RkOjptaW4obG9naWNhbEhlaWdodCgpLCBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgp
KTsKKworICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgp
OworICAgIHdoaWxlIChSb290SW5saW5lQm94KiBuZXh0TGluZSA9IGxhc3RMaW5lLT5uZXh0Um9v
dEJveCgpKQorICAgICAgICBsYXN0TGluZSA9IG5leHRMaW5lOworCisgICAgTGF5b3V0VW5pdCBs
b2dpY2FsQm90dG9tID0gbGFzdExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpICsgYWJzb2x1
dGVWYWx1ZShsaW5lRGVsdGEpOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0
aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGF1dG8gZW5kID0g
ZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmpl
Y3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGZs
b2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b21Gb3JG
bG9hdChmbG9hdGluZ09iamVjdCkgPj0gbG9naWNhbFRvcCAmJiBsb2dpY2FsQm90dG9tRm9yRmxv
YXQoZmxvYXRpbmdPYmplY3QpIDwgbG9naWNhbEJvdHRvbSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zs
b3c6OmxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqIHJvb3RC
b3gsIExheW91dFVuaXQgbGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRl
ZEZsb3cpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFnbWVudGVkRmxvdykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGN1cnJlbnRGcmFnbWVudCA9
IGZyYWdtZW50QXRCbG9ja09mZnNldChyb290Qm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSArIGxp
bmVEZWx0YSk7CisgICAgLy8gSnVzdCBiYWlsIGlmIHRoZSBmcmFnbWVudCBkaWRuJ3QgY2hhbmdl
LgorICAgIGlmIChyb290Qm94LT5jb250YWluaW5nRnJhZ21lbnQoKSA9PSBjdXJyZW50RnJhZ21l
bnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcm9vdEJveC0+cGFnaW5hdGVk
TGluZVdpZHRoKCkgIT0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yQ29udGVudChjdXJyZW50RnJh
Z21lbnQpOworfQorCitib29sIFJlbmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
ciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYg
ZW5kTGluZVN0YXR1cykKK3sKKyAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5l
U3RhcnQpIHsKKyAgICAgICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjaGVja1BhZ2luYXRp
b25BbmRGbG9hdHNBdEVuZExpbmUobGF5b3V0U3RhdGUpOworICAgIH0KKworICAgIC8vIFRoZSBm
aXJzdCBjbGVhbiBsaW5lIGRvZXNuJ3QgbWF0Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgYSBoYW5kZnVs
IG9mIGZvbGxvd2luZyBsaW5lcyB0byB0cnkKKyAgICAvLyB0byBtYXRjaCBiYWNrIHVwLgorICAg
IHN0YXRpYyBjb25zdCBpbnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3
aWxsaW5nIHRvIG1hdGNoIGFnYWluc3QuCisgICAgUm9vdElubGluZUJveCogb3JpZ2luYWxFbmRM
aW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOworICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBv
cmlnaW5hbEVuZExpbmU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5l
OyBpKyssIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChsaW5lLT5s
aW5lQnJlYWtPYmooKSA9PSByZXNvbHZlci5wb3NpdGlvbigpLnJlbmRlcmVyKCkgJiYgbGluZS0+
bGluZUJyZWFrUG9zKCkgPT0gcmVzb2x2ZXIucG9zaXRpb24oKS5vZmZzZXQoKSkgeworICAgICAg
ICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLgorICAgICAgICAgICAgaWYgKGxpbmUtPmxpbmVCcmVh
a0JpZGlTdGF0dXMoKSAhPSByZXNvbHZlci5zdGF0dXMoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7IC8vIC4uLmJ1dCB0aGUgYmlkaSBzdGF0ZSBkb2Vzbid0IG1hdGNoLgorICAgICAg
ICAgICAgCisgICAgICAgICAgICBib29sIG1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFJv
b3RJbmxpbmVCb3gqIHJlc3VsdCA9IGxpbmUtPm5leHRSb290Qm94KCk7CisgICAgICAgICAgICBs
YXlvdXRTdGF0ZS5zZXRFbmRMaW5lKHJlc3VsdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7
CisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxUb3AobGluZS0+
bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBjaGVj
a1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUobGF5b3V0U3RhdGUpOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAvLyBOb3cgZGVsZXRlIHRoZSBsaW5lcyB0aGF0IHdlIGZhaWxlZCB0
byBzeW5jLgorICAgICAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBvcmlnaW5h
bEVuZExpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZDsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9jazo6Z2Vu
ZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCit7
CisgICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkgPT0gdGhpcyk7CisKKyAgICBJbmxpbmVJ
dGVyYXRvciBpdCh0aGlzLCBpbmxpbmVPYmosIDApOworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQg
cGFzcyBjb3JyZWN0IHZhbHVlIGZvciBXaGl0ZXNwYWNlUG9zaXRpb24uCisgICAgd2hpbGUgKCFp
dC5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXQpKQorICAgICAgICBpdC5pbmNyZW1lbnQo
KTsKKworICAgIHJldHVybiAhaXQuYXRFbmQoKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKK3sKKyAgICBpZiAoYXV0byBsYXlvdXQg
PSBzaW1wbGVMaW5lTGF5b3V0KCkpIHsKKyAgICAgICAgQVNTRVJUKCFoYXNPdmVyZmxvd0NsaXAo
KSk7CisgICAgICAgIFNpbXBsZUxpbmVMYXlvdXQ6OmNvbGxlY3RGbG93T3ZlcmZsb3coKnRoaXMs
ICpsYXlvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExheW91dFVuaXQgZW5kUGFk
ZGluZyA9IGhhc092ZXJmbG93Q2xpcCgpID8gcGFkZGluZ0VuZCgpIDogMF9sdTsKKyAgICAvLyBG
SVhNRTogTmVlZCB0byBmaW5kIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMsIHNpbmNlIHNjcm9sbGJh
cnMgY291bGQgc2hvdyB3aGVuIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KKyAgICBpZiAoaGFzT3Zl
cmZsb3dDbGlwKCkgJiYgIWVuZFBhZGRpbmcgJiYgZWxlbWVudCgpICYmIGVsZW1lbnQoKS0+aXNS
b290RWRpdGFibGVFbGVtZW50KCkgJiYgc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkp
CisgICAgICAgIGVuZFBhZGRpbmcgPSAxOworICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9
IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAg
ICAgICBhZGRMYXlvdXRPdmVyZmxvdyhjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3QoZW5k
UGFkZGluZykpOworICAgICAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogZnJhZ21lbnQgPSBl
bmNsb3NpbmdGcmFnbWVudGVkRmxvdygpID8gY3Vyci0+Y29udGFpbmluZ0ZyYWdtZW50KCkgOiBu
dWxscHRyOworICAgICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICBmcmFnbWVudC0+YWRk
TGF5b3V0T3ZlcmZsb3dGb3JCb3godGhpcywgY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0
KGVuZFBhZGRpbmcpKTsKKyAgICAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSkgeworICAgICAg
ICAgICAgTGF5b3V0UmVjdCBjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCA9IGN1cnItPnZpc3VhbE92
ZXJmbG93UmVjdChjdXJyLT5saW5lVG9wKCksIGN1cnItPmxpbmVCb3R0b20oKSk7CisgICAgICAg
ICAgICBhZGRWaXN1YWxPdmVyZmxvdyhjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7CisgICAgICAg
ICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICAgICAgZnJhZ21lbnQtPmFkZFZpc3VhbE92
ZXJmbG93Rm9yQm94KHRoaXMsIGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVz
KCkKK3sKKyAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7
CisgICAgYm9vbCBsdHIgPSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IEluZGVudFRleHQ7CisgICAgZm9yIChS
b290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5u
ZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChjdXJyLT5oYXNFbGxpcHNpc0JveCgpKSB7Cisg
ICAgICAgICAgICBjdXJyLT5jbGVhclRydW5jYXRpb24oKTsKKworICAgICAgICAgICAgLy8gU2hp
ZnQgdGhlIGxpbmUgYmFjayB3aGVyZSBpdCBiZWxvbmdzIGlmIHdlIGNhbm5vdCBhY2NvbW9kYXRl
IGFuIGVsbGlwc2lzLgorICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSBsb2dpY2FsTGVm
dE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAg
ICAgICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9mZnNldEZv
ckxpbmUoY3Vyci0+bGluZVRvcCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExlZnQ7Cisg
ICAgICAgICAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1cnItPmxvZ2ljYWxXaWR0aCgp
OworICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwg
Y3VyciwgMCwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2Fs
V2lkdGgsIDApOworCisgICAgICAgICAgICBpZiAobHRyKQorICAgICAgICAgICAgICAgIGN1cnIt
PmFkanVzdExvZ2ljYWxQb3NpdGlvbigobG9naWNhbExlZnQgLSBjdXJyLT5sb2dpY2FsTGVmdCgp
KSwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9n
aWNhbFBvc2l0aW9uKC0oY3Vyci0+bG9naWNhbExlZnQoKSAtIGxvZ2ljYWxMZWZ0KSwgMCk7Cisg
ICAgICAgIH0KKyAgICAgICAgc2hvdWxkSW5kZW50VGV4dCA9IERvTm90SW5kZW50VGV4dDsKKyAg
ICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93
KCkKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNpcyB1c2luZyB0
aGUgY3VycmVudCBmb250LgorICAgIC8vIEZJWE1FOiBDU1MzIHNheXMgdGhpcyBpcyBjb25maWd1
cmFibGUsIGFsc28gbmVlZCB0byB1c2UgMHgwMDJFIChGVUxMIFNUT1ApIGlmIGhvcml6b250YWwg
ZWxsaXBzaXMgaXMgIm5vdCByZW5kZXJhYmxlIgorICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250
ID0gc3R5bGUoKS5mb250Q2FzY2FkZSgpOworICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxBdG9t
U3RyaW5nPiBlbGxpcHNpc1N0cigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxKTsKKyAgICBjb25zdCBG
b250Q2FzY2FkZSYgZmlyc3RMaW5lRm9udCA9IGZpcnN0TGluZVN0eWxlKCkuZm9udENhc2NhZGUo
KTsKKyAgICBmbG9hdCBmaXJzdExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53aWR0
aChjb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9udGFsRWxsaXBzaXMsIDEsIGZpcnN0TGluZVN0eWxl
KCkpKTsKKyAgICBmbG9hdCBlbGxpcHNpc1dpZHRoID0gKGZvbnQgPT0gZmlyc3RMaW5lRm9udCkg
PyBmaXJzdExpbmVFbGxpcHNpc1dpZHRoIDogZm9udC53aWR0aChjb25zdHJ1Y3RUZXh0UnVuKCZo
b3Jpem9udGFsRWxsaXBzaXMsIDEsIHN0eWxlKCkpKTsKKworICAgIC8vIEZvciBMVFIgdGV4dCB0
cnVuY2F0aW9uLCB3ZSB3YW50IHRvIGdldCB0aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBi
b3gsIGFuZCB0aGVuIHdlIHdhbnQgdG8gc2VlCisgICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2Yg
YSBsaW5lIGJveCBleGNlZWRzIHRoYXQuICBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBv
ZiB0aGUgcGFkZGluZyBib3ggYW5kCisgICAgLy8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUg
bGluZSBib3ggdG8gc2VlIGlmIGl0IGlzIGxlc3MKKyAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxi
YXIgZm9yIG92ZXJmbG93IGJsb2Nrcywgd2hpY2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRl
bnRXaWR0aCgpIgorICAgIGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCk7CisgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgpLnRleHRBbGlnbigpOwor
ICAgIGJvb2wgZmlyc3RMaW5lID0gdHJ1ZTsKKyAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIg
PSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBmaXJzdExpbmUgPyBJbmRl
bnRUZXh0IDogRG9Ob3RJbmRlbnRUZXh0OworICAgICAgICBMYXlvdXRVbml0IGJsb2NrUmlnaHRF
ZGdlID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZElu
ZGVudFRleHQpOworICAgICAgICBMYXlvdXRVbml0IGJsb2NrTGVmdEVkZ2UgPSBsb2dpY2FsTGVm
dE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAg
ICAgTGF5b3V0VW5pdCBsaW5lQm94RWRnZSB7IGx0ciA/IGN1cnItPngoKSArIGN1cnItPmxvZ2lj
YWxXaWR0aCgpIDogY3Vyci0+eCgpIH07CisgICAgICAgIGlmICgobHRyICYmIGxpbmVCb3hFZGdl
ID4gYmxvY2tSaWdodEVkZ2UpIHx8ICghbHRyICYmIGxpbmVCb3hFZGdlIDwgYmxvY2tMZWZ0RWRn
ZSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbGluZSBzcGlsbHMgb3V0IG9mIG91ciBib3ggaW4g
dGhlIGFwcHJvcHJpYXRlIGRpcmVjdGlvbi4gIE5vdyB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgbGlu
ZQorICAgICAgICAgICAgLy8gY2FuIGJlIHRydW5jYXRlZC4gIEluIG9yZGVyIGZvciB0cnVuY2F0
aW9uIHRvIGJlIHBvc3NpYmxlLCB0aGUgbGluZSBtdXN0IGhhdmUgc3VmZmljaWVudCBzcGFjZSB0
bworICAgICAgICAgICAgLy8gYWNjb21tb2RhdGUgb3VyIHRydW5jYXRpb24gc3RyaW5nLCBhbmQg
bm8gcmVwbGFjZWQgZWxlbWVudHMgKGltYWdlcywgdGFibGVzKSBjYW4gb3ZlcmxhcCB0aGUgZWxs
aXBzaXMKKyAgICAgICAgICAgIC8vIHNwYWNlLgorICAgICAgICAgICAgTGF5b3V0VW5pdCB3aWR0
aCB7IGZpcnN0TGluZSA/IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBlbGxpcHNpc1dpZHRoIH07
CisgICAgICAgICAgICBMYXlvdXRVbml0IGJsb2NrRWRnZSB7IGx0ciA/IGJsb2NrUmlnaHRFZGdl
IDogYmxvY2tMZWZ0RWRnZSB9OworICAgICAgICAgICAgaWYgKGN1cnItPmxpbmVDYW5BY2NvbW1v
ZGF0ZUVsbGlwc2lzKGx0ciwgYmxvY2tFZGdlLCBsaW5lQm94RWRnZSwgd2lkdGgpKSB7CisgICAg
ICAgICAgICAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBjdXJyLT5wbGFjZUVsbGlwc2lz
KGVsbGlwc2lzU3RyLCBsdHIsIGJsb2NrTGVmdEVkZ2UsIGJsb2NrUmlnaHRFZGdlLCB3aWR0aCk7
CisKKyAgICAgICAgICAgICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IDA7IC8vIFdlIGFyZSBvbmx5
IGludGVyZXN0ZWQgaW4gdGhlIGRlbHRhIGZyb20gdGhlIGJhc2UgcG9zaXRpb24uCisgICAgICAg
ICAgICAgICAgZmxvYXQgdHJ1bmNhdGVkV2lkdGggPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JM
aW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgICAgICAgICAgICAg
dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgY3VyciwgbnVsbHB0ciwg
bG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCB0cnVuY2F0ZWRXaWR0aCwgMCk7CisgICAg
ICAgICAgICAgICAgaWYgKGx0cikKKyAgICAgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9n
aWNhbFBvc2l0aW9uKGxvZ2ljYWxMZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbigtKHRydW5jYXRlZFdp
ZHRoIC0gKGxvZ2ljYWxMZWZ0ICsgdG90YWxMb2dpY2FsV2lkdGgpKSwgMCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7CisgICAgfQorfQorCiti
b29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25zdCBGbG9hdGlu
Z09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lLCBMaW5lSW5mbyYgbGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCit7CisgICAgaWYgKCFw
b3NpdGlvbk5ld0Zsb2F0cygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aWR0aC5z
aHJpbmtBdmFpbGFibGVXaWR0aEZvck5ld0Zsb2F0SWZOZWVkZWQobmV3RmxvYXQpOworCisgICAg
Ly8gV2Ugb25seSBjb25uZWN0IGZsb2F0cyB0byBsaW5lcyBmb3IgcGFnaW5hdGlvbiBwdXJwb3Nl
cyBpZiB0aGUgZmxvYXRzIG9jY3VyIGF0IHRoZSBzdGFydCBvZgorICAgIC8vIHRoZSBsaW5lIGFu
ZCB0aGUgcHJldmlvdXMgbGluZSBoYWQgYSBoYXJkIGJyZWFrIChzbyB0aGlzIGxpbmUgaXMgZWl0
aGVyIHRoZSBmaXJzdCBpbiB0aGUgYmxvY2sKKyAgICAvLyBvciBmb2xsb3dzIGEgPGJyPikuCisg
ICAgaWYgKCFuZXdGbG9hdC5wYWdpbmF0aW9uU3RydXQoKSB8fCAhbGluZUluZm8ucHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KCkgfHwgIWxpbmVJbmZvLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQg
PSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgQVNTRVJUKGZsb2F0aW5nT2JqZWN0U2V0
Lmxhc3QoKS5nZXQoKSA9PSAmbmV3RmxvYXQpOworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2lj
YWxUb3AgPSBsb2dpY2FsVG9wRm9yRmxvYXQobmV3RmxvYXQpOworICAgIExheW91dFVuaXQgcGFn
aW5hdGlvblN0cnV0ID0gbmV3RmxvYXQucGFnaW5hdGlvblN0cnV0KCk7CisKKyAgICBpZiAoZmxv
YXRMb2dpY2FsVG9wIC0gcGFnaW5hdGlvblN0cnV0ICE9IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJ
bmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
YXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIC0taXQ7IC8vIExhc3QgZmxv
YXQgaXMgbmV3RmxvYXQsIHNraXAgdGhhdCBvbmUuCisgICAgYXV0byBiZWdpbiA9IGZsb2F0aW5n
T2JqZWN0U2V0LmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGJlZ2luKSB7CisgICAgICAgIC0t
aXQ7CisgICAgICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKKyAgICAgICAg
aWYgKCZmbG9hdGluZ09iamVjdCA9PSBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGlmIChsb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmpl
Y3QpID09IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkp
IHsKKyAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LnNldFBhZ2luYXRpb25TdHJ1dChwYWdpbmF0
aW9uU3RydXQgKyBmbG9hdGluZ09iamVjdC5wYWdpbmF0aW9uU3RydXQoKSk7CisgICAgICAgICAg
ICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gZmxvYXRpbmdPYmplY3QucmVuZGVyZXIoKTsKKyAgICAg
ICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChmbG9hdEJveCwgbG9naWNhbFRvcEZvckNoaWxk
KGZsb2F0Qm94KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGZsb2F0Qm94KSArIHBhZ2luYXRpb25T
dHJ1dCk7CisKKyAgICAgICAgICAgIGlmICh1cGRhdGVGcmFnbWVudFJhbmdlRm9yQm94Q2hpbGQo
ZmxvYXRCb3gpKQorICAgICAgICAgICAgICAgIGZsb2F0Qm94LnNldE5lZWRzTGF5b3V0KE1hcmtP
bmx5VGhpcyk7CisgICAgICAgICAgICBlbHNlIGlmIChpczxSZW5kZXJCbG9jaz4oZmxvYXRCb3gp
KQorICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPihmbG9hdEJveCkuc2V0Q2hp
bGROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgICAgICAgICAgZmxvYXRCb3gubGF5b3V0
SWZOZWVkZWQoKTsKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb2xkIGxvZ2ljYWwgdG9wIGJl
Zm9yZSBjYWxsaW5nIHJlbW92ZVBsYWNlZE9iamVjdCB3aGljaCB3aWxsIHNldAorICAgICAgICAg
ICAgLy8gaXNQbGFjZWQgdG8gZmFsc2UuIE90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIgYW4gYXNz
ZXJ0IGluIGxvZ2ljYWxUb3BGb3JGbG9hdC4KKyAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9n
aWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCk7CisgICAgICAgICAg
ICBtX2Zsb2F0aW5nT2JqZWN0cy0+cmVtb3ZlUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVjdCk7
CisgICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QsIG9sZExv
Z2ljYWxUb3AgKyBwYWdpbmF0aW9uU3RydXQpOworICAgICAgICAgICAgbV9mbG9hdGluZ09iamVj
dHMtPmFkZFBsYWNlZE9iamVjdCgmZmxvYXRpbmdPYmplY3QpOworICAgICAgICB9CisgICAgfQor
CisgICAgLy8gSnVzdCB1cGRhdGUgdGhlIGxpbmUgaW5mbydzIHBhZ2luYXRpb24gc3RydXQgd2l0
aG91dCBhbHRlcmluZyBvdXIgbG9naWNhbCBoZWlnaHQgeWV0LiBJZiB0aGUgbGluZSBlbmRzIHVw
IGNvbnRhaW5pbmcKKyAgICAvLyBubyBjb250ZW50LCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gaW1w
cm9wZXJseSBncm93IHRoZSBoZWlnaHQgb2YgdGhlIGJsb2NrLgorICAgIGxpbmVJbmZvLnNldEZs
b2F0UGFnaW5hdGlvblN0cnV0KGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkgKyBwYWdp
bmF0aW9uU3RydXQpOworICAgIHJldHVybiB0cnVlOworfQorCitMYXlvdXRVbml0IFJlbmRlckJs
b2NrRmxvdzo6c3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCkKK3sKKyAgICBUZXh0QWxpZ25Nb2RlIHRl
eHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgYm9vbCBzaG91bGRBcHBseUluZGVu
dFRleHQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgIGNhc2UgVGV4dEFs
aWduTW9kZTo6TGVmdDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6CisgICAg
ICAgIHNob3VsZEFwcGx5SW5kZW50VGV4dCA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlJpZ2h0OgorICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0UmlnaHQ6CisgICAgICAgIHNob3VsZEFwcGx5SW5k
ZW50VGV4dCA9ICFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpTdGFydDoKKyAgICAgICAgc2hvdWxkQXBwbHlJ
bmRlbnRUZXh0ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
c2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gZmFsc2U7CisgICAgfQorICAgIC8vIDxyZGFyOi8vcHJv
YmxlbS8xNTQyNzU3MT4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTI0NTIyCisgICAgLy8gVGhpcyBxdWlyayBpcyBmb3IgbGVnYWN5IGNvbnRlbnQgdGhh
dCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgY2VudGVyIHBvc2l0aW9uaW5nIHNjaGVt
ZQorICAgIC8vIGJlaW5nIGhvbm9yZWQgKGUuZy4sIGVwdWJzKS4KKyAgICBpZiAoc2hvdWxkQXBw
bHlJbmRlbnRUZXh0IHx8IHNldHRpbmdzKCkudXNlTGVnYWN5VGV4dEFsaWduUG9zaXRpb25lZEVs
ZW1lbnRCZWhhdmlvcigpKSAvLyBGSVhNRTogSGFuZGxlIFRleHRBbGlnbk1vZGU6OkVuZCBoZXJl
CisgICAgICAgIHJldHVybiBzdGFydE9mZnNldEZvckxpbmUocG9zaXRpb24sIHNob3VsZEluZGVu
dFRleHQpOworCisgICAgLy8gdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KCkgaGFuZGxl
cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayBzbyBubyBuZWVkIHRvIGNvbnNpZGVyIGl0IGhl
cmUKKyAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IDA7CisgICAgZmxvYXQgbG9naWNhbExl
ZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVu
dFRleHQpOworICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9m
ZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExl
ZnQ7CisKKyAgICAvLyBGSVhNRTogQnVnIDEyOTMxMTogV2UgbmVlZCB0byBwYXNzIGEgdmFsaWQg
Um9vdElubGluZUJveCBoZXJlLCBjb25zaWRlcmluZyB0aGUgYmlkaSBsZXZlbCB1c2VkIHRvIGNv
bnN0cnVjdCB0aGUgbGluZS4KKyAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4
dEFsaWduLCAwLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgMCk7CisKKyAgICBpZiAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpKQorICAgICAgICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsV2lkdGgoKSAtIGxvZ2ljYWxM
ZWZ0KTsKKyAgICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsTGVmdCk7Cit9CisKK3ZvaWQgUmVu
ZGVyQmxvY2tGbG93Ojp1cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJv
eCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGluZUJveCk7CisKKyAgICBpZiAoIWhhc0ZyYWdtZW50
UmFuZ2VJbkZyYWdtZW50ZWRGbG93KCkpCisgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29udGFpbmlu
Z0ZyYWdtZW50KCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhdXRvIGNvbnRhaW5pbmdGcmFn
bWVudCA9IGZyYWdtZW50QXRCbG9ja09mZnNldChsaW5lQm94LT5saW5lVG9wV2l0aExlYWRpbmco
KSkpCisgICAgICAgICAgICBsaW5lQm94LT5zZXRDb250YWluaW5nRnJhZ21lbnQoKmNvbnRhaW5p
bmdGcmFnbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbmVCb3gtPmNsZWFyQ29u
dGFpbmluZ0ZyYWdtZW50KCk7CisgICAgfQorCisgICAgUm9vdElubGluZUJveCogcHJldkxpbmVC
b3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOworICAgIGlmICghcHJldkxpbmVCb3gpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgY2hlY2sgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRo
ZSBvbmUgaW4gfGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb258IGJlY2F1c2UgaXQgdGFr
ZXMgaW50bworICAgIC8vIGFjY291bnQganVzdCB0aGUgY29udGFpbmVyIGNoYW5nZXMgYmV0d2Vl
biBsaW5lcy4gVGhlIGJlZm9yZSBtZW50aW9uZWQgZnVuY3Rpb24gZG9lc24ndCBzZXQgdGhlIGZs
YWcKKyAgICAvLyBjb3JyZWN0bHkgaWYgdGhlIGxpbmUgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9w
IG9mIHRoZSBsYXN0IGZyYWdtZW50IGNvbnRhaW5lci4KKyAgICBpZiAobGluZUJveC0+Y29udGFp
bmluZ0ZyYWdtZW50KCkgIT0gcHJldkxpbmVCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpKQorICAg
ICAgICBsaW5lQm94LT5zZXRJc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsodHJ1ZSk7Cit9CisKK30KClBy
b3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21wbGV4TGluZUxh
eW91dC5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQojIyAtMCwwICsxICMjCitu
YXRpdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3BwCShyZXZpc2lvbiAyNDg0MDQp
CisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJz
IEtub2xsIChrbm9sbEBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVz
ZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21h
aWwuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmln
aHQgcmVzZXJ2ZWQuCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkNvbXBsZXhMaW5lTGF5b3V0LmgiCiAKICNpbmNsdWRlICJBWE9iamVjdENh
Y2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCkBAIC00MiwxNiArNDMsMjMgQEAKICNp
bmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKICNpbmNsdWRlICJSZW5kZXJSdWJ5QmFzZS5oIgog
I2luY2x1ZGUgIlJlbmRlclJ1YnlUZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyU1ZHVGV4dC5oIgog
I2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTVkdSb290SW5saW5lQm94LmgiCiAj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25z
LmgiCiAjaW5jbHVkZSAiVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94LmgiCiAjaW5jbHVkZSAi
VmVydGljYWxQb3NpdGlvbkNhY2hlLmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK0NvbXBsZXhMaW5lTGF5b3V0OjpDb21wbGV4TGluZUxh
eW91dChSZW5kZXJCbG9ja0Zsb3cmIGZsb3cpCisgICAgOiBtX2Zsb3coZmxvdykKK3sKK30KKwor
Q29tcGxleExpbmVMYXlvdXQ6On5Db21wbGV4TGluZUxheW91dCgpID0gZGVmYXVsdDsKKwogc3Rh
dGljIHZvaWQgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxp
bmVJdGVyYXRvciBpdGVyKQogewogICAgIHdoaWxlICghaXRlci5hdEVuZCgpKSB7CkBAIC03Nyw5
ICs4NSw5IEBAIGlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8QmlkaVJ1bj4gY3JlYXRlUnUKICAgICBy
ZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCaWRpUnVuPihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVy
LmNvbnRleHQoKSwgcmVzb2x2ZXIuZGlyKCkpOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6
YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiogcnVucywgaW50IHN0YXJ0
LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
cikKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OmFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4qIHJ1bnMsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0JiBvYmos
IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCiB7Ci0gICAgaWYgKHN0YXJ0ID4gZW5kIHx8
IHNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JPYmplY3Qob2JqKSkKKyAgICBpZiAoc3RhcnQgPiBl
bmQgfHwgUmVuZGVyQmxvY2s6OnNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JPYmplY3Qob2JqKSkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgTGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUmIGxp
bmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlID0gcmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNp
bmdTdGF0ZSgpOwpAQCAtMTE5LDI5ICsxMjcsMzUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFw
cGVuZFJ1bnNGb3JPYmplYwogICAgIH0KIH0KIAotc3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVC
b3g+IFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlUm9vdElubGluZUJveCgpCitzdGQ6OnVuaXF1ZV9w
dHI8Um9vdElubGluZUJveD4gQ29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZVJvb3RJbmxpbmVCb3go
KQogewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KCp0aGlzKTsK
KyAgICBpZiAoaXM8UmVuZGVyU1ZHVGV4dD4obV9mbG93KSkgeworICAgICAgICBhdXRvIGJveCA9
IHN0ZDo6bWFrZV91bmlxdWU8U1ZHUm9vdElubGluZUJveD4oZG93bmNhc3Q8UmVuZGVyU1ZHVGV4
dD4obV9mbG93KSk7CisgICAgICAgIGJveC0+c2V0SGFzVmlydHVhbExvZ2ljYWxIZWlnaHQoKTsK
KyAgICAgICAgcmV0dXJuIGJveDsKKyAgICB9CisgICAgICAgIAorICAgIHJldHVybiBzdGQ6Om1h
a2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KG1fZmxvdyk7CiB9CiAKLVJvb3RJbmxpbmVCb3gqIFJl
bmRlckJsb2NrRmxvdzo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCitSb290SW5saW5l
Qm94KiBDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCiB7
CiAgICAgYXV0byBuZXdSb290Qm94ID0gY3JlYXRlUm9vdElubGluZUJveCgpOwogICAgIFJvb3RJ
bmxpbmVCb3gqIHJvb3RCb3ggPSBuZXdSb290Qm94LmdldCgpOwogICAgIG1fbGluZUJveGVzLmFw
cGVuZExpbmVCb3goV1RGTW92ZShuZXdSb290Qm94KSk7CiAKICAgICBpZiAoVU5MSUtFTFkoQVhP
YmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgJiYgZmlyc3RSb290Qm94KCkgPT0g
cm9vdEJveCkgewotICAgICAgICBpZiAoQVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb2N1bWVudCgp
LmV4aXN0aW5nQVhPYmplY3RDYWNoZSgpKQotICAgICAgICAgICAgY2FjaGUtPmRlZmVyUmVjb21w
dXRlSXNJZ25vcmVkKGVsZW1lbnQoKSk7CisgICAgICAgIGlmIChBWE9iamVjdENhY2hlKiBjYWNo
ZSA9IG1fZmxvdy5kb2N1bWVudCgpLmV4aXN0aW5nQVhPYmplY3RDYWNoZSgpKQorICAgICAgICAg
ICAgY2FjaGUtPmRlZmVyUmVjb21wdXRlSXNJZ25vcmVkKG1fZmxvdy5lbGVtZW50KCkpOwogICAg
IH0KIAogICAgIHJldHVybiByb290Qm94OwogfQogCi1zdGF0aWMgaW5saW5lIElubGluZUJveCog
Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgYm9vbCBp
c1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNlKQoraW5saW5lIElubGluZUJveCog
Q29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVj
dCogcmVuZGVyZXIsIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4pCiB7CiAgICAg
aWYgKGlzUm9vdExpbmVCb3gpCi0gICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zs
b3c+KCpyZW5kZXJlcikuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOworICAgICAgICBy
ZXR1cm4gZG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93PigqcmVuZGVyZXIpLmNvbXBsZXhMaW5lTGF5
b3V0KCkuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOwogCiAgICAgaWYgKGlzPFJlbmRl
clRleHQ+KCpyZW5kZXJlcikpCiAgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0Pigq
cmVuZGVyZXIpLmNyZWF0ZUlubGluZVRleHRCb3goKTsKQEAgLTE4NSw3ICsxOTksNyBAQCBzdGF0
aWMgYm9vbCBwYXJlbnRJc0NvbnN0cnVjdGVkT3JIYXZlTmV4CiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi1JbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlcyhSZW5k
ZXJPYmplY3QqIG9iaiwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNoaWxk
Qm94KQorSW5saW5lRmxvd0JveCogQ29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUxpbmVCb3hlcyhS
ZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNo
aWxkQm94KQogewogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFuIHVuY29uc3RydWN0ZWQgbGluZSBi
b3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwogICAgIC8vIHRoZSBsYXN0IGl0ZW0gb24g
dGhlIGxpbmUuCkBAIC0xOTQsMjggKzIwOCwyOCBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9j
a0Zsb3c6OmNyZWF0ZUxpCiAgICAgSW5saW5lRmxvd0JveCogcmVzdWx0ID0gbnVsbHB0cjsKICAg
ICBib29sIGhhc0RlZmF1bHRMaW5lQm94Q29udGFpbiA9IHN0eWxlKCkubGluZUJveENvbnRhaW4o
KSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVCb3hDb250YWluKCk7CiAgICAgZG8gewotICAg
ICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihpczxSZW5kZXJJbmxpbmU+KCpv
YmopIHx8IG9iaiA9PSB0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9TRUNVUklU
WV9JTVBMSUNBVElPTihpczxSZW5kZXJJbmxpbmU+KCpvYmopIHx8IG9iaiA9PSAmbV9mbG93KTsK
IAotICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSBvYmogIT0gdGhpcyA/IGRvd25j
YXN0PFJlbmRlcklubGluZT4ob2JqKSA6IG51bGxwdHI7CisgICAgICAgIFJlbmRlcklubGluZSog
aW5saW5lRmxvdyA9IG9iaiAhPSAmbV9mbG93ID8gZG93bmNhc3Q8UmVuZGVySW5saW5lPihvYmop
IDogbnVsbHB0cjsKIAogICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94IHdlIG1hZGUgZm9yIHRo
aXMgcmVuZGVyIG9iamVjdC4KICAgICAgICAgcGFyZW50Qm94ID0gaW5saW5lRmxvdyA/IGlubGlu
ZUZsb3ctPmxhc3RMaW5lQm94KCkgOiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpvYmopLmxh
c3RSb290Qm94KCk7CiAKICAgICAgICAgLy8gSWYgdGhpcyBib3ggb3IgaXRzIGFuY2VzdG9yIGlz
IGNvbnN0cnVjdGVkIHRoZW4gaXQgaXMgZnJvbSBhIHByZXZpb3VzIGxpbmUsIGFuZCB3ZSBuZWVk
Ci0gICAgICAgIC8vIHRvIG1ha2UgYSBuZXcgYm94IGZvciBvdXIgbGluZS4gIElmIHRoaXMgYm94
IG9yIGl0cyBhbmNlc3RvciBpcyB1bmNvbnN0cnVjdGVkIGJ1dCBpdCBoYXMKKyAgICAgICAgLy8g
dG8gbWFrZSBhIG5ldyBib3ggZm9yIG91ciBsaW5lLiBJZiB0aGlzIGJveCBvciBpdHMgYW5jZXN0
b3IgaXMgdW5jb25zdHJ1Y3RlZCBidXQgaXQgaGFzCiAgICAgICAgIC8vIHNvbWV0aGluZyBmb2xs
b3dpbmcgaXQgb24gdGhlIGxpbmUsIHRoZW4gd2Uga25vdyB3ZSBoYXZlIHRvIG1ha2UgYSBuZXcg
Ym94Ci0gICAgICAgIC8vIGFzIHdlbGwuICBJbiB0aGlzIHNpdHVhdGlvbiBvdXIgaW5saW5lIGhh
cyBhY3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBvbgorICAgICAgICAvLyBhcyB3ZWxsLiBJbiB0
aGlzIHNpdHVhdGlvbiBvdXIgaW5saW5lIGhhcyBhY3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBv
bgogICAgICAgICAvLyB0aGUgc2FtZSBsaW5lICh0aGlzIGNhbiBoYXBwZW4gd2l0aCB2ZXJ5IGZh
bmN5IGxhbmd1YWdlIG1peHR1cmVzKS4KICAgICAgICAgYm9vbCBjb25zdHJ1Y3RlZE5ld0JveCA9
IGZhbHNlOwogICAgICAgICBib29sIGFsbG93ZWRUb0NvbnN0cnVjdE5ld0JveCA9ICFoYXNEZWZh
dWx0TGluZUJveENvbnRhaW4gfHwgIWlubGluZUZsb3cgfHwgaW5saW5lRmxvdy0+YWx3YXlzQ3Jl
YXRlTGluZUJveGVzKCk7CiAgICAgICAgIGJvb2wgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3ggPSBw
YXJlbnRCb3ggJiYgIXBhcmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXh0KHBhcmVudEJveCk7CiAg
ICAgICAgIGlmIChhbGxvd2VkVG9Db25zdHJ1Y3ROZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFy
ZW50Qm94KSB7Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0
aGlzIHJlbmRlciBvYmplY3QuICBPbmNlCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ug
YSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBvYmplY3QuIE9uY2UKICAgICAgICAgICAgIC8vIG1h
ZGUsIHdlIG5lZWQgdG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgot
ICAgICAgICAgICAgSW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJl
cihvYmosIG9iaiA9PSB0aGlzKTsKKyAgICAgICAgICAgIElubGluZUJveCogbmV3Qm94ID0gY3Jl
YXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gJm1fZmxvdyk7CiAgICAgICAgICAg
ICBwYXJlbnRCb3ggPSBkb3duY2FzdDxJbmxpbmVGbG93Qm94PihuZXdCb3gpOwogICAgICAgICAg
ICAgcGFyZW50Qm94LT5zZXRJc0ZpcnN0TGluZShsaW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKLSAg
ICAgICAgICAgIHBhcmVudEJveC0+c2V0SXNIb3Jpem9udGFsKGlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKCkpOworICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwobV9mbG93Lmlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwogICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0TGlu
ZUJveENvbnRhaW4pCiAgICAgICAgICAgICAgICAgcGFyZW50Qm94LT5jbGVhckRlc2NlbmRhbnRz
SGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUoKTsKICAgICAgICAgICAgIGNvbnN0cnVjdGVk
TmV3Qm94ID0gdHJ1ZTsKQEAgLTIzMSw3ICsyNDUsNyBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJC
bG9ja0Zsb3c6OmNyZWF0ZUxpCiAgICAgICAgICAgICBpZiAoY2hpbGRCb3gpCiAgICAgICAgICAg
ICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gpOwogCi0gICAgICAgICAgICBpZiAo
IWNvbnN0cnVjdGVkTmV3Qm94IHx8IG9iaiA9PSB0aGlzKQorICAgICAgICAgICAgaWYgKCFjb25z
dHJ1Y3RlZE5ld0JveCB8fCBvYmogPT0gJm1fZmxvdykKICAgICAgICAgICAgICAgICBicmVhazsK
IAogICAgICAgICAgICAgY2hpbGRCb3ggPSBwYXJlbnRCb3g7CkBAIC0yMzksNyArMjUzLDcgQEAg
SW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaQogCiAgICAgICAgIC8vIElm
IHdlJ3ZlIGV4Y2VlZGVkIG91ciBsaW5lIGRlcHRoLCB0aGVuIGp1bXAgc3RyYWlnaHQgdG8gdGhl
IHJvb3QgYW5kIHNraXAgYWxsIHRoZSByZW1haW5pbmcKICAgICAgICAgLy8gaW50ZXJtZWRpYXRl
IGlubGluZSBmbG93cy4KLSAgICAgICAgb2JqID0gKCsrbGluZURlcHRoID49IGNNYXhMaW5lRGVw
dGgpID8gdGhpcyA6IG9iai0+cGFyZW50KCk7CisgICAgICAgIG9iaiA9ICgrK2xpbmVEZXB0aCA+
PSBjTWF4TGluZURlcHRoKSA/ICZtX2Zsb3cgOiBvYmotPnBhcmVudCgpOwogCiAgICAgfSB3aGls
ZSAodHJ1ZSk7CiAKQEAgLTI3MCw3ICsyODQsNyBAQCBzdGF0aWMgYm9vbCByZWFjaGVkRW5kT2ZU
ZXh0UmVuZGVyZXIoY29uCiAgICAgcmV0dXJuIGVuZHNXaXRoSFRNTFNwYWNlcyh0ZXh0LmNoYXJh
Y3RlcnMxNigpLCBwb3NpdGlvbiwgbGVuZ3RoKTsKIH0KIAotUm9vdElubGluZUJveCogUmVuZGVy
QmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywg
Y29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQorUm9vdElubGluZUJveCogQ29tcGxleExpbmVMYXlv
dXQ6OmNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBM
aW5lSW5mbyYgbGluZUluZm8pCiB7CiAgICAgQVNTRVJUKGJpZGlSdW5zLmZpcnN0UnVuKCkpOwog
CkBAIC0zMTksNyArMzMzLDcgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93Ojpjb25z
dHJ1YwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gV2Ugc2hvdWxkIGhhdmUgYSByb290IGlu
bGluZSBib3guICBJdCBzaG91bGQgYmUgdW5jb25zdHJ1Y3RlZCBhbmQKKyAgICAvLyBXZSBzaG91
bGQgaGF2ZSBhIHJvb3QgaW5saW5lIGJveC4gSXQgc2hvdWxkIGJlIHVuY29uc3RydWN0ZWQgYW5k
CiAgICAgLy8gYmUgdGhlIGxhc3QgY29udGludWF0aW9uIG9mIG91ciBsaW5lIGxpc3QuCiAgICAg
QVNTRVJUKGxhc3RSb290Qm94KCkgJiYgIWxhc3RSb290Qm94KCktPmlzQ29uc3RydWN0ZWQoKSk7
CiAKQEAgLTMyOSw3ICszNDMsNyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNv
bnN0cnVjCiAgICAgICAgIGxhc3RSb290Qm94KCktPnJvb3QoKS5zZXRIYXNTZWxlY3RlZENoaWxk
cmVuKHRydWUpOwogCiAgICAgLy8gU2V0IGJpdHMgb24gb3VyIGlubGluZSBmbG93IGJveGVzIHRo
YXQgaW5kaWNhdGUgd2hpY2ggc2lkZXMgc2hvdWxkCi0gICAgLy8gcGFpbnQgYm9yZGVycy9tYXJn
aW5zL3BhZGRpbmcuICBUaGlzIGtub3dsZWRnZSB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCB3aGVu
CisgICAgLy8gcGFpbnQgYm9yZGVycy9tYXJnaW5zL3BhZGRpbmcuIFRoaXMga25vd2xlZGdlIHdp
bGwgdWx0aW1hdGVseSBiZSB1c2VkIHdoZW4KICAgICAvLyB3ZSBkZXRlcm1pbmUgdGhlIGhvcml6
b250YWwgcG9zaXRpb25zIGFuZCB3aWR0aHMgb2YgYWxsIHRoZSBpbmxpbmUgYm94ZXMgb24KICAg
ICAvLyB0aGUgbGluZS4KICAgICBib29sIGlzTG9naWNhbGx5TGFzdFJ1bldyYXBwZWQgPSBiaWRp
UnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkuaXNUZXh0KCkgPyAhcmVhY2hlZEVu
ZE9mVGV4dFJlbmRlcmVyKGJpZGlSdW5zKSA6ICFpczxSZW5kZXJJbmxpbmU+KGJpZGlSdW5zLmxv
Z2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKSk7CkBAIC0zNDIsOCArMzU2LDExIEBAIFJvb3RJ
bmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y29uc3RydWMKICAgICByZXR1cm4gbGFzdFJvb3RC
b3goKTsKIH0KIAotVGV4dEFsaWduTW9kZSBSZW5kZXJCbG9ja0Zsb3c6OnRleHRBbGlnbm1lbnRG
b3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0CitUZXh0QWxpZ25Nb2RlIENvbXBs
ZXhMaW5lTGF5b3V0Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZShib29sIGVuZHNXaXRoU29mdEJyZWFr
KSBjb25zdAogeworICAgIGlmIChhdXRvIG92ZXJyaWRlQWxpZ25tZW50ID0gbV9mbG93Lm92ZXJy
aWRlVGV4dEFsaWdubWVudEZvckxpbmUoZW5kc1dpdGhTb2Z0QnJlYWspKQorICAgICAgICByZXR1
cm4gKm92ZXJyaWRlQWxpZ25tZW50OworCiAgICAgVGV4dEFsaWduTW9kZSBhbGlnbm1lbnQgPSBz
dHlsZSgpLnRleHRBbGlnbigpOwogI2lmIEVOQUJMRShDU1MzX1RFWFQpCiAgICAgVGV4dEp1c3Rp
ZnkgdGV4dEp1c3RpZnkgPSBzdHlsZSgpLnRleHRKdXN0aWZ5KCk7CkBAIC00MzQsNyArNDUxLDcg
QEAgc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQQogICAgICAgICBsb2dp
Y2FsTGVmdCArPSB0b3RhbExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA/IChh
dmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgOiAoYXZhaWxhYmxlTG9n
aWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIC8gMiAtIHRyYWlsaW5nU3BhY2VXaWR0aDsK
IH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4q
IHJ1biwgUmVuZGVyUnVieVJ1biYgcmVuZGVyZXIsIFJlbmRlck9iamVjdCogcHJldmlvdXNPYmpl
Y3QsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OnNl
dE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biYgcmVuZGVyZXIs
IFJlbmRlck9iamVjdCogcHJldmlvdXNPYmplY3QsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykK
IHsKICAgICBmbG9hdCBzdGFydE92ZXJoYW5nOwogICAgIGZsb2F0IGVuZE92ZXJoYW5nOwpAQCAt
NDQ2LDggKzQ2Myw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVIK
ICAgICAgICAgfQogICAgIH0KICAgICByZW5kZXJlci5nZXRPdmVyaGFuZyhsaW5lSW5mby5pc0Zp
cnN0TGluZSgpLCByZW5kZXJlci5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHBy
ZXZpb3VzT2JqZWN0IDogbmV4dE9iamVjdCwgcmVuZGVyZXIuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkgPyBuZXh0T2JqZWN0IDogcHJldmlvdXNPYmplY3QsIHN0YXJ0T3Zlcmhhbmcs
IGVuZE92ZXJoYW5nKTsKLSAgICBzZXRNYXJnaW5TdGFydEZvckNoaWxkKHJlbmRlcmVyLCBMYXlv
dXRVbml0KC1zdGFydE92ZXJoYW5nKSk7Ci0gICAgc2V0TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVy
ZXIsIExheW91dFVuaXQoLWVuZE92ZXJoYW5nKSk7CisgICAgbV9mbG93LnNldE1hcmdpblN0YXJ0
Rm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLXN0YXJ0T3ZlcmhhbmcpKTsKKyAgICBtX2Zs
b3cuc2V0TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLWVuZE92ZXJoYW5n
KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJv
b3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwgUmVuZGVyVGV4dCYgcmVuZGVyZXIs
IGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywKQEAgLTU0Myw3ICs1NjAsNyBA
QCBzdGF0aWMgaW5saW5lIHZvaWQgc2V0TG9naWNhbFdpZHRoRm9yVGV4CiAgICAgfQogfQogCi12
b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlUnVieUZvckp1c3RpZmllZFRleHQoUmVuZGVyUnVi
eVJ1biYgcnVieVJ1biwgQmlkaVJ1biYgciwgY29uc3QgVmVjdG9yPHVuc2lnbmVkLCAxNj4mIGV4
cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwg
c2l6ZV90JiBpKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6dXBkYXRlUnVieUZvckp1c3RpZmll
ZFRleHQoUmVuZGVyUnVieVJ1biYgcnVieVJ1biwgQmlkaVJ1biYgciwgY29uc3QgVmVjdG9yPHVu
c2lnbmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkJiBleHBhbnNpb25P
cHBvcnR1bml0eUNvdW50LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCwgc2l6ZV90JiBpKQogewogICAgIGlmICghcnVieVJ1bi5ydWJ5QmFzZSgp
IHx8ICFydWJ5UnVuLnJ1YnlCYXNlKCktPmZpcnN0Um9vdEJveCgpIHx8IHJ1YnlSdW4ucnVieUJh
c2UoKS0+Zmlyc3RSb290Qm94KCktPm5leHRSb290Qm94KCkgfHwgIXIucmVuZGVyZXIoKS5zdHls
ZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKQogICAgICAgICByZXR1cm47CkBAIC01NjUsNyArNTgy
LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVJ1YnlGb3JKdXN0aQogICAgIH0KIAog
ICAgIEFTU0VSVCghcnVieVJ1bi5oYXNPdmVycmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoKSk7Ci0g
ICAgZmxvYXQgbmV3QmFzZVdpZHRoID0gcnVieVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFsRXhw
YW5zaW9uICsgbWFyZ2luU3RhcnRGb3JDaGlsZChydWJ5UnVuKSArIG1hcmdpbkVuZEZvckNoaWxk
KHJ1YnlSdW4pOworICAgIGZsb2F0IG5ld0Jhc2VXaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdpZHRo
KCkgKyB0b3RhbEV4cGFuc2lvbiArIG1fZmxvdy5tYXJnaW5TdGFydEZvckNoaWxkKHJ1YnlSdW4p
ICsgbV9mbG93Lm1hcmdpbkVuZEZvckNoaWxkKHJ1YnlSdW4pOwogICAgIGZsb2F0IG5ld1J1YnlS
dW5XaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdpZHRoKCkgKyB0b3RhbEV4cGFuc2lvbjsKICAgICBy
dWJ5QmFzZS5zZXRJbml0aWFsT2Zmc2V0KChuZXdSdWJ5UnVuV2lkdGggLSBuZXdCYXNlV2lkdGgp
IC8gMik7CiAgICAgcnVieVJ1bi5zZXRPdmVycmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoTGF5b3V0
VW5pdChuZXdSdWJ5UnVuV2lkdGgpKTsKQEAgLTU4Myw3ICs2MDAsNyBAQCB2b2lkIFJlbmRlckJs
b2NrRmxvdzo6dXBkYXRlUnVieUZvckp1c3RpCiAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3Vu
dCAtPSB0b3RhbE9wcG9ydHVuaXRpZXNJblJ1bjsKIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRUZXh0KEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRp
UnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBjb25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5z
aW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxv
YXQgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKK3ZvaWQg
Q29tcGxleExpbmVMYXlvdXQ6OmNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRUZXh0KEJpZGlS
dW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBjb25zdCBWZWN0b3I8dW5z
aWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQgZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudCwgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCkKIHsKICAgICBpZiAoIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgfHwgYXZh
aWxhYmxlTG9naWNhbFdpZHRoIDw9IHRvdGFsTG9naWNhbFdpZHRoKQogICAgICAgICByZXR1cm47
CkBAIC02MTQsNyArNjMxLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVFeHBhbnNp
b25GbwogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUxvZ2ljYWxXaWR0
aEZvckFsaWdubWVudChjb25zdCBUZXh0QWxpZ25Nb2RlJiB0ZXh0QWxpZ24sIGNvbnN0IFJvb3RJ
bmxpbmVCb3gqIHJvb3RJbmxpbmVCb3gsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0
JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxl
TG9naWNhbFdpZHRoLCBpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkKK3ZvaWQgQ29tcGxl
eExpbmVMYXlvdXQ6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudChjb25zdCBUZXh0QWxp
Z25Nb2RlJiB0ZXh0QWxpZ24sIGNvbnN0IFJvb3RJbmxpbmVCb3gqIHJvb3RJbmxpbmVCb3gsIEJp
ZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFs
TG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpbnQgZXhwYW5zaW9u
T3Bwb3J0dW5pdHlDb3VudCkKIHsKICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbjsKICAgICBp
ZiAocm9vdElubGluZUJveCAmJiBzdHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0gUGxhaW50ZXh0KQpA
QCAtNjQwLDcgKzY1Nyw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVMb2dpY2FsV2lk
dGgKICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKHN0eWxl
KCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVm
dCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CiAgICAgICAgIGJy
ZWFrOwogICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6SnVzdGlmeToKLSAgICAgICAgYWRqdXN0SW5s
aW5lRGlyZWN0aW9uTGluZUJvdW5kcyhleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBsb2dpY2Fs
TGVmdCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICAgICAgbV9mbG93LmFkanVzdElubGlu
ZURpcmVjdGlvbkxpbmVCb3VuZHMoZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgbG9naWNhbExl
ZnQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CiAgICAgICAgIGlmIChleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50KSB7CiAgICAgICAgICAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikgewogICAgICAg
ICAgICAgICAgIHRvdGFsTG9naWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5s
b2dpY2FsV2lkdGgoKTsKQEAgLTY3Myw3ICs2OTAsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVMb2dp
Y2FsSW5saW5lUG9zaXRpb25zCiAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbGluZUxvZ2lj
YWxSaWdodCAtIGxpbmVMb2dpY2FsTGVmdDsKIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNv
bXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVC
b3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4q
IHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxi
YWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3Zv
aWQgQ29tcGxleExpbmVMYXlvdXQ6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JM
aW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgQmlk
aVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVu
ZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50
cyYgd29yZE1lYXN1cmVtZW50cykKIHsKICAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHRl
eHRBbGlnbm1lbnRGb3JMaW5lKCFyZWFjaGVkRW5kICYmICFsaW5lQm94LT5lbmRzV2l0aEJyZWFr
KCkpOwogICAgIApAQCAtNjgxLDE4ICs2OTgsMTggQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNv
bXB1dGVJbmxpbmVEaXJlYwogICAgIC8vIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRo
ZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuIgogICAgIC8vIENTUzMgInRleHQt
aW5kZW50IiwgIi13ZWJraXQtZWFjaC1saW5lIiBhZmZlY3RzIHRoZSBmaXJzdCBsaW5lIG9mIHRo
ZSBibG9jayBjb250YWluZXIgYXMgd2VsbCBhcyBlYWNoIGxpbmUgYWZ0ZXIgYSBmb3JjZWQgbGlu
ZSBicmVhaywKICAgICAvLyBidXQgZG9lcyBub3QgYWZmZWN0IGxpbmVzIGFmdGVyIGEgc29mdCB3
cmFwIGJyZWFrLgotICAgIGJvb2wgaXNGaXJzdExpbmUgPSBsaW5lSW5mby5pc0ZpcnN0TGluZSgp
ICYmICEoaXNBbm9ueW1vdXNCbG9jaygpICYmIHBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gdGhp
cyk7CisgICAgYm9vbCBpc0ZpcnN0TGluZSA9IGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgJiYgISht
X2Zsb3cuaXNBbm9ueW1vdXNCbG9jaygpICYmIG1fZmxvdy5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgp
ICE9ICZtX2Zsb3cpOwogICAgIGJvb2wgaXNBZnRlckhhcmRMaW5lQnJlYWsgPSBsaW5lQm94LT5w
cmV2Um9vdEJveCgpICYmIGxpbmVCb3gtPnByZXZSb290Qm94KCktPmVuZHNXaXRoQnJlYWsoKTsK
ICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IHJlcXVpcmVzSW5kZW50KGlz
Rmlyc3RMaW5lLCBpc0FmdGVySGFyZExpbmVCcmVhaywgc3R5bGUoKSk7CiAgICAgZmxvYXQgbGlu
ZUxvZ2ljYWxMZWZ0OwogICAgIGZsb2F0IGxpbmVMb2dpY2FsUmlnaHQ7CiAgICAgZmxvYXQgYXZh
aWxhYmxlTG9naWNhbFdpZHRoOwotICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRo
aXMsIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxhYmxlTG9naWNhbFdp
ZHRoLCBpc0ZpcnN0TGluZSwgc2hvdWxkSW5kZW50VGV4dCwgMCk7CisgICAgdXBkYXRlTG9naWNh
bElubGluZVBvc2l0aW9ucyhtX2Zsb3csIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdo
dCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwgc2hvdWxkSW5kZW50VGV4dCwg
MCk7CiAgICAgYm9vbCBuZWVkc1dvcmRTcGFjaW5nOwogCiAgICAgaWYgKGZpcnN0UnVuICYmIGZp
cnN0UnVuLT5yZW5kZXJlcigpLmlzUmVwbGFjZWQoKSkgewogICAgICAgICBSZW5kZXJCb3gmIHJl
bmRlckJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oZmlyc3RSdW4tPnJlbmRlcmVyKCkpOwotICAg
ICAgICB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKCp0aGlzLCBsaW5lTG9naWNhbExlZnQs
IGxpbmVMb2dpY2FsUmlnaHQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaXNGaXJzdExpbmUsIHNo
b3VsZEluZGVudFRleHQsIHJlbmRlckJveC5sb2dpY2FsSGVpZ2h0KCkpOworICAgICAgICB1cGRh
dGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKG1fZmxvdywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9n
aWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRl
bnRUZXh0LCByZW5kZXJCb3gubG9naWNhbEhlaWdodCgpKTsKICAgICB9CiAKICAgICBjb21wdXRl
SW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChsaW5lQm94LCBsaW5lSW5mbywgdGV4
dEFsaWduLCBsaW5lTG9naWNhbExlZnQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgZmlyc3RSdW4s
IHRyYWlsaW5nU3BhY2VSdW4sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUs
IHdvcmRNZWFzdXJlbWVudHMpOwpAQCAtODI1LDcgKzg0Miw3IEBAIHN0YXRpYyBib29sIGlzTGFz
dEluRmxvd1J1bihCaWRpUnVuJiBydW4KICAgICByZXR1cm4gdHJ1ZTsKIH0KICAgICAKLUJpZGlS
dW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNl
Z21lbnQoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBU
ZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCAKK0JpZGlSdW4qIENv
bXBsZXhMaW5lTGF5b3V0Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVu
dChSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIFRleHRB
bGlnbk1vZGUgdGV4dEFsaWduLCBmbG9hdCYgbG9naWNhbExlZnQsCiAgICAgZmxvYXQmIGF2YWls
YWJsZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3Bh
Y2VSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwg
VmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsCiAgICAgV29yZE1l
YXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKIHsKQEAgLTgzNSw3ICs4NTIsNyBAQCBCaWRp
UnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgYm9vbCBpc0xUUiA9IHN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwogICAgIGZsb2F0IHRvdGFsTG9naWNhbFdp
ZHRoID0gbGluZUJveC0+Z2V0Rmxvd1NwYWNpbmdMb2dpY2FsV2lkdGgoKTsKICAgICB1bnNpZ25l
ZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKLSAgICBib29sIGlzQWZ0ZXJFeHBhbnNp
b24gPSBpczxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpID8gZG93bmNhc3Q8UmVuZGVyUnVieUJhc2U+
KCp0aGlzKS5pc0FmdGVyRXhwYW5zaW9uKCkgOiB0cnVlOworICAgIGJvb2wgaXNBZnRlckV4cGFu
c2lvbiA9IGlzPFJlbmRlclJ1YnlCYXNlPihtX2Zsb3cpID8gZG93bmNhc3Q8UmVuZGVyUnVieUJh
c2U+KG1fZmxvdykuaXNBZnRlckV4cGFuc2lvbigpIDogdHJ1ZTsKICAgICBWZWN0b3I8dW5zaWdu
ZWQsIDE2PiBleHBhbnNpb25PcHBvcnR1bml0aWVzOwogCiAgICAgQmlkaVJ1biogcnVuID0gZmly
c3RSdW47CkBAIC04NTcsMTUgKzg3NCwxNSBAQCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNv
bXB1dGVJbmxpbmVECiAgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ICs9IG9w
cG9ydHVuaXRpZXNJblJ1bjsKICAgICAgICAgfTsKICAgICAgICAgaWYgKCFydW4tPmJveCgpIHx8
IHJ1bi0+cmVuZGVyZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBydW4tPmJveCgpLT5p
c0xpbmVCcmVhaygpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgLy8gUG9zaXRpb25lZCBvYmpl
Y3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVpcgotICAgICAgICAg
ICAgICAgICAgICAgIC8vIGNvcnJlY3Qgc3RhdGljIHggcG9zaXRpb24uICBUaGV5IGhhdmUgbm8g
ZWZmZWN0IG9uIHRoZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHks
IGxpbmUgYnJlYWsgYm94ZXMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIHdpZHRoLgorICAgICAgICAg
ICAgLy8gUG9zaXRpb25lZCBvYmplY3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJl
IG91dCB0aGVpciBjb3JyZWN0IHN0YXRpYyB4IHBvc2l0aW9uLgorICAgICAgICAgICAgLy8gVGhl
eSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguIFNpbWlsYXJseSwgbGluZSBicmVhayBib3hl
cyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguCisgICAgICAgICAgICBjb250aW51ZTsKICAg
ICAgICAgfQogICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkgewog
ICAgICAgICAgICAgYXV0byYgcmVuZGVyVGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KHJ1bi0+
cmVuZGVyZXIoKSk7CiAgICAgICAgICAgICBhdXRvJiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5l
VGV4dEJveD4oKnJ1bi0+Ym94KCkpOwogICAgICAgICAgICAgaWYgKGNhbkhhbmdQdW5jdHVhdGlv
bkF0U3RhcnQgJiYgbGluZUluZm8uaXNGaXJzdExpbmUoKSAmJiAoaXNMVFIgfHwgaXNMYXN0SW5G
bG93UnVuKCpydW4pKQotICAgICAgICAgICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0
Qm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0aGlzLCAqcnVuLT5ib3goKSkpIHsKKyAgICAgICAgICAg
ICAgICAmJiAhaW5saW5lQW5jZXN0b3JIYXNTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbihtX2Zs
b3csICpydW4tPmJveCgpKSkgewogICAgICAgICAgICAgICAgIGZsb2F0IGhhbmdTdGFydFdpZHRo
ID0gcmVuZGVyVGV4dC5oYW5nYWJsZVB1bmN0dWF0aW9uU3RhcnRXaWR0aChydW4tPm1fc3RhcnQp
OwogICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCArPSBoYW5nU3RhcnRXaWR0
aDsKICAgICAgICAgICAgICAgICBpZiAoc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkp
CkBAIC04NzQsNyArODkxLDcgQEAgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5s
aW5lRAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoY2FuSGFu
Z1B1bmN0dWF0aW9uQXRFbmQgJiYgbGluZUluZm8uaXNMYXN0TGluZSgpICYmIHJ1bi0+bV9zdG9w
ID4gMCAmJiAoIWlzTFRSIHx8IGlzTGFzdEluRmxvd1J1bigqcnVuKSkKLSAgICAgICAgICAgICAg
ICAmJiAhaW5saW5lQW5jZXN0b3JIYXNFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4oKnRoaXMsICpy
dW4tPmJveCgpKSkgeworICAgICAgICAgICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc0VuZEJv
cmRlclBhZGRpbmdPck1hcmdpbihtX2Zsb3csICpydW4tPmJveCgpKSkgewogICAgICAgICAgICAg
ICAgIGZsb2F0IGhhbmdFbmRXaWR0aCA9IHJlbmRlclRleHQuaGFuZ2FibGVQdW5jdHVhdGlvbkVu
ZFdpZHRoKHJ1bi0+bV9zdG9wIC0gMSk7CiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNh
bFdpZHRoICs9IGhhbmdFbmRXaWR0aDsKICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKCkuaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbigpKQpAQCAtODgzLDcgKzkwMCw3IEBAIEJpZGlSdW4qIFJlbmRl
ckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZUQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAog
ICAgICAgICAgICAgaWYgKHRleHRBbGlnbiA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmIHJ1
biAhPSB0cmFpbGluZ1NwYWNlUnVuKQotICAgICAgICAgICAgICAgIGNvbXB1dGVFeHBhbnNpb25P
cHBvcnR1bml0aWVzKCp0aGlzLCB0ZXh0Qm94LCBwcmV2aW91c1J1biwgcnVuLT5uZXh0KCksIHJl
bmRlclRleHQuc3RyaW5nVmlldyhydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wKSwgcnVuLT5ib3go
KS0+ZGlyZWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGNvbXB1dGVFeHBhbnNpb25PcHBvcnR1
bml0aWVzKG1fZmxvdywgdGV4dEJveCwgcHJldmlvdXNSdW4sIHJ1bi0+bmV4dCgpLCByZW5kZXJU
ZXh0LnN0cmluZ1ZpZXcocnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCksIHJ1bi0+Ym94KCktPmRp
cmVjdGlvbigpKTsKIAogICAgICAgICAgICAgaWYgKHVuc2lnbmVkIGxlbmd0aCA9IHJlbmRlclRl
eHQudGV4dCgpLmxlbmd0aCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFydW4tPm1fc3RhcnQg
JiYgbmVlZHNXb3JkU3BhY2luZyAmJiBpc1NwYWNlT3JOZXdsaW5lKHJlbmRlclRleHQuY2hhcmFj
dGVyQXQocnVuLT5tX3N0YXJ0KSkpCkBAIC05MTgsOCArOTM1LDggQEAgQmlkaVJ1biogUmVuZGVy
QmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRAogICAgICAgICAgICAgICAgIGF1dG8mIHJlbmRlckJv
eCA9IGRvd25jYXN0PFJlbmRlckJveD4ocnVuLT5yZW5kZXJlcigpKTsKICAgICAgICAgICAgICAg
ICBpZiAoaXM8UmVuZGVyUnVieVJ1bj4ocmVuZGVyQm94KSkKICAgICAgICAgICAgICAgICAgICAg
c2V0TWFyZ2luc0ZvclJ1YnlSdW4ocnVuLCBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihyZW5kZXJC
b3gpLCBwcmV2aW91c1J1biA/ICZwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSA6IG51bGxwdHIsIGxp
bmVJbmZvKTsKLSAgICAgICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgobG9n
aWNhbFdpZHRoRm9yQ2hpbGQocmVuZGVyQm94KSk7Ci0gICAgICAgICAgICAgICAgdG90YWxMb2dp
Y2FsV2lkdGggKz0gbWFyZ2luU3RhcnRGb3JDaGlsZChyZW5kZXJCb3gpICsgbWFyZ2luRW5kRm9y
Q2hpbGQocmVuZGVyQm94KTsKKyAgICAgICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2Fs
V2lkdGgobV9mbG93LmxvZ2ljYWxXaWR0aEZvckNoaWxkKHJlbmRlckJveCkpOworICAgICAgICAg
ICAgICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IG1fZmxvdy5tYXJnaW5TdGFydEZvckNoaWxkKHJl
bmRlckJveCkgKyBtX2Zsb3cubWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyQm94KTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogCkBAIC05MzksNyArOTU2LDcgQEAgQmlkaVJ1biogUmVuZGVyQmxv
Y2tGbG93Ojpjb21wdXRlSW5saW5lRAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGlzPFJl
bmRlclJ1YnlCYXNlPigqdGhpcykgJiYgIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpCisgICAg
aWYgKGlzPFJlbmRlclJ1YnlCYXNlPihtX2Zsb3cpICYmICFleHBhbnNpb25PcHBvcnR1bml0eUNv
dW50KQogICAgICAgICB0ZXh0QWxpZ24gPSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI7CiAKICAgICB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBsaW5lQm94LCB0cmFpbGlu
Z1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCwgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7CkBAIC05NDksNyArOTY2LDcgQEAg
QmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRAogICAgIHJldHVybiBydW47
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVJbmxpbmVCb3goQmlkaVJ1biYgcnVu
LCBjb25zdCBSb290SW5saW5lQm94JiByb290TGluZUJveCkgY29uc3QKK3ZvaWQgQ29tcGxleExp
bmVMYXlvdXQ6OnJlbW92ZUlubGluZUJveChCaWRpUnVuJiBydW4sIGNvbnN0IFJvb3RJbmxpbmVC
b3gmIHJvb3RMaW5lQm94KSBjb25zdAogewogICAgIGF1dG8qIGlubGluZUJveCA9IHJ1bi5ib3go
KTsKICNpZiAhQVNTRVJUX0RJU0FCTEVECkBAIC05NzgsMTAgKzk5NSw5IEBAIHZvaWQgUmVuZGVy
QmxvY2tGbG93OjpyZW1vdmVJbmxpbmVCb3goQmkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxv
Y2tGbG93Ojpjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVC
b3gqIGxpbmVCb3gsIEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tG
b250c01hcCYgdGV4dEJveERhdGFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQ
b3NpdGlvbkNhY2hlKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUJsb2NrRGlyZWN0
aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBmaXJz
dFJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBW
ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkKIHsKLSAgICBzZXRM
b2dpY2FsSGVpZ2h0KGxpbmVCb3gtPmFsaWduQm94ZXNJbkJsb2NrRGlyZWN0aW9uKGxvZ2ljYWxI
ZWlnaHQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkpOworICAgIG1f
Zmxvdy5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3gtPmFsaWduQm94ZXNJbkJsb2NrRGlyZWN0aW9u
KG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCksIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUpKTsKIAogICAgIC8vIE5vdyBtYWtlIHN1cmUgd2UgcGxhY2UgcmVwbGFjZWQgcmVuZGVy
IG9iamVjdHMgY29ycmVjdGx5LgogICAgIGZvciAoYXV0byogcnVuID0gZmlyc3RSdW47IHJ1bjsg
cnVuID0gcnVuLT5uZXh0KCkpIHsKQEAgLTk4OSwxMSArMTAwNSwxMSBAQCB2b2lkIFJlbmRlckJs
b2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0CiAgICAgICAgIGlmICghcnVuLT5ib3goKSkKICAg
ICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHJ1bnMgd2l0aCBubyBsaW5lIGJveGVzLgogCi0g
ICAgICAgIC8vIEFsaWduIHBvc2l0aW9uZWQgYm94ZXMgd2l0aCB0aGUgdG9wIG9mIHRoZSBsaW5l
IGJveC4gIFRoaXMgaXMKKyAgICAgICAgLy8gQWxpZ24gcG9zaXRpb25lZCBib3hlcyB3aXRoIHRo
ZSB0b3Agb2YgdGhlIGxpbmUgYm94LiBUaGlzIGlzCiAgICAgICAgIC8vIGEgcmVhc29uYWJsZSBh
cHByb3hpbWF0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHkgcG9zaXRpb24uCiAgICAgICAgIGF1dG8m
IHJlbmRlcmVyID0gcnVuLT5yZW5kZXJlcigpOwogICAgICAgICBpZiAocmVuZGVyZXIuaXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsVG9w
KGxvZ2ljYWxIZWlnaHQoKSk7CisgICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsVG9w
KG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkpOwogCiAgICAgICAgIC8vIFBvc2l0aW9uIGlzIHVzZWQg
dG8gcHJvcGVybHkgcG9zaXRpb24gYm90aCByZXBsYWNlZCBlbGVtZW50cyBhbmQKICAgICAgICAg
Ly8gdG8gdXBkYXRlIHRoZSBzdGF0aWMgbm9ybWFsIGZsb3cgeC95IG9mIHBvc2l0aW9uZWQgZWxl
bWVudHMuCkBAIC0xMDM4LDcgKzEwNTQsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRG
aXJzdFRyYWlsaW5nCiAgICAgcmV0dXJuIGZpcnN0U3BhY2U7CiB9CiAKLWlubGluZSBCaWRpUnVu
KiBSZW5kZXJCbG9ja0Zsb3c6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlS
dW4+JiBiaWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRDb250ZXh0KQoraW5saW5lIEJpZGlS
dW4qIENvbXBsZXhMaW5lTGF5b3V0OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxC
aWRpUnVuPiYgYmlkaVJ1bnMsIEJpZGlDb250ZXh0KiBjdXJyZW50Q29udGV4dCkKIHsKICAgICBp
ZiAoIWJpZGlSdW5zLnJ1bkNvdW50KCkKICAgICAgICAgfHwgIWJpZGlSdW5zLmxvZ2ljYWxseUxh
c3RSdW4oKS0+cmVuZGVyZXIoKS5zdHlsZSgpLmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpCkBA
IC0xMDg5LDcgKzExMDUsNyBAQCBpbmxpbmUgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93OjpoYW5k
bGVUCiAgICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VSdW47CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tG
bG93OjphcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QmIGZsb2F0
aW5nT2JqZWN0KQordm9pZCBDb21wbGV4TGluZUxheW91dDo6YXBwZW5kRmxvYXRpbmdPYmplY3RU
b0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0JiBmbG9hdGluZ09iamVjdCkKIHsKICAgICBBU1NFUlRf
V0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdPYmplY3Qub3JpZ2luYXRpbmdMaW5l
KCkpOwogICAgIEFTU0VSVChsYXN0Um9vdEJveCgpKTsKQEAgLTExODQsNyArMTIwMCw3IEBAIHN0
YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvclMKIH0KIAogLy8gVGhpcyBmdW5j
dGlvbiBjb25zdHJ1Y3RzIGxpbmUgYm94ZXMgZm9yIGFsbCBvZiB0aGUgdGV4dCBydW5zIGluIHRo
ZSByZXNvbHZlciBhbmQgY29tcHV0ZXMgdGhlaXIgcG9zaXRpb24uCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyh1bnNpZ25lZCBiaWRp
TGV2ZWwsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZCwgTGluZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVt
ZW50cyYgd29yZE1lYXN1cmVtZW50cykKK1Jvb3RJbmxpbmVCb3gqIENvbXBsZXhMaW5lTGF5b3V0
OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxldmVsLCBCaWRpUnVu
TGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJ
bmZvJiBsaW5lSW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2Fj
aGUsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMpCiB7CiAgICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQogICAgICAgICByZXR1
cm4gbnVsbHB0cjsKQEAgLTEyMTYsNyArMTIzMiw3IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJs
b2NrRmxvdzo6Y3JlYXRlTGkKICAgICAvLyBjb250YWlucyByZXZlcnNlZCB0ZXh0IG9yIG5vdC4g
SWYgd2Ugd291bGRuJ3QgZG8gdGhhdCBlZGl0aW5nIGFuZCB0aHVzCiAgICAgLy8gdGV4dCBzZWxl
Y3Rpb24gaW4gUlRMIGJveGVzIHdvdWxkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgogICAgIGlmIChp
c1NWR1Jvb3RJbmxpbmVCb3gpIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04oaXNTVkdUZXh0KCkpOworICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX1NFQ1VSSVRZ
X0lNUExJQ0FUSU9OKG1fZmxvdy5pc1NWR1RleHQoKSk7CiAgICAgICAgIGRvd25jYXN0PFNWR1Jv
b3RJbmxpbmVCb3g+KCpsaW5lQm94KS5jb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRp
b24oKTsKICAgICB9CiAgICAgCkBAIC0xMjUzLDcgKzEyNjksNyBAQCBzdGF0aWMgdm9pZCByZXBh
aW50RGlydHlGbG9hdHMoTGluZUxheW91CiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrRmxv
dzo6bGF5b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29s
IGhhc0lubGluZUNoaWxkKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6bGF5b3V0UnVuc0FuZEZs
b2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lubGluZUNoaWxkKQog
ewogICAgIC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGlydHkgbGluZQog
ICAgIElubGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKQEAgLTEyNjgsMjEgKzEyODQsMjEgQEAg
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgIC8vIEZJWE1FOiBU
aGlzIHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBz
aW5jZQogICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRpb24gY2FuIGNoYW5nZSB0aGUgZnVsbExh
eW91dCBmbGFnIHdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlLiBGYWlsdXJlIHRvIGNhbGwKICAgICAv
LyBkZXRlcm1pbmVTdGFydFBvc2l0aW9uIGZpcnN0IHdpbGwgYnJlYWsgZmFzdC9yZXBhaW50L2xp
bmUtZmxvdy13aXRoLWZsb2F0cy05Lmh0bWwuCi0gICAgaWYgKGxheW91dFN0YXRlLmlzRnVsbExh
eW91dCgpICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAg
ICBzZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOyAvLyBNYXJrIGFzIG5lZWRpbmcgYSBmdWxs
IGxheW91dCB0byBmb3JjZSB1cyB0byByZXBhaW50LgotICAgICAgICBpZiAoIXZpZXcoKS5mcmFt
ZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubmVlZHNGdWxsUmVwYWludCgpICYmIGhhc1NlbGZQYWlu
dGluZ0xheWVyKCkgJiYgaGFzUmVwYWludExheW91dFJlY3RzKCkpIHsKKyAgICBpZiAobGF5b3V0
U3RhdGUuaXNGdWxsTGF5b3V0KCkgJiYgaGFzSW5saW5lQ2hpbGQgJiYgIW1fZmxvdy5zZWxmTmVl
ZHNMYXlvdXQoKSkgeworICAgICAgICBtX2Zsb3cuc2V0TmVlZHNMYXlvdXQoTWFya09ubHlUaGlz
KTsgLy8gTWFyayBhcyBuZWVkaW5nIGEgZnVsbCBsYXlvdXQgdG8gZm9yY2UgdXMgdG8gcmVwYWlu
dC4KKyAgICAgICAgaWYgKCFsYXlvdXRDb250ZXh0KCkubmVlZHNGdWxsUmVwYWludCgpICYmIG1f
Zmxvdy5oYXNTZWxmUGFpbnRpbmdMYXllcigpICYmIG1fZmxvdy5oYXNSZXBhaW50TGF5b3V0UmVj
dHMoKSkgewogICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBh
bHJlYWR5IGluc2lkZSBsYXlvdXQgdG8gZGlzY292ZXIKICAgICAgICAgICAgIC8vIHRoYXQgdGhl
IGJsb2NrIHJlYWxseSBuZWVkZWQgYSBmdWxsIGxheW91dCwgd2UgbWlzc2VkIG91ciBjaGFuY2Ug
dG8gcmVwYWludCB0aGUgbGF5ZXIKLSAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQgc3RhcnRl
ZC4gIEx1Y2tpbHkgdGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRz
IG9yaWdpbmFsCisgICAgICAgICAgICAvLyBiZWZvcmUgbGF5b3V0IHN0YXJ0ZWQuIEx1Y2tpbHkg
dGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRzIG9yaWdpbmFsCiAg
ICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNhbiB1c2UgdGhhdCB0
byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93LgotICAgICAgICAgICAgcmVwYWludFVzaW5nQ29u
dGFpbmVyKGNvbnRhaW5lckZvclJlcGFpbnQoKSwgcmVwYWludExheW91dFJlY3RzKCkubV9yZXBh
aW50UmVjdCk7CisgICAgICAgICAgICBtX2Zsb3cucmVwYWludFVzaW5nQ29udGFpbmVyKG1fZmxv
dy5jb250YWluZXJGb3JSZXBhaW50KCksIG1fZmxvdy5yZXBhaW50TGF5b3V0UmVjdHMoKS5tX3Jl
cGFpbnRSZWN0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjb250YWluc0Zsb2F0cygp
KQotICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0RmxvYXQobV9mbG9hdGlu
Z09iamVjdHMtPnNldCgpLmxhc3QoKS5nZXQoKSk7CisgICAgaWYgKG1fZmxvdy5jb250YWluc0Zs
b2F0cygpKQorICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0RmxvYXQobV9m
bG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKS5sYXN0KCkuZ2V0KCkpOwogCi0gICAgLy8gV2Ug
YWxzbyBmaW5kIHRoZSBmaXJzdCBjbGVhbiBsaW5lIGFuZCBleHRyYWN0IHRoZXNlIGxpbmVzLiAg
V2Ugd2lsbCBhZGQgdGhlbSBiYWNrCisgICAgLy8gV2UgYWxzbyBmaW5kIHRoZSBmaXJzdCBjbGVh
biBsaW5lIGFuZCBleHRyYWN0IHRoZXNlIGxpbmVzLiBXZSB3aWxsIGFkZCB0aGVtIGJhY2sKICAg
ICAvLyBpZiB3ZSBkZXRlcm1pbmUgdGhhdCB3ZSdyZSBhYmxlIHRvIHN5bmNocm9uaXplIGFmdGVy
IGhhbmRsaW5nIGFsbCBvdXIgZGlydHkgbGluZXMuCiAgICAgSW5saW5lSXRlcmF0b3IgY2xlYW5M
aW5lU3RhcnQ7CiAgICAgQmlkaVN0YXR1cyBjbGVhbkxpbmVCaWRpU3RhdHVzOwpAQCAtMTI5MSw3
ICsxMzA3LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogCiAg
ICAgaWYgKHN0YXJ0TGluZSkgewogICAgICAgICBpZiAoIWxheW91dFN0YXRlLnVzZXNSZXBhaW50
Qm91bmRzKCkpCi0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRSZXBhaW50UmFuZ2UobG9naWNh
bEhlaWdodCgpKTsKKyAgICAgICAgICAgIGxheW91dFN0YXRlLnNldFJlcGFpbnRSYW5nZShtX2Zs
b3cubG9naWNhbEhlaWdodCgpKTsKICAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRl
LCBzdGFydExpbmUpOwogICAgIH0KIApAQCAtMTMwNiw3ICsxMzIyLDcgQEAgdm9pZCBSZW5kZXJC
bG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgICAgICAgICAgaWYgKGxhc3RPYmplY3Qt
PmlzQlIoKSkgewogICAgICAgICAgICAgICAgIENsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5
bGUoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgIGlmIChjbGVhciAhPSBDbGVhcjo6Tm9uZSkK
LSAgICAgICAgICAgICAgICAgICAgY2xlYXJGbG9hdHMoY2xlYXIpOworICAgICAgICAgICAgICAg
ICAgICBtX2Zsb3cuY2xlYXJGbG9hdHMoY2xlYXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9
CiAgICAgfQpAQCAtMTMxNywyNSArMTMzMywyNSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5
b3V0UnVuc0FuZEZsb2F0CiB9CiAKIC8vIEJlZm9yZSByZXN0YXJ0aW5nIHRoZSBsYXlvdXQgbG9v
cCB3aXRoIGEgbmV3IGxvZ2ljYWxIZWlnaHQsIHJlbW92ZSBhbGwgZmxvYXRzIHRoYXQgd2VyZSBh
ZGRlZCBhbmQgcmVzZXQgdGhlIHJlc29sdmVyLgotaW5saW5lIGNvbnN0IElubGluZUl0ZXJhdG9y
JiBSZW5kZXJCbG9ja0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlv
dXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZs
b2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImIG9sZEVuZCkKK2lubGluZSBjb25z
dCBJbmxpbmVJdGVyYXRvciYgQ29tcGxleExpbmVMYXlvdXQ6OnJlc3RhcnRMYXlvdXRSdW5zQW5k
RmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3
TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImIG9s
ZEVuZCkKIHsKLSAgICByZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCBvbGRMb2dpY2FsSGVpZ2h0KTsKLSAgICBzZXRMb2dpY2FsSGVpZ2h0KG5ld0xv
Z2ljYWxIZWlnaHQpOworICAgIG1fZmxvdy5yZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhsYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBvbGRMb2dpY2FsSGVpZ2h0KTsKKyAgICBtX2Zsb3cuc2V0
TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKICAgICByZXNvbHZlci5zZXRQb3NpdGlv
bklnbm9yaW5nTmVzdGVkSXNvbGF0ZXMob2xkRW5kKTsKICAgICByZXR1cm4gb2xkRW5kOwogfQog
Ci12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVh
bkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK3Zv
aWQgQ29tcGxleExpbmVMYXlvdXQ6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xlYW5M
aW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCiB7CiAg
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlVG9Vc2UgPSBzdHlsZSgpOwotICAgIGJvb2wgcGFn
aW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgp
ICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQ
YWdpbmF0ZWQoKTsKKyAgICBib29sIHBhZ2luYXRlZCA9IGxheW91dENvbnRleHQoKS5sYXlvdXRT
dGF0ZSgpICYmIGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwog
ICAgIExpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlJiBsaW5lV2hpdGVzcGFjZUNvbGxhcHNp
bmdTdGF0ZSA9IHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKTsKICAgICBJbmxp
bmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOwogICAgIGJvb2wgY2hlY2tGb3JF
bmRMaW5lTWF0Y2ggPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7CiAgICAgUmVuZGVyVGV4dEluZm8g
cmVuZGVyVGV4dEluZm87CiAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9zaXRp
b25DYWNoZTsKIAotICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKCp0aGlzKTsKKyAgICBMaW5l
QnJlYWtlciBsaW5lQnJlYWtlcihtX2Zsb3cpOwogCiAgICAgd2hpbGUgKCFlbmQuYXRFbmQoKSkg
ewogICAgICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBuZWNlc3NhcnkgYmVmb3JlIHRoZSBm
aXJzdCBpdGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRvIHRoZSBlbmQ/CkBAIC0xMzU1LDEx
ICsxMzcxLDExIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQKIAog
ICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7CiAgICAgICAgIGJvb2wg
aXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSgpOwotICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSA9IChjb250YWluc0Zsb2F0cygpKSA/IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5s
YXN0KCkuZ2V0KCkgOiBudWxscHRyOworICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSA9IChtX2Zsb3cuY29udGFpbnNGbG9hdHMoKSkgPyBtX2Zsb3cuZmxv
YXRpbmdPYmplY3RzKCktPnNldCgpLmxhc3QoKS5nZXQoKSA6IG51bGxwdHI7CiAKICAgICAgICAg
V29yZE1lYXN1cmVtZW50cyB3b3JkTWVhc3VyZW1lbnRzOwogICAgICAgICBlbmQgPSBsaW5lQnJl
YWtlci5uZXh0TGluZUJyZWFrKHJlc29sdmVyLCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLCByZW5k
ZXJUZXh0SW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMsIHdvcmRNZWFzdXJlbWVudHMpOwotICAgICAgICBjYWNoZVByaW9yQ2hhcmFjdGVy
c0lmTmVlZGVkKHJlbmRlclRleHRJbmZvLmxpbmVCcmVha0l0ZXJhdG9yKTsKKyAgICAgICAgbV9m
bG93LmNhY2hlUHJpb3JDaGFyYWN0ZXJzSWZOZWVkZWQocmVuZGVyVGV4dEluZm8ubGluZUJyZWFr
SXRlcmF0b3IpOwogICAgICAgICByZW5kZXJUZXh0SW5mby5saW5lQnJlYWtJdGVyYXRvci5yZXNl
dFByaW9yQ29udGV4dCgpOwogICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgp
KSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNyZWF0aW5nIGFueSBy
dW5zIGluIG5leHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0aCEKQEAgLTE0MDIsNyArMTQxOCw3IEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQKICAgICAgICAgICAgIC8v
IEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJlIG91dCB3aGVyZSBib3JkZXIvcGFkZGluZy9tYXJn
aW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCiAgICAgICAgICAgICAvLyBpbmxpbmUgZmxvdyBib3hl
cy4KIAotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhl
aWdodCgpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVpZ2h0ID0gbV9mbG93
LmxvZ2ljYWxIZWlnaHQoKTsKICAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmVCb3ggPSBj
cmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMocmVzb2x2ZXIuc3RhdHVzKCkuY29udGV4dC0+bGV2
ZWwoKSwgYmlkaVJ1bnMsIGVuZCwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgdmVydGljYWxQb3Np
dGlvbkNhY2hlLCB0cmFpbGluZ1NwYWNlUnVuLCB3b3JkTWVhc3VyZW1lbnRzKTsKIAogICAgICAg
ICAgICAgYmlkaVJ1bnMuY2xlYXIoKTsKQEAgLTE0MTksMjIgKzE0MzUsMjIgQEAgdm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgICAgICAgICAgICAgIGxheW91dFN0
YXRlLm1hcmdpbkluZm8oKS5zZXRBdEJlZm9yZVNpZGVPZkJsb2NrKGZhbHNlKTsKIAogICAgICAg
ICAgICAgICAgIGlmIChwYWdpbmF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIGFkanVzdExpbmVQ
b3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgYWRqdXN0bWVudCwgb3ZlcmZsb3dzRnJhZ21l
bnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOworICAgICAgICAgICAgICAgICAgICBt
X2Zsb3cuYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBhZGp1c3RtZW50
LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CiAgICAg
ICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgSW5kZW50
VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRmly
c3RMaW5lKCkgPyBJbmRlbnRUZXh0IDogRG9Ob3RJbmRlbnRUZXh0OwotICAgICAgICAgICAgICAg
ICAgICBMYXlvdXRVbml0IG9sZExpbmVXaWR0aCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxp
bmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgICAgICAgICAgICAg
ICAgIExheW91dFVuaXQgb2xkTGluZVdpZHRoID0gbV9mbG93LmF2YWlsYWJsZUxvZ2ljYWxXaWR0
aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwgc2hvdWxkSW5kZW50VGV4dCk7CiAgICAgICAgICAg
ICAgICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24oYWRqdXN0bWVu
dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS51c2VzUmVwYWludEJvdW5k
cygpKQogICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJh
bmdlRnJvbUJveChsaW5lQm94KTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgc2hvdWxk
SW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICht
X2Zsb3cuYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0ICsgYWRq
dXN0bWVudCwgc2hvdWxkSW5kZW50VGV4dCkgIT0gb2xkTGluZVdpZHRoKSB7CiAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGxpbmUsIHJlbW92ZSBhbGwg
ZmxvYXRzIHRoYXQgZ290IGFkZGVkLCBhbmQgbGV0IGxpbmUgbGF5b3V0IHJlLXJ1bi4KICAgICAg
ICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmRlbGV0ZUxpbmUoKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgIGVuZCA9IHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShvbGRMb2dp
Y2FsSGVpZ2h0LCBvbGRMb2dpY2FsSGVpZ2h0ICsgYWRqdXN0bWVudCwgbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSwgcmVzb2x2ZXIsIG9sZEVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAg
ICAgICAgICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5saW5lQm90dG9t
V2l0aExlYWRpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CkBAIC0xNDQ1LDE1ICsxNDYxLDE1IEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQKICAgICAgICAgfQogCiAg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZUJyZWFrZXIucG9zaXRpb25lZE9iamVj
dHMoKS5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucygqdGhpcywg
KmxpbmVCcmVha2VyLnBvc2l0aW9uZWRPYmplY3RzKClbaV0sIERvTm90SW5kZW50VGV4dCk7Cisg
ICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMobV9mbG93LCAqbGluZUJyZWFrZXIucG9zaXRp
b25lZE9iamVjdHMoKVtpXSwgRG9Ob3RJbmRlbnRUZXh0KTsKIAogICAgICAgICBpZiAoIWxheW91
dFN0YXRlLmxpbmVJbmZvKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5s
aW5lSW5mbygpLnNldEZpcnN0TGluZShmYWxzZSk7Ci0gICAgICAgICAgICBjbGVhckZsb2F0cyhs
aW5lQnJlYWtlci5jbGVhcigpKTsKKyAgICAgICAgICAgIG1fZmxvdy5jbGVhckZsb2F0cyhsaW5l
QnJlYWtlci5jbGVhcigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtX2Zsb2F0aW5nT2Jq
ZWN0cyAmJiBsYXN0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBGbG9hdGluZ09iamVj
dFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAg
ICAgIGlmIChtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCkgJiYgbGFzdFJvb3RCb3goKSkgeworICAg
ICAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9m
bG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICAgICAgICAgIGF1dG8gaXQgPSBmbG9h
dGluZ09iamVjdFNldC5iZWdpbigpOwogICAgICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09i
amVjdFNldC5lbmQoKTsKICAgICAgICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRT
dGF0ZS5mbG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgewpAQCAtMTQ4MCw3ICsxNDk2LDcgQEAgdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdAogICAgIC8vIEluIGNhc2Ugd2Ug
YWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMgbGF5b3V0IHRv
IGF2b2lkIHdpZG93cwogICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHBvc3NpYmls
aXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgogICAgIC8vIE90aGVyd2lzZSwg
d2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5zdCB0aGUgYmxv
Y2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgotICAgIGlmIChwYWdpbmF0ZWQgJiYgIXN0eWxl
KCkuaGFzQXV0b1dpZG93cygpICYmICFkaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7Cisg
ICAgaWYgKHBhZ2luYXRlZCAmJiAhc3R5bGUoKS5oYXNBdXRvV2lkb3dzKCkgJiYgIW1fZmxvdy5k
aWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7CiAgICAgICAgIC8vIENoZWNrIHRoZSBsaW5l
IGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHVuYWNjZXB0YWJsZSB3aWRvd3Mu
CiAgICAgICAgIC8vIEhvd2V2ZXIsIHdlJ2xsIHByaW9yaXRpemUgb3JwaGFucyAtIHNvIG5vdGhp
bmcgd2UgZG8gaGVyZSBzaG91bGQgY3JlYXRlCiAgICAgICAgIC8vIGEgbmV3IG9ycGhhbi4KQEAg
LTE1MzIsMTQgKzE1NDgsMTQgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRG
bG9hdAogICAgICAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOwog
CiAgICAgICAgICAgICAvLyBXZSBub3cgd2FudCB0byBicmVhayBhdCB0aGlzIGxpbmUuIFJlbWVt
YmVyIGZvciBuZXh0IGxheW91dCBhbmQgdHJpZ2dlciByZWxheW91dC4KLSAgICAgICAgICAgIHNl
dEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KGxpbmVDb3VudChsaW5lQm94KSk7Ci0gICAgICAgICAg
ICBtYXJrTGluZXNEaXJ0eUluQmxvY2tSYW5nZShsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0
aExlYWRpbmcoKSwgbGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gpOwor
ICAgICAgICAgICAgbV9mbG93LnNldEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KG1fZmxvdy5saW5l
Q291bnQobGluZUJveCkpOworICAgICAgICAgICAgbV9mbG93Lm1hcmtMaW5lc0RpcnR5SW5CbG9j
a1JhbmdlKGxhc3RSb290Qm94KCktPmxpbmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94LT5s
aW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGluZUJveCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAg
Y2xlYXJEaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpOworICAgIG1fZmxvdy5jbGVhckRpZEJy
ZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZWF0
dGFjaENsZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIExheW91dFVuaXQg
ZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFuTGluZSkKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OnJl
YXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNsZWFuTGluZSwgTGF5b3V0VW5p
dCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKQogewogICAgIGF1dG8qIGNsZWFuTGluZUZs
b2F0cyA9IGNsZWFuTGluZS5mbG9hdHNQdHIoKTsKICAgICBpZiAoIWNsZWFuTGluZUZsb2F0cykK
QEAgLTE1NDgsNyArMTU2NCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZWF0dGFjaENsZWFu
TGluZUYKICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFuTGluZUZsb2F0cykgewog
ICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IGF1dG8qIGZsb2F0aW5nT2JqZWN0ID0gaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94
KTsKKyAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBtX2Zsb3cuaW5zZXJ0RmxvYXRpbmdP
YmplY3QoKmZsb2F0aW5nQm94KTsKICAgICAgICAgaWYgKGlzRmlyc3RDbGVhbkxpbmUgJiYgZmxv
YXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKSB7CiAgICAgICAgICAgICAvLyBGbG9hdCBi
b3ggZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbGluZSBhbnltb3JlLgogICAgICAgICAgICAgQVNT
RVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oY2xlYW5MaW5lLnByZXZSb290Qm94KCkgPT0g
ZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKQEAgLTE1NTcsMjUgKzE1NzMsMjUg
QEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlYXR0YWNoQ2xlYW5MaW5lRgogICAgICAgICB9CiAg
ICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdGluZ09iamVjdC0+
b3JpZ2luYXRpbmdMaW5lKCkpOwogICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRp
bmdMaW5lKGNsZWFuTGluZSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEZv
ckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gp
ICsgZGVsdGEpOwotICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOworICAgICAgICBtX2Zsb3cu
c2V0TG9naWNhbEhlaWdodChtX2Zsb3cubG9naWNhbFRvcEZvckNoaWxkKCpmbG9hdGluZ0JveCkg
LSBtX2Zsb3cubWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSArIGRlbHRhKTsKKyAg
ICAgICAgbV9mbG93LnBvc2l0aW9uTmV3RmxvYXRzKCk7CiAgICAgfQogfQogCi12b2lkIFJlbmRl
ckJsb2NrRmxvdzo6bGlua1RvRW5kTGluZUlmTmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKIHsKICAgICBhdXRvKiBmaXJzdENsZWFuTGluZSA9
IGxheW91dFN0YXRlLmVuZExpbmUoKTsKICAgICBpZiAoZmlyc3RDbGVhbkxpbmUpIHsKICAgICAg
ICAgaWYgKGxheW91dFN0YXRlLmVuZExpbmVNYXRjaGVkKCkpIHsKLSAgICAgICAgICAgIGJvb2wg
cGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0
ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+
aXNQYWdpbmF0ZWQoKTsKKyAgICAgICAgICAgIGJvb2wgcGFnaW5hdGVkID0gbGF5b3V0Q29udGV4
dCgpLmxheW91dFN0YXRlKCkgJiYgbGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCktPmlzUGFn
aW5hdGVkKCk7CiAgICAgICAgICAgICAvLyBBdHRhY2ggYWxsIHRoZSByZW1haW5pbmcgbGluZXMs
IGFuZCB0aGVuIGFkanVzdCB0aGVpciB5LXBvc2l0aW9ucyBhcyBuZWVkZWQuCi0gICAgICAgICAg
ICBMYXlvdXRVbml0IGRlbHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGlu
ZUxvZ2ljYWxUb3AoKTsKKyAgICAgICAgICAgIExheW91dFVuaXQgZGVsdGEgPSBtX2Zsb3cubG9n
aWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsKICAgICAgICAg
ICAgIGZvciAoYXV0byogbGluZSA9IGZpcnN0Q2xlYW5MaW5lOyBsaW5lOyBsaW5lID0gbGluZS0+
bmV4dFJvb3RCb3goKSkgewogICAgICAgICAgICAgICAgIGxpbmUtPmF0dGFjaExpbmUoKTsKICAg
ICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRh
IC09IGxpbmUtPnBhZ2luYXRpb25TdHJ1dCgpOwogICAgICAgICAgICAgICAgICAgICBib29sIG92
ZXJmbG93c0ZyYWdtZW50OwotICAgICAgICAgICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25G
b3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUu
ZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAgICAgICAgIG1fZmxvdy5hZGp1c3RMaW5l
UG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5
b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgIGlmIChkZWx0YSkgewogICAgICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRh
dGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmUsIGRlbHRhKTsKQEAgLTE1ODUsMzAgKzE2MDEsMzAg
QEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmtUb0VuZExpbmVJZk5lZQogICAgICAgICAgICAg
ICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUobGluZSk7CiAgICAgICAgICAgICAgICAgcmVh
dHRhY2hDbGVhbkxpbmVGbG9hdHMoKmxpbmUsIGRlbHRhLCBsaW5lID09IGZpcnN0Q2xlYW5MaW5l
KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobGFzdFJvb3RC
b3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworICAgICAgICAgICAgbV9mbG93LnNldExv
Z2ljYWxIZWlnaHQobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwogICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCB0aGUgcmVtYWluaW5nIGxp
bmVzLgogICAgICAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBsYXlvdXRTdGF0
ZS5lbmRMaW5lKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIGlmIChtX2Zsb2F0aW5n
T2JqZWN0cyAmJiAobGF5b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUoKSB8fCBw
b3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBsYXN0Um9vdEJveCgpKSB7CisgICAgaWYgKG1fZmxvdy5m
bG9hdGluZ09iamVjdHMoKSAmJiAobGF5b3V0U3RhdGUuY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExp
bmUoKSB8fCBtX2Zsb3cucG9zaXRpb25OZXdGbG9hdHMoKSkgJiYgbGFzdFJvb3RCb3goKSkgewog
ICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0aGUgbGFzdCBsaW5lLCBpdCBt
aWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCiAgICAgICAgIC8vIFRoaXMgaGFzIHRv
IGJlIGRvbmUgYmVmb3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRkaW5nLCBvciB0
aGUgZmxvYXQgd2lsbAogICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWRkaW5nIGluY29ycmVjdGx5
LiAtZHdoCiAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zyb21MYXN0TGlu
ZSgpKSB7CiAgICAgICAgICAgICBMYXlvdXRVbml0IGJvdHRvbVZpc3VhbE92ZXJmbG93ID0gbGFz
dFJvb3RCb3goKS0+bG9naWNhbEJvdHRvbVZpc3VhbE92ZXJmbG93KCk7CiAgICAgICAgICAgICBM
YXlvdXRVbml0IGJvdHRvbUxheW91dE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+bG9naWNhbEJv
dHRvbUxheW91dE92ZXJmbG93KCk7Ci0gICAgICAgICAgICBhdXRvIG5ld0xpbmVCb3ggPSBzdGQ6
Om1ha2VfdW5pcXVlPFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveD4oKnRoaXMpOworICAgICAg
ICAgICAgYXV0byBuZXdMaW5lQm94ID0gc3RkOjptYWtlX3VuaXF1ZTxUcmFpbGluZ0Zsb2F0c1Jv
b3RJbmxpbmVCb3g+KG1fZmxvdyk7CiAgICAgICAgICAgICBhdXRvIHRyYWlsaW5nRmxvYXRzTGlu
ZUJveCA9IG5ld0xpbmVCb3guZ2V0KCk7CiAgICAgICAgICAgICBtX2xpbmVCb3hlcy5hcHBlbmRM
aW5lQm94KFdURk1vdmUobmV3TGluZUJveCkpOwogICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNM
aW5lQm94LT5zZXRDb25zdHJ1Y3RlZCgpOwogICAgICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZh
bGxiYWNrRm9udHNNYXAgdGV4dEJveERhdGFNYXA7CiAgICAgICAgICAgICBWZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBi
bG9ja0xvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgICAgICBMYXlvdXRV
bml0IGJsb2NrTG9naWNhbEhlaWdodCA9IG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCk7CiAgICAgICAg
ICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPmFsaWduQm94ZXNJbkJsb2NrRGlyZWN0aW9uKGJs
b2NrTG9naWNhbEhlaWdodCwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7
CiAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldExpbmVUb3BCb3R0b21Qb3Np
dGlvbnMoYmxvY2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNh
bEhlaWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRz
TGluZUJveC0+c2V0UGFnaW5hdGVkTGluZVdpZHRoKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNv
bnRlbnQoYmxvY2tMb2dpY2FsSGVpZ2h0KSk7CisgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xp
bmVCb3gtPnNldFBhZ2luYXRlZExpbmVXaWR0aChtX2Zsb3cuYXZhaWxhYmxlTG9naWNhbFdpZHRo
Rm9yQ29udGVudChibG9ja0xvZ2ljYWxIZWlnaHQpKTsKICAgICAgICAgICAgIExheW91dFJlY3Qg
bG9naWNhbExheW91dE92ZXJmbG93KDBfbHUsIGJsb2NrTG9naWNhbEhlaWdodCwgMV9sdSwgYm90
dG9tTGF5b3V0T3ZlcmZsb3cgLSBibG9ja0xvZ2ljYWxIZWlnaHQpOwogICAgICAgICAgICAgTGF5
b3V0UmVjdCBsb2dpY2FsVmlzdWFsT3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2FsSGVpZ2h0LCAx
X2x1LCBib3R0b21WaXN1YWxPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7CiAgICAgICAg
ICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0cyhs
b2dpY2FsTGF5b3V0T3ZlcmZsb3csIGxvZ2ljYWxWaXN1YWxPdmVyZmxvdywgdHJhaWxpbmdGbG9h
dHNMaW5lQm94LT5saW5lVG9wKCksIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+bGluZUJvdHRvbSgp
KTsKQEAgLTE2MTYsNyArMTYzMiw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRM
aW5lSWZOZWUKICAgICAgICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUodHJhaWxpbmdG
bG9hdHNMaW5lQm94KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0
U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAg
ICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG93LmZs
b2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICAgICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0
U2V0LmJlZ2luKCk7CiAgICAgICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7
CiAgICAgICAgIGlmIChhdXRvKiBsYXN0RmxvYXQgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5s
YXN0RmxvYXQoKSkgewpAQCAtMTYzMSwyMyArMTY0NywyMyBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6bGlua1RvRW5kTGluZUlmTmVlCiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6
bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWlu
dExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90dG9tKQordm9pZCBDb21w
bGV4TGluZUxheW91dDo6bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5
b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90
dG9tKQogewotICAgIEFTU0VSVCghbV9zaW1wbGVMaW5lTGF5b3V0KTsKKyAgICBBU1NFUlQoIW1f
Zmxvdy5zaW1wbGVMaW5lTGF5b3V0KCkpOwogCi0gICAgc2V0TG9naWNhbEhlaWdodChib3JkZXJB
bmRQYWRkaW5nQmVmb3JlKCkpOworICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KG1fZmxvdy5i
b3JkZXJBbmRQYWRkaW5nQmVmb3JlKCkpOwogICAgIAogICAgIC8vIExheSBvdXQgb3VyIGh5cG90
aGV0aWNhbCBncmlkIGxpbmUgYXMgdGhvdWdoIGl0IG9jY3VycyBhdCB0aGUgdG9wIG9mIHRoZSBi
bG9jay4KLSAgICBpZiAodmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRT
dGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUo
KS0+bGluZUdyaWQoKSA9PSB0aGlzKQotICAgICAgICBsYXlvdXRMaW5lR3JpZEJveCgpOworICAg
IGlmIChsYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiBsYXlvdXRDb250ZXh0KCkubGF5
b3V0U3RhdGUoKS0+bGluZUdyaWQoKSA9PSAmbV9mbG93KQorICAgICAgICBtX2Zsb3cubGF5b3V0
TGluZUdyaWRCb3goKTsKIAotICAgIFJlbmRlckZyYWdtZW50ZWRGbG93KiBmcmFnbWVudGVkRmxv
dyA9IGVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCk7CisgICAgUmVuZGVyRnJhZ21lbnRlZEZsb3cq
IGZyYWdtZW50ZWRGbG93ID0gbV9mbG93LmVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCk7CiAgICAg
Ym9vbCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbiA9IGZpcnN0Um9vdEJveCgpICYmIGZyYWdtZW50
ZWRGbG93ICYmICFmcmFnbWVudGVkRmxvdy0+aGFzRnJhZ21lbnRzKCk7CiAKICAgICAvLyBGaWd1
cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklY
TUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKLSAgICBib29sIGlzRnVsbExheW91dCA9ICFm
aXJzdFJvb3RCb3goKSB8fCBzZWxmTmVlZHNMYXlvdXQoKSB8fCByZWxheW91dENoaWxkcmVuIHx8
IGNsZWFyTGluZXNGb3JQYWdpbmF0aW9uOwotICAgIExpbmVMYXlvdXRTdGF0ZSBsYXlvdXRTdGF0
ZSgqdGhpcywgaXNGdWxsTGF5b3V0LCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxC
b3R0b20sIGZyYWdtZW50ZWRGbG93KTsKKyAgICBib29sIGlzRnVsbExheW91dCA9ICFmaXJzdFJv
b3RCb3goKSB8fCBtX2Zsb3cuc2VsZk5lZWRzTGF5b3V0KCkgfHwgcmVsYXlvdXRDaGlsZHJlbiB8
fCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbjsKKyAgICBMaW5lTGF5b3V0U3RhdGUgbGF5b3V0U3Rh
dGUobV9mbG93LCBpc0Z1bGxMYXlvdXQsIHJlcGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNh
bEJvdHRvbSwgZnJhZ21lbnRlZEZsb3cpOwogCiAgICAgaWYgKGlzRnVsbExheW91dCkKICAgICAg
ICAgbGluZUJveGVzKCkuZGVsZXRlTGluZUJveGVzKCk7CkBAIC0xNjU1LDE3ICsxNjcxLDE4IEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAgICAvLyBUZXh0IHRy
dW5jYXRpb24ga2lja3MgaW4gaW4gdHdvIGNhc2VzOgogICAgIC8vICAgICAxKSBJZiB5b3VyIG92
ZXJmbG93IGlzbid0IHZpc2libGUgYW5kIHlvdXIgdGV4dC1vdmVyZmxvdy1tb2RlIGlzbid0IGNs
aXAuCiAgICAgLy8gICAgIDIpIElmIHlvdSdyZSBhbiBhbm9ueW1vdXMgYmxvY2sgd2l0aCBhIGJs
b2NrIHBhcmVudCB0aGF0IHNhdGlzZmllcyAjMS4KLSAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRo
YXQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY2xpcHBlZCBtdXN0IGFsc28ga25vdyBob3cgdG8gdHJ1
bmNhdGUuICBUaGlzIGlzIGluc2FuZWx5CisgICAgLy8gRklYTUU6IENTUzMgc2F5cyB0aGF0IGRl
c2NlbmRhbnRzIHRoYXQgYXJlIGNsaXBwZWQgbXVzdCBhbHNvIGtub3cgaG93IHRvIHRydW5jYXRl
LiBUaGlzIGlzIGluc2FuZWx5CiAgICAgLy8gZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgaW4gZ2Vu
ZXJhbCAoZXNwZWNpYWxseSBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nIGxheW91dCksIHNvIHdlIG9u
bHkgaGFuZGxlIHRoZQogICAgIC8vIHNpbXBsZSBjYXNlIG9mIGFuIGFub255bW91cyBibG9jayB0
cnVuY2F0aW5nIHdoZW4gaXQncyBwYXJlbnQgaXMgY2xpcHBlZC4KLSAgICBib29sIGhhc1RleHRP
dmVyZmxvdyA9IChzdHlsZSgpLnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxvdzo6RWxsaXBz
aXMgJiYgaGFzT3ZlcmZsb3dDbGlwKCkpCi0gICAgICAgIHx8IChpc0Fub255bW91c0Jsb2NrKCkg
JiYgcGFyZW50KCkgJiYgcGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSAmJiBwYXJlbnQoKS0+c3R5
bGUoKS50ZXh0T3ZlcmZsb3coKSA9PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIHBhcmVudCgp
LT5oYXNPdmVyZmxvd0NsaXAoKSk7CisgICAgYXV0byogcGFyZW50ID0gbV9mbG93LnBhcmVudCgp
OworICAgIGJvb2wgaGFzVGV4dE92ZXJmbG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0g
VGV4dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBtX2Zsb3cuaGFzT3ZlcmZsb3dDbGlwKCkpCisgICAg
ICAgIHx8IChtX2Zsb3cuaXNBbm9ueW1vdXNCbG9jaygpICYmIHBhcmVudCAmJiBwYXJlbnQtPmlz
UmVuZGVyQmxvY2soKSAmJiBwYXJlbnQtPnN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4dE92
ZXJmbG93OjpFbGxpcHNpcyAmJiBwYXJlbnQtPmhhc092ZXJmbG93Q2xpcCgpKTsKIAogICAgIC8v
IFdhbGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlm
IHRoZXkgZXhpc3QuCiAgICAgaWYgKGhhc1RleHRPdmVyZmxvdykKLSAgICAgICAgIGRlbGV0ZUVs
bGlwc2lzTGluZUJveGVzKCk7CisgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CiAK
LSAgICBpZiAoZmlyc3RDaGlsZCgpKSB7CisgICAgaWYgKG1fZmxvdy5maXJzdENoaWxkKCkpIHsK
ICAgICAgICAgLy8gSW4gZnVsbCBsYXlvdXQgbW9kZSwgY2xlYXIgdGhlIGxpbmUgYm94ZXMgb2Yg
Y2hpbGRyZW4gdXBmcm9udC4gT3RoZXJ3aXNlLAogICAgICAgICAvLyBzaWJsaW5ncyBjYW4gcnVu
IGludG8gc3RhbGUgcm9vdCBsaW5lYm94ZXMgZHVyaW5nIGxheW91dC4gVGhlbiBsYXlvdXQKICAg
ICAgICAgLy8gdGhlIHJlcGxhY2VkIGVsZW1lbnRzIGxhdGVyLiBJbiBwYXJ0aWFsIGxheW91dCBt
b2RlLCBsaW5lIGJveGVzIGFyZSBub3QKQEAgLTE2NzMsNyArMTY5MCw3IEBAIHZvaWQgUmVuZGVy
QmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAgICAgICAgLy8gZWxlbWVudHMgYXQgdGhl
IHNhbWUgdGltZS4KICAgICAgICAgYm9vbCBoYXNJbmxpbmVDaGlsZCA9IGZhbHNlOwogICAgICAg
ICBWZWN0b3I8UmVuZGVyQm94Kj4gcmVwbGFjZWRDaGlsZHJlbjsKLSAgICAgICAgZm9yIChJbmxp
bmVXYWxrZXIgd2Fsa2VyKCp0aGlzKTsgIXdhbGtlci5hdEVuZCgpOyB3YWxrZXIuYWR2YW5jZSgp
KSB7CisgICAgICAgIGZvciAoSW5saW5lV2Fsa2VyIHdhbGtlcihtX2Zsb3cpOyAhd2Fsa2VyLmF0
RW5kKCk7IHdhbGtlci5hZHZhbmNlKCkpIHsKICAgICAgICAgICAgIFJlbmRlck9iamVjdCYgbyA9
ICp3YWxrZXIuY3VycmVudCgpOwogCiAgICAgICAgICAgICBpZiAoIWhhc0lubGluZUNoaWxkICYm
IG8uaXNJbmxpbmUoKSkKQEAgLTE2OTgsOCArMTcxNSw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93
OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91
dCAmJiBpczxSZW5kZXJSdWJ5UnVuPihib3gpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBGSVhNRTogVGhpcyByZXNldHMgdGhlIG92ZXJoYW5naW5nIG1hcmdpbnMgdGhhdCB3ZSBzZXQg
ZHVyaW5nIGxpbmUgbGF5b3V0IChzZWUgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0Zv
clNlZ21lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGEgbW9yZSBzdWl0YWJs
ZSBwbGFjZSBmb3IgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpblN0YXJ0
Rm9yQ2hpbGQoYm94LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmdpbkVuZEZv
ckNoaWxkKGJveCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Zsb3cuc2V0TWFyZ2lu
U3RhcnRGb3JDaGlsZChib3gsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbV9mbG93LnNl
dE1hcmdpbkVuZEZvckNoaWxkKGJveCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgICAgICAgYm94LmRpcnR5TGluZUJveGVzKGlzRnVsbExheW91dCk7CiAgICAgICAg
ICAgICAgICAgICAgIGlmIChpc0Z1bGxMYXlvdXQpCkBAIC0xNzE3LDcgKzE3MzQsNyBAQCB2b2lk
IFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvCiAgICAgICAgIH0KIAogICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcGxhY2VkQ2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0g
ICAgICAgICAgICAgcmVwbGFjZWRDaGlsZHJlbltpXS0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAg
ICAgICAgIHJlcGxhY2VkQ2hpbGRyZW5baV0tPmxheW91dElmTmVlZGVkKCk7CiAKICAgICAgICAg
bGF5b3V0UnVuc0FuZEZsb2F0cyhsYXlvdXRTdGF0ZSwgaGFzSW5saW5lQ2hpbGQpOwogICAgIH0K
QEAgLTE3MjUsNyArMTc0Miw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94
ZXMoYm8KICAgICAvLyBFeHBhbmQgdGhlIGxhc3QgbGluZSB0byBhY2NvbW1vZGF0ZSBSdWJ5IGFu
ZCBlbXBoYXNpcyBtYXJrcy4KICAgICBpbnQgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQg
PSAwOwogICAgIGlmIChsYXN0Um9vdEJveCgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgbG93ZXN0
QWxsb3dlZFBvc2l0aW9uID0gc3RkOjptYXgobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbSgpLCBs
b2dpY2FsSGVpZ2h0KCkgKyBwYWRkaW5nQWZ0ZXIoKSk7CisgICAgICAgIExheW91dFVuaXQgbG93
ZXN0QWxsb3dlZFBvc2l0aW9uID0gc3RkOjptYXgobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbSgp
LCBtX2Zsb3cubG9naWNhbEhlaWdodCgpICsgbV9mbG93LnBhZGRpbmdBZnRlcigpKTsKICAgICAg
ICAgaWYgKCFzdHlsZSgpLmlzRmxpcHBlZExpbmVzV3JpdGluZ01vZGUoKSkKICAgICAgICAgICAg
IGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gbGFzdFJvb3RCb3goKS0+Y29tcHV0ZVVu
ZGVyQW5ub3RhdGlvbkFkanVzdG1lbnQobG93ZXN0QWxsb3dlZFBvc2l0aW9uKTsKICAgICAgICAg
ZWxzZQpAQCAtMTczNiwxOSArMTc1MywxOSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0
TGluZUJveGVzKGJvCiAgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2VkIGJv
dHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uIFRoaXMgY29sbGFwc2UgaXMgb25seSBuZWNlc3NhcnkK
ICAgICAvLyBpZiBvdXIgbGFzdCBjaGlsZCB3YXMgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayB0
aGF0IG1pZ2h0IG5lZWQgdG8gcHJvcGFnYXRlIG1hcmdpbiBpbmZvcm1hdGlvbiBvdXQgdG8KICAg
ICAvLyB1cy4KLSAgICBMYXlvdXRVbml0IGFmdGVyRWRnZSA9IGJvcmRlckFuZFBhZGRpbmdBZnRl
cigpICsgc2Nyb2xsYmFyTG9naWNhbEhlaWdodCgpICsgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVz
dG1lbnQ7Ci0gICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBhZnRlckVkZ2Up
OworICAgIExheW91dFVuaXQgYWZ0ZXJFZGdlID0gbV9mbG93LmJvcmRlckFuZFBhZGRpbmdBZnRl
cigpICsgbV9mbG93LnNjcm9sbGJhckxvZ2ljYWxIZWlnaHQoKSArIGxhc3RMaW5lQW5ub3RhdGlv
bnNBZGp1c3RtZW50OworICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KG1fZmxvdy5sb2dpY2Fs
SGVpZ2h0KCkgKyBhZnRlckVkZ2UpOwogCi0gICAgaWYgKCFmaXJzdFJvb3RCb3goKSAmJiBoYXNM
aW5lSWZFbXB0eSgpKQotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSAr
IGxpbmVIZWlnaHQodHJ1ZSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IEhvcml6b250YWxM
aW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpKTsKKyAgICBp
ZiAoIWZpcnN0Um9vdEJveCgpICYmIG1fZmxvdy5oYXNMaW5lSWZFbXB0eSgpKQorICAgICAgICBt
X2Zsb3cuc2V0TG9naWNhbEhlaWdodChtX2Zsb3cubG9naWNhbEhlaWdodCgpICsgbV9mbG93Lmxp
bmVIZWlnaHQodHJ1ZSwgbV9mbG93LmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBIb3Jpem9u
dGFsTGluZSA6IFZlcnRpY2FsTGluZSwgUG9zaXRpb25PZkludGVyaW9yTGluZUJveGVzKSk7CiAK
LSAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbnkgbGluZXMgdGhhdCBzcGlsbCBvdXQgb2Ygb3VyIGJs
b2NrLiAgSWYgd2UgZG8sIHRoZW4gd2Ugd2lsbCBwb3NzaWJseSBuZWVkIHRvCisgICAgLy8gU2Vl
IGlmIHdlIGhhdmUgYW55IGxpbmVzIHRoYXQgc3BpbGwgb3V0IG9mIG91ciBibG9jay4gSWYgd2Ug
ZG8sIHRoZW4gd2Ugd2lsbCBwb3NzaWJseSBuZWVkIHRvCiAgICAgLy8gdHJ1bmNhdGUgdGV4dC4K
ICAgICBpZiAoaGFzVGV4dE92ZXJmbG93KQogICAgICAgICBjaGVja0xpbmVzRm9yVGV4dE92ZXJm
bG93KCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0SW5DbGVhbkxpbmUo
Um9vdElubGluZUJveCYgY2xlYW5MaW5lLCBSZW5kZXJCb3gmIGZsb2F0Qm94T25DbGVhbkxpbmUs
IEZsb2F0V2l0aFJlY3QmIG1hdGNoaW5nRmxvYXRXaXRoUmVjdCwKK3ZvaWQgQ29tcGxleExpbmVM
YXlvdXQ6OmNoZWNrRmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJl
bmRlckJveCYgZmxvYXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9h
dFdpdGhSZWN0LAogICAgIGJvb2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRC
eUZsb2F0KQogewogICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdEJv
eE9uQ2xlYW5MaW5lLnN0eWxlKCkuZGVsZXRpb25IYXNCZWd1bigpKTsKQEAgLTE3NjYsMTkgKzE3
ODMsMTkgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrRmxvYXRJbkNsZWFuTAogICAgIGlm
IChvcmlnaW5hbEZsb2F0UmVjdC5zaXplKCkgPT0gbmV3U2l6ZSAmJiAoZmxvYXRCb3hPbkNsZWFu
TGluZS5zdHlsZSgpLnN0eWxlVHlwZSgpICE9IFBzZXVkb0lkOjpGaXJzdExldHRlciB8fCAhZmxv
YXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLmluaXRpYWxMZXR0ZXJEcm9wKCkpKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBMYXlvdXRVbml0IGZsb2F0VG9wID0gaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSA/IG9yaWdpbmFsRmxvYXRSZWN0LnkoKSA6IG9yaWdpbmFsRmxvYXRSZWN0LngoKTsKLSAg
ICBMYXlvdXRVbml0IGZsb2F0SGVpZ2h0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IHN0
ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBuZXdTaXplLmhlaWdodCgpKQorICAg
IExheW91dFVuaXQgZmxvYXRUb3AgPSBtX2Zsb3cuaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/
IG9yaWdpbmFsRmxvYXRSZWN0LnkoKSA6IG9yaWdpbmFsRmxvYXRSZWN0LngoKTsKKyAgICBMYXlv
dXRVbml0IGZsb2F0SGVpZ2h0ID0gbV9mbG93LmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBz
dGQ6Om1heChvcmlnaW5hbEZsb2F0UmVjdC5oZWlnaHQoKSwgbmV3U2l6ZS5oZWlnaHQoKSkKICAg
ICAgICAgOiBzdGQ6Om1heChvcmlnaW5hbEZsb2F0UmVjdC53aWR0aCgpLCBuZXdTaXplLndpZHRo
KCkpOwogICAgIGZsb2F0SGVpZ2h0ID0gc3RkOjptaW4oZmxvYXRIZWlnaHQsIExheW91dFVuaXQ6
Om1heCgpIC0gZmxvYXRUb3ApOwogICAgIGNsZWFuTGluZS5tYXJrRGlydHkoKTsKLSAgICBtYXJr
TGluZXNEaXJ0eUluQmxvY2tSYW5nZShjbGVhbkxpbmUubGluZUJvdHRvbVdpdGhMZWFkaW5nKCks
IGZsb2F0VG9wICsgZmxvYXRIZWlnaHQsICZjbGVhbkxpbmUpOworICAgIG1fZmxvdy5tYXJrTGlu
ZXNEaXJ0eUluQmxvY2tSYW5nZShjbGVhbkxpbmUubGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGZs
b2F0VG9wICsgZmxvYXRIZWlnaHQsICZjbGVhbkxpbmUpOwogICAgIExheW91dFJlY3QgbmV3Rmxv
YXRSZWN0ID0gb3JpZ2luYWxGbG9hdFJlY3Q7CiAgICAgbmV3RmxvYXRSZWN0LnNldFNpemUobmV3
U2l6ZSk7CiAgICAgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LmFkanVzdFJlY3QobmV3RmxvYXRSZWN0
KTsKICAgICBkaXJ0aWVkQnlGbG9hdCA9IHRydWU7CiB9CiAKLVJvb3RJbmxpbmVCb3gqIFJlbmRl
ckJsb2NrRmxvdzo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQorUm9vdElubGluZUJveCogQ29t
cGxleExpbmVMYXlvdXQ6OmRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKIHsKICAgICBSb290SW5s
aW5lQm94KiBjdXJyZW50TGluZSA9IG51bGxwdHI7CiAgICAgUm9vdElubGluZUJveCogbGFzdExp
bmUgPSBudWxscHRyOwpAQCAtMTc4OCw3ICsxODA1LDcgQEAgUm9vdElubGluZUJveCogUmVuZGVy
QmxvY2tGbG93OjpkZXRlcm1pbgogICAgIGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKICAg
ICBpZiAoIWxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKSB7CiAgICAgICAgIC8vIFBhZ2luYXRl
IGFsbCBvZiB0aGUgY2xlYW4gbGluZXMuCi0gICAgICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygp
LmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFt
ZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAg
ICAgICAgYm9vbCBwYWdpbmF0ZWQgPSBsYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiBs
YXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKICAgICAgICAgTGF5
b3V0VW5pdCBwYWdpbmF0aW9uRGVsdGE7CiAgICAgICAgIGF1dG8gZmxvYXRzSXRlcmF0b3IgPSBm
bG9hdHMuYmVnaW4oKTsKICAgICAgICAgYXV0byBlbmQgPSBmbG9hdHMuZW5kKCk7CkBAIC0xODAw
LDEwICsxODE3LDEwIEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW4K
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbkRlbHRhIC09IGN1
cnJlbnRMaW5lLT5wYWdpbmF0aW9uU3RydXQoKTsKICAgICAgICAgICAgICAgICBib29sIG92ZXJm
bG93c0ZyYWdtZW50OwotICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2lu
YXRpb24oY3VycmVudExpbmUsIHBhZ2luYXRpb25EZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxh
eW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOworICAgICAgICAgICAgICAgIG1fZmxvdy5hZGp1
c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGN1cnJlbnRMaW5lLCBwYWdpbmF0aW9uRGVsdGEs
IG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKICAgICAg
ICAgICAgICAgICBpZiAocGFnaW5hdGlvbkRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChjb250YWluc0Zsb2F0cygpIHx8ICFmbG9hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAvLyBGSVhNRTogRG8gYmV0dGVyIGV2ZW50dWFsbHkuICBGb3Igbm93IGlmIHdl
IGV2ZXIgc2hpZnQgYmVjYXVzZSBvZiBwYWdpbmF0aW9uIGFuZCBmbG9hdHMgYXJlIHByZXNlbnQg
anVzdCBnbyB0byBhIGZ1bGwgbGF5b3V0LgorICAgICAgICAgICAgICAgICAgICBpZiAobV9mbG93
LmNvbnRhaW5zRmxvYXRzKCkgfHwgIWZsb2F0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBEbyBiZXR0ZXIgZXZlbnR1YWxseS4gRm9yIG5vdyBpZiB3ZSBl
dmVyIHNoaWZ0IGJlY2F1c2Ugb2YgcGFnaW5hdGlvbiBhbmQgZmxvYXRzIGFyZSBwcmVzZW50IGp1
c3QgZ28gdG8gYSBmdWxsIGxheW91dC4KICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFN0
YXRlLm1hcmtGb3JGdWxsTGF5b3V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg3Myw3ICsxODkwLDcgQEAgUm9vdElubGluZUJv
eCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbgogICAgIH0KIAogICAgIGlmICghZmxvYXRzLmlz
RW1wdHkoKSkgewotICAgICAgICBMYXlvdXRVbml0IHNhdmVkTG9naWNhbEhlaWdodCA9IGxvZ2lj
YWxIZWlnaHQoKTsKKyAgICAgICAgTGF5b3V0VW5pdCBzYXZlZExvZ2ljYWxIZWlnaHQgPSBtX2Zs
b3cubG9naWNhbEhlaWdodCgpOwogICAgICAgICAvLyBSZXN0b3JlIGZsb2F0cyBmcm9tIGNsZWFu
IGxpbmVzLgogICAgICAgICBSb290SW5saW5lQm94KiBsaW5lID0gZmlyc3RSb290Qm94KCk7CiAg
ICAgICAgIHdoaWxlIChsaW5lICE9IGN1cnJlbnRMaW5lKSB7CkBAIC0xODgxLDM5ICsxODk4LDM5
IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW4KICAgICAgICAgICAg
ICAgICBmb3IgKGF1dG8mIGZsb2F0aW5nQm94IDogKmNsZWFuTGluZUZsb2F0cykgewogICAgICAg
ICAgICAgICAgICAgICBpZiAoIWZsb2F0aW5nQm94KQogICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8qIGZsb2F0aW5nT2JqZWN0ID0gaW5z
ZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKKyAgICAgICAgICAgICAgICAgICAgYXV0
byogZmxvYXRpbmdPYmplY3QgPSBtX2Zsb3cuaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5n
Qm94KTsKICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJ
T04oIWZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7CiAgICAgICAgICAgICAgICAg
ICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRPcmlnaW5hdGluZ0xpbmUoKmxpbmUpOwotICAgICAgICAg
ICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxUb3BGb3JDaGlsZCgqZmxvYXRpbmdC
b3gpIC0gbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSk7Ci0gICAgICAgICAgICAg
ICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgIG1fZmxvdy5z
ZXRMb2dpY2FsSGVpZ2h0KG1fZmxvdy5sb2dpY2FsVG9wRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSAt
IG1fZmxvdy5tYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gpKTsKKyAgICAgICAgICAg
ICAgICAgICAgbV9mbG93LnBvc2l0aW9uTmV3RmxvYXRzKCk7CiAgICAgICAgICAgICAgICAgICAg
IGZsb2F0cy5zZXRMYXN0Q2xlYW5GbG9hdCgqZmxvYXRpbmdCb3gpOwogICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgp
OwogICAgICAgICB9Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQoc2F2ZWRMb2dpY2FsSGVpZ2h0
KTsKKyAgICAgICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQoc2F2ZWRMb2dpY2FsSGVpZ2h0KTsK
ICAgICB9CiAKICAgICBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnNldEZpcnN0TGluZSghbGFzdExp
bmUpOwogICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0UHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KCFsYXN0TGluZSB8fCBsYXN0TGluZS0+ZW5kc1dpdGhCcmVhaygpKTsKIAogICAgIGlmIChs
YXN0TGluZSkgewotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxhc3RMaW5lLT5saW5lQm90dG9t
V2l0aExlYWRpbmcoKSk7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVy
YXRvcih0aGlzLCBsYXN0TGluZS0+bGluZUJyZWFrT2JqKCksIGxhc3RMaW5lLT5saW5lQnJlYWtQ
b3MoKSk7CisgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KGxhc3RMaW5lLT5saW5lQm90
dG9tV2l0aExlYWRpbmcoKSk7CisgICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJ
dGVyYXRvcigmbV9mbG93LCBsYXN0TGluZS0+bGluZUJyZWFrT2JqKCksIGxhc3RMaW5lLT5saW5l
QnJlYWtQb3MoKSk7CiAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKGl0ZXIsIG51bWJlck9m
SXNvbGF0ZUFuY2VzdG9ycyhpdGVyKSk7CiAgICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhsYXN0
TGluZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpKTsKICAgICB9IGVsc2UgewogICAgICAgICBUZXh0
RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0eWxlKCkuZGlyZWN0aW9uKCk7CiAgICAgICAgIGlmIChz
dHlsZSgpLnVuaWNvZGVCaWRpKCkgPT0gUGxhaW50ZXh0KQotICAgICAgICAgICAgZGV0ZXJtaW5l
RGlyZWN0aW9uYWxpdHkoZGlyZWN0aW9uLCBJbmxpbmVJdGVyYXRvcih0aGlzLCBiaWRpRmlyc3RT
a2lwcGluZ0VtcHR5SW5saW5lcygqdGhpcyksIDApKTsKKyAgICAgICAgICAgIGRldGVybWluZURp
cmVjdGlvbmFsaXR5KGRpcmVjdGlvbiwgSW5saW5lSXRlcmF0b3IoJm1fZmxvdywgYmlkaUZpcnN0
U2tpcHBpbmdFbXB0eUlubGluZXMobV9mbG93KSwgMCkpOwogICAgICAgICByZXNvbHZlci5zZXRT
dGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rpb24sIGlzT3ZlcnJpZGUoc3R5bGUoKS51bmljb2RlQmlk
aSgpKSkpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0b3IodGhp
cywgYmlkaUZpcnN0U2tpcHBpbmdFbXB0eUlubGluZXMoKnRoaXMsICZyZXNvbHZlciksIDApOwor
ICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0b3IoJm1fZmxvdywgYmlk
aUZpcnN0U2tpcHBpbmdFbXB0eUlubGluZXMobV9mbG93LCAmcmVzb2x2ZXIpLCAwKTsKICAgICAg
ICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oaXRlciwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGl0
ZXIpKTsKICAgICB9CiAgICAgcmV0dXJuIGN1cnJlbnRMaW5lOwogfQogCi12b2lkIFJlbmRlckJs
b2NrRmxvdzo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3Rh
cnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpCit2b2lkIENvbXBsZXhMaW5lTGF5
b3V0OjpkZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBS
b290SW5saW5lQm94KiBzdGFydExpbmUsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwg
QmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cykKIHsKICAgICBhdXRvIGl0ZXJhdG9yRm9y
Rmlyc3REaXJ0eUZsb2F0ID0gW10oTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykg
ewogICAgICAgICBhdXRvIGxhc3RDbGVhbkZsb2F0ID0gZmxvYXRzLmxhc3RDbGVhbkZsb2F0KCk7
CkBAIC0xOTU2LDcgKzE5NzMsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5k
UG9zaXRpCiAgICAgLy8gQXQgdGhpcyBwb2ludCwgfGxhc3R8IGlzIHRoZSBmaXJzdCBsaW5lIGlu
IGEgcnVuIG9mIGNsZWFuIGxpbmVzIHRoYXQgZW5kcyB3aXRoIHRoZSBsYXN0IGxpbmUKICAgICAv
LyBpbiB0aGUgYmxvY2suCiAgICAgUm9vdElubGluZUJveCogcHJldmlvdXNMaW5lID0gbGFzdExp
bmUtPnByZXZSb290Qm94KCk7Ci0gICAgY2xlYW5MaW5lU3RhcnQgPSBJbmxpbmVJdGVyYXRvcih0
aGlzLCBwcmV2aW91c0xpbmUtPmxpbmVCcmVha09iaigpLCBwcmV2aW91c0xpbmUtPmxpbmVCcmVh
a1BvcygpKTsKKyAgICBjbGVhbkxpbmVTdGFydCA9IElubGluZUl0ZXJhdG9yKCZtX2Zsb3csIHBy
ZXZpb3VzTGluZS0+bGluZUJyZWFrT2JqKCksIHByZXZpb3VzTGluZS0+bGluZUJyZWFrUG9zKCkp
OwogICAgIGNsZWFuTGluZUJpZGlTdGF0dXMgPSBwcmV2aW91c0xpbmUtPmxpbmVCcmVha0JpZGlT
dGF0dXMoKTsKICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTG9naWNhbFRvcChwcmV2aW91c0xp
bmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKIApAQCAtMTk2NywxMSArMTk4NCwxMSBAQCB2
b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5kUG9zaXRpCiAgICAgbGF5b3V0U3RhdGUu
c2V0RW5kTGluZShsYXN0TGluZSk7CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2tGbG93OjpjaGVja1Bh
Z2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkK
K2Jvb2wgQ29tcGxleExpbmVMYXlvdXQ6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGlu
ZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogewotICAgIExheW91dFVuaXQgbGluZURl
bHRhID0gbG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsK
KyAgICBMYXlvdXRVbml0IGxpbmVEZWx0YSA9IG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkgLSBsYXlv
dXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgpOwogCi0gICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3
KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZy
YW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwor
ICAgIGJvb2wgcGFnaW5hdGVkID0gbGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgbGF5
b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7CiAgICAgaWYgKHBhZ2lu
YXRlZCAmJiBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKSB7CiAgICAgICAgIC8vIENoZWNr
IGFsbCBsaW5lcyBmcm9tIGhlcmUgdG8gdGhlIGVuZCwgYW5kIHNlZSBpZiB0aGUgaHlwb3RoZXRp
Y2FsIG5ldyBwb3NpdGlvbiBmb3IgdGhlIGxpbmVzIHdpbGwgcmVzdWx0CiAgICAgICAgIC8vIGlu
IGEgZGlmZmVyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoLgpAQCAtMTk4Miw3ICsxOTk5LDcgQEAg
Ym9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFuZAogICAgICAgICAgICAgICAg
IExheW91dFVuaXQgb2xkUGFnaW5hdGlvblN0cnV0ID0gbGluZUJveC0+cGFnaW5hdGlvblN0cnV0
KCk7CiAgICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVudDsKICAgICAgICAgICAg
ICAgICBsaW5lRGVsdGEgLT0gb2xkUGFnaW5hdGlvblN0cnV0OwotICAgICAgICAgICAgICAgIGFk
anVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgbGluZURlbHRhLCBvdmVyZmxv
d3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAgICAg
ICAgbV9mbG93LmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgbGluZURl
bHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CiAg
ICAgICAgICAgICAgICAgbGluZUJveC0+c2V0UGFnaW5hdGlvblN0cnV0KG9sZFBhZ2luYXRpb25T
dHJ1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobGluZVdpZHRoRm9yUGFnaW5h
dGVkTGluZUNoYW5nZWQobGluZUJveCwgbGluZURlbHRhLCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVk
RmxvdygpKSkKQEAgLTE5OTAsMTEgKzIwMDcsMTEgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNo
ZWNrUGFnaW5hdGlvbkFuZAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIGlmICghbGluZURl
bHRhIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICBpZiAoIWxpbmVEZWx0YSB8fCAhbV9mbG93
LmZsb2F0aW5nT2JqZWN0cygpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAKICAgICAvLyBT
ZWUgaWYgYW55IGZsb2F0cyBlbmQgaW4gdGhlIHJhbmdlIGFsb25nIHdoaWNoIHdlIHdhbnQgdG8g
c2hpZnQgdGhlIGxpbmVzIHZlcnRpY2FsbHkuCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0g
c3RkOjptaW4obG9naWNhbEhlaWdodCgpLCBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgp
KTsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBzdGQ6Om1pbihtX2Zsb3cubG9naWNhbEhl
aWdodCgpLCBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgpKTsKIAogICAgIFJvb3RJbmxp
bmVCb3gqIGxhc3RMaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwogICAgIHdoaWxlIChSb290
SW5saW5lQm94KiBuZXh0TGluZSA9IGxhc3RMaW5lLT5uZXh0Um9vdEJveCgpKQpAQCAtMjAwMiwz
MCArMjAxOSwzMCBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdpbmF0aW9uQW5kCiAK
ICAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20gPSBsYXN0TGluZS0+bGluZUJvdHRvbVdpdGhM
ZWFkaW5nKCkgKyBhYnNvbHV0ZVZhbHVlKGxpbmVEZWx0YSk7CiAKLSAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7
CisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG93
LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0
U2V0LmVuZCgpOwogICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgICBjb25zdCBhdXRvJiBmbG9hdGluZ09iamVjdCA9
ICppdC0+Z2V0KCk7Ci0gICAgICAgIGlmIChsb2dpY2FsQm90dG9tRm9yRmxvYXQoZmxvYXRpbmdP
YmplY3QpID49IGxvZ2ljYWxUb3AgJiYgbG9naWNhbEJvdHRvbUZvckZsb2F0KGZsb2F0aW5nT2Jq
ZWN0KSA8IGxvZ2ljYWxCb3R0b20pCisgICAgICAgIGlmIChtX2Zsb3cubG9naWNhbEJvdHRvbUZv
ckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA+PSBsb2dpY2FsVG9wICYmIG1fZmxvdy5sb2dpY2FsQm90
dG9tRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpIDwgbG9naWNhbEJvdHRvbSkKICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZW5k
ZXJCbG9ja0Zsb3c6OmxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVC
b3gqIHJvb3RCb3gsIExheW91dFVuaXQgbGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyog
ZnJhZ21lbnRlZEZsb3cpIGNvbnN0Citib29sIENvbXBsZXhMaW5lTGF5b3V0OjpsaW5lV2lkdGhG
b3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChSb290SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0
IGxpbmVEZWx0YSwgUmVuZGVyRnJhZ21lbnRlZEZsb3cqIGZyYWdtZW50ZWRGbG93KSBjb25zdAog
ewogICAgIGlmICghZnJhZ21lbnRlZEZsb3cpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAg
IFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBjdXJyZW50RnJhZ21lbnQgPSBmcmFnbWVudEF0Qmxv
Y2tPZmZzZXQocm9vdEJveC0+bGluZVRvcFdpdGhMZWFkaW5nKCkgKyBsaW5lRGVsdGEpOworICAg
IFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBjdXJyZW50RnJhZ21lbnQgPSBtX2Zsb3cuZnJhZ21l
bnRBdEJsb2NrT2Zmc2V0KHJvb3RCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygpICsgbGluZURlbHRh
KTsKICAgICAvLyBKdXN0IGJhaWwgaWYgdGhlIGZyYWdtZW50IGRpZG4ndCBjaGFuZ2UuCiAgICAg
aWYgKHJvb3RCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpID09IGN1cnJlbnRGcmFnbWVudCkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiByb290Qm94LT5wYWdpbmF0ZWRMaW5lV2lk
dGgoKSAhPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JDb250ZW50KGN1cnJlbnRGcmFnbWVudCk7
CisgICAgcmV0dXJuIHJvb3RCb3gtPnBhZ2luYXRlZExpbmVXaWR0aCgpICE9IG1fZmxvdy5hdmFp
bGFibGVMb2dpY2FsV2lkdGhGb3JDb250ZW50KGN1cnJlbnRGcmFnbWVudCk7CiB9CiAKLWJvb2wg
UmVuZGVyQmxvY2tGbG93OjptYXRjaGVkRW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0
YXRlLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVy
YXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBlbmRMaW5lU3RhdHVzKQorYm9v
bCBDb21wbGV4TGluZUxheW91dDo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5l
SXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cykK
IHsKICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3RhcnQpIHsKICAgICAg
ICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCkBAIC0yMDYxLDQ0ICsy
MDc4LDI5IEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93OjptYXRjaGVkRW5kTGluZShMaW4KICAgICBy
ZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6OmdlbmVyYXRlc0xpbmVCb3hlc0Zv
cklubGluZUNoaWxkKFJlbmRlck9iamVjdCogaW5saW5lT2JqKQordm9pZCBDb21wbGV4TGluZUxh
eW91dDo6YWRkT3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4oKQogewotICAgIEFTU0VSVChpbmxp
bmVPYmotPnBhcmVudCgpID09IHRoaXMpOwotCi0gICAgSW5saW5lSXRlcmF0b3IgaXQodGhpcywg
aW5saW5lT2JqLCAwKTsKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgY29ycmVjdCB2YWx1
ZSBmb3IgV2hpdGVzcGFjZVBvc2l0aW9uLgotICAgIHdoaWxlICghaXQuYXRFbmQoKSAmJiAhcmVx
dWlyZXNMaW5lQm94KGl0KSkKLSAgICAgICAgaXQuaW5jcmVtZW50KCk7Ci0KLSAgICByZXR1cm4g
IWl0LmF0RW5kKCk7Ci19CisgICAgQVNTRVJUKCFtX2Zsb3cuc2ltcGxlTGluZUxheW91dCgpKTsK
IAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkK
LXsKLSAgICBpZiAoYXV0byBsYXlvdXQgPSBzaW1wbGVMaW5lTGF5b3V0KCkpIHsKLSAgICAgICAg
QVNTRVJUKCFoYXNPdmVyZmxvd0NsaXAoKSk7Ci0gICAgICAgIFNpbXBsZUxpbmVMYXlvdXQ6OmNv
bGxlY3RGbG93T3ZlcmZsb3coKnRoaXMsICpsYXlvdXQpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIExheW91dFVuaXQgZW5kUGFkZGluZyA9IGhhc092ZXJmbG93Q2xpcCgpID8gcGFkZGlu
Z0VuZCgpIDogMF9sdTsKKyAgICBMYXlvdXRVbml0IGVuZFBhZGRpbmcgPSBtX2Zsb3cuaGFzT3Zl
cmZsb3dDbGlwKCkgPyBtX2Zsb3cucGFkZGluZ0VuZCgpIDogMF9sdTsKICAgICAvLyBGSVhNRTog
TmVlZCB0byBmaW5kIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMsIHNpbmNlIHNjcm9sbGJhcnMgY291
bGQgc2hvdyB3aGVuIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KLSAgICBpZiAoaGFzT3ZlcmZsb3dD
bGlwKCkgJiYgIWVuZFBhZGRpbmcgJiYgZWxlbWVudCgpICYmIGVsZW1lbnQoKS0+aXNSb290RWRp
dGFibGVFbGVtZW50KCkgJiYgc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAg
aWYgKG1fZmxvdy5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhZW5kUGFkZGluZyAmJiBtX2Zsb3cuZWxl
bWVudCgpICYmIG1fZmxvdy5lbGVtZW50KCktPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmIHN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQogICAgICAgICBlbmRQYWRkaW5nID0gMTsK
ICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3Vy
ciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgYWRkTGF5b3V0T3ZlcmZsb3coY3Vy
ci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0KGVuZFBhZGRpbmcpKTsKLSAgICAgICAgUmVuZGVy
RnJhZ21lbnRDb250YWluZXIqIGZyYWdtZW50ID0gZW5jbG9zaW5nRnJhZ21lbnRlZEZsb3coKSA/
IGN1cnItPmNvbnRhaW5pbmdGcmFnbWVudCgpIDogbnVsbHB0cjsKKyAgICAgICAgbV9mbG93LmFk
ZExheW91dE92ZXJmbG93KGN1cnItPnBhZGRlZExheW91dE92ZXJmbG93UmVjdChlbmRQYWRkaW5n
KSk7CisgICAgICAgIFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBmcmFnbWVudCA9IG1fZmxvdy5l
bmNsb3NpbmdGcmFnbWVudGVkRmxvdygpID8gY3Vyci0+Y29udGFpbmluZ0ZyYWdtZW50KCkgOiBu
dWxscHRyOwogICAgICAgICBpZiAoZnJhZ21lbnQpCi0gICAgICAgICAgICBmcmFnbWVudC0+YWRk
TGF5b3V0T3ZlcmZsb3dGb3JCb3godGhpcywgY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0
KGVuZFBhZGRpbmcpKTsKLSAgICAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSkgeworICAgICAg
ICAgICAgZnJhZ21lbnQtPmFkZExheW91dE92ZXJmbG93Rm9yQm94KCZtX2Zsb3csIGN1cnItPnBh
ZGRlZExheW91dE92ZXJmbG93UmVjdChlbmRQYWRkaW5nKSk7CisgICAgICAgIGlmICghbV9mbG93
Lmhhc092ZXJmbG93Q2xpcCgpKSB7CiAgICAgICAgICAgICBMYXlvdXRSZWN0IGNoaWxkVmlzdWFs
T3ZlcmZsb3dSZWN0ID0gY3Vyci0+dmlzdWFsT3ZlcmZsb3dSZWN0KGN1cnItPmxpbmVUb3AoKSwg
Y3Vyci0+bGluZUJvdHRvbSgpKTsKLSAgICAgICAgICAgIGFkZFZpc3VhbE92ZXJmbG93KGNoaWxk
VmlzdWFsT3ZlcmZsb3dSZWN0KTsKKyAgICAgICAgICAgIG1fZmxvdy5hZGRWaXN1YWxPdmVyZmxv
dyhjaGlsZFZpc3VhbE92ZXJmbG93UmVjdCk7CiAgICAgICAgICAgICBpZiAoZnJhZ21lbnQpCi0g
ICAgICAgICAgICAgICAgZnJhZ21lbnQtPmFkZFZpc3VhbE92ZXJmbG93Rm9yQm94KHRoaXMsIGNo
aWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC0+YWRkVmlz
dWFsT3ZlcmZsb3dGb3JCb3goJm1fZmxvdywgY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QpOwogICAg
ICAgICB9CiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBzaXNM
aW5lQm94ZXMoKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94
ZXMoKQogewogICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24o
KTsKICAgICBib29sIGx0ciA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwpAQCAt
MjEwOCw4ICsyMTEwLDggQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlwc2lzTGlu
ZQogICAgICAgICAgICAgY3Vyci0+Y2xlYXJUcnVuY2F0aW9uKCk7CiAKICAgICAgICAgICAgIC8v
IFNoaWZ0IHRoZSBsaW5lIGJhY2sgd2hlcmUgaXQgYmVsb25ncyBpZiB3ZSBjYW5ub3QgYWNjb21v
ZGF0ZSBhbiBlbGxpcHNpcy4KLSAgICAgICAgICAgIGZsb2F0IGxvZ2ljYWxMZWZ0ID0gbG9naWNh
bExlZnRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7Ci0g
ICAgICAgICAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBsb2dpY2FsUmlnaHRPZmZz
ZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgRG9Ob3RJbmRlbnRUZXh0KSAtIGxvZ2ljYWxMZWZ0
OworICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSBtX2Zsb3cubG9naWNhbExlZnRPZmZz
ZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgICAgICAg
ICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBtX2Zsb3cubG9naWNhbFJpZ2h0T2Zmc2V0
Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIERvTm90SW5kZW50VGV4dCkgLSBsb2dpY2FsTGVmdDsK
ICAgICAgICAgICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gY3Vyci0+bG9naWNhbFdpZHRo
KCk7CiAgICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWdu
LCBjdXJyLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCwgMCk7CiAKQEAgLTIxMjIsMTggKzIxMjQsMTggQEAgdm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmRlbGV0ZUVsbGlwc2lzTGluZQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y2hl
Y2tMaW5lc0ZvclRleHRPdmVyZmxvdygpCiB7CiAgICAgLy8gRGV0ZXJtaW5lIHRoZSB3aWR0aCBv
ZiB0aGUgZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KICAgICAvLyBGSVhNRTogQ1NT
MyBzYXlzIHRoaXMgaXMgY29uZmlndXJhYmxlLCBhbHNvIG5lZWQgdG8gdXNlIDB4MDAyRSAoRlVM
TCBTVE9QKSBpZiBob3Jpem9udGFsIGVsbGlwc2lzIGlzICJub3QgcmVuZGVyYWJsZSIKICAgICBj
b25zdCBGb250Q2FzY2FkZSYgZm9udCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKTsKICAgICBzdGF0
aWMgTmV2ZXJEZXN0cm95ZWQ8QXRvbVN0cmluZz4gZWxsaXBzaXNTdHIoJmhvcml6b250YWxFbGxp
cHNpcywgMSk7Ci0gICAgY29uc3QgRm9udENhc2NhZGUmIGZpcnN0TGluZUZvbnQgPSBmaXJzdExp
bmVTdHlsZSgpLmZvbnRDYXNjYWRlKCk7Ci0gICAgZmxvYXQgZmlyc3RMaW5lRWxsaXBzaXNXaWR0
aCA9IGZpcnN0TGluZUZvbnQud2lkdGgoY29uc3RydWN0VGV4dFJ1bigmaG9yaXpvbnRhbEVsbGlw
c2lzLCAxLCBmaXJzdExpbmVTdHlsZSgpKSk7Ci0gICAgZmxvYXQgZWxsaXBzaXNXaWR0aCA9IChm
b250ID09IGZpcnN0TGluZUZvbnQpID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA6IGZvbnQud2lk
dGgoY29uc3RydWN0VGV4dFJ1bigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxLCBzdHlsZSgpKSk7Cisg
ICAgY29uc3QgRm9udENhc2NhZGUmIGZpcnN0TGluZUZvbnQgPSBtX2Zsb3cuZmlyc3RMaW5lU3R5
bGUoKS5mb250Q2FzY2FkZSgpOworICAgIGZsb2F0IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggPSBm
aXJzdExpbmVGb250LndpZHRoKG1fZmxvdy5jb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9udGFsRWxs
aXBzaXMsIDEsIG1fZmxvdy5maXJzdExpbmVTdHlsZSgpKSk7CisgICAgZmxvYXQgZWxsaXBzaXNX
aWR0aCA9IChmb250ID09IGZpcnN0TGluZUZvbnQpID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA6
IGZvbnQud2lkdGgobV9mbG93LmNvbnN0cnVjdFRleHRSdW4oJmhvcml6b250YWxFbGxpcHNpcywg
MSwgc3R5bGUoKSkpOwogCiAgICAgLy8gRm9yIExUUiB0ZXh0IHRydW5jYXRpb24sIHdlIHdhbnQg
dG8gZ2V0IHRoZSByaWdodCBlZGdlIG9mIG91ciBwYWRkaW5nIGJveCwgYW5kIHRoZW4gd2Ugd2Fu
dCB0byBzZWUKLSAgICAvLyBpZiB0aGUgcmlnaHQgZWRnZSBvZiBhIGxpbmUgYm94IGV4Y2VlZHMg
dGhhdC4gIEZvciBSVEwsIHdlIHVzZSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBwYWRkaW5nIGJveCBh
bmQKKyAgICAvLyBpZiB0aGUgcmlnaHQgZWRnZSBvZiBhIGxpbmUgYm94IGV4Y2VlZHMgdGhhdC4g
Rm9yIFJUTCwgd2UgdXNlIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHBhZGRpbmcgYm94IGFuZAogICAg
IC8vIGNoZWNrIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94IHRvIHNlZSBpZiBpdCBpcyBs
ZXNzCiAgICAgLy8gSW5jbHVkZSB0aGUgc2Nyb2xsYmFyIGZvciBvdmVyZmxvdyBibG9ja3MsIHdo
aWNoIG1lYW5zIHdlIHdhbnQgdG8gdXNlICJjb250ZW50V2lkdGgoKSIKICAgICBib29sIGx0ciA9
IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwpAQCAtMjE0MSwxMiArMjE0MywxMiBA
QCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tMaW5lc0ZvclRleHRPCiAgICAgYm9vbCBmaXJz
dExpbmUgPSB0cnVlOwogICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJv
eCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewogICAgICAgICBJbmRlbnRU
ZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IGZpcnN0TGluZSA/IEluZGVudFRleHQgOiBEb05v
dEluZGVudFRleHQ7Ci0gICAgICAgIExheW91dFVuaXQgYmxvY2tSaWdodEVkZ2UgPSBsb2dpY2Fs
UmlnaHRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7Ci0g
ICAgICAgIExheW91dFVuaXQgYmxvY2tMZWZ0RWRnZSA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGlu
ZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOworICAgICAgICBMYXlvdXRVbml0
IGJsb2NrUmlnaHRFZGdlID0gbV9mbG93LmxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+
bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBibG9ja0xl
ZnRFZGdlID0gbV9mbG93LmxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCks
IHNob3VsZEluZGVudFRleHQpOwogICAgICAgICBMYXlvdXRVbml0IGxpbmVCb3hFZGdlIHsgbHRy
ID8gY3Vyci0+eCgpICsgY3Vyci0+bG9naWNhbFdpZHRoKCkgOiBjdXJyLT54KCkgfTsKICAgICAg
ICAgaWYgKChsdHIgJiYgbGluZUJveEVkZ2UgPiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFsdHIgJiYg
bGluZUJveEVkZ2UgPCBibG9ja0xlZnRFZGdlKSkgewotICAgICAgICAgICAgLy8gVGhpcyBsaW5l
IHNwaWxscyBvdXQgb2Ygb3VyIGJveCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiAgTm93
IHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBsaW5lCi0gICAgICAgICAgICAvLyBjYW4gYmUgdHJ1bmNh
dGVkLiAgSW4gb3JkZXIgZm9yIHRydW5jYXRpb24gdG8gYmUgcG9zc2libGUsIHRoZSBsaW5lIG11
c3QgaGF2ZSBzdWZmaWNpZW50IHNwYWNlIHRvCisgICAgICAgICAgICAvLyBUaGlzIGxpbmUgc3Bp
bGxzIG91dCBvZiBvdXIgYm94IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uIE5vdyB3ZSBu
ZWVkIHRvIHNlZSBpZiB0aGUgbGluZQorICAgICAgICAgICAgLy8gY2FuIGJlIHRydW5jYXRlZC4g
SW4gb3JkZXIgZm9yIHRydW5jYXRpb24gdG8gYmUgcG9zc2libGUsIHRoZSBsaW5lIG11c3QgaGF2
ZSBzdWZmaWNpZW50IHNwYWNlIHRvCiAgICAgICAgICAgICAvLyBhY2NvbW1vZGF0ZSBvdXIgdHJ1
bmNhdGlvbiBzdHJpbmcsIGFuZCBubyByZXBsYWNlZCBlbGVtZW50cyAoaW1hZ2VzLCB0YWJsZXMp
IGNhbiBvdmVybGFwIHRoZSBlbGxpcHNpcwogICAgICAgICAgICAgLy8gc3BhY2UuCiAgICAgICAg
ICAgICBMYXlvdXRVbml0IHdpZHRoIHsgZmlyc3RMaW5lID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0
aCA6IGVsbGlwc2lzV2lkdGggfTsKQEAgLTIxNTUsNyArMjE1Nyw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpjaGVja0xpbmVzRm9yVGV4dE8KICAgICAgICAgICAgICAgICBmbG9hdCB0b3RhbExv
Z2ljYWxXaWR0aCA9IGN1cnItPnBsYWNlRWxsaXBzaXMoZWxsaXBzaXNTdHIsIGx0ciwgYmxvY2tM
ZWZ0RWRnZSwgYmxvY2tSaWdodEVkZ2UsIHdpZHRoKTsKIAogICAgICAgICAgICAgICAgIGZsb2F0
IGxvZ2ljYWxMZWZ0ID0gMDsgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZGVsdGEg
ZnJvbSB0aGUgYmFzZSBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBmbG9hdCB0cnVuY2F0ZWRX
aWR0aCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91
bGRJbmRlbnRUZXh0KTsKKyAgICAgICAgICAgICAgICBmbG9hdCB0cnVuY2F0ZWRXaWR0aCA9IG1f
Zmxvdy5hdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxk
SW5kZW50VGV4dCk7CiAgICAgICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25t
ZW50KHRleHRBbGlnbiwgY3VyciwgbnVsbHB0ciwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdp
ZHRoLCB0cnVuY2F0ZWRXaWR0aCwgMCk7CiAgICAgICAgICAgICAgICAgaWYgKGx0cikKICAgICAg
ICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0aW9uKGxvZ2ljYWxMZWZ0LCAw
KTsKQEAgLTIxNjcsOSArMjE2OSw5IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0xpbmVz
Rm9yVGV4dE8KICAgICB9CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zs
b2F0T25MaW5lKGNvbnN0IEZsb2F0aW5nT2JqZWN0JiBuZXdGbG9hdCwgRmxvYXRpbmdPYmplY3Qq
IGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVJbmZvJiBsaW5lSW5mbywgTGluZVdpZHRo
JiB3aWR0aCkKK2Jvb2wgQ29tcGxleExpbmVMYXlvdXQ6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUo
Y29uc3QgRmxvYXRpbmdPYmplY3QmIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRoKQog
ewotICAgIGlmICghcG9zaXRpb25OZXdGbG9hdHMoKSkKKyAgICBpZiAoIW1fZmxvdy5wb3NpdGlv
bk5ld0Zsb2F0cygpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICB3aWR0aC5zaHJpbmtB
dmFpbGFibGVXaWR0aEZvck5ld0Zsb2F0SWZOZWVkZWQobmV3RmxvYXQpOwpAQCAtMjE4MCwxMyAr
MjE4MiwxMyBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRpb25OZXdGbG9hdE9uCiAgICAg
aWYgKCFuZXdGbG9hdC5wYWdpbmF0aW9uU3RydXQoKSB8fCAhbGluZUluZm8ucHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5KCkgfHwgIWxpbmVJbmZvLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHRy
dWU7CiAKLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBt
X2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZs
b2F0aW5nT2JqZWN0U2V0ID0gbV9mbG93LmZsb2F0aW5nT2JqZWN0cygpLT5zZXQoKTsKICAgICBB
U1NFUlQoZmxvYXRpbmdPYmplY3RTZXQubGFzdCgpLmdldCgpID09ICZuZXdGbG9hdCk7CiAKLSAg
ICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChuZXdGbG9h
dCk7CisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxUb3AgPSBtX2Zsb3cubG9naWNhbFRvcEZv
ckZsb2F0KG5ld0Zsb2F0KTsKICAgICBMYXlvdXRVbml0IHBhZ2luYXRpb25TdHJ1dCA9IG5ld0Zs
b2F0LnBhZ2luYXRpb25TdHJ1dCgpOwogCi0gICAgaWYgKGZsb2F0TG9naWNhbFRvcCAtIHBhZ2lu
YXRpb25TdHJ1dCAhPSBsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSW5mby5mbG9hdFBhZ2luYXRpb25T
dHJ1dCgpKQorICAgIGlmIChmbG9hdExvZ2ljYWxUb3AgLSBwYWdpbmF0aW9uU3RydXQgIT0gbV9m
bG93LmxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpCiAg
ICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVu
ZCgpOwpAQCAtMjE5NywxMiArMjE5OSwxMiBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRp
b25OZXdGbG9hdE9uCiAgICAgICAgIGF1dG8mIGZsb2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsK
ICAgICAgICAgaWYgKCZmbG9hdGluZ09iamVjdCA9PSBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
KQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChsb2dpY2FsVG9wRm9yRmxvYXQoZmxv
YXRpbmdPYmplY3QpID09IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZvLmZsb2F0UGFnaW5hdGlv
blN0cnV0KCkpIHsKKyAgICAgICAgaWYgKG1fZmxvdy5sb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRp
bmdPYmplY3QpID09IG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSW5mby5mbG9hdFBhZ2lu
YXRpb25TdHJ1dCgpKSB7CiAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC5zZXRQYWdpbmF0aW9u
U3RydXQocGFnaW5hdGlvblN0cnV0ICsgZmxvYXRpbmdPYmplY3QucGFnaW5hdGlvblN0cnV0KCkp
OwogICAgICAgICAgICAgUmVuZGVyQm94JiBmbG9hdEJveCA9IGZsb2F0aW5nT2JqZWN0LnJlbmRl
cmVyKCk7Ci0gICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoZmxvYXRCb3gsIGxvZ2lj
YWxUb3BGb3JDaGlsZChmbG9hdEJveCkgKyBtYXJnaW5CZWZvcmVGb3JDaGlsZChmbG9hdEJveCkg
KyBwYWdpbmF0aW9uU3RydXQpOworICAgICAgICAgICAgbV9mbG93LnNldExvZ2ljYWxUb3BGb3JD
aGlsZChmbG9hdEJveCwgbV9mbG93LmxvZ2ljYWxUb3BGb3JDaGlsZChmbG9hdEJveCkgKyBtX2Zs
b3cubWFyZ2luQmVmb3JlRm9yQ2hpbGQoZmxvYXRCb3gpICsgcGFnaW5hdGlvblN0cnV0KTsKIAot
ICAgICAgICAgICAgaWYgKHVwZGF0ZUZyYWdtZW50UmFuZ2VGb3JCb3hDaGlsZChmbG9hdEJveCkp
CisgICAgICAgICAgICBpZiAobV9mbG93LnVwZGF0ZUZyYWdtZW50UmFuZ2VGb3JCb3hDaGlsZChm
bG9hdEJveCkpCiAgICAgICAgICAgICAgICAgZmxvYXRCb3guc2V0TmVlZHNMYXlvdXQoTWFya09u
bHlUaGlzKTsKICAgICAgICAgICAgIGVsc2UgaWYgKGlzPFJlbmRlckJsb2NrPihmbG9hdEJveCkp
CiAgICAgICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyQmxvY2s+KGZsb2F0Qm94KS5zZXRDaGls
ZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CkBAIC0yMjEwLDEwICsyMjEyLDEwIEBAIGJvb2wg
UmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zsb2F0T24KIAogICAgICAgICAgICAgLy8gU2F2
ZSB0aGUgb2xkIGxvZ2ljYWwgdG9wIGJlZm9yZSBjYWxsaW5nIHJlbW92ZVBsYWNlZE9iamVjdCB3
aGljaCB3aWxsIHNldAogICAgICAgICAgICAgLy8gaXNQbGFjZWQgdG8gZmFsc2UuIE90aGVyd2lz
ZSBpdCB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0IGluIGxvZ2ljYWxUb3BGb3JGbG9hdC4KLSAgICAg
ICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChmbG9h
dGluZ09iamVjdCk7Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+cmVtb3ZlUGxhY2Vk
T2JqZWN0KCZmbG9hdGluZ09iamVjdCk7Ci0gICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yRmxv
YXQoZmxvYXRpbmdPYmplY3QsIG9sZExvZ2ljYWxUb3AgKyBwYWdpbmF0aW9uU3RydXQpOwotICAg
ICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZFBsYWNlZE9iamVjdCgmZmxvYXRpbmdPYmpl
Y3QpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbV9mbG93LmxvZ2lj
YWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCk7CisgICAgICAgICAgICBtX2Zsb3cuZmxvYXRp
bmdPYmplY3RzKCktPnJlbW92ZVBsYWNlZE9iamVjdCgmZmxvYXRpbmdPYmplY3QpOworICAgICAg
ICAgICAgbV9mbG93LnNldExvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCwgb2xkTG9n
aWNhbFRvcCArIHBhZ2luYXRpb25TdHJ1dCk7CisgICAgICAgICAgICBtX2Zsb3cuZmxvYXRpbmdP
YmplY3RzKCktPmFkZFBsYWNlZE9iamVjdCgmZmxvYXRpbmdPYmplY3QpOwogICAgICAgICB9CiAg
ICAgfQogCkBAIC0yMjIzLDcgKzIyMjUsNyBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6cG9zaXRp
b25OZXdGbG9hdE9uCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2tGbG93OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgcG9zaXRpb24sIElu
ZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KQorTGF5b3V0VW5pdCBDb21wbGV4TGluZUxh
eW91dDo6c3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJbmRl
bnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCkKIHsKICAgICBUZXh0QWxpZ25Nb2RlIHRleHRB
bGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7CiAgICAgYm9vbCBzaG91bGRBcHBseUluZGVudFRl
eHQgPSBmYWxzZTsKQEAgLTIyNDYsMzAgKzIyNDgsMzAgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9j
a0Zsb3c6OnN0YXJ0QWxpZ25lZAogICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xMjQ1MjIKICAgICAvLyBUaGlzIHF1aXJrIGlzIGZvciBsZWdhY3kgY29udGVu
dCB0aGF0IGRvZXNuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHRoZSBjZW50ZXIgcG9zaXRpb25pbmcg
c2NoZW1lCiAgICAgLy8gYmVpbmcgaG9ub3JlZCAoZS5nLiwgZXB1YnMpLgotICAgIGlmIChzaG91
bGRBcHBseUluZGVudFRleHQgfHwgc2V0dGluZ3MoKS51c2VMZWdhY3lUZXh0QWxpZ25Qb3NpdGlv
bmVkRWxlbWVudEJlaGF2aW9yKCkpIC8vIEZJWE1FOiBIYW5kbGUgVGV4dEFsaWduTW9kZTo6RW5k
IGhlcmUKLSAgICAgICAgcmV0dXJuIHN0YXJ0T2Zmc2V0Rm9yTGluZShwb3NpdGlvbiwgc2hvdWxk
SW5kZW50VGV4dCk7CisgICAgaWYgKHNob3VsZEFwcGx5SW5kZW50VGV4dCB8fCBtX2Zsb3cuc2V0
dGluZ3MoKS51c2VMZWdhY3lUZXh0QWxpZ25Qb3NpdGlvbmVkRWxlbWVudEJlaGF2aW9yKCkpIC8v
IEZJWE1FOiBIYW5kbGUgVGV4dEFsaWduTW9kZTo6RW5kIGhlcmUKKyAgICAgICAgcmV0dXJuIG1f
Zmxvdy5zdGFydE9mZnNldEZvckxpbmUocG9zaXRpb24sIHNob3VsZEluZGVudFRleHQpOwogCiAg
ICAgLy8gdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KCkgaGFuZGxlcyB0aGUgZGlyZWN0
aW9uIG9mIHRoZSBibG9jayBzbyBubyBuZWVkIHRvIGNvbnNpZGVyIGl0IGhlcmUKICAgICBmbG9h
dCB0b3RhbExvZ2ljYWxXaWR0aCA9IDA7Ci0gICAgZmxvYXQgbG9naWNhbExlZnQgPSBsb2dpY2Fs
TGVmdE9mZnNldEZvckxpbmUobG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpOwotICAg
IGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUo
bG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExlZnQ7CisgICAgZmxv
YXQgbG9naWNhbExlZnQgPSBtX2Zsb3cubG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKG1fZmxvdy5s
b2dpY2FsSGVpZ2h0KCksIERvTm90SW5kZW50VGV4dCk7CisgICAgZmxvYXQgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoID0gbV9mbG93LmxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUobV9mbG93LmxvZ2lj
YWxIZWlnaHQoKSwgRG9Ob3RJbmRlbnRUZXh0KSAtIGxvZ2ljYWxMZWZ0OwogCiAgICAgLy8gRklY
TUU6IEJ1ZyAxMjkzMTE6IFdlIG5lZWQgdG8gcGFzcyBhIHZhbGlkIFJvb3RJbmxpbmVCb3ggaGVy
ZSwgY29uc2lkZXJpbmcgdGhlIGJpZGkgbGV2ZWwgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGxpbmUu
CiAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgMCwgMCwgbG9n
aWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIDApOwog
CiAgICAgaWYgKCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgcmV0
dXJuIExheW91dFVuaXQobG9naWNhbFdpZHRoKCkgLSBsb2dpY2FsTGVmdCk7CisgICAgICAgIHJl
dHVybiBMYXlvdXRVbml0KG1fZmxvdy5sb2dpY2FsV2lkdGgoKSAtIGxvZ2ljYWxMZWZ0KTsKICAg
ICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsTGVmdCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tG
bG93Ojp1cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCkgY29uc3QK
K3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OnVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290SW5saW5l
Qm94KiBsaW5lQm94KSBjb25zdAogewogICAgIEFTU0VSVChsaW5lQm94KTsKIAotICAgIGlmICgh
aGFzRnJhZ21lbnRSYW5nZUluRnJhZ21lbnRlZEZsb3coKSkKKyAgICBpZiAoIW1fZmxvdy5oYXNG
cmFnbWVudFJhbmdlSW5GcmFnbWVudGVkRmxvdygpKQogICAgICAgICBsaW5lQm94LT5jbGVhckNv
bnRhaW5pbmdGcmFnbWVudCgpOwogICAgIGVsc2UgewotICAgICAgICBpZiAoYXV0byBjb250YWlu
aW5nRnJhZ21lbnQgPSBmcmFnbWVudEF0QmxvY2tPZmZzZXQobGluZUJveC0+bGluZVRvcFdpdGhM
ZWFkaW5nKCkpKQorICAgICAgICBpZiAoYXV0byBjb250YWluaW5nRnJhZ21lbnQgPSBtX2Zsb3cu
ZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KGxpbmVCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygpKSkKICAg
ICAgICAgICAgIGxpbmVCb3gtPnNldENvbnRhaW5pbmdGcmFnbWVudCgqY29udGFpbmluZ0ZyYWdt
ZW50KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgbGluZUJveC0+Y2xlYXJDb250YWluaW5n
RnJhZ21lbnQoKTsKQEAgLTIyODYsNCArMjI4OCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6
dXBkYXRlRnJhZ21lbnRGb3JMCiAgICAgICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VC
cmVhayh0cnVlKTsKIH0KIAorY29uc3QgUmVuZGVyU3R5bGUmIENvbXBsZXhMaW5lTGF5b3V0Ojpz
dHlsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZmxvdy5zdHlsZSgpOworfQorCitjb25zdCBG
cmFtZVZpZXdMYXlvdXRDb250ZXh0JiBDb21wbGV4TGluZUxheW91dDo6bGF5b3V0Q29udGV4dCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZmxvdy52aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29u
dGV4dCgpOworfQorCisKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21wbGV4
TGluZUxheW91dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21w
bGV4TGluZUxheW91dC5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9Db21wbGV4TGluZUxheW91dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJbmxpbmVGbG93Qm94LmgiCisj
aW5jbHVkZSAiTGluZVdpZHRoLmgiCisjaW5jbHVkZSAiUmVuZGVyTGluZUJveExpc3QuaCIKKyNp
bmNsdWRlICJSZW5kZXJTdHlsZUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIlRyYWlsaW5nT2JqZWN0
cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEJpZGlDb250ZXh0OworY2xhc3Mg
RmxvYXRpbmdPYmplY3Q7CitjbGFzcyBGbG9hdFdpdGhSZWN0OworY2xhc3MgRnJhbWVWaWV3TGF5
b3V0Q29udGV4dDsKK2NsYXNzIElubGluZUJveDsKK2NsYXNzIElubGluZUl0ZXJhdG9yOworY2xh
c3MgTGluZUluZm87CitjbGFzcyBMaW5lTGF5b3V0U3RhdGU7CitjbGFzcyBSZW5kZXJCbG9ja0Zs
b3c7CitjbGFzcyBSZW5kZXJPYmplY3Q7CitjbGFzcyBSZW5kZXJSdWJ5UnVuOworY2xhc3MgUm9v
dElubGluZUJveDsKK2NsYXNzIFZlcnRpY2FsUG9zaXRpb25DYWNoZTsKK3N0cnVjdCBCaWRpU3Rh
dHVzOworc3RydWN0IFdvcmRNZWFzdXJlbWVudDsKKwordGVtcGxhdGUgPGNsYXNzIFJ1bj4gY2xh
c3MgQmlkaVJ1bkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxXb3JkTWVhc3VyZW1lbnQsIDY0PiBXb3Jk
TWVhc3VyZW1lbnRzOworCitjbGFzcyBDb21wbGV4TGluZUxheW91dCB7CisgICAgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ29tcGxleExpbmVMYXlvdXQoUmVuZGVyQmxv
Y2tGbG93Jik7CisgICAgfkNvbXBsZXhMaW5lTGF5b3V0KCk7CisKKyAgICBSZW5kZXJMaW5lQm94
TGlzdCYgbGluZUJveGVzKCkgeyByZXR1cm4gbV9saW5lQm94ZXM7IH0KKyAgICBjb25zdCBSZW5k
ZXJMaW5lQm94TGlzdCYgbGluZUJveGVzKCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXM7IH0K
KworICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25j
YXN0PFJvb3RJbmxpbmVCb3g+KG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpKTsgfQorICAgIFJv
b3RJbmxpbmVCb3gqIGxhc3RSb290Qm94KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8Um9vdElu
bGluZUJveD4obV9saW5lQm94ZXMubGFzdExpbmVCb3goKSk7IH0KKworICAgIHZvaWQgbGF5b3V0
TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2lj
YWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKKworICAgIExheW91dFVu
aXQgc3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJbmRlbnRU
ZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgUm9vdElubGluZUJveCogY29uc3RydWN0
TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IExpbmVJbmZvJik7CisgICAgYm9vbCBw
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKGNvbnN0IEZsb2F0aW5nT2JqZWN0JiBuZXdGbG9hdCwgRmxv
YXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVJbmZvJiwgTGluZVdp
ZHRoJik7CisgICAgdm9pZCBhZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpOworCisgICAg
c3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiosIGlu
dCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0JiwgSW5saW5lQmlkaVJlc29sdmVyJik7CisK
K3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJ
bmxpbmVCb3goKTsKKyAgICBSb290SW5saW5lQm94KiBjcmVhdGVBbmRBcHBlbmRSb290SW5saW5l
Qm94KCk7CisgICAgc3RhdGljIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIo
UmVuZGVyT2JqZWN0KiwgYm9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNl
KTsKKyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgY29u
c3QgTGluZUluZm8mLCBJbmxpbmVCb3gqKTsKKyAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbm1l
bnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0OworICAgIHZvaWQgc2V0TWFy
Z2luc0ZvclJ1YnlSdW4oQmlkaVJ1biosIFJlbmRlclJ1YnlSdW4mLCBSZW5kZXJPYmplY3QqIHBy
ZXZpb3VzT2JqZWN0LCBjb25zdCBMaW5lSW5mbyYpOworICAgIHZvaWQgdXBkYXRlUnVieUZvckp1
c3RpZmllZFRleHQoUmVuZGVyUnVieVJ1biYsIEJpZGlSdW4mLCBjb25zdCBWZWN0b3I8dW5zaWdu
ZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQmIGV4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoLCBzaXplX3QmKTsKKyAgICB2b2lkIGNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZp
ZWRUZXh0KEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBjb25z
dCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQg
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JB
bGlnbm1lbnQoY29uc3QgVGV4dEFsaWduTW9kZSYsIGNvbnN0IFJvb3RJbmxpbmVCb3gqLCBCaWRp
UnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiB0b3RhbExv
Z2ljYWxXaWR0aCwgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaW50IGV4cGFuc2lvbk9w
cG9ydHVuaXR5Q291bnQpOworICAgIHZvaWQgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9u
c0ZvckxpbmUoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwgQmlkaVJ1biogZmlyc3RS
dW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwgR2x5cGhPdmVy
Zmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVh
c3VyZW1lbnRzJik7CisgICAgQmlkaVJ1biogY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9u
c0ZvclNlZ21lbnQoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwgVGV4dEFsaWduTW9k
ZSwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRp
UnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0Fu
ZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1l
bnRzJik7CisgICAgdm9pZCByZW1vdmVJbmxpbmVCb3goQmlkaVJ1biYsIGNvbnN0IFJvb3RJbmxp
bmVCb3gmKSBjb25zdDsKKyAgICB2b2lkIGNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0Zv
ckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5k
RmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYp
OworICAgIGlubGluZSBCaWRpUnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxC
aWRpUnVuPiYgYmlkaVJ1bnMsIEJpZGlDb250ZXh0KiBjdXJyZW50Q29udGV4dCk7CisgICAgdm9p
ZCBhcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QmKTsKKyAgICBS
b290SW5saW5lQm94KiBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxl
dmVsLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9y
JiBlbmQsIExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgQmlkaVJ1biogdHJhaWxp
bmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYpOworICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZs
b2F0cyhMaW5lTGF5b3V0U3RhdGUmLCBib29sIGhhc0lubGluZUNoaWxkKTsKKyAgICBpbmxpbmUg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShM
YXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwg
RmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNv
bHZlciYsICBjb25zdCBJbmxpbmVJdGVyYXRvciYgb2xkRW5kKTsKKyAgICB2b2lkIGxheW91dFJ1
bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYg
Y2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMp
OworICAgIHZvaWQgcmVhdHRhY2hDbGVhbkxpbmVGbG9hdHMoUm9vdElubGluZUJveCYgY2xlYW5M
aW5lLCBMYXlvdXRVbml0IGRlbHRhLCBib29sIGlzRmlyc3RDbGVhbkxpbmUpOworICAgIHZvaWQg
bGlua1RvRW5kTGluZUlmTmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYpOworICAgIHZvaWQgY2hlY2tG
bG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxpbmVCb3gmIGNsZWFuTGluZSwgUmVuZGVyQm94JiBmbG9h
dEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdpdGhSZWN0JiBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QsIGJv
b2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZsb2F0KTsKKyAgICBSb290
SW5saW5lQm94KiBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYsIElubGlu
ZUJpZGlSZXNvbHZlciYpOworICAgIHZvaWQgZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91
dFN0YXRlJiwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5M
aW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpOworICAgIGJvb2wgY2hl
Y2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYpOworICAgIGJv
b2wgbGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoUm9vdElubGluZUJveCogcm9vdEJv
eCwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRlckZyYWdtZW50ZWRGbG93KikgY29uc3Q7Cisg
ICAgYm9vbCBtYXRjaGVkRW5kTGluZShMaW5lTGF5b3V0U3RhdGUmLCBjb25zdCBJbmxpbmVCaWRp
UmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRp
U3RhdHVzJiBlbmRMaW5lU3RhdHVzKTsKKyAgICB2b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVz
KCk7CisgICAgdm9pZCBjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCk7CisgICAgdm9pZCB1cGRh
dGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCopIGNvbnN0OworCisgICAgY29uc3QgUmVu
ZGVyU3R5bGUmIHN0eWxlKCkgY29uc3Q7CisgICAgY29uc3QgRnJhbWVWaWV3TGF5b3V0Q29udGV4
dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0OworCisgICAgUmVuZGVyQmxvY2tGbG93JiBtX2Zsb3c7
CisgICAgUmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7Cit9OworCit9OwpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmgJKHJldmlzaW9uIDI0ODUwMCkK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCSh3b3JraW5nIGNv
cHkpCkBAIC01MzcsNyArNTM3LDcgQEAgcHVibGljOgogICAgICAgICAgICAgYWRkUGxhY2Vob2xk
ZXJSdW5Gb3JJc29sYXRlZElubGluZShyZXNvbHZlciwgb2JqLCBwb3MsIHJvb3QpOwogICAgICAg
ICB9CiAgICAgICAgIG1faGF2ZUFkZGVkRmFrZVJ1bkZvclJvb3RJc29sYXRlID0gdHJ1ZTsKLSAg
ICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9yT2JqZWN0KG51bGxwdHIsIHBvcywg
ZW5kLCBvYmosIHJlc29sdmVyKTsKKyAgICAgICAgQ29tcGxleExpbmVMYXlvdXQ6OmFwcGVuZFJ1
bnNGb3JPYmplY3QobnVsbHB0ciwgcG9zLCBlbmQsIG9iaiwgcmVzb2x2ZXIpOwogICAgIH0KIAog
cHJpdmF0ZToKQEAgLTU1OSw3ICs1NTksNyBAQCBpbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2
ZXI6OmFwcGVuZFJ1CiAgICAgICAgICAgICBpZiAoaXNvbGF0ZVRyYWNrZXIuaW5Jc29sYXRlKCkp
CiAgICAgICAgICAgICAgICAgaXNvbGF0ZVRyYWNrZXIuYWRkRmFrZVJ1bklmTmVjZXNzYXJ5KCpv
YmosIHN0YXJ0LCBvYmotPmxlbmd0aCgpLCAqbV9zb3Iucm9vdCgpLCAqdGhpcyk7CiAgICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9y
T2JqZWN0KCZtX3J1bnMsIHN0YXJ0LCBvYmotPmxlbmd0aCgpLCAqb2JqLCAqdGhpcyk7CisgICAg
ICAgICAgICAgICAgQ29tcGxleExpbmVMYXlvdXQ6OmFwcGVuZFJ1bnNGb3JPYmplY3QoJm1fcnVu
cywgc3RhcnQsIG9iai0+bGVuZ3RoKCksICpvYmosICp0aGlzKTsKICAgICAgICAgICAgIC8vIEZJ
WE1FOiBzdGFydC9vYmogc2hvdWxkIGJlIGFuIElubGluZUl0ZXJhdG9yIGluc3RlYWQgb2YgdHdv
IHNlcGFyYXRlIHZhcmlhYmxlcy4KICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAg
IG9iaiA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoKm1fc29yLnJvb3QoKSwgb2JqLCAm
aXNvbGF0ZVRyYWNrZXIpOwpAQCAtNTc1LDcgKzU3NSw3IEBAIGlubGluZSB2b2lkIElubGluZUJp
ZGlSZXNvbHZlcjo6YXBwZW5kUnUKICAgICAgICAgICAgIGlmIChpc29sYXRlVHJhY2tlci5pbklz
b2xhdGUoKSkKICAgICAgICAgICAgICAgICBpc29sYXRlVHJhY2tlci5hZGRGYWtlUnVuSWZOZWNl
c3NhcnkoKm9iaiwgc3RhcnQsIG9iai0+bGVuZ3RoKCksICptX3Nvci5yb290KCksICp0aGlzKTsK
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVu
ZFJ1bnNGb3JPYmplY3QoJm1fcnVucywgc3RhcnQsIGVuZCwgKm9iaiwgKnRoaXMpOworICAgICAg
ICAgICAgICAgIENvbXBsZXhMaW5lTGF5b3V0OjphcHBlbmRSdW5zRm9yT2JqZWN0KCZtX3J1bnMs
IHN0YXJ0LCBlbmQsICpvYmosICp0aGlzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1fZW9yLmlu
Y3JlbWVudCgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHJl
dmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xMTMsOCArMTEzLDYgQEAgcHVibGljOgogICAgIGJvb2wgaGFz
TWFyZ2luQmVmb3JlUXVpcmsoY29uc3QgUmVuZGVyQm94JiBjaGlsZCkgY29uc3Q7CiAgICAgYm9v
bCBoYXNNYXJnaW5BZnRlclF1aXJrKGNvbnN0IFJlbmRlckJveCYgY2hpbGQpIGNvbnN0OwogCi0g
ICAgYm9vbCBnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqKTsK
LQogICAgIHZvaWQgbWFya1Bvc2l0aW9uZWRPYmplY3RzRm9yTGF5b3V0KCk7CiAgICAgdm9pZCBt
YXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQoKSBvdmVycmlkZTsKICAgICAKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCShyZXZpc2lv
biAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgogCisjaW5jbHVkZSAiQ29tcGxleExpbmVMYXlv
dXQuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKICNpbmNsdWRlICJGbG9hdGluZ09iamVjdHMuaCIK
ICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtMTEwLDYgKzExMSw3IEBAIFJlbmRlckJsb2NrRmxvdzo6
UmVuZGVyQmxvY2tGbG93KEVsZW1lbnQKICAgICAsIG1fd2lkdGhGb3JUZXh0QXV0b3NpemluZygt
MSkKICAgICAsIG1fbGluZUNvdW50Rm9yVGV4dEF1dG9zaXppbmcoTk9UX1NFVCkKICNlbmRpZgor
ICAgICwgbV9jb21wbGV4TGluZUxheW91dCgqdGhpcykKIHsKICAgICBzZXRDaGlsZHJlbklubGlu
ZSh0cnVlKTsKIH0KQEAgLTEyMCw2ICsxMjIsNyBAQCBSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJs
b2NrRmxvdyhEb2N1bWVuCiAgICAgLCBtX3dpZHRoRm9yVGV4dEF1dG9zaXppbmcoLTEpCiAgICAg
LCBtX2xpbmVDb3VudEZvclRleHRBdXRvc2l6aW5nKE5PVF9TRVQpCiAjZW5kaWYKKyAgICAsIG1f
Y29tcGxleExpbmVMYXlvdXQoKnRoaXMpCiB7CiAgICAgc2V0Q2hpbGRyZW5JbmxpbmUodHJ1ZSk7
CiB9CkBAIC0xNTEsNyArMTU0LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OndpbGxCZURlc3Ry
b3llZCgpCiAgICAgICAgICAgICBwYXJlbnQoKS0+ZGlydHlMaW5lc0Zyb21DaGFuZ2VkQ2hpbGQo
KnRoaXMpOwogICAgIH0KIAotICAgIG1fbGluZUJveGVzLmRlbGV0ZUxpbmVCb3hlcygpOworICAg
IGxpbmVCb3hlcygpLmRlbGV0ZUxpbmVCb3hlcygpOwogCiAgICAgYmxvY2tXaWxsQmVEZXN0cm95
ZWQoKTsKIApAQCAtNjc0LDcgKzY3Nyw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRJ
bmxpbmVDaGlsZHIKICAgICB9CiAKICAgICBtX3NpbXBsZUxpbmVMYXlvdXQgPSBudWxscHRyOwot
ICAgIGxheW91dExpbmVCb3hlcyhyZWxheW91dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwg
cmVwYWludExvZ2ljYWxCb3R0b20pOworICAgIGNvbXBsZXhMaW5lTGF5b3V0KCkubGF5b3V0TGlu
ZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJlcGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNh
bEJvdHRvbSk7CiB9CiAKIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0NoaWxkKFJl
bmRlckJveCYgY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExheW91dFVuaXQmIHByZXZp
b3VzRmxvYXRMb2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20p
CkBAIC04OTYsNyArODk5LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZsb2F0aW5n
QmxvYwogdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9y
Q2hpbGQoUmVuZGVyQm94JiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBJbmRlbnRUZXh0
T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCkKIHsKICAgICBpZiAoY2hpbGQuc3R5bGUoKS5pc09yaWdp
bmFsRGlzcGxheUlubGluZVR5cGUoKSkKLSAgICAgICAgc2V0U3RhdGljSW5saW5lUG9zaXRpb25G
b3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcCwgc3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShsb2dp
Y2FsVG9wLCBzaG91bGRJbmRlbnRUZXh0KSk7CisgICAgICAgIHNldFN0YXRpY0lubGluZVBvc2l0
aW9uRm9yQ2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3AsIGNvbXBsZXhMaW5lTGF5b3V0KCkuc3RhcnRB
bGlnbmVkT2Zmc2V0Rm9yTGluZShsb2dpY2FsVG9wLCBzaG91bGRJbmRlbnRUZXh0KSk7CiAgICAg
ZWxzZQogICAgICAgICBzZXRTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGNoaWxkLCBsb2dp
Y2FsVG9wLCBzdGFydE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcCkpOwogfQpAQCAtMjA2NCwx
MCArMjA2NywxMCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlTGluZXMoKQogICAgICAg
ICBtX2Zsb2F0aW5nT2JqZWN0cy0+Y2xlYXJMaW5lQm94VHJlZVBvaW50ZXJzKCk7CiAKICAgICBp
ZiAobV9zaW1wbGVMaW5lTGF5b3V0KSB7Ci0gICAgICAgIEFTU0VSVCghbV9saW5lQm94ZXMuZmly
c3RMaW5lQm94KCkpOworICAgICAgICBBU1NFUlQoIWxpbmVCb3hlcygpLmZpcnN0TGluZUJveCgp
KTsKICAgICAgICAgbV9zaW1wbGVMaW5lTGF5b3V0ID0gbnVsbHB0cjsKICAgICB9IGVsc2UKLSAg
ICAgICAgbV9saW5lQm94ZXMuZGVsZXRlTGluZUJveFRyZWUoKTsKKyAgICAgICAgbGluZUJveGVz
KCkuZGVsZXRlTGluZUJveFRyZWUoKTsKIAogICAgIFJlbmRlckJsb2NrOjpkZWxldGVMaW5lcygp
OwogfQpAQCAtMjkwNCw3ICsyOTA3LDE4IEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93OjpoaXRUZXN0
SW5saW5lQ2hpbGQKICAgICBpZiAoYXV0byBzaW1wbGVMaW5lTGF5b3V0ID0gdGhpcy0+c2ltcGxl
TGluZUxheW91dCgpKQogICAgICAgICByZXR1cm4gU2ltcGxlTGluZUxheW91dDo6aGl0VGVzdEZs
b3coKnRoaXMsICpzaW1wbGVMaW5lTGF5b3V0LCByZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5D
b250YWluZXIsIGFjY3VtdWxhdGVkT2Zmc2V0LCBoaXRUZXN0QWN0aW9uKTsKIAotICAgIHJldHVy
biBtX2xpbmVCb3hlcy5oaXRUZXN0KHRoaXMsIHJlcXVlc3QsIHJlc3VsdCwgbG9jYXRpb25JbkNv
bnRhaW5lciwgYWNjdW11bGF0ZWRPZmZzZXQsIGhpdFRlc3RBY3Rpb24pOworICAgIHJldHVybiBs
aW5lQm94ZXMoKS5oaXRUZXN0KHRoaXMsIHJlcXVlc3QsIHJlc3VsdCwgbG9jYXRpb25JbkNvbnRh
aW5lciwgYWNjdW11bGF0ZWRPZmZzZXQsIGhpdFRlc3RBY3Rpb24pOworfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6YWRkT3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4oKQoreworICAgIGlmIChh
dXRvIHNpbXBsZUxpbmVMYXlvdXQgPSB0aGlzLT5zaW1wbGVMaW5lTGF5b3V0KCkpIHsKKyAgICAg
ICAgQVNTRVJUKCFoYXNPdmVyZmxvd0NsaXAoKSk7CisgICAgICAgIFNpbXBsZUxpbmVMYXlvdXQ6
OmNvbGxlY3RGbG93T3ZlcmZsb3coKnRoaXMsICpzaW1wbGVMaW5lTGF5b3V0KTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGNvbXBsZXhMaW5lTGF5b3V0KCkuYWRkT3ZlcmZsb3dGcm9t
SW5saW5lQ2hpbGRyZW4oKTsKIH0KIAogdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZvckJv
cmRlckZpdChMYXlvdXRVbml0IHgsIExheW91dFVuaXQmIGxlZnQsIExheW91dFVuaXQmIHJpZ2h0
KSBjb25zdApAQCAtMzQ4Niw3ICszNTAwLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnBhaW50
SW5saW5lQ2hpbGRyZQogICAgICAgICBTaW1wbGVMaW5lTGF5b3V0OjpwYWludEZsb3coKnRoaXMs
ICpzaW1wbGVMaW5lTGF5b3V0LCBwYWludEluZm8sIHBhaW50T2Zmc2V0KTsKICAgICAgICAgcmV0
dXJuOwogICAgIH0KLSAgICBtX2xpbmVCb3hlcy5wYWludCh0aGlzLCBwYWludEluZm8sIHBhaW50
T2Zmc2V0KTsKKyAgICBsaW5lQm94ZXMoKS5wYWludCh0aGlzLCBwYWludEluZm8sIHBhaW50T2Zm
c2V0KTsKIH0KIAogYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnJlbGF5b3V0Rm9yUGFnaW5hdGlvbigp
CkBAIC0zNTgxLDcgKzM1OTUsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0U2ltcGxl
TGluZXMoCiAgICAgfQogICAgIGZvciAoYXV0byYgcmVuZGVyZXIgOiBjaGlsZHJlbk9mVHlwZTxS
ZW5kZXJPYmplY3Q+KCp0aGlzKSkKICAgICAgICAgcmVuZGVyZXIuY2xlYXJOZWVkc0xheW91dCgp
OwotICAgIEFTU0VSVCghbV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCkpOworICAgIEFTU0VSVCgh
bGluZUJveGVzKCkuZmlyc3RMaW5lQm94KCkpOwogICAgIExheW91dFVuaXQgbGluZUxheW91dEhl
aWdodCA9IFNpbXBsZUxpbmVMYXlvdXQ6OmNvbXB1dGVGbG93SGVpZ2h0KCp0aGlzLCAqbV9zaW1w
bGVMaW5lTGF5b3V0KTsKICAgICBMYXlvdXRVbml0IGxpbmVMYXlvdXRUb3AgPSBib3JkZXJBbmRQ
YWRkaW5nQmVmb3JlKCk7CiAgICAgcmVwYWludExvZ2ljYWxUb3AgPSBsaW5lTGF5b3V0VG9wOwpA
QCAtMzYyNywxNCArMzY0MSwxNCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZW5zdXJlTGluZUJv
eGVzKCkKICAgICBMYXlvdXRVbml0IHJlcGFpbnRMb2dpY2FsQm90dG9tOwogICAgIGlmIChpc1Bh
Z2luYXRlZCkgewogICAgICAgICBQYWdpbmF0ZWRMYXlvdXRTdGF0ZU1haW50YWluZXIgc3RhdGUo
KnRoaXMpOwotICAgICAgICBsYXlvdXRMaW5lQm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWlu
dExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKKyAgICAgICAgY29tcGxleExpbmVM
YXlvdXQoKS5sYXlvdXRMaW5lQm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWludExvZ2ljYWxU
b3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHJlbGF5
b3V0VG9Bdm9pZFdpZG93cy4KICAgICAgICAgaWYgKHNob3VsZEJyZWFrQXRMaW5lVG9Bdm9pZFdp
ZG93KCkpCi0gICAgICAgICAgICBsYXlvdXRMaW5lQm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVw
YWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKKyAgICAgICAgICAgIGNvbXBs
ZXhMaW5lTGF5b3V0KCkubGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJlcGFpbnRM
b2dpY2FsVG9wLCByZXBhaW50TG9naWNhbEJvdHRvbSk7CiAgICAgICAgIC8vIEZJWE1FOiBUaGlz
IGlzIG5lZWRlZCBhcyBsb25nIGFzIHNpbXBsZSBhbmQgbm9ybWFsIGxpbmUgbGF5b3V0IHByb2R1
Y2UgZGlmZmVyZW50IGxpbmUgYnJlYWtpbmdzLgogICAgICAgICByZXBhaW50KCk7CiAgICAgfSBl
bHNlCi0gICAgICAgIGxheW91dExpbmVCb3hlcyhyZWxheW91dENoaWxkcmVuLCByZXBhaW50TG9n
aWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20pOworICAgICAgICBjb21wbGV4TGluZUxheW91
dCgpLmxheW91dExpbmVCb3hlcyhyZWxheW91dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwg
cmVwYWludExvZ2ljYWxCb3R0b20pOwogCiAgICAgdXBkYXRlTG9naWNhbEhlaWdodCgpOwogICAg
IEFTU0VSVChkaWROZWVkTGF5b3V0IHx8IGxvZ2ljYWxIZWlnaHQoKSA9PSBvbGRIZWlnaHQpOwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkocmV2aXNp
b24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5o
CSh3b3JraW5nIGNvcHkpCkBAIC0yMiw2ICsyMiw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5j
bHVkZSAiQ29tcGxleExpbmVMYXlvdXQuaCIKICNpbmNsdWRlICJGbG9hdGluZ09iamVjdHMuaCIK
ICNpbmNsdWRlICJMaW5lV2lkdGguaCIKICNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgpAQCAtMzIs
MTcgKzMzLDEwIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRmxvYXRXaXRoUmVj
dDsKIGNsYXNzIExpbmVCcmVha2VyOwotY2xhc3MgTGluZUluZm87CiBjbGFzcyBSZW5kZXJNdWx0
aUNvbHVtbkZsb3c7CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogCi1zdHJ1Y3QgV29yZE1lYXN1cmVt
ZW50OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUnVuPiBjbGFzcyBCaWRpUnVuTGlzdDsKLXR5cGVkZWYg
VmVjdG9yPFdvcmRNZWFzdXJlbWVudCwgNjQ+IFdvcmRNZWFzdXJlbWVudHM7Ci0KICNpZiBFTkFC
TEUoVEVYVF9BVVRPU0laSU5HKQogZW51bSBMaW5lQ291bnQgewogICAgIE5PVF9TRVQgPSAwLCBO
T19MSU5FID0gMSwgT05FX0xJTkUgPSAyLCBNVUxUSV9MSU5FID0gMwpAQCAtMzMyLDExICszMjYs
MTEgQEAgcHVibGljOgogCiAgICAgTGF5b3V0UG9pbnQgZmxpcEZsb2F0Rm9yV3JpdGluZ01vZGVG
b3JDaGlsZChjb25zdCBGbG9hdGluZ09iamVjdCYsIGNvbnN0IExheW91dFBvaW50JikgY29uc3Q7
CiAKLSAgICBSZW5kZXJMaW5lQm94TGlzdCYgbGluZUJveGVzKCkgeyByZXR1cm4gbV9saW5lQm94
ZXM7IH0KLSAgICBjb25zdCBSZW5kZXJMaW5lQm94TGlzdCYgbGluZUJveGVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9saW5lQm94ZXM7IH0KKyAgICBSZW5kZXJMaW5lQm94TGlzdCYgbGluZUJveGVzKCkg
eyByZXR1cm4gbV9jb21wbGV4TGluZUxheW91dC5saW5lQm94ZXMoKTsgfQorICAgIGNvbnN0IFJl
bmRlckxpbmVCb3hMaXN0JiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2NvbXBsZXhMaW5l
TGF5b3V0LmxpbmVCb3hlcygpOyB9CiAKLSAgICBSb290SW5saW5lQm94KiBmaXJzdFJvb3RCb3go
KSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxSb290SW5saW5lQm94PihtX2xpbmVCb3hlcy5maXJz
dExpbmVCb3goKSk7IH0KLSAgICBSb290SW5saW5lQm94KiBsYXN0Um9vdEJveCgpIGNvbnN0IHsg
cmV0dXJuIGRvd25jYXN0PFJvb3RJbmxpbmVCb3g+KG1fbGluZUJveGVzLmxhc3RMaW5lQm94KCkp
OyB9CisgICAgUm9vdElubGluZUJveCogZmlyc3RSb290Qm94KCkgY29uc3QgeyByZXR1cm4gbV9j
b21wbGV4TGluZUxheW91dC5maXJzdFJvb3RCb3goKTsgfQorICAgIFJvb3RJbmxpbmVCb3gqIGxh
c3RSb290Qm94KCkgY29uc3QgeyByZXR1cm4gbV9jb21wbGV4TGluZUxheW91dC5sYXN0Um9vdEJv
eCgpOyB9CiAKICAgICBib29sIGhhc0xpbmVzKCkgY29uc3Q7CiAgICAgdm9pZCBpbnZhbGlkYXRl
TGluZUxheW91dFBhdGgoKSBmaW5hbDsKQEAgLTQ4NCw4ICs0NzgsOCBAQCBwcml2YXRlOgogICAg
IC8vIENhbGxlZCBmcm9tIGxpbmVXaWR0aCwgdG8gcG9zaXRpb24gdGhlIGZsb2F0cyBhZGRlZCBp
biB0aGUgbGFzdCBsaW5lLgogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBpdCBo
YXMgcG9zaXRpb25lZCBhbnkgZmxvYXRzLgogICAgIGJvb2wgcG9zaXRpb25OZXdGbG9hdHMoKTsK
LQogICAgIHZvaWQgY2xlYXJGbG9hdHMoQ2xlYXIpOworICAgIEZsb2F0aW5nT2JqZWN0cyogZmxv
YXRpbmdPYmplY3RzKCkgeyByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMuZ2V0KCk7IH0KIAogICAg
IExheW91dFVuaXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9n
aWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0
KSBjb25zdCBvdmVycmlkZTsKICAgICBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRG
b3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5
b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KSBjb25zdCBvdmVycmlkZTsKQEAgLTUyMyw2MyArNTE3LDE3
IEBAIHByaXZhdGU6CiAgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9yUG9pbnRXaXRoSW5s
aW5lQ2hpbGRyZW4oY29uc3QgTGF5b3V0UG9pbnQmIHBvaW50SW5Mb2dpY2FsQ29udGVudHMsIGNv
bnN0IFJlbmRlckZyYWdtZW50Q29udGFpbmVyKikgb3ZlcnJpZGU7CiAgICAgdm9pZCBhZGRGb2N1
c1JpbmdSZWN0c0ZvcklubGluZUNoaWxkcmVuKFZlY3RvcjxMYXlvdXRSZWN0PiYgcmVjdHMsIGNv
bnN0IExheW91dFBvaW50JiBhZGRpdGlvbmFsT2Zmc2V0LCBjb25zdCBSZW5kZXJMYXllck1vZGVs
T2JqZWN0Kikgb3ZlcnJpZGU7CiAKLS8vIEZJWE1FLUJMT0NLRkxPVzogVGhlc2UgbWV0aG9kcyBo
YXZlIGltcGxlbWVudGF0aW9ucyBpbgotLy8gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LiBUaGV5IHNo
b3VsZCBiZSBtb3ZlZCB0byB0aGUgcHJvcGVyIGhlYWRlciBvbmNlIHRoZQotLy8gbGluZSBsYXlv
dXQgY29kZSBpcyBzZXBhcmF0ZWQgZnJvbSBSZW5kZXJCbG9jayBhbmQgUmVuZGVyQmxvY2tGbG93
LgotLy8gU1RBUlQgTUVUSE9EUyBERUZJTkVEIElOIFJlbmRlckJsb2NrTGluZUxheW91dAogcHVi
bGljOgotICAgIHN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxpc3Q8Qmlk
aVJ1bj4qLCBpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCYsIElubGluZUJpZGlSZXNv
bHZlciYpOwotICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3go
KTsKKyAgICBDb21wbGV4TGluZUxheW91dCYgY29tcGxleExpbmVMYXlvdXQoKSB7IHJldHVybiBt
X2NvbXBsZXhMaW5lTGF5b3V0OyB9CiAKLSAgICBMYXlvdXRVbml0IHN0YXJ0QWxpZ25lZE9mZnNl
dEZvckxpbmUoTGF5b3V0VW5pdCBwb3NpdGlvbiwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVu
dFRleHQpOwotICAgIHZpcnR1YWwgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ25tZW50Rm9yTGluZShi
b29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdDsKKyAgICB2aXJ0dWFsIE9wdGlvbmFsPFRleHRB
bGlnbk1vZGU+IG92ZXJyaWRlVGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCAvKiBlbmRzV2l0aFNv
ZnRCcmVhayAqLykgY29uc3QgeyByZXR1cm4geyB9OyB9CiAgICAgdmlydHVhbCB2b2lkIGFkanVz
dElubGluZURpcmVjdGlvbkxpbmVCb3VuZHMoaW50IC8qIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQgKi8sIGZsb2F0JiAvKiBsb2dpY2FsTGVmdCAqLywgZmxvYXQmIC8qIGxvZ2ljYWxXaWR0aCAq
LykgY29uc3QgeyB9Ci0gICAgUm9vdElubGluZUJveCogY29uc3RydWN0TGluZShCaWRpUnVuTGlz
dDxCaWRpUnVuPiYsIGNvbnN0IExpbmVJbmZvJik7CiAKLXByaXZhdGU6ICAgICAgICAKLSAgICB2
b2lkIGFkanVzdEludHJpbnNpY0xvZ2ljYWxXaWR0aHNGb3JDb2x1bW5zKExheW91dFVuaXQmIG1p
bkxvZ2ljYWxXaWR0aCwgTGF5b3V0VW5pdCYgbWF4TG9naWNhbFdpZHRoKSBjb25zdDsKLQotICAg
IHZvaWQgbGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYg
cmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKK3By
aXZhdGU6CiAgICAgdm9pZCBsYXlvdXRTaW1wbGVMaW5lcyhib29sIHJlbGF5b3V0Q2hpbGRyZW4s
IExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsVG9wLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNh
bEJvdHRvbSk7CiAKLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBj
cmVhdGVSb290SW5saW5lQm94KCk7IC8vIFN1YmNsYXNzZWQgYnkgUmVuZGVyU1ZHVGV4dC4KLSAg
ICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgY29uc3QgTGlu
ZUluZm8mLCBJbmxpbmVCb3gqIGNoaWxkQm94KTsKLSAgICB2b2lkIHNldE1hcmdpbnNGb3JSdWJ5
UnVuKEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVuJiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgTGluZUlu
Zm8mKTsKLSAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJv
b3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVu
KiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1lYXN1cmVtZW50cyYp
OwotICAgIHZvaWQgdXBkYXRlUnVieUZvckp1c3RpZmllZFRleHQoUmVuZGVyUnVieVJ1biYsIEJp
ZGlSdW4mLCBjb25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGll
cywgdW5zaWduZWQmIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2lj
YWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGV4cGFuc2lvbklu
ZGV4KTsKLSAgICB2b2lkIGNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRUZXh0KEJpZGlSdW4q
IGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBjb25zdCBWZWN0b3I8dW5zaWdu
ZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCwgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCk7Ci0gICAgQmlkaVJ1biogY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0Zv
clNlZ21lbnQoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwgVGV4dEFsaWduTW9kZSwg
ZmxvYXQmIGxvZ2ljYWxMZWZ0LAotICAgICAgICBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRo
LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVy
Zmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlQmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBCaWRpUnVuKiwgR2x5cGhPdmVyZmxv
d0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmKTsKLSAgICBCaWRp
UnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIEJpZGlDb250
ZXh0Kik7Ci0gICAgdm9pZCBhcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdP
YmplY3QmKTsKLSAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGxheW91dElubGluZUNoaWxkcmVu
KCkKLSAgICBSb290SW5saW5lQm94KiBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWdu
ZWQgYmlkaUxldmVsLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IElubGluZUl0ZXJhdG9y
JiBlbmQsIExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgQmlkaVJ1biogdHJhaWxp
bmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYpOwotICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZs
b2F0cyhMaW5lTGF5b3V0U3RhdGUmLCBib29sIGhhc0lubGluZUNoaWxkKTsKLSAgICBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgcmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVu
aXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRp
bmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYs
ICBjb25zdCBJbmxpbmVJdGVyYXRvciYpOwotICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0c0lu
UmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5l
SXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRp
U3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgdm9pZCBy
ZWF0dGFjaENsZWFuTGluZUZsb2F0cyhSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIExheW91dFVu
aXQgZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFuTGluZSk7Ci0gICAgdm9pZCBsaW5rVG9FbmRMaW5l
SWZOZWVkZWQoTGluZUxheW91dFN0YXRlJik7Ci0gICAgdm9pZCBjaGVja0Zsb2F0SW5DbGVhbkxp
bmUoUm9vdElubGluZUJveCYgY2xlYW5MaW5lLCBSZW5kZXJCb3gmIGZsb2F0Qm94T25DbGVhbkxp
bmUsIEZsb2F0V2l0aFJlY3QmIG1hdGNoaW5nRmxvYXRXaXRoUmVjdCwKLSAgICAgICAgYm9vbCYg
ZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5RmxvYXQpOwotICAgIFJvb3RJbmxp
bmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlk
aVJlc29sdmVyJik7Ci0gICAgdm9pZCBkZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0U3Rh
dGUmLCBSb290SW5saW5lQm94KiBzdGFydEJveCwgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0
YXJ0LCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKLSAgICBib29sIGNoZWNrUGFn
aW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmKTsKLSAgICBib29sIG1h
dGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYsIGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVu
ZExpbmVTdGF0dXMpOwotICAgIHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKLSAgICB2
b2lkIGNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKLSAgICAvLyBQb3NpdGlvbnMgbmV3IGZs
b2F0cyBhbmQgYWxzbyBhZGp1c3QgYWxsIGZsb2F0cyBlbmNvdW50ZXJlZCBvbiB0aGUgbGluZSBp
ZiBhbnkgb2YgdGhlbQotICAgIC8vIGhhdmUgdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlL2NvbHVt
bi4KLSAgICBib29sIHBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoY29uc3QgRmxvYXRpbmdPYmplY3Qm
IG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGlu
ZUluZm8mLCBMaW5lV2lkdGgmKTsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB0
ZXN0IGEgbGluZSBib3ggdGhhdCBoYXMgbW92ZWQgaW4gdGhlIGJsb2NrIGRpcmVjdGlvbiB0byBz
ZWUgaWYgaXQgaGFzIGVuZGVkIHVwIGluIGEgbmV3Ci0gICAgLy8gcGFnZS9jb2x1bW4gdGhhdCBo
YXMgYSBkaWZmZXJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGggdGhhbiB0aGUgb2xkIG9uZS4gVXNl
ZCB0byBrbm93IHdoZW4geW91IGhhdmUgdG8gZGlydHkgYQotICAgIC8vIGxpbmUsIGkuZS4sIHRo
YXQgaXQgY2FuJ3QgYmUgcmUtdXNlZC4KLSAgICBib29sIGxpbmVXaWR0aEZvclBhZ2luYXRlZExp
bmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqLCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVyRnJh
Z21lbnRlZEZsb3cqKSBjb25zdDsKLSAgICB2b2lkIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdu
bWVudChjb25zdCBUZXh0QWxpZ25Nb2RlJiwgY29uc3QgUm9vdElubGluZUJveCosIEJpZGlSdW4q
IHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIHRvdGFsTG9naWNh
bFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpbnQgZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCk7Ci0vLyBFTkQgTUVUSE9EUyBERUZJTkVEIElOIFJlbmRlckJsb2NrTGluZUxh
eW91dAotCisgICAgdm9pZCBhZGp1c3RJbnRyaW5zaWNMb2dpY2FsV2lkdGhzRm9yQ29sdW1ucyhM
YXlvdXRVbml0JiBtaW5Mb2dpY2FsV2lkdGgsIExheW91dFVuaXQmIG1heExvZ2ljYWxXaWR0aCkg
Y29uc3Q7CiAgICAgdm9pZCBjb21wdXRlSW5saW5lUHJlZmVycmVkTG9naWNhbFdpZHRocyhMYXlv
dXRVbml0JiBtaW5Mb2dpY2FsV2lkdGgsIExheW91dFVuaXQmIG1heExvZ2ljYWxXaWR0aCkgY29u
c3Q7Ci0KICAgICB2b2lkIGFkanVzdEluaXRpYWxMZXR0ZXJQb3NpdGlvbihSZW5kZXJCb3gmIGNo
aWxkQm94LCBMYXlvdXRVbml0JiBsb2dpY2FsVG9wT2Zmc2V0LCBMYXlvdXRVbml0JiBtYXJnaW5C
ZWZvcmVPZmZzZXQpOwogCiAjaWYgRU5BQkxFKFRFWFRfQVVUT1NJWklORykKQEAgLTU4OCwxMiAr
NTM2LDkgQEAgcHJpdmF0ZTogICAgICAgIAogI2VuZGlmCiAgICAgdm9pZCBzZXRTZWxlY3Rpb25T
dGF0ZShTZWxlY3Rpb25TdGF0ZSkgZmluYWw7CiAKLSAgICB2b2lkIHJlbW92ZUlubGluZUJveChC
aWRpUnVuJiwgY29uc3QgUm9vdElubGluZUJveCYpIGNvbnN0OwotCiBwdWJsaWM6CiAgICAgLy8g
RklYTUUtQkxPQ0tGTE9XOiBUaGVzZSBjYW4gYmUgbWFkZSBwcm90ZWN0ZWQgYWdhaW4gb25jZSBh
bGwgY2FsbGVycyBoYXZlIGJlZW4gbW92ZWQgaGVyZS4KICAgICB2b2lkIGFkanVzdExpbmVQb3Np
dGlvbkZvclBhZ2luYXRpb24oUm9vdElubGluZUJveCosIExheW91dFVuaXQmIGRlbHRhT2Zmc2V0
LCBib29sJiBvdmVyZmxvd3NGcmFnbWVudCwgUmVuZGVyRnJhZ21lbnRlZEZsb3cqKTsgLy8gQ29t
cHV0ZXMgYSBkZWx0YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0
aGUgbmV4dCBwYWdlIGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAg
dm9pZCB1cGRhdGVGcmFnbWVudEZvckxpbmUoUm9vdElubGluZUJveCopIGNvbnN0OwogCiAgICAg
Ly8gUGFnaW5hdGlvbiByb3V0aW5lcy4KICAgICBib29sIHJlbGF5b3V0Rm9yUGFnaW5hdGlvbigp
OwpAQCAtNjE2LDExICs1NjEsMTQgQEAgcHVibGljOgogcHJvdGVjdGVkOgogICAgIHN0ZDo6dW5p
cXVlX3B0cjxGbG9hdGluZ09iamVjdHM+IG1fZmxvYXRpbmdPYmplY3RzOwogICAgIHN0ZDo6dW5p
cXVlX3B0cjxSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YT4gbV9yYXJlQmxvY2tGbG93RGF0YTsKLSAg
ICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsKKworICAgIC8vIEZJWE1FOiBPbmx5IG9u
ZSBvZiB0aGVzZSBzaG91bGQgYmUgbmVlZGVkIGF0IGFueSBnaXZlbiB0aW1lLgorICAgIENvbXBs
ZXhMaW5lTGF5b3V0IG1fY29tcGxleExpbmVMYXlvdXQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFNp
bXBsZUxpbmVMYXlvdXQ6OkxheW91dD4gbV9zaW1wbGVMaW5lTGF5b3V0OwogCiAgICAgZnJpZW5k
IGNsYXNzIExpbmVCcmVha2VyOwogICAgIGZyaWVuZCBjbGFzcyBMaW5lV2lkdGg7IC8vIE5lZWRz
IHRvIGtub3cgRmxvYXRpbmdPYmplY3QKKyAgICBmcmllbmQgY2xhc3MgQ29tcGxleExpbmVMYXlv
dXQ7CiB9OwogCiBpbmxpbmUgY29uc3QgU2ltcGxlTGluZUxheW91dDo6TGF5b3V0KiBSZW5kZXJC
bG9ja0Zsb3c6OnNpbXBsZUxpbmVMYXlvdXQoKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDI0
ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQu
Y3BwCShub25leGlzdGVudCkKQEAgLTEsMjI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMs
IDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwg
cmlnaHQgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZh
bWlkb3dAZ21haWwuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5j
LiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRl
ICJBWE9iamVjdENhY2hlLmgiCi0jaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCi0jaW5jbHVkZSAi
QnJlYWtpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdPYmplY3RzLmgiCi0jaW5jbHVk
ZSAiSFRNTFBhcnNlcklkaW9tcy5oIgotI2luY2x1ZGUgIklubGluZUVsZW1lbnRCb3guaCIKLSNp
bmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgotI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKLSNp
bmNsdWRlICJJbmxpbmVUZXh0Qm94U3R5bGUuaCIKLSNpbmNsdWRlICJMaW5lTGF5b3V0U3RhdGUu
aCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCi0j
aW5jbHVkZSAiUmVuZGVyRnJhZ21lbnRDb250YWluZXIuaCIKLSNpbmNsdWRlICJSZW5kZXJGcmFn
bWVudGVkRmxvdy5oIgotI2luY2x1ZGUgIlJlbmRlckxheW91dFN0YXRlLmgiCi0jaW5jbHVkZSAi
UmVuZGVyTGluZUJyZWFrLmgiCi0jaW5jbHVkZSAiUmVuZGVyUnVieUJhc2UuaCIKLSNpbmNsdWRl
ICJSZW5kZXJSdWJ5VGV4dC5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJT
VkdSb290SW5saW5lQm94LmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTaW1w
bGVMaW5lTGF5b3V0RnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiVHJhaWxpbmdGbG9hdHNSb290SW5s
aW5lQm94LmgiCi0jaW5jbHVkZSAiVmVydGljYWxQb3NpdGlvbkNhY2hlLmgiCi0jaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLXN0YXRpYyB2b2lk
IGRldGVybWluZURpcmVjdGlvbmFsaXR5KFRleHREaXJlY3Rpb24mIGRpciwgSW5saW5lSXRlcmF0
b3IgaXRlcikKLXsKLSAgICB3aGlsZSAoIWl0ZXIuYXRFbmQoKSkgewotICAgICAgICBpZiAoaXRl
ci5hdFBhcmFncmFwaFNlcGFyYXRvcigpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBp
ZiAoVUNoYXIgY3VycmVudCA9IGl0ZXIuY3VycmVudCgpKSB7Ci0gICAgICAgICAgICBVQ2hhckRp
cmVjdGlvbiBjaGFyRGlyZWN0aW9uID0gdV9jaGFyRGlyZWN0aW9uKGN1cnJlbnQpOwotICAgICAg
ICAgICAgaWYgKGNoYXJEaXJlY3Rpb24gPT0gVV9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAg
ICAgICAgZGlyID0gVGV4dERpcmVjdGlvbjo6TFRSOwotICAgICAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFyRGlyZWN0aW9uID09IFVfUklHSFRf
VE9fTEVGVCB8fCBjaGFyRGlyZWN0aW9uID09IFVfUklHSFRfVE9fTEVGVF9BUkFCSUMpIHsKLSAg
ICAgICAgICAgICAgICBkaXIgPSBUZXh0RGlyZWN0aW9uOjpSVEw7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGl0ZXIuaW5jcmVtZW50
KCk7Ci0gICAgfQotfQotCi1pbmxpbmUgc3RkOjp1bmlxdWVfcHRyPEJpZGlSdW4+IGNyZWF0ZVJ1
bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCYgb2JqLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyKQotewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEJpZGlSdW4+KHN0
YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSk7Ci19Ci0K
LXZvaWQgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJp
ZGlSdW4+KiBydW5zLCBpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCYgb2JqLCBJbmxp
bmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQotewotICAgIGlmIChzdGFydCA+IGVuZCB8fCBzaG91
bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KG9iaikpCi0gICAgICAgIHJldHVybjsKLQotICAg
IExpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlJiBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdT
dGF0ZSA9IHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKTsKLSAgICBib29sIGhh
dmVOZXh0VHJhbnNpdGlvbiA9IChsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5jdXJyZW50
VHJhbnNpdGlvbigpIDwgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUubnVtVHJhbnNpdGlv
bnMoKSk7Ci0gICAgSW5saW5lSXRlcmF0b3IgbmV4dFRyYW5zaXRpb247Ci0gICAgaWYgKGhhdmVO
ZXh0VHJhbnNpdGlvbikKLSAgICAgICAgbmV4dFRyYW5zaXRpb24gPSBsaW5lV2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZS50cmFuc2l0aW9ucygpW2xpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRl
LmN1cnJlbnRUcmFuc2l0aW9uKCldOwotICAgIGlmIChsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdT
dGF0ZS5iZXR3ZWVuVHJhbnNpdGlvbnMoKSkgewotICAgICAgICBpZiAoIWhhdmVOZXh0VHJhbnNp
dGlvbiB8fCAoJm9iaiAhPSBuZXh0VHJhbnNpdGlvbi5yZW5kZXJlcigpKSkKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBzdGFydCBwb2ludC4gU3RvcCBpZ25v
cmluZyBvYmplY3RzIGFuZAotICAgICAgICAvLyBhZGp1c3Qgb3VyIHN0YXJ0LgotICAgICAgICBz
dGFydCA9IG5leHRUcmFuc2l0aW9uLm9mZnNldCgpOwotICAgICAgICBsaW5lV2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZS5pbmNyZW1lbnRDdXJyZW50VHJhbnNpdGlvbigpOwotICAgICAgICBpZiAo
c3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgIGFwcGVuZFJ1bnNGb3JPYmplY3QocnVucywgc3Rh
cnQsIGVuZCwgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWhhdmVOZXh0VHJhbnNpdGlvbiB8fCAoJm9iaiAh
PSBuZXh0VHJhbnNpdGlvbi5yZW5kZXJlcigpKSkgewotICAgICAgICAgICAgaWYgKHJ1bnMpCi0g
ICAgICAgICAgICAgICAgcnVucy0+YXBwZW5kUnVuKGNyZWF0ZVJ1bihzdGFydCwgZW5kLCBvYmos
IHJlc29sdmVyKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBBbiBlbmQgdHJhbnNpdGlvbiBoYXMgYmVlbiBlbmNvdW50ZXJlZCB3aXRoaW4gb3VyIG9iamVj
dC4gV2UgbmVlZCB0byBhcHBlbmQgYSBydW4gd2l0aCBvdXIgZW5kcG9pbnQuCi0gICAgICAgIGlm
IChzdGF0aWNfY2FzdDxpbnQ+KG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSkgPD0gZW5kKSB7
Ci0gICAgICAgICAgICBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5pbmNyZW1lbnRDdXJy
ZW50VHJhbnNpdGlvbigpOwotICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGUgbGluZSBpcyBi
ZWZvcmUgdGhlIG9iamVjdCB3ZSdyZSBpbnNwZWN0aW5nLiBTa2lwIGV2ZXJ5dGhpbmcgYW5kIHJl
dHVybgotICAgICAgICAgICAgaWYgKG5leHRUcmFuc2l0aW9uLnJlZmVyc1RvRW5kT2ZQcmV2aW91
c05vZGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoc3RhdGlj
X2Nhc3Q8aW50PihuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEpID4gc3RhcnQgJiYgcnVucykK
LSAgICAgICAgICAgICAgICBydW5zLT5hcHBlbmRSdW4oY3JlYXRlUnVuKHN0YXJ0LCBuZXh0VHJh
bnNpdGlvbi5vZmZzZXQoKSArIDEsIG9iaiwgcmVzb2x2ZXIpKTsKLSAgICAgICAgICAgIGFwcGVu
ZFJ1bnNGb3JPYmplY3QocnVucywgbmV4dFRyYW5zaXRpb24ub2Zmc2V0KCkgKyAxLCBlbmQsIG9i
aiwgcmVzb2x2ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHJ1bnMpCi0gICAgICAgICAgICBydW5z
LT5hcHBlbmRSdW4oY3JlYXRlUnVuKHN0YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIpKTsKLSAgICB9
Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBSZW5kZXJCbG9ja0Zsb3c6OmNy
ZWF0ZVJvb3RJbmxpbmVCb3goKQotewotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFJvb3RJ
bmxpbmVCb3g+KCp0aGlzKTsKLX0KLQotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93Ojpj
cmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCkKLXsKLSAgICBhdXRvIG5ld1Jvb3RCb3ggPSBj
cmVhdGVSb290SW5saW5lQm94KCk7Ci0gICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IG5ld1Jv
b3RCb3guZ2V0KCk7Ci0gICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveChXVEZNb3ZlKG5ld1Jv
b3RCb3gpKTsKLQotICAgIGlmIChVTkxJS0VMWShBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5
RW5hYmxlZCgpKSAmJiBmaXJzdFJvb3RCb3goKSA9PSByb290Qm94KSB7Ci0gICAgICAgIGlmIChB
WE9iamVjdENhY2hlKiBjYWNoZSA9IGRvY3VtZW50KCkuZXhpc3RpbmdBWE9iamVjdENhY2hlKCkp
Ci0gICAgICAgICAgICBjYWNoZS0+ZGVmZXJSZWNvbXB1dGVJc0lnbm9yZWQoZWxlbWVudCgpKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gcm9vdEJveDsKLX0KLQotc3RhdGljIGlubGluZSBJbmxpbmVC
b3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGJv
b2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSkKLXsKLSAgICBpZiAoaXNS
b290TGluZUJveCkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlckJsb2NrRmxvdz4oKnJl
bmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7Ci0KLSAgICBpZiAoaXM8UmVu
ZGVyVGV4dD4oKnJlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlclRleHQ+
KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lVGV4dEJveCgpOwotCi0gICAgaWYgKGlzPFJlbmRlckJv
eD4oKnJlbmRlcmVyKSkgewotICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyB0ZXJyaWJsZS4gVGhp
cyBicmFuY2ggcmV0dXJucyBhbiAqb3duZWQqIHBvaW50ZXIhCi0gICAgICAgIHJldHVybiBkb3du
Y2FzdDxSZW5kZXJCb3g+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lQm94KCkucmVsZWFzZSgpOwot
ICAgIH0KLQotICAgIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KCpyZW5kZXJlcikpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFRoaXMgaXMgdGVycmlibGUuIFRoaXMgYnJhbmNoIHJldHVybnMgYW4gKm93
bmVkKiBwb2ludGVyIQotICAgICAgICBhdXRvIGlubGluZUJveCA9IGRvd25jYXN0PFJlbmRlckxp
bmVCcmVhaz4oKnJlbmRlcmVyKS5jcmVhdGVJbmxpbmVCb3goKS5yZWxlYXNlKCk7Ci0gICAgICAg
IC8vIFdlIG9ubHkgdHJlYXQgYSBib3ggYXMgdGV4dCBmb3IgYSA8YnI+IGlmIHdlIGFyZSBvbiBh
IGxpbmUgYnkgb3Vyc2VsZiBvciBpbiBzdHJpY3QgbW9kZQotICAgICAgICAvLyAoTm90ZSB0aGUg
dXNlIG9mIHN0cmljdCBtb2RlLiBJbiAiYWxtb3N0IHN0cmljdCIgbW9kZSwgd2UgZG9uJ3QgdHJl
YXQgdGhlIGJveCBmb3IgPGJyPiBhcyB0ZXh0LikKLSAgICAgICAgaW5saW5lQm94LT5zZXRCZWhh
dmVzTGlrZVRleHQoaXNPbmx5UnVuIHx8IHJlbmRlcmVyLT5kb2N1bWVudCgpLmluTm9RdWlya3NN
b2RlKCkgfHwgcmVuZGVyZXItPmlzTGluZUJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAgIHJl
dHVybiBpbmxpbmVCb3g7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlcklubGlu
ZT4oKnJlbmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCk7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVyKFJlbmRlck9iamVjdCYgcmVu
ZGVyZXIsIGJvb2wgZnVsbExheW91dCkKLXsKLSAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVy
ZXIpKSB7Ci0gICAgICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQgPSBkb3duY2FzdDxSZW5kZXJU
ZXh0PihyZW5kZXJlcik7Ci0gICAgICAgIHVwZGF0ZUNvdW50ZXJJZk5lZWRlZChyZW5kZXJUZXh0
KTsKLSAgICAgICAgcmVuZGVyVGV4dC5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKLSAgICB9
IGVsc2UgaWYgKGlzPFJlbmRlckxpbmVCcmVhaz4ocmVuZGVyZXIpKQotICAgICAgICBkb3duY2Fz
dDxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKS5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsK
LSAgICBlbHNlCi0gICAgICAgIGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpLmRpcnR5
TGluZUJveGVzKGZ1bGxMYXlvdXQpOwotfQotCi1zdGF0aWMgYm9vbCBwYXJlbnRJc0NvbnN0cnVj
dGVkT3JIYXZlTmV4dChJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3gpCi17Ci0gICAgZG8gewotICAg
ICAgICBpZiAocGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwgcGFyZW50Qm94LT5uZXh0T25M
aW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcGFyZW50Qm94ID0gcGFy
ZW50Qm94LT5wYXJlbnQoKTsKLSAgICB9IHdoaWxlIChwYXJlbnRCb3gpOwotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94
ZXMoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgSW5saW5lQm94
KiBjaGlsZEJveCkKLXsKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbiB1bmNvbnN0cnVjdGVkIGxp
bmUgYm94IGZvciB0aGlzIG9iamVjdCB0aGF0IGlzIGFsc28KLSAgICAvLyB0aGUgbGFzdCBpdGVt
IG9uIHRoZSBsaW5lLgotICAgIHVuc2lnbmVkIGxpbmVEZXB0aCA9IDE7Ci0gICAgSW5saW5lRmxv
d0JveCogcGFyZW50Qm94ID0gbnVsbHB0cjsKLSAgICBJbmxpbmVGbG93Qm94KiByZXN1bHQgPSBu
dWxscHRyOwotICAgIGJvb2wgaGFzRGVmYXVsdExpbmVCb3hDb250YWluID0gc3R5bGUoKS5saW5l
Qm94Q29udGFpbigpID09IFJlbmRlclN0eWxlOjppbml0aWFsTGluZUJveENvbnRhaW4oKTsKLSAg
ICBkbyB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlzPFJlbmRl
cklubGluZT4oKm9iaikgfHwgb2JqID09IHRoaXMpOwotCi0gICAgICAgIFJlbmRlcklubGluZSog
aW5saW5lRmxvdyA9IG9iaiAhPSB0aGlzID8gZG93bmNhc3Q8UmVuZGVySW5saW5lPihvYmopIDog
bnVsbHB0cjsKLQotICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94IHdlIG1hZGUgZm9yIHRoaXMg
cmVuZGVyIG9iamVjdC4KLSAgICAgICAgcGFyZW50Qm94ID0gaW5saW5lRmxvdyA/IGlubGluZUZs
b3ctPmxhc3RMaW5lQm94KCkgOiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpvYmopLmxhc3RS
b290Qm94KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBib3ggb3IgaXRzIGFuY2VzdG9yIGlzIGNv
bnN0cnVjdGVkIHRoZW4gaXQgaXMgZnJvbSBhIHByZXZpb3VzIGxpbmUsIGFuZCB3ZSBuZWVkCi0g
ICAgICAgIC8vIHRvIG1ha2UgYSBuZXcgYm94IGZvciBvdXIgbGluZS4gIElmIHRoaXMgYm94IG9y
IGl0cyBhbmNlc3RvciBpcyB1bmNvbnN0cnVjdGVkIGJ1dCBpdCBoYXMKLSAgICAgICAgLy8gc29t
ZXRoaW5nIGZvbGxvd2luZyBpdCBvbiB0aGUgbGluZSwgdGhlbiB3ZSBrbm93IHdlIGhhdmUgdG8g
bWFrZSBhIG5ldyBib3gKLSAgICAgICAgLy8gYXMgd2VsbC4gIEluIHRoaXMgc2l0dWF0aW9uIG91
ciBpbmxpbmUgaGFzIGFjdHVhbGx5IGJlZW4gc3BsaXQgaW4gdHdvIG9uCi0gICAgICAgIC8vIHRo
ZSBzYW1lIGxpbmUgKHRoaXMgY2FuIGhhcHBlbiB3aXRoIHZlcnkgZmFuY3kgbGFuZ3VhZ2UgbWl4
dHVyZXMpLgotICAgICAgICBib29sIGNvbnN0cnVjdGVkTmV3Qm94ID0gZmFsc2U7Ci0gICAgICAg
IGJvb2wgYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ID0gIWhhc0RlZmF1bHRMaW5lQm94Q29udGFp
biB8fCAhaW5saW5lRmxvdyB8fCBpbmxpbmVGbG93LT5hbHdheXNDcmVhdGVMaW5lQm94ZXMoKTsK
LSAgICAgICAgYm9vbCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCA9IHBhcmVudEJveCAmJiAhcGFy
ZW50SXNDb25zdHJ1Y3RlZE9ySGF2ZU5leHQocGFyZW50Qm94KTsKLSAgICAgICAgaWYgKGFsbG93
ZWRUb0NvbnN0cnVjdE5ld0JveCAmJiAhY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKLSAgICAg
ICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9iamVj
dC4gIE9uY2UKLSAgICAgICAgICAgIC8vIG1hZGUsIHdlIG5lZWQgdG8gcGxhY2UgaXQgYXQgdGhl
IGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAgSW5saW5lQm94KiBuZXdCb3gg
PSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSB0aGlzKTsKLSAgICAgICAg
ICAgIHBhcmVudEJveCA9IGRvd25jYXN0PElubGluZUZsb3dCb3g+KG5ld0JveCk7Ci0gICAgICAg
ICAgICBwYXJlbnRCb3gtPnNldElzRmlyc3RMaW5lKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOwot
ICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwoaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSk7Ci0gICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRMaW5lQm94Q29udGFpbikKLSAg
ICAgICAgICAgICAgICBwYXJlbnRCb3gtPmNsZWFyRGVzY2VuZGFudHNIYXZlU2FtZUxpbmVIZWln
aHRBbmRCYXNlbGluZSgpOwotICAgICAgICAgICAgY29uc3RydWN0ZWROZXdCb3ggPSB0cnVlOwot
ICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnN0cnVjdGVkTmV3Qm94IHx8IGNhblVzZUV4aXN0
aW5nUGFyZW50Qm94KSB7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgICAgICAg
ICByZXN1bHQgPSBwYXJlbnRCb3g7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRo
ZSBibG9jayBpdHNlbGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAotICAgICAgICAg
ICAgLy8gaW5saW5lIGJveCBmb3IgdGhlIGxpbmUsIGFuZCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUg
YXBwZW5kZWQgdG8gYW55IHBhcmVudAotICAgICAgICAgICAgLy8gaW5saW5lLgotICAgICAgICAg
ICAgaWYgKGNoaWxkQm94KQotICAgICAgICAgICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGNo
aWxkQm94KTsKLQotICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RlZE5ld0JveCB8fCBvYmogPT0g
dGhpcykKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2hpbGRCb3ggPSBw
YXJlbnRCb3g7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSd2ZSBleGNlZWRlZCBvdXIg
bGluZSBkZXB0aCwgdGhlbiBqdW1wIHN0cmFpZ2h0IHRvIHRoZSByb290IGFuZCBza2lwIGFsbCB0
aGUgcmVtYWluaW5nCi0gICAgICAgIC8vIGludGVybWVkaWF0ZSBpbmxpbmUgZmxvd3MuCi0gICAg
ICAgIG9iaiA9ICgrK2xpbmVEZXB0aCA+PSBjTWF4TGluZURlcHRoKSA/IHRoaXMgOiBvYmotPnBh
cmVudCgpOwotCi0gICAgfSB3aGlsZSAodHJ1ZSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPiBzdGF0aWMgaW5saW5lIGJvb2wgZW5k
c1dpdGhIVE1MU3BhY2VzKGNvbnN0IENoYXJhY3RlclR5cGUqIGNoYXJhY3RlcnMsIHVuc2lnbmVk
IHBvc2l0aW9uLCB1bnNpZ25lZCBlbmQpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gcG9zaXRp
b247IGkgPCBlbmQ7ICsraSkgewotICAgICAgICBpZiAoIWlzSFRNTFNwYWNlKGNoYXJhY3RlcnNb
aV0pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotc3RhdGljIGJvb2wgcmVhY2hlZEVuZE9mVGV4dFJlbmRlcmVyKGNvbnN0IEJpZGlSdW5M
aXN0PEJpZGlSdW4+JiBiaWRpUnVucykKLXsKLSAgICBCaWRpUnVuKiBydW4gPSBiaWRpUnVucy5s
b2dpY2FsbHlMYXN0UnVuKCk7Ci0gICAgaWYgKCFydW4pCi0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIGlmICghaXM8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGF1dG8mIHRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PihydW4tPnJlbmRl
cmVyKCkpLnRleHQoKTsKLSAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IHJ1bi0+c3RvcCgpOwotICAg
IHVuc2lnbmVkIGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgaWYgKHRleHQuaXM4Qml0KCkp
Ci0gICAgICAgIHJldHVybiBlbmRzV2l0aEhUTUxTcGFjZXModGV4dC5jaGFyYWN0ZXJzOCgpLCBw
b3NpdGlvbiwgbGVuZ3RoKTsKLSAgICByZXR1cm4gZW5kc1dpdGhIVE1MU3BhY2VzKHRleHQuY2hh
cmFjdGVyczE2KCksIHBvc2l0aW9uLCBsZW5ndGgpOwotfQotCi1Sb290SW5saW5lQm94KiBSZW5k
ZXJCbG9ja0Zsb3c6OmNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5z
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCi17Ci0gICAgQVNTRVJUKGJpZGlSdW5zLmZpcnN0
UnVuKCkpOwotCi0gICAgYm9vbCByb290SGFzU2VsZWN0ZWRDaGlsZHJlbiA9IGZhbHNlOwotICAg
IElubGluZUZsb3dCb3gqIHBhcmVudEJveCA9IDA7Ci0gICAgaW50IHJ1bkNvdW50ID0gYmlkaVJ1
bnMucnVuQ291bnQoKSAtIGxpbmVJbmZvLnJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKLSAg
ICAKLSAgICBmb3IgKEJpZGlSdW4qIHIgPSBiaWRpUnVucy5maXJzdFJ1bigpOyByOyByID0gci0+
bmV4dCgpKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGJveCBmb3Igb3VyIG9iamVjdC4KLSAgICAg
ICAgYm9vbCBpc09ubHlSdW4gPSAocnVuQ291bnQgPT0gMSk7Ci0gICAgICAgIGlmIChydW5Db3Vu
dCA9PSAyICYmICFyLT5yZW5kZXJlcigpLmlzTGlzdE1hcmtlcigpKQotICAgICAgICAgICAgaXNP
bmx5UnVuID0gKCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IGJpZGlSdW5zLmxh
c3RSdW4oKSA6IGJpZGlSdW5zLmZpcnN0UnVuKCkpLT5yZW5kZXJlcigpLmlzTGlzdE1hcmtlcigp
OwotCi0gICAgICAgIGlmIChsaW5lSW5mby5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVy
KCZyLT5yZW5kZXJlcigpLCBmYWxzZSwgaXNPbmx5UnVuKTsKLSAgICAgICAgci0+c2V0Qm94KGJv
eCk7Ci0KLSAgICAgICAgaWYgKCFyb290SGFzU2VsZWN0ZWRDaGlsZHJlbiAmJiBib3gtPnJlbmRl
cmVyKCkuc2VsZWN0aW9uU3RhdGUoKSAhPSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvbk5vbmUpCi0g
ICAgICAgICAgICByb290SGFzU2VsZWN0ZWRDaGlsZHJlbiA9IHRydWU7Ci0gICAgICAgIAotICAg
ICAgICAvLyBJZiB3ZSBoYXZlIG5vIHBhcmVudCBib3ggeWV0LCBvciBpZiB0aGUgcnVuIGlzIG5v
dCBzaW1wbHkgYSBzaWJsaW5nLAotICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY29uc3RydWN0
IGlubGluZSBib3hlcyBhcyBuZWNlc3NhcnkgdG8gcHJvcGVybHkgZW5jbG9zZSB0aGUKLSAgICAg
ICAgLy8gcnVuJ3MgaW5saW5lIGJveC4gU2VnbWVudHMgY2FuIG9ubHkgYmUgc2libGluZ3MgYXQg
dGhlIHJvb3QgbGV2ZWwsIGFzCi0gICAgICAgIC8vIHRoZXkgYXJlIHBvc2l0aW9uZWQgc2VwYXJh
dGVseS4KLSAgICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgJnBhcmVudEJveC0+cmVuZGVyZXIoKSAh
PSByLT5yZW5kZXJlcigpLnBhcmVudCgpKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlu
bGluZSBib3hlcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24g
cG9pbnQuCi0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVudFRvVXNlID0gci0+cmVuZGVy
ZXIoKS5wYXJlbnQoKTsKLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhw
YXJlbnRUb1VzZSwgbGluZUluZm8sIGJveCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgotICAgICAgICAgICAgcGFy
ZW50Qm94LT5hZGRUb0xpbmUoYm94KTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgdmlzdWFs
bHlPcmRlcmVkID0gci0+cmVuZGVyZXIoKS5zdHlsZSgpLnJ0bE9yZGVyaW5nKCkgPT0gT3JkZXI6
OlZpc3VhbDsKLSAgICAgICAgYm94LT5zZXRCaWRpTGV2ZWwoci0+bGV2ZWwoKSk7Ci0KLSAgICAg
ICAgaWYgKGlzPElubGluZVRleHRCb3g+KCpib3gpKSB7Ci0gICAgICAgICAgICBhdXRvJiB0ZXh0
Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKmJveCk7Ci0gICAgICAgICAgICB0ZXh0Qm94
LnNldFN0YXJ0KHItPm1fc3RhcnQpOwotICAgICAgICAgICAgdGV4dEJveC5zZXRMZW4oci0+bV9z
dG9wIC0gci0+bV9zdGFydCk7Ci0gICAgICAgICAgICB0ZXh0Qm94LnNldERpck92ZXJyaWRlKHIt
PmRpck92ZXJyaWRlKHZpc3VhbGx5T3JkZXJlZCkpOwotICAgICAgICAgICAgaWYgKHItPm1faGFz
SHlwaGVuKQotICAgICAgICAgICAgICAgIHRleHRCb3guc2V0SGFzSHlwaGVuKHRydWUpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2Ugc2hvdWxkIGhhdmUgYSByb290IGlubGluZSBib3gu
ICBJdCBzaG91bGQgYmUgdW5jb25zdHJ1Y3RlZCBhbmQKLSAgICAvLyBiZSB0aGUgbGFzdCBjb250
aW51YXRpb24gb2Ygb3VyIGxpbmUgbGlzdC4KLSAgICBBU1NFUlQobGFzdFJvb3RCb3goKSAmJiAh
bGFzdFJvb3RCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKTsKLQotICAgIC8vIFNldCB0aGUgbV9zZWxl
Y3RlZENoaWxkcmVuIGZsYWcgb24gdGhlIHJvb3QgaW5saW5lIGJveCBpZiBvbmUgb2YgdGhlIGxl
YWYgaW5saW5lIGJveAotICAgIC8vIGZyb20gdGhlIGJpZGkgcnVucyB3YWxrIGFib3ZlIGhhcyBh
IHNlbGVjdGlvbiBzdGF0ZS4KLSAgICBpZiAocm9vdEhhc1NlbGVjdGVkQ2hpbGRyZW4pCi0gICAg
ICAgIGxhc3RSb290Qm94KCktPnJvb3QoKS5zZXRIYXNTZWxlY3RlZENoaWxkcmVuKHRydWUpOwot
Ci0gICAgLy8gU2V0IGJpdHMgb24gb3VyIGlubGluZSBmbG93IGJveGVzIHRoYXQgaW5kaWNhdGUg
d2hpY2ggc2lkZXMgc2hvdWxkCi0gICAgLy8gcGFpbnQgYm9yZGVycy9tYXJnaW5zL3BhZGRpbmcu
ICBUaGlzIGtub3dsZWRnZSB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCB3aGVuCi0gICAgLy8gd2Ug
ZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIHBvc2l0aW9ucyBhbmQgd2lkdGhzIG9mIGFsbCB0aGUg
aW5saW5lIGJveGVzIG9uCi0gICAgLy8gdGhlIGxpbmUuCi0gICAgYm9vbCBpc0xvZ2ljYWxseUxh
c3RSdW5XcmFwcGVkID0gYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpLmlz
VGV4dCgpID8gIXJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihiaWRpUnVucykgOiAhaXM8UmVuZGVy
SW5saW5lPihiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkpOwotICAgIGxh
c3RSb290Qm94KCktPmRldGVybWluZVNwYWNpbmdGb3JGbG93Qm94ZXMobGluZUluZm8uaXNMYXN0
TGluZSgpLCBpc0xvZ2ljYWxseUxhc3RSdW5XcmFwcGVkLCAmYmlkaVJ1bnMubG9naWNhbGx5TGFz
dFJ1bigpLT5yZW5kZXJlcigpKTsKLQotICAgIC8vIE5vdyBtYXJrIHRoZSBsaW5lIGJveGVzIGFz
IGJlaW5nIGNvbnN0cnVjdGVkLgotICAgIGxhc3RSb290Qm94KCktPnNldENvbnN0cnVjdGVkKCk7
Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGxhc3QgbGluZS4KLSAgICByZXR1cm4gbGFzdFJvb3RCb3go
KTsKLX0KLQotVGV4dEFsaWduTW9kZSBSZW5kZXJCbG9ja0Zsb3c6OnRleHRBbGlnbm1lbnRGb3JM
aW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0Ci17Ci0gICAgVGV4dEFsaWduTW9kZSBh
bGlnbm1lbnQgPSBzdHlsZSgpLnRleHRBbGlnbigpOwotI2lmIEVOQUJMRShDU1MzX1RFWFQpCi0g
ICAgVGV4dEp1c3RpZnkgdGV4dEp1c3RpZnkgPSBzdHlsZSgpLnRleHRKdXN0aWZ5KCk7Ci0gICAg
aWYgKGFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmIHRleHRKdXN0aWZ5ID09
IFRleHRKdXN0aWZ5OjpOb25lKQotICAgICAgICByZXR1cm4gc3R5bGUoKS5kaXJlY3Rpb24oKSA9
PSBUZXh0RGlyZWN0aW9uOjpMVFIgPyBUZXh0QWxpZ25Nb2RlOjpMZWZ0IDogVGV4dEFsaWduTW9k
ZTo6UmlnaHQ7Ci0jZW5kaWYKLQotICAgIGlmIChlbmRzV2l0aFNvZnRCcmVhaykKLSAgICAgICAg
cmV0dXJuIGFsaWdubWVudDsKLQotI2lmICFFTkFCTEUoQ1NTM19URVhUKQotICAgIHJldHVybiAo
YWxpZ25tZW50ID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpID8gVGV4dEFsaWduTW9kZTo6U3Rh
cnQgOiBhbGlnbm1lbnQ7Ci0jZWxzZQotICAgIGlmIChhbGlnbm1lbnQgIT0gVGV4dEFsaWduTW9k
ZTo6SnVzdGlmeSkKLSAgICAgICAgcmV0dXJuIGFsaWdubWVudDsKLQotICAgIFRleHRBbGlnbkxh
c3QgYWxpZ25tZW50TGFzdCA9IHN0eWxlKCkudGV4dEFsaWduTGFzdCgpOwotICAgIHN3aXRjaCAo
YWxpZ25tZW50TGFzdCkgewotICAgIGNhc2UgVGV4dEFsaWduTGFzdDo6U3RhcnQ6Ci0gICAgICAg
IHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKLSAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OkVu
ZDoKLSAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OkVuZDsKLSAgICBjYXNlIFRleHRBbGln
bkxhc3Q6OkxlZnQ6Ci0gICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpMZWZ0OwotICAgIGNh
c2UgVGV4dEFsaWduTGFzdDo6UmlnaHQ6Ci0gICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpS
aWdodDsKLSAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OkNlbnRlcjoKLSAgICAgICAgcmV0dXJuIFRl
eHRBbGlnbk1vZGU6OkNlbnRlcjsKLSAgICBjYXNlIFRleHRBbGlnbkxhc3Q6Okp1c3RpZnk6Ci0g
ICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OwotICAgIGNhc2UgVGV4dEFsaWdu
TGFzdDo6QXV0bzoKLSAgICAgICAgaWYgKHRleHRKdXN0aWZ5ID09IFRleHRKdXN0aWZ5OjpEaXN0
cmlidXRlKQotICAgICAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7Ci0gICAg
ICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKLSAgICB9Ci0gICAgcmV0dXJuIGFsaWdu
bWVudDsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JMZWZ0
QWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlvbiwgQmlkaVJ1biogdHJhaWxp
bmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgs
IGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKLXsKLSAgICAvLyBUaGUgZGlyZWN0aW9uIG9m
IHRoZSBibG9jayBzaG91bGQgZGV0ZXJtaW5lIHdoYXQgaGFwcGVucyB3aXRoIHdpZGUgbGluZXMu
Ci0gICAgLy8gSW4gcGFydGljdWxhciB3aXRoIFJUTCBibG9ja3MsIHdpZGUgbGluZXMgc2hvdWxk
IHN0aWxsIHNwaWxsIG91dCB0byB0aGUgbGVmdC4KLSAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVj
dGlvbikgewotICAgICAgICBpZiAodG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dpY2Fs
V2lkdGggJiYgdHJhaWxpbmdTcGFjZVJ1bikKLSAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4t
PmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3RkOjptYXg8ZmxvYXQ+KDAsIHRyYWlsaW5nU3BhY2VS
dW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSAtIHRvdGFsTG9naWNhbFdpZHRoICsgYXZhaWxhYmxl
TG9naWNhbFdpZHRoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodHJhaWxp
bmdTcGFjZVJ1bikKLSAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxX
aWR0aCgwKTsKLSAgICBlbHNlIGlmICh0b3RhbExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCkKLSAgICAgICAgbG9naWNhbExlZnQgLT0gKHRvdGFsTG9naWNhbFdpZHRoIC0gYXZh
aWxhYmxlTG9naWNhbFdpZHRoKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRo
Rm9yUmlnaHRBbGlnbmVkQmxvY2soYm9vbCBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uLCBCaWRpUnVu
KiB0cmFpbGluZ1NwYWNlUnVuLCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiB0b3RhbExvZ2lj
YWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQotewotICAgIC8vIFdpZGUgbGlu
ZXMgc3BpbGwgb3V0IG9mIHRoZSBibG9jayBiYXNlZCBvZmYgZGlyZWN0aW9uLgotICAgIC8vIFNv
IGV2ZW4gaWYgdGV4dC1hbGlnbiBpcyByaWdodCwgaWYgZGlyZWN0aW9uIGlzIExUUiwgd2lkZSBs
aW5lcyBzaG91bGQgb3ZlcmZsb3cgb3V0IG9mIHRoZSByaWdodAotICAgIC8vIHNpZGUgb2YgdGhl
IGJsb2NrLgotICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgIGlmICh0
cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFp
bGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCk7Ci0gICAgICAgICAgICB0cmFpbGlu
Z1NwYWNlUnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKDApOwotICAgICAgICB9Ci0gICAgICAg
IGxvZ2ljYWxMZWZ0ICs9IHN0ZDo6bWF4KDAuZiwgYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gdG90
YWxMb2dpY2FsV2lkdGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHRvdGFs
TG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNhbFdpZHRoICYmIHRyYWlsaW5nU3BhY2VSdW4p
IHsKLSAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChzdGQ6
Om1heDxmbG9hdD4oMCwgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpIC0g
dG90YWxMb2dpY2FsV2lkdGggKyBhdmFpbGFibGVMb2dpY2FsV2lkdGgpKTsKLSAgICAgICAgdG90
YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgp
OwotICAgIH0gZWxzZQotICAgICAgICBsb2dpY2FsTGVmdCArPSBhdmFpbGFibGVMb2dpY2FsV2lk
dGggLSB0b3RhbExvZ2ljYWxXaWR0aDsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbFdp
ZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlvbiwgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxM
b2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKLXsKLSAgICBmbG9hdCB0
cmFpbGluZ1NwYWNlV2lkdGggPSAwOwotICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAg
ICAgIHRvdGFsTG9naWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2Fs
V2lkdGgoKTsKLSAgICAgICAgdHJhaWxpbmdTcGFjZVdpZHRoID0gc3RkOjptaW4odHJhaWxpbmdT
cGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpLCAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0g
dG90YWxMb2dpY2FsV2lkdGggKyAxKSAvIDIpOwotICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5i
b3goKS0+c2V0TG9naWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0PigwLCB0cmFpbGluZ1NwYWNlV2lk
dGgpKTsKLSAgICB9Ci0gICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgIGxv
Z2ljYWxMZWZ0ICs9IHN0ZDo6bWF4PGZsb2F0PigoYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gdG90
YWxMb2dpY2FsV2lkdGgpIC8gMiwgMCk7Ci0gICAgZWxzZQotICAgICAgICBsb2dpY2FsTGVmdCAr
PSB0b3RhbExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA/IChhdmFpbGFibGVM
b2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgOiAoYXZhaWxhYmxlTG9naWNhbFdpZHRo
IC0gdG90YWxMb2dpY2FsV2lkdGgpIC8gMiAtIHRyYWlsaW5nU3BhY2VXaWR0aDsKLX0KLQotdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVu
ZGVyUnVieVJ1biYgcmVuZGVyZXIsIFJlbmRlck9iamVjdCogcHJldmlvdXNPYmplY3QsIGNvbnN0
IExpbmVJbmZvJiBsaW5lSW5mbykKLXsKLSAgICBmbG9hdCBzdGFydE92ZXJoYW5nOwotICAgIGZs
b2F0IGVuZE92ZXJoYW5nOwotICAgIFJlbmRlck9iamVjdCogbmV4dE9iamVjdCA9IDA7Ci0gICAg
Zm9yIChCaWRpUnVuKiBydW5XaXRoTmV4dE9iamVjdCA9IHJ1bi0+bmV4dCgpOyBydW5XaXRoTmV4
dE9iamVjdDsgcnVuV2l0aE5leHRPYmplY3QgPSBydW5XaXRoTmV4dE9iamVjdC0+bmV4dCgpKSB7
Ci0gICAgICAgIGlmICghcnVuV2l0aE5leHRPYmplY3QtPnJlbmRlcmVyKCkuaXNPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkgJiYgIXJ1bldpdGhOZXh0T2JqZWN0LT5ib3goKS0+aXNMaW5lQnJlYWsoKSkg
ewotICAgICAgICAgICAgbmV4dE9iamVjdCA9ICZydW5XaXRoTmV4dE9iamVjdC0+cmVuZGVyZXIo
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJlbmRlcmVyLmdl
dE92ZXJoYW5nKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksIHJlbmRlcmVyLnN0eWxlKCkuaXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpID8gcHJldmlvdXNPYmplY3QgOiBuZXh0T2JqZWN0LCByZW5kZXJl
ci5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG5leHRPYmplY3QgOiBwcmV2aW91
c09iamVjdCwgc3RhcnRPdmVyaGFuZywgZW5kT3ZlcmhhbmcpOwotICAgIHNldE1hcmdpblN0YXJ0
Rm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLXN0YXJ0T3ZlcmhhbmcpKTsKLSAgICBzZXRN
YXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgtZW5kT3ZlcmhhbmcpKTsKLX0K
LQotc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4oUm9vdElubGlu
ZUJveCogbGluZUJveCwgQmlkaVJ1biogcnVuLCBSZW5kZXJUZXh0JiByZW5kZXJlciwgZmxvYXQg
eFBvcywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLAotICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCi17
Ci0gICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250czsKLSAgICBHbHlwaE92ZXJm
bG93IGdseXBoT3ZlcmZsb3c7Ci0KLSAgICBjb25zdCBGb250Q2FzY2FkZSYgZm9udCA9IGxpbmVT
dHlsZSgqcmVuZGVyZXIucGFyZW50KCksIGxpbmVJbmZvKS5mb250Q2FzY2FkZSgpOwotICAgIC8v
IEFsd2F5cyBjb21wdXRlIGdseXBoIG92ZXJmbG93IGlmIHRoZSBibG9jaydzIGxpbmUtYm94LWNv
bnRhaW4gdmFsdWUgaXMgImdseXBocyIuCi0gICAgaWYgKGxpbmVCb3gtPmZpdHNUb0dseXBocygp
KSB7Ci0gICAgICAgIC8vIElmIHdlIGRvbid0IHN0aWNrIG91dCBvZiB0aGUgcm9vdCBsaW5lJ3Mg
Zm9udCBib3gsIHRoZW4gZG9uJ3QgYm90aGVyIGNvbXB1dGluZyBvdXIgZ2x5cGggb3ZlcmZsb3cu
IFRoaXMgb3B0aW1pemF0aW9uCi0gICAgICAgIC8vIHdpbGwga2VlcCB1cyBmcm9tIGNvbXB1dGlu
ZyBnbHlwaCBib3VuZHMgaW4gbmVhcmx5IGFsbCBjYXNlcy4KLSAgICAgICAgYm9vbCBpbmNsdWRl
Um9vdExpbmUgPSBsaW5lQm94LT5pbmNsdWRlc1Jvb3RMaW5lQm94Rm9udE9yTGVhZGluZygpOwot
ICAgICAgICBpbnQgYmFzZWxpbmVTaGlmdCA9IGxpbmVCb3gtPnZlcnRpY2FsUG9zaXRpb25Gb3JC
b3gocnVuLT5ib3goKSwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsKLSAgICAgICAgaW50IHJvb3RE
ZXNjZW50ID0gaW5jbHVkZVJvb3RMaW5lID8gZm9udC5mb250TWV0cmljcygpLmRlc2NlbnQoKSA6
IDA7Ci0gICAgICAgIGludCByb290QXNjZW50ID0gaW5jbHVkZVJvb3RMaW5lID8gZm9udC5mb250
TWV0cmljcygpLmFzY2VudCgpIDogMDsKLSAgICAgICAgaW50IGJveEFzY2VudCA9IGZvbnQuZm9u
dE1ldHJpY3MoKS5hc2NlbnQoKSAtIGJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgIGludCBib3hEZXNj
ZW50ID0gZm9udC5mb250TWV0cmljcygpLmRlc2NlbnQoKSArIGJhc2VsaW5lU2hpZnQ7Ci0gICAg
ICAgIGlmIChib3hBc2NlbnQgPiByb290RGVzY2VudCB8fCAgYm94RGVzY2VudCA+IHJvb3RBc2Nl
bnQpCi0gICAgICAgICAgICBnbHlwaE92ZXJmbG93LmNvbXB1dGVCb3VuZHMgPSB0cnVlOyAKLSAg
ICB9Ci0gICAgCi0gICAgTGF5b3V0VW5pdCBoeXBoZW5XaWR0aDsKLSAgICBpZiAoZG93bmNhc3Q8
SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpLmhhc0h5cGhlbigpKQotICAgICAgICBoeXBoZW5X
aWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aChyZW5kZXJlciwgZm9udCwgJmZhbGxiYWNrRm9udHMp
OwotCi0gICAgZmxvYXQgbWVhc3VyZWRXaWR0aCA9IDA7Ci0KLSAgICBib29sIGtlcm5pbmdJc0Vu
YWJsZWQgPSBmb250LmVuYWJsZUtlcm5pbmcoKTsKLSAgICBib29sIGNhblVzZVNpbXBsZUZvbnRD
b2RlUGF0aCA9IHJlbmRlcmVyLmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpOwotICAgIAotICAg
IC8vIFNpbmNlIHdlIGRvbid0IGNhY2hlIGdseXBoIG92ZXJmbG93cywgd2UgbmVlZCB0byByZS1t
ZWFzdXJlIHRoZSBydW4gaWYKLSAgICAvLyB0aGUgc3R5bGUgaXMgbGluZWJveC1jb250YWluOiBn
bHlwaC4KLSAgICBpZiAoIWxpbmVCb3gtPmZpdHNUb0dseXBocygpICYmIGNhblVzZVNpbXBsZUZv
bnRDb2RlUGF0aCkgewotICAgICAgICB1bnNpZ25lZCBsYXN0RW5kT2Zmc2V0ID0gcnVuLT5tX3N0
YXJ0OwotICAgICAgICBib29sIGF0Rmlyc3RXb3JkTWVhc3VyZW1lbnQgPSB0cnVlOwotICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpOyBpIDwg
c2l6ZSAmJiBsYXN0RW5kT2Zmc2V0IDwgcnVuLT5tX3N0b3A7ICsraSkgewotICAgICAgICAgICAg
V29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzW2ldOwot
ICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC53aWR0aCA8PSAwIHx8IHdvcmRNZWFzdXJl
bWVudC5zdGFydE9mZnNldCA9PSB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0KQotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC5yZW5kZXJl
ciAhPSAmcmVuZGVyZXIgfHwgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ICE9IGxhc3RFbmRP
ZmZzZXQgfHwgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA+IHJ1bi0+bV9zdG9wKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBsYXN0RW5kT2Zmc2V0ID0gd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldDsKLSAgICAgICAgICAgIGlmIChrZXJuaW5nSXNFbmFibGVkICYm
IGxhc3RFbmRPZmZzZXQgPT0gcnVuLT5tX3N0b3ApIHsKLSAgICAgICAgICAgICAgICBpbnQgd29y
ZExlbmd0aCA9IGxhc3RFbmRPZmZzZXQgLSB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQ7Ci0g
ICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxvdyBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICBt
ZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLndpZHRoKHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNl
dCwgd29yZExlbmd0aCwgeFBvcyArIG1lYXN1cmVkV2lkdGgsIGxpbmVJbmZvLmlzRmlyc3RMaW5l
KCksCi0gICAgICAgICAgICAgICAgICAgICZ3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywg
Jm92ZXJmbG93KTsKLSAgICAgICAgICAgICAgICBVQ2hhciBjID0gcmVuZGVyZXIuY2hhcmFjdGVy
QXQod29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAvLyByZW5k
ZXJlci53aWR0aCgpIG9taXRzIHdvcmQtc3BhY2luZyB2YWx1ZSBmb3IgbGVhZGluZyB3aGl0ZXNw
YWNlLCBzbyBsZXQncyBqdXN0IGFkZCBpdCBiYWNrIGhlcmUuCi0gICAgICAgICAgICAgICAgaWYg
KCFhdEZpcnN0V29yZE1lYXN1cmVtZW50ICYmIEZvbnRDYXNjYWRlOjp0cmVhdEFzU3BhY2UoYykp
Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0gcmVuZGVyZXIuc3R5bGUoKS5m
b250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAg
ICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHdvcmRNZWFzdXJlbWVudC53aWR0aDsKLSAgICAgICAg
ICAgIGF0Rmlyc3RXb3JkTWVhc3VyZW1lbnQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCF3
b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAg
ICBIYXNoU2V0PGNvbnN0IEZvbnQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gd29yZE1lYXN1cmVt
ZW50LmZhbGxiYWNrRm9udHMuZW5kKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChIYXNoU2V0PGNv
bnN0IEZvbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tG
b250cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICAgICAgICAgIGZhbGxi
YWNrRm9udHMuYWRkKCppdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYg
KG1lYXN1cmVkV2lkdGggJiYgbGFzdEVuZE9mZnNldCAhPSBydW4tPm1fc3RvcCkgewotICAgICAg
ICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggY2FjaGVkIGRhdGEsIHdlJ2xsIG1lYXN1
cmUgdGhlIHJ1biBhZ2Fpbi4KLSAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSAwOwotICAgICAg
ICAgICAgZmFsbGJhY2tGb250cy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYg
KCFtZWFzdXJlZFdpZHRoKQotICAgICAgICBtZWFzdXJlZFdpZHRoID0gcmVuZGVyZXIud2lkdGgo
cnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCAtIHJ1bi0+bV9zdGFydCwgeFBvcywgbGluZUluZm8u
aXNGaXJzdExpbmUoKSwgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLQotICAgIHJ1
bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChtZWFzdXJlZFdpZHRoICsgaHlwaGVuV2lkdGgpOwot
ICAgIGlmICghZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHJ1bi0+
Ym94KCktPmJlaGF2ZXNMaWtlVGV4dCgpKTsKLSAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxi
YWNrRm9udHNNYXA6Oml0ZXJhdG9yIGl0ID0gdGV4dEJveERhdGFNYXAuYWRkKGRvd25jYXN0PElu
bGluZVRleHRCb3g+KHJ1bi0+Ym94KCkpLCBzdGQ6Om1ha2VfcGFpcihWZWN0b3I8Y29uc3QgRm9u
dCo+KCksIEdseXBoT3ZlcmZsb3coKSkpLml0ZXJhdG9yOwotICAgICAgICBBU1NFUlQoaXQtPnZh
bHVlLmZpcnN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIGl0LT52YWx1ZS5maXJzdCA9IGNvcHlUb1Zl
Y3RvcihmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgcnVuLT5ib3goKS0+cGFyZW50KCktPmNsZWFy
RGVzY2VuZGFudHNIYXZlU2FtZUxpbmVIZWlnaHRBbmRCYXNlbGluZSgpOwotICAgIH0KLQotICAg
IC8vIEluY2x1ZGUgdGV4dCBkZWNvcmF0aW9uIHZpc3VhbCBvdmVyZmxvdyBhcyBwYXJ0IG9mIHRo
ZSBnbHlwaCBvdmVyZmxvdy4KLSAgICBpZiAoIXJlbmRlcmVyLnN0eWxlKCkudGV4dERlY29yYXRp
b25zSW5FZmZlY3QoKS5pc0VtcHR5KCkpCi0gICAgICAgIGdseXBoT3ZlcmZsb3cuZXh0ZW5kVG8o
dmlzdWFsT3ZlcmZsb3dGb3JEZWNvcmF0aW9ucyhydW4tPmJveCgpLT5saW5lU3R5bGUoKSwgZG93
bmNhc3Q8SW5saW5lVGV4dEJveD4ocnVuLT5ib3goKSkpKTsKLQotICAgIGlmICghZ2x5cGhPdmVy
Zmxvdy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHJ1bi0+Ym94KCktPmJlaGF2ZXNMaWtl
VGV4dCgpKTsKLSAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXA6Oml0ZXJh
dG9yIGl0ID0gdGV4dEJveERhdGFNYXAuYWRkKGRvd25jYXN0PElubGluZVRleHRCb3g+KHJ1bi0+
Ym94KCkpLCBzdGQ6Om1ha2VfcGFpcihWZWN0b3I8Y29uc3QgRm9udCo+KCksIEdseXBoT3ZlcmZs
b3coKSkpLml0ZXJhdG9yOwotICAgICAgICBpdC0+dmFsdWUuc2Vjb25kID0gZ2x5cGhPdmVyZmxv
dzsKLSAgICAgICAgcnVuLT5ib3goKS0+Y2xlYXJLbm93blRvSGF2ZU5vT3ZlcmZsb3coKTsKLSAg
ICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4
dChSZW5kZXJSdWJ5UnVuJiBydWJ5UnVuLCBCaWRpUnVuJiByLCBjb25zdCBWZWN0b3I8dW5zaWdu
ZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQmIGV4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoLCBzaXplX3QmIGkpCi17Ci0gICAgaWYgKCFydWJ5UnVuLnJ1YnlCYXNlKCkgfHwg
IXJ1YnlSdW4ucnVieUJhc2UoKS0+Zmlyc3RSb290Qm94KCkgfHwgcnVieVJ1bi5ydWJ5QmFzZSgp
LT5maXJzdFJvb3RCb3goKS0+bmV4dFJvb3RCb3goKSB8fCAhci5yZW5kZXJlcigpLnN0eWxlKCku
Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGF1dG8mIHJ1YnlC
YXNlID0gKnJ1YnlSdW4ucnVieUJhc2UoKTsKLSAgICBhdXRvJiByb290Qm94ID0gKnJ1YnlCYXNl
LmZpcnN0Um9vdEJveCgpOwotCi0gICAgZmxvYXQgdG90YWxFeHBhbnNpb24gPSAwOwotICAgIHVu
c2lnbmVkIHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuID0gMDsKLSAgICBmb3IgKGF1dG8qIGxlYWZD
aGlsZCA9IHJvb3RCb3guZmlyc3RMZWFmQ2hpbGQoKTsgbGVhZkNoaWxkOyBsZWFmQ2hpbGQgPSBs
ZWFmQ2hpbGQtPm5leHRMZWFmQ2hpbGQoKSkgewotICAgICAgICBpZiAoIWxlYWZDaGlsZC0+aXNJ
bmxpbmVUZXh0Qm94KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICB1bnNpZ25l
ZCBvcHBvcnR1bml0aWVzSW5SdW4gPSBleHBhbnNpb25PcHBvcnR1bml0aWVzW2krK107Ci0gICAg
ICAgIEFTU0VSVChvcHBvcnR1bml0aWVzSW5SdW4gPD0gZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3Vu
dCk7Ci0gICAgICAgIGF1dG8gZXhwYW5zaW9uID0gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRv
dGFsTG9naWNhbFdpZHRoKSAqIG9wcG9ydHVuaXRpZXNJblJ1biAvIGV4cGFuc2lvbk9wcG9ydHVu
aXR5Q291bnQ7Ci0gICAgICAgIHRvdGFsRXhwYW5zaW9uICs9IGV4cGFuc2lvbjsKLSAgICAgICAg
dG90YWxPcHBvcnR1bml0aWVzSW5SdW4gKz0gb3Bwb3J0dW5pdGllc0luUnVuOwotICAgIH0KLQot
ICAgIEFTU0VSVCghcnVieVJ1bi5oYXNPdmVycmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoKSk7Ci0g
ICAgZmxvYXQgbmV3QmFzZVdpZHRoID0gcnVieVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFsRXhw
YW5zaW9uICsgbWFyZ2luU3RhcnRGb3JDaGlsZChydWJ5UnVuKSArIG1hcmdpbkVuZEZvckNoaWxk
KHJ1YnlSdW4pOwotICAgIGZsb2F0IG5ld1J1YnlSdW5XaWR0aCA9IHJ1YnlSdW4ubG9naWNhbFdp
ZHRoKCkgKyB0b3RhbEV4cGFuc2lvbjsKLSAgICBydWJ5QmFzZS5zZXRJbml0aWFsT2Zmc2V0KChu
ZXdSdWJ5UnVuV2lkdGggLSBuZXdCYXNlV2lkdGgpIC8gMik7Ci0gICAgcnVieVJ1bi5zZXRPdmVy
cmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdChuZXdSdWJ5UnVuV2lkdGgpKTsKLSAg
ICBydWJ5UnVuLnNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAgcm9vdEJveC5tYXJr
RGlydHkoKTsKLSAgICBpZiAoUmVuZGVyUnVieVRleHQqIHJ1YnlUZXh0ID0gcnVieVJ1bi5ydWJ5
VGV4dCgpKSB7Ci0gICAgICAgIGlmIChSb290SW5saW5lQm94KiB0ZXh0Um9vdEJveCA9IHJ1YnlU
ZXh0LT5maXJzdFJvb3RCb3goKSkKLSAgICAgICAgICAgIHRleHRSb290Qm94LT5tYXJrRGlydHko
KTsKLSAgICB9Ci0gICAgcnVieVJ1bi5sYXlvdXRCbG9jayh0cnVlKTsKLSAgICBydWJ5UnVuLmNs
ZWFyT3ZlcnJpZGVDb250ZW50TG9naWNhbFdpZHRoKCk7Ci0gICAgci5ib3goKS0+c2V0RXhwYW5z
aW9uKG5ld1J1YnlSdW5XaWR0aCAtIHIuYm94KCktPmxvZ2ljYWxXaWR0aCgpKTsKLQotICAgIHRv
dGFsTG9naWNhbFdpZHRoICs9IHRvdGFsRXhwYW5zaW9uOwotICAgIGV4cGFuc2lvbk9wcG9ydHVu
aXR5Q291bnQgLT0gdG90YWxPcHBvcnR1bml0aWVzSW5SdW47Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2tGbG93Ojpjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4dChCaWRpUnVuKiBmaXJzdFJ1
biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgY29uc3QgVmVjdG9yPHVuc2lnbmVkLCAxNj4m
IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQsIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgp
Ci17Ci0gICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHx8IGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCA8PSB0b3RhbExvZ2ljYWxXaWR0aCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc2l6
ZV90IGkgPSAwOwotICAgIGZvciAoQmlkaVJ1biogcnVuID0gZmlyc3RSdW47IHJ1bjsgcnVuID0g
cnVuLT5uZXh0KCkpIHsKLSAgICAgICAgaWYgKCFydW4tPmJveCgpIHx8IHJ1biA9PSB0cmFpbGlu
Z1NwYWNlUnVuKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIAotICAgICAgICBpZiAo
aXM8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkgewotICAgICAgICAgICAgdW5zaWduZWQg
b3Bwb3J0dW5pdGllc0luUnVuID0gZXhwYW5zaW9uT3Bwb3J0dW5pdGllc1tpKytdOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBBU1NFUlQob3Bwb3J0dW5pdGllc0luUnVuIDw9IGV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBPbmx5IGp1
c3RpZnkgdGV4dCBpZiB3aGl0ZXNwYWNlIGlzIGNvbGxhcHNlZC4KLSAgICAgICAgICAgIGlmIChy
dW4tPnJlbmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAg
ICAgICAgIElubGluZVRleHRCb3gmIHRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94Pigq
cnVuLT5ib3goKSk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZXhwYW5zaW9uID0gKGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRoKSAqIG9wcG9ydHVuaXRpZXNJblJ1biAv
IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7Ci0gICAgICAgICAgICAgICAgdGV4dEJveC5zZXRF
eHBhbnNpb24oZXhwYW5zaW9uKTsKLSAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCAr
PSBleHBhbnNpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50IC09IG9wcG9ydHVuaXRpZXNJblJ1bjsKLSAgICAgICAgfSBlbHNlIGlmIChpczxS
ZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkpKQotICAgICAgICAgICAgdXBkYXRlUnVieUZv
ckp1c3RpZmllZFRleHQoZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSwg
KnJ1biwgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwg
dG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaSk7Ci0KLSAgICAgICAg
aWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25t
ZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmIHRleHRBbGlnbiwgY29uc3QgUm9vdElubGluZUJveCog
cm9vdElubGluZUJveCwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxM
ZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lk
dGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQotewotICAgIFRleHREaXJlY3Rpb24g
ZGlyZWN0aW9uOwotICAgIGlmIChyb290SW5saW5lQm94ICYmIHN0eWxlKCkudW5pY29kZUJpZGko
KSA9PSBQbGFpbnRleHQpCi0gICAgICAgIGRpcmVjdGlvbiA9IHJvb3RJbmxpbmVCb3gtPmRpcmVj
dGlvbigpOwotICAgIGVsc2UKLSAgICAgICAgZGlyZWN0aW9uID0gc3R5bGUoKS5kaXJlY3Rpb24o
KTsKLQotICAgIC8vIEFybWVkIHdpdGggdGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBsaW5lICh3aXRo
b3V0IGp1c3RpZmljYXRpb24pLAotICAgIC8vIHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWdu
IHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKLSAg
ICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gVGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBsaW5lIGNh
biBiZSBpbmNyZWFzZWQgaWYgd2UgZW5kIHVwCi0gICAgLy8ganVzdGlmeWluZyB0ZXh0LgotICAg
IHN3aXRjaCAodGV4dEFsaWduKSB7Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpMZWZ0OgotICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0TGVmdDoKLSAgICAgICAgdXBkYXRlTG9naWNhbFdp
ZHRoRm9yTGVmdEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwg
dHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFi
bGVMb2dpY2FsV2lkdGgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6
OlJpZ2h0OgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0UmlnaHQ6Ci0gICAgICAgIHVw
ZGF0ZUxvZ2ljYWxXaWR0aEZvclJpZ2h0QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2Fs
V2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
VGV4dEFsaWduTW9kZTo6Q2VudGVyOgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0Q2Vu
dGVyOgotICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JDZW50ZXJBbGlnbmVkQmxvY2soc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxM
ZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OgotICAgICAgICBhZGp1c3RJ
bmxpbmVEaXJlY3Rpb25MaW5lQm91bmRzKGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGxvZ2lj
YWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotICAgICAgICBpZiAoZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudCkgewotICAgICAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2VSdW4pIHsKLSAg
ICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3go
KS0+bG9naWNhbFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94
KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6U3RhcnQ6Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKQot
ICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVmdEFsaWduZWRCbG9jayhzdHlsZSgp
LmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQs
IHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdodEFsaWduZWRCbG9jayhzdHls
ZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExl
ZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkVuZDoKLSAgICAgICAgaWYgKGRpcmVjdGlv
biA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpCi0gICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhG
b3JSaWdodEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJh
aWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVM
b2dpY2FsV2lkdGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lk
dGhGb3JMZWZ0QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0
cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQg
dXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBmbG9h
dCYgbGluZUxvZ2ljYWxMZWZ0LCBmbG9hdCYgbGluZUxvZ2ljYWxSaWdodCwgZmxvYXQmIGF2YWls
YWJsZUxvZ2ljYWxXaWR0aCwgYm9vbCBmaXJzdExpbmUsCi0gICAgSW5kZW50VGV4dE9yTm90IHNo
b3VsZEluZGVudFRleHQsIExheW91dFVuaXQgYm94TG9naWNhbEhlaWdodCkKLXsKLSAgICBMYXlv
dXRVbml0IGxpbmVMb2dpY2FsSGVpZ2h0ID0gYmxvY2subWluTGluZUhlaWdodEZvclJlcGxhY2Vk
UmVuZGVyZXIoZmlyc3RMaW5lLCBib3hMb2dpY2FsSGVpZ2h0KTsKLSAgICBsaW5lTG9naWNhbExl
ZnQgPSBibG9jay5sb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoYmxvY2subG9naWNhbEhlaWdodCgp
LCBzaG91bGRJbmRlbnRUZXh0LCBsaW5lTG9naWNhbEhlaWdodCk7Ci0gICAgbGluZUxvZ2ljYWxS
aWdodCA9IGJsb2NrLmxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoYmxvY2subG9naWNhbEhlaWdo
dCgpLCBzaG91bGRJbmRlbnRUZXh0LCBsaW5lTG9naWNhbEhlaWdodCk7Ci0gICAgYXZhaWxhYmxl
TG9naWNhbFdpZHRoID0gbGluZUxvZ2ljYWxSaWdodCAtIGxpbmVMb2dpY2FsTGVmdDsKLX0KLQot
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JM
aW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgQmlk
aVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVu
ZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50
cyYgd29yZE1lYXN1cmVtZW50cykKLXsKLSAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHRl
eHRBbGlnbm1lbnRGb3JMaW5lKCFyZWFjaGVkRW5kICYmICFsaW5lQm94LT5lbmRzV2l0aEJyZWFr
KCkpOwotICAgIAotICAgIC8vIENTUyAyLjE6ICInVGV4dC1pbmRlbnQnIG9ubHkgYWZmZWN0cyBh
IGxpbmUgaWYgaXQgaXMgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9mIGFuIGVsZW1lbnQuIEZv
ciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgCi0gICAgLy8g
Ym94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJl
bnQgZWxlbWVudC4iCi0gICAgLy8gQ1NTMyAidGV4dC1pbmRlbnQiLCAiLXdlYmtpdC1lYWNoLWxp
bmUiIGFmZmVjdHMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJsb2NrIGNvbnRhaW5lciBhcyB3ZWxs
IGFzIGVhY2ggbGluZSBhZnRlciBhIGZvcmNlZCBsaW5lIGJyZWFrLAotICAgIC8vIGJ1dCBkb2Vz
IG5vdCBhZmZlY3QgbGluZXMgYWZ0ZXIgYSBzb2Z0IHdyYXAgYnJlYWsuCi0gICAgYm9vbCBpc0Zp
cnN0TGluZSA9IGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgJiYgIShpc0Fub255bW91c0Jsb2NrKCkg
JiYgcGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSB0aGlzKTsKLSAgICBib29sIGlzQWZ0ZXJIYXJk
TGluZUJyZWFrID0gbGluZUJveC0+cHJldlJvb3RCb3goKSAmJiBsaW5lQm94LT5wcmV2Um9vdEJv
eCgpLT5lbmRzV2l0aEJyZWFrKCk7Ci0gICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRl
eHQgPSByZXF1aXJlc0luZGVudChpc0ZpcnN0TGluZSwgaXNBZnRlckhhcmRMaW5lQnJlYWssIHN0
eWxlKCkpOwotICAgIGZsb2F0IGxpbmVMb2dpY2FsTGVmdDsKLSAgICBmbG9hdCBsaW5lTG9naWNh
bFJpZ2h0OwotICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aDsKLSAgICB1cGRhdGVMb2dp
Y2FsSW5saW5lUG9zaXRpb25zKCp0aGlzLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmln
aHQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaXNGaXJzdExpbmUsIHNob3VsZEluZGVudFRleHQs
IDApOwotICAgIGJvb2wgbmVlZHNXb3JkU3BhY2luZzsKLQotICAgIGlmIChmaXJzdFJ1biAmJiBm
aXJzdFJ1bi0+cmVuZGVyZXIoKS5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgUmVuZGVyQm94JiBy
ZW5kZXJCb3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KGZpcnN0UnVuLT5yZW5kZXJlcigpKTsKLSAg
ICAgICAgdXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0
LCBsaW5lTG9naWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBz
aG91bGRJbmRlbnRUZXh0LCByZW5kZXJCb3gubG9naWNhbEhlaWdodCgpKTsKLSAgICB9Ci0KLSAg
ICBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChsaW5lQm94LCBsaW5l
SW5mbywgdGV4dEFsaWduLCBsaW5lTG9naWNhbExlZnQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwg
Zmlyc3RSdW4sIHRyYWlsaW5nU3BhY2VSdW4sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUsIHdvcmRNZWFzdXJlbWVudHMpOwotICAgIC8vIFRoZSB3aWR0aHMgb2YgYWxsIHJ1
bnMgYXJlIG5vdyBrbm93bi4gV2UgY2FuIG5vdyBwbGFjZSBldmVyeSBpbmxpbmUgYm94IChhbmQK
LSAgICAvLyBjb21wdXRlIGFjY3VyYXRlIHdpZHRocyBmb3IgdGhlIGlubGluZSBmbG93IGJveGVz
KS4KLSAgICBuZWVkc1dvcmRTcGFjaW5nID0gZmFsc2U7Ci0gICAgbGluZUJveC0+cGxhY2VCb3hl
c0luSW5saW5lRGlyZWN0aW9uKGxpbmVMb2dpY2FsTGVmdCwgbmVlZHNXb3JkU3BhY2luZyk7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3JGb3JJ
bmxpbmVUZXh0Qm94KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIElubGluZVRleHRCb3gmIHRleHRC
b3gsIEJpZGlSdW4qIHByZXZpb3VzUnVuLCBCaWRpUnVuKiBuZXh0UnVuLCBUZXh0QWxpZ25Nb2Rl
IHRleHRBbGlnbiwgYm9vbCBpc0FmdGVyRXhwYW5zaW9uKQotewotICAgIC8vIFRhdGVjaHV5b2tv
IGlzIG1vZGVsZWQgYXMgdGhlIE9iamVjdCBSZXBsYWNlbWVudCBDaGFyYWN0ZXIgKFUrRkZGQyks
IHdoaWNoIGNhbiBuZXZlciBoYXZlIGV4cGFuc2lvbiBvcHBvcnR1bml0aWVzIGluc2lkZSBub3Ig
aW50cmluc2ljYWxseSBhZGphY2VudCB0byBpdC4KLSAgICBpZiAodGV4dEJveC5yZW5kZXJlcigp
LnN0eWxlKCkudGV4dENvbWJpbmUoKSA9PSBUZXh0Q29tYmluZTo6SG9yaXpvbnRhbCkKLSAgICAg
ICAgcmV0dXJuIEZvcmJpZExlYWRpbmdFeHBhbnNpb24gfCBGb3JiaWRUcmFpbGluZ0V4cGFuc2lv
bjsKLQotICAgIEV4cGFuc2lvbkJlaGF2aW9yIHJlc3VsdCA9IDA7Ci0gICAgYm9vbCBzZXRMZWFk
aW5nRXhwYW5zaW9uID0gZmFsc2U7Ci0gICAgYm9vbCBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IGZh
bHNlOwotICAgIGlmICh0ZXh0QWxpZ24gPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSkgewotICAg
ICAgICAvLyBJZiB0aGUgbmV4dCBib3ggaXMgcnVieSwgYW5kIHdlJ3JlIGp1c3RpZnlpbmcsIGFu
ZCB0aGUgZmlyc3QgYm94IGluIHRoZSBydWJ5IGJhc2UgaGFzIGEgbGVhZGluZyBleHBhbnNpb24s
IGFuZCB3ZSBhcmUgYSB0ZXh0IGJveCwgdGhlbiBmb3JjZSBhIHRyYWlsaW5nIGV4cGFuc2lvbi4K
LSAgICAgICAgaWYgKG5leHRSdW4gJiYgaXM8UmVuZGVyUnVieVJ1bj4obmV4dFJ1bi0+cmVuZGVy
ZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4obmV4dFJ1bi0+cmVuZGVyZXIoKSkucnVi
eUJhc2UoKSAmJiBuZXh0UnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNl
KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIHJ1YnlCYXNlID0gKmRvd25jYXN0PFJlbmRlclJ1YnlS
dW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCk7Ci0gICAgICAgICAgICBpZiAocnVi
eUJhc2UuZmlyc3RSb290Qm94KCkgJiYgIXJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5uZXh0Um9v
dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG8qIGxlYWZDaGlsZCA9IHJ1YnlCYXNl
LmZpcnN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChpczxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gRklYTUU6IFRoaXMgbGVhZGluZ0V4cGFuc2lvbk9wcG9ydHVuaXR5IGRvZXNuJ3Qg
YWN0dWFsbHkgd29yayBiZWNhdXNlIGl0IGRvZXNuJ3QgcGVyZm9ybSB0aGUgVUJBCi0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoRm9udENhc2NhZGU6OmxlYWRpbmdFeHBhbnNpb25PcHBvcnR1
bml0eShkb3duY2FzdDxSZW5kZXJUZXh0PihsZWFmQ2hpbGQtPnJlbmRlcmVyKCkpLnN0cmluZ1Zp
ZXcoKSwgbGVhZkNoaWxkLT5kaXJlY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0IHw9IEZvcmNlVHJhaWxpbmdFeHBhbnNpb247Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2FtZSB0aGluZywgZXhjZXB0IGlmIHdl
J3JlIGZvbGxvd2luZyBhIHJ1YnkKLSAgICAgICAgaWYgKHByZXZpb3VzUnVuICYmIGlzPFJlbmRl
clJ1YnlSdW4+KHByZXZpb3VzUnVuLT5yZW5kZXJlcigpKSAmJiBkb3duY2FzdDxSZW5kZXJSdWJ5
UnVuPihwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKSAmJiBwcmV2aW91c1J1bi0+
cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICBh
dXRvJiBydWJ5QmFzZSA9ICpkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihwcmV2aW91c1J1bi0+cmVu
ZGVyZXIoKSkucnVieUJhc2UoKTsKLSAgICAgICAgICAgIGlmIChydWJ5QmFzZS5maXJzdFJvb3RC
b3goKSAmJiAhcnVieUJhc2UuZmlyc3RSb290Qm94KCktPm5leHRSb290Qm94KCkpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoYXV0byogbGVhZkNoaWxkID0gcnVieUJhc2UuZmlyc3RSb290Qm94KCkt
Pmxhc3RMZWFmQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXM8SW5saW5lVGV4
dEJveD4oKmxlYWZDaGlsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBU
aGlzIGxlYWRpbmdFeHBhbnNpb25PcHBvcnR1bml0eSBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgYmVj
YXVzZSBpdCBkb2Vzbid0IHBlcmZvcm0gdGhlIFVCQQotICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKEZvbnRDYXNjYWRlOjp0cmFpbGluZ0V4cGFuc2lvbk9wcG9ydHVuaXR5KGRvd25jYXN0PFJl
bmRlclRleHQ+KGxlYWZDaGlsZC0+cmVuZGVyZXIoKSkuc3RyaW5nVmlldygpLCBsZWFmQ2hpbGQt
PmRpcmVjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExlYWRpbmdF
eHBhbnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBG
b3JjZUxlYWRpbmdFeHBhbnNpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gSWYgd2UncmUgdGhlIGZpcnN0IGJveCBpbnNpZGUgYSBydWJ5IGJhc2Us
IGZvcmJpZCBhIGxlYWRpbmcgZXhwYW5zaW9uLCBhbmQgdmljZS12ZXJzYQotICAgICAgICBpZiAo
aXM8UmVuZGVyUnVieUJhc2U+KGJsb2NrKSkgewotICAgICAgICAgICAgUmVuZGVyUnVieUJhc2Um
IHJ1YnlCYXNlID0gZG93bmNhc3Q8UmVuZGVyUnVieUJhc2U+KGJsb2NrKTsKLSAgICAgICAgICAg
IGlmICgmdGV4dEJveCA9PSBydWJ5QmFzZS5maXJzdFJvb3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQo
KSkgewotICAgICAgICAgICAgICAgIHNldExlYWRpbmdFeHBhbnNpb24gPSB0cnVlOwotICAgICAg
ICAgICAgICAgIHJlc3VsdCB8PSBGb3JiaWRMZWFkaW5nRXhwYW5zaW9uOwotICAgICAgICAgICAg
fSBpZiAoJnRleHRCb3ggPT0gcnVieUJhc2UuZmlyc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQo
KSkgewotICAgICAgICAgICAgICAgIHNldFRyYWlsaW5nRXhwYW5zaW9uID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICByZXN1bHQgfD0gRm9yYmlkVHJhaWxpbmdFeHBhbnNpb247Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzZXRMZWFkaW5nRXhwYW5zaW9uKQotICAg
ICAgICByZXN1bHQgfD0gaXNBZnRlckV4cGFuc2lvbiA/IEZvcmJpZExlYWRpbmdFeHBhbnNpb24g
OiBBbGxvd0xlYWRpbmdFeHBhbnNpb247Ci0gICAgaWYgKCFzZXRUcmFpbGluZ0V4cGFuc2lvbikK
LSAgICAgICAgcmVzdWx0IHw9IEFsbG93VHJhaWxpbmdFeHBhbnNpb247Ci0gICAgcmV0dXJuIHJl
c3VsdDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFwcGx5RXhwYW5zaW9uQmVoYXZpb3IoSW5s
aW5lVGV4dEJveCYgdGV4dEJveCwgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3Ip
Ci17Ci0gICAgc3dpdGNoIChleHBhbnNpb25CZWhhdmlvciAmIExlYWRpbmdFeHBhbnNpb25NYXNr
KSB7Ci0gICAgY2FzZSBGb3JjZUxlYWRpbmdFeHBhbnNpb246Ci0gICAgICAgIHRleHRCb3guc2V0
Rm9yY2VMZWFkaW5nRXhwYW5zaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRm9yYmlk
TGVhZGluZ0V4cGFuc2lvbjoKLSAgICAgICAgdGV4dEJveC5zZXRDYW5IYXZlTGVhZGluZ0V4cGFu
c2lvbihmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQWxsb3dMZWFkaW5nRXhwYW5z
aW9uOgotICAgICAgICB0ZXh0Qm94LnNldENhbkhhdmVMZWFkaW5nRXhwYW5zaW9uKHRydWUpOwot
ICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoZXhwYW5zaW9uQmVoYXZpb3Ig
JiBUcmFpbGluZ0V4cGFuc2lvbk1hc2spIHsKLSAgICBjYXNlIEZvcmNlVHJhaWxpbmdFeHBhbnNp
b246Ci0gICAgICAgIHRleHRCb3guc2V0Rm9yY2VUcmFpbGluZ0V4cGFuc2lvbigpOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIEZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uOgotICAgICAgICB0ZXh0
Qm94LnNldENhbkhhdmVUcmFpbGluZ0V4cGFuc2lvbihmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgQWxsb3dUcmFpbGluZ0V4cGFuc2lvbjoKLSAgICAgICAgdGV4dEJveC5zZXRDYW5I
YXZlVHJhaWxpbmdFeHBhbnNpb24odHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19
Ci0KLXN0YXRpYyBib29sIGlubGluZUFuY2VzdG9ySGFzU3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJn
aW4oY29uc3QgUmVuZGVyQmxvY2tGbG93JiBibG9jaywgY29uc3QgSW5saW5lQm94JiBib3gpCi17
Ci0gICAgYm9vbCBpc0xUUiA9IGJsb2NrLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
OwotICAgIGZvciAoYXV0byogY3VycmVudEJveCA9IGJveC5wYXJlbnQoKTsgY3VycmVudEJveDsg
Y3VycmVudEJveCA9IGN1cnJlbnRCb3gtPnBhcmVudCgpKSB7Ci0gICAgICAgIGlmICgoaXNMVFIg
JiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xvZ2ljYWxMZWZ0KCkgPiAwKQotICAg
ICAgICAgICAgfHwgKCFpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9n
aWNhbFJpZ2h0KCkgPiAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGlubGluZUFuY2VzdG9ySGFzRW5kQm9yZGVy
UGFkZGluZ09yTWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIGNvbnN0IElubGlu
ZUJveCYgYm94KQotewotICAgIGJvb2wgaXNMVFIgPSBibG9jay5zdHlsZSgpLmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKTsKLSAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSBib3gucGFyZW50KCk7
IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wYXJlbnQoKSkgewotICAgICAg
ICBpZiAoKGlzTFRSICYmIGN1cnJlbnRCb3gtPm1hcmdpbkJvcmRlclBhZGRpbmdMb2dpY2FsUmln
aHQoKSA+IDApCi0gICAgICAgICAgICB8fCAoIWlzTFRSICYmIGN1cnJlbnRCb3gtPm1hcmdpbkJv
cmRlclBhZGRpbmdMb2dpY2FsTGVmdCgpID4gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotICAgIAotc3RhdGljIGJvb2wgaXNMYXN0SW5G
bG93UnVuKEJpZGlSdW4mIHJ1blRvQ2hlY2spCi17Ci0gICAgZm9yIChhdXRvKiBydW4gPSBydW5U
b0NoZWNrLm5leHQoKTsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgewotICAgICAgICBpZiAoIXJ1
bi0+Ym94KCkgfHwgcnVuLT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpIHx8IHJ1
bi0+Ym94KCktPmlzTGluZUJyZWFrKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLSAgICAKLUJpZGlSdW4q
IFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21l
bnQoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBUZXh0
QWxpZ25Nb2RlIHRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCAKLSAgICBmbG9hdCYgYXZh
aWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdT
cGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFw
LCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwKLSAgICBXb3Jk
TWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAgIGJvb2wgbmVlZHNXb3JkU3Bh
Y2luZyA9IGZhbHNlOwotICAgIGJvb2wgY2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFydCA9IHN0eWxl
KCkuaGFuZ2luZ1B1bmN0dWF0aW9uKCkuY29udGFpbnMoSGFuZ2luZ1B1bmN0dWF0aW9uOjpGaXJz
dCk7Ci0gICAgYm9vbCBjYW5IYW5nUHVuY3R1YXRpb25BdEVuZCA9IHN0eWxlKCkuaGFuZ2luZ1B1
bmN0dWF0aW9uKCkuY29udGFpbnMoSGFuZ2luZ1B1bmN0dWF0aW9uOjpMYXN0KTsKLSAgICBib29s
IGlzTFRSID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7Ci0gICAgZmxvYXQgdG90
YWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LT5nZXRGbG93U3BhY2luZ0xvZ2ljYWxXaWR0aCgpOwot
ICAgIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgPSAwOwotICAgIGJvb2wgaXNB
ZnRlckV4cGFuc2lvbiA9IGlzPFJlbmRlclJ1YnlCYXNlPigqdGhpcykgPyBkb3duY2FzdDxSZW5k
ZXJSdWJ5QmFzZT4oKnRoaXMpLmlzQWZ0ZXJFeHBhbnNpb24oKSA6IHRydWU7Ci0gICAgVmVjdG9y
PHVuc2lnbmVkLCAxNj4gZXhwYW5zaW9uT3Bwb3J0dW5pdGllczsKLQotICAgIEJpZGlSdW4qIHJ1
biA9IGZpcnN0UnVuOwotICAgIEJpZGlSdW4qIHByZXZpb3VzUnVuID0gbnVsbHB0cjsKLSAgICBm
b3IgKDsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgewotICAgICAgICBhdXRvIGNvbXB1dGVFeHBh
bnNpb25PcHBvcnR1bml0aWVzID0gWyZleHBhbnNpb25PcHBvcnR1bml0aWVzLCAmZXhwYW5zaW9u
T3Bwb3J0dW5pdHlDb3VudCwgdGV4dEFsaWduLCAmaXNBZnRlckV4cGFuc2lvbl0gKFJlbmRlckJs
b2NrRmxvdyYgYmxvY2ssCi0gICAgICAgICAgICBJbmxpbmVUZXh0Qm94JiB0ZXh0Qm94LCBCaWRp
UnVuKiBwcmV2aW91c1J1biwgQmlkaVJ1biogbmV4dFJ1biwgY29uc3QgU3RyaW5nVmlldyYgc3Ry
aW5nVmlldywgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAg
IGlmIChzdHJpbmdWaWV3LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIEVtcHR5IHJ1
bnMgc2hvdWxkIHN0aWxsIHByb2R1Y2UgYW4gZW50cnkgaW4gZXhwYW5zaW9uT3Bwb3J0dW5pdGll
cyBsaXN0IHNvIHRoYXQgdGhlIG51bWJlciBvZiBpdGVtcyBtYXRjaGVzIHRoZSBudW1iZXIgb2Yg
cnVucy4KLSAgICAgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0aWVzLmFwcGVuZCgwKTsK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBh
bnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvciA9IGV4cGFuc2lvbkJlaGF2aW9yRm9ySW5s
aW5lVGV4dEJveChibG9jaywgdGV4dEJveCwgcHJldmlvdXNSdW4sIG5leHRSdW4sIHRleHRBbGln
biwgaXNBZnRlckV4cGFuc2lvbik7Ci0gICAgICAgICAgICBhcHBseUV4cGFuc2lvbkJlaGF2aW9y
KHRleHRCb3gsIGV4cGFuc2lvbkJlaGF2aW9yKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIG9wcG9y
dHVuaXRpZXNJblJ1bjsKLSAgICAgICAgICAgIHN0ZDo6dGllKG9wcG9ydHVuaXRpZXNJblJ1biwg
aXNBZnRlckV4cGFuc2lvbikgPSBGb250Q2FzY2FkZTo6ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3Vu
dChzdHJpbmdWaWV3LCBkaXJlY3Rpb24sIGV4cGFuc2lvbkJlaGF2aW9yKTsKLSAgICAgICAgICAg
IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXBwZW5kKG9wcG9ydHVuaXRpZXNJblJ1bik7Ci0gICAg
ICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ICs9IG9wcG9ydHVuaXRpZXNJblJ1bjsK
LSAgICAgICAgfTsKLSAgICAgICAgaWYgKCFydW4tPmJveCgpIHx8IHJ1bi0+cmVuZGVyZXIoKS5p
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBydW4tPmJveCgpLT5pc0xpbmVCcmVhaygpKSB7Ci0g
ICAgICAgICAgICBjb250aW51ZTsgLy8gUG9zaXRpb25lZCBvYmplY3RzIGFyZSBvbmx5IHBhcnRp
Y2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgIC8vIGNv
cnJlY3Qgc3RhdGljIHggcG9zaXRpb24uICBUaGV5IGhhdmUgbm8gZWZmZWN0IG9uIHRoZSB3aWR0
aC4KLSAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHksIGxpbmUgYnJlYWsgYm94ZXMg
aGF2ZSBubyBlZmZlY3Qgb24gdGhlIHdpZHRoLgotICAgICAgICB9Ci0gICAgICAgIGlmIChpczxS
ZW5kZXJUZXh0PihydW4tPnJlbmRlcmVyKCkpKSB7Ci0gICAgICAgICAgICBhdXRvJiByZW5kZXJU
ZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAg
IGF1dG8mIHRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqcnVuLT5ib3goKSk7Ci0g
ICAgICAgICAgICBpZiAoY2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFydCAmJiBsaW5lSW5mby5pc0Zp
cnN0TGluZSgpICYmIChpc0xUUiB8fCBpc0xhc3RJbkZsb3dSdW4oKnJ1bikpCi0gICAgICAgICAg
ICAgICAgJiYgIWlubGluZUFuY2VzdG9ySGFzU3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4oKnRo
aXMsICpydW4tPmJveCgpKSkgewotICAgICAgICAgICAgICAgIGZsb2F0IGhhbmdTdGFydFdpZHRo
ID0gcmVuZGVyVGV4dC5oYW5nYWJsZVB1bmN0dWF0aW9uU3RhcnRXaWR0aChydW4tPm1fc3RhcnQp
OwotICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCArPSBoYW5nU3RhcnRXaWR0
aDsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxMZWZ0IC09IGhhbmdTdGFydFdpZHRoOwotICAg
ICAgICAgICAgICAgIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgPSBmYWxzZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkhhbmdQdW5jdHVhdGlvbkF0
RW5kICYmIGxpbmVJbmZvLmlzTGFzdExpbmUoKSAmJiBydW4tPm1fc3RvcCA+IDAgJiYgKCFpc0xU
UiB8fCBpc0xhc3RJbkZsb3dSdW4oKnJ1bikpCi0gICAgICAgICAgICAgICAgJiYgIWlubGluZUFu
Y2VzdG9ySGFzRW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0aGlzLCAqcnVuLT5ib3goKSkpIHsK
LSAgICAgICAgICAgICAgICBmbG9hdCBoYW5nRW5kV2lkdGggPSByZW5kZXJUZXh0LmhhbmdhYmxl
UHVuY3R1YXRpb25FbmRXaWR0aChydW4tPm1fc3RvcCAtIDEpOwotICAgICAgICAgICAgICAgIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCArPSBoYW5nRW5kV2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYg
KCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAg
bG9naWNhbExlZnQgLT0gaGFuZ0VuZFdpZHRoOwotICAgICAgICAgICAgICAgIGNhbkhhbmdQdW5j
dHVhdGlvbkF0RW5kID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGlmICh0ZXh0QWxpZ24gPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiBydW4gIT0g
dHJhaWxpbmdTcGFjZVJ1bikKLSAgICAgICAgICAgICAgICBjb21wdXRlRXhwYW5zaW9uT3Bwb3J0
dW5pdGllcygqdGhpcywgdGV4dEJveCwgcHJldmlvdXNSdW4sIHJ1bi0+bmV4dCgpLCByZW5kZXJU
ZXh0LnN0cmluZ1ZpZXcocnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCksIHJ1bi0+Ym94KCktPmRp
cmVjdGlvbigpKTsKLQotICAgICAgICAgICAgaWYgKHVuc2lnbmVkIGxlbmd0aCA9IHJlbmRlclRl
eHQudGV4dCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFydW4tPm1fc3RhcnQg
JiYgbmVlZHNXb3JkU3BhY2luZyAmJiBpc1NwYWNlT3JOZXdsaW5lKHJlbmRlclRleHQuY2hhcmFj
dGVyQXQocnVuLT5tX3N0YXJ0KSkpCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsTG9naWNhbFdp
ZHRoICs9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC5wYXJlbnQoKSwgbGluZUluZm8pLmZvbnRDYXNj
YWRlKCkud29yZFNwYWNpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyBydW4tPm1fc3RhcnQgPT0g
cnVuLT5tX3N0b3Agc2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZmYgdGhlIHJ1biBpcyBhIHJlcGxhY2Vk
IHJ1biBmb3IgYmlkaTogaXNvbGF0ZS4KLSAgICAgICAgICAgICAgICBBU1NFUlQocnVuLT5tX3N0
b3AgPiAwIHx8IHJ1bi0+bV9zdGFydCA9PSBydW4tPm1fc3RvcCk7Ci0gICAgICAgICAgICAgICAg
bmVlZHNXb3JkU3BhY2luZyA9IHJ1bi0+bV9zdG9wID09IGxlbmd0aCAmJiAhaXNTcGFjZU9yTmV3
bGluZShyZW5kZXJUZXh0LmNoYXJhY3RlckF0KHJ1bi0+bV9zdG9wIC0gMSkpOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBzZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKGxpbmVCb3gsIHJ1
biwgcmVuZGVyVGV4dCwgdG90YWxMb2dpY2FsV2lkdGgsIGxpbmVJbmZvLCB0ZXh0Qm94RGF0YU1h
cCwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQgPSBmYWxzZTsKLSAg
ICAgICAgICAgIGJvb2wgZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5ID0gZmFsc2U7Ci0gICAgICAg
ICAgICBpZiAoaXM8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKSAmJiB0ZXh0QWxpZ24g
PT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiBydW4gIT0gdHJhaWxpbmdTcGFjZVJ1biAmJiBk
b3duY2FzdDxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCkpIHsKLSAg
ICAgICAgICAgICAgICBhdXRvKiBydWJ5QmFzZSA9IGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJ1
bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocnVieUJhc2Ut
PmZpcnN0Um9vdEJveCgpICYmICFydWJ5QmFzZS0+Zmlyc3RSb290Qm94KCktPm5leHRSb290Qm94
KCkgJiYgcnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgcnVieUJhc2UtPnNldElzQWZ0ZXJFeHBhbnNpb24oaXNBZnRlckV4
cGFuc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byogbGVhZkNoaWxkID0gcnVi
eUJhc2UtPmZpcnN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgpOyBsZWFmQ2hpbGQ7IGxlYWZD
aGlsZCA9IGxlYWZDaGlsZC0+bmV4dExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIWlzPElubGluZVRleHRCb3g+KCpsZWFmQ2hpbGQpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VudGVy
ZWRKdXN0aWZpZWRSdWJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVF
eHBhbnNpb25PcHBvcnR1bml0aWVzKCpydWJ5QmFzZSwgZG93bmNhc3Q8SW5saW5lVGV4dEJveD4o
KmxlYWZDaGlsZCksIG51bGxwdHIsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5kZXJlcigpKS5zdHJpbmdWaWV3
KCksIGxlYWZDaGlsZC0+ZGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVuY291bnRl
cmVkSnVzdGlmaWVkUnVieSkKLSAgICAgICAgICAgICAgICBpc0FmdGVyRXhwYW5zaW9uID0gZmFs
c2U7Ci0KLSAgICAgICAgICAgIGlmICghaXM8UmVuZGVySW5saW5lPihydW4tPnJlbmRlcmVyKCkp
KSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgcmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94
PihydW4tPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmIChpczxSZW5kZXJSdWJ5UnVu
PihyZW5kZXJCb3gpKQotICAgICAgICAgICAgICAgICAgICBzZXRNYXJnaW5zRm9yUnVieVJ1bihy
dW4sIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJlbmRlckJveCksIHByZXZpb3VzUnVuID8gJnBy
ZXZpb3VzUnVuLT5yZW5kZXJlcigpIDogbnVsbHB0ciwgbGluZUluZm8pOwotICAgICAgICAgICAg
ICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JDaGlsZChyZW5k
ZXJCb3gpKTsKLSAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCArPSBtYXJnaW5TdGFy
dEZvckNoaWxkKHJlbmRlckJveCkgKyBtYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJCb3gpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gcnVu
LT5ib3goKS0+bG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIHByZXZpb3VzUnVuID0gcnVuOwotICAg
IH0KLQotICAgIGlmIChpc0FmdGVyRXhwYW5zaW9uICYmICFleHBhbnNpb25PcHBvcnR1bml0aWVz
LmlzRW1wdHkoKSkgewotICAgICAgICAvLyBGSVhNRTogc2VlIDx3ZWJraXQub3JnL2IvMTM5Mzkz
I2MxMT4KLSAgICAgICAgaW50IGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCA9
IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgd2hpbGUgKGxhc3RW
YWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCA+PSAwICYmICFleHBhbnNpb25PcHBvcnR1
bml0aWVzLmF0KGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCkpCi0gICAgICAg
ICAgICAtLWxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleDsKLSAgICAgICAgaWYg
KGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCA+PSAwKSB7Ci0gICAgICAgICAg
ICBBU1NFUlQoZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hdChsYXN0VmFsaWRFeHBhbnNpb25PcHBv
cnR1bml0aWVzSW5kZXgpKTsKLSAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXQo
bGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0luZGV4KS0tOwotICAgICAgICAgICAgZXhw
YW5zaW9uT3Bwb3J0dW5pdHlDb3VudC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlz
PFJlbmRlclJ1YnlCYXNlPigqdGhpcykgJiYgIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpCi0g
ICAgICAgIHRleHRBbGlnbiA9IFRleHRBbGlnbk1vZGU6OkNlbnRlcjsKLQotICAgIHVwZGF0ZUxv
Z2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24sIGxpbmVCb3gsIHRyYWlsaW5nU3BhY2VS
dW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRo
LCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKLQotICAgIGNvbXB1dGVFeHBhbnNpb25Gb3JK
dXN0aWZpZWRUZXh0KGZpcnN0UnVuLCB0cmFpbGluZ1NwYWNlUnVuLCBleHBhbnNpb25PcHBvcnR1
bml0aWVzLCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZh
aWxhYmxlTG9naWNhbFdpZHRoKTsKLQotICAgIHJldHVybiBydW47Ci19Ci0KLXZvaWQgUmVuZGVy
QmxvY2tGbG93OjpyZW1vdmVJbmxpbmVCb3goQmlkaVJ1biYgcnVuLCBjb25zdCBSb290SW5saW5l
Qm94JiByb290TGluZUJveCkgY29uc3QKLXsKLSAgICBhdXRvKiBpbmxpbmVCb3ggPSBydW4uYm94
KCk7Ci0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIGF1dG8qIGlubGluZVBhcmVudCA9IGlubGlu
ZUJveC0+cGFyZW50KCk7Ci0gICAgd2hpbGUgKGlubGluZVBhcmVudCAmJiBpbmxpbmVQYXJlbnQg
IT0gJnJvb3RMaW5lQm94KSB7Ci0gICAgICAgIEFTU0VSVCghaW5saW5lUGFyZW50LT5pc0RpcnR5
KCkpOwotICAgICAgICBpbmxpbmVQYXJlbnQgPSBpbmxpbmVQYXJlbnQtPnBhcmVudCgpOwotICAg
IH0KLSAgICBBU1NFUlQoIXJvb3RMaW5lQm94LmlzRGlydHkoKSk7Ci0jZW5kaWYKLSAgICBhdXRv
KiBwYXJlbnQgPSBpbmxpbmVCb3gtPnBhcmVudCgpOwotICAgIGlubGluZUJveC0+cmVtb3ZlRnJv
bVBhcmVudCgpOwotCi0gICAgYXV0byYgcmVuZGVyZXIgPSBydW4ucmVuZGVyZXIoKTsKLSAgICBp
ZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIpKQotICAgICAgICBkb3duY2FzdDxSZW5kZXJUZXh0
PihyZW5kZXJlcikucmVtb3ZlVGV4dEJveChkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqaW5saW5l
Qm94KSk7Ci0gICAgZGVsZXRlIGlubGluZUJveDsKLSAgICBydW4uc2V0Qm94KG51bGxwdHIpOwot
ICAgIC8vIHJlbW92ZUZyb21QYXJlbnQoKSB1bm5lY2Vzc2FyaWx5IGRpcnRpZXMgdGhlIGFuY2Vz
dG9yIHN1YnRyZWUuCi0gICAgYXV0byogYW5jZXN0b3IgPSBwYXJlbnQ7Ci0gICAgd2hpbGUgKGFu
Y2VzdG9yKSB7Ci0gICAgICAgIGFuY2VzdG9yLT5tYXJrRGlydHkoZmFsc2UpOwotICAgICAgICBp
ZiAoYW5jZXN0b3IgPT0gJnJvb3RMaW5lQm94KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGFuY2VzdG9yID0gYW5jZXN0b3ItPnBhcmVudCgpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJC
bG9ja0Zsb3c6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGlu
ZUJveCogbGluZUJveCwgQmlkaVJ1biogZmlyc3RSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFj
a0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUpCi17Ci0gICAgc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5hbGlnbkJv
eGVzSW5CbG9ja0RpcmVjdGlvbihsb2dpY2FsSGVpZ2h0KCksIHRleHRCb3hEYXRhTWFwLCB2ZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUpKTsKLQotICAgIC8vIE5vdyBtYWtlIHN1cmUgd2UgcGxhY2UgcmVw
bGFjZWQgcmVuZGVyIG9iamVjdHMgY29ycmVjdGx5LgotICAgIGZvciAoYXV0byogcnVuID0gZmly
c3RSdW47IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKLSAgICAgICAgQVNTRVJUKHJ1bi0+Ym94
KCkpOwotICAgICAgICBpZiAoIXJ1bi0+Ym94KCkpCi0gICAgICAgICAgICBjb250aW51ZTsgLy8g
U2tpcCBydW5zIHdpdGggbm8gbGluZSBib3hlcy4KLQotICAgICAgICAvLyBBbGlnbiBwb3NpdGlv
bmVkIGJveGVzIHdpdGggdGhlIHRvcCBvZiB0aGUgbGluZSBib3guICBUaGlzIGlzCi0gICAgICAg
IC8vIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHkgcG9zaXRp
b24uCi0gICAgICAgIGF1dG8mIHJlbmRlcmVyID0gcnVuLT5yZW5kZXJlcigpOwotICAgICAgICBp
ZiAocmVuZGVyZXIuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBydW4tPmJv
eCgpLT5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxIZWlnaHQoKSk7Ci0KLSAgICAgICAgLy8gUG9zaXRp
b24gaXMgdXNlZCB0byBwcm9wZXJseSBwb3NpdGlvbiBib3RoIHJlcGxhY2VkIGVsZW1lbnRzIGFu
ZAotICAgICAgICAvLyB0byB1cGRhdGUgdGhlIHN0YXRpYyBub3JtYWwgZmxvdyB4L3kgb2YgcG9z
aXRpb25lZCBlbGVtZW50cy4KLSAgICAgICAgYm9vbCBpbmxpbmVCb3hJc1JlZHVuZGFudCA9IGZh
bHNlOwotICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIpKSB7Ci0gICAgICAgICAg
ICBhdXRvJiBpbmxpbmVUZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94
KCkpOwotICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4ocmVuZGVyZXIpLnBvc2l0aW9u
TGluZUJveChpbmxpbmVUZXh0Qm94KTsKLSAgICAgICAgICAgIGlubGluZUJveElzUmVkdW5kYW50
ID0gIWlubGluZVRleHRCb3guaGFzVGV4dENvbnRlbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChp
czxSZW5kZXJCb3g+KHJlbmRlcmVyKSkgewotICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyQm94
PihyZW5kZXJlcikucG9zaXRpb25MaW5lQm94KGRvd25jYXN0PElubGluZUVsZW1lbnRCb3g+KCpy
dW4tPmJveCgpKSk7Ci0gICAgICAgICAgICBpbmxpbmVCb3hJc1JlZHVuZGFudCA9IHJlbmRlcmVy
LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGlzPFJlbmRlckxp
bmVCcmVhaz4ocmVuZGVyZXIpKQotICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyTGluZUJyZWFr
PihyZW5kZXJlcikucmVwbGFjZUlubGluZUJveFdyYXBwZXIoZG93bmNhc3Q8SW5saW5lRWxlbWVu
dEJveD4oKnJ1bi0+Ym94KCkpKTsKLSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBrZWVw
IHRoaXMgYm94IG9uIHRoZSBsaW5lIGF0IGFsbC4KLSAgICAgICAgaWYgKGlubGluZUJveElzUmVk
dW5kYW50KQotICAgICAgICAgICAgcmVtb3ZlSW5saW5lQm94KCpydW4sICpsaW5lQm94KTsKLSAg
ICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlU3BhY2UoVUNoYXIgY2hh
cmFjdGVyLCBjb25zdCBSZW5kZXJUZXh0JiByZW5kZXJlcikKLXsKLSAgICBpZiAoY2hhcmFjdGVy
ID09ICcgJyB8fCBjaGFyYWN0ZXIgPT0gJ1x0JyB8fCBjaGFyYWN0ZXIgPT0gc29mdEh5cGhlbikK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGNoYXJhY3RlciA9PSAnXG4nKQotICAgICAg
ICByZXR1cm4gIXJlbmRlcmVyLnN0eWxlKCkucHJlc2VydmVOZXdsaW5lKCk7Ci0gICAgaWYgKGNo
YXJhY3RlciA9PSBub0JyZWFrU3BhY2UpCi0gICAgICAgIHJldHVybiByZW5kZXJlci5zdHlsZSgp
Lm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNwYWNlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
dGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVk
IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UoY29uc3QgUmVuZGVyVGV4dCYgbGFzdFRleHQsIGNvbnN0
IENoYXJhY3RlclR5cGUqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBzdG9w
KQotewotICAgIHVuc2lnbmVkIGZpcnN0U3BhY2UgPSBzdG9wOwotICAgIHdoaWxlIChmaXJzdFNw
YWNlID4gc3RhcnQpIHsKLSAgICAgICAgVUNoYXIgY3VycmVudCA9IGNoYXJhY3RlcnNbZmlyc3RT
cGFjZSAtIDFdOwotICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVTcGFjZShjdXJyZW50LCBsYXN0
VGV4dCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZmlyc3RTcGFjZS0tOwotICAgIH0K
LQotICAgIHJldHVybiBmaXJzdFNwYWNlOwotfQotCi1pbmxpbmUgQmlkaVJ1biogUmVuZGVyQmxv
Y2tGbG93OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1
bnMsIEJpZGlDb250ZXh0KiBjdXJyZW50Q29udGV4dCkKLXsKLSAgICBpZiAoIWJpZGlSdW5zLnJ1
bkNvdW50KCkKLSAgICAgICAgfHwgIWJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVy
ZXIoKS5zdHlsZSgpLmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpCi0gICAgICAgIHx8ICFiaWRp
UnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkuc3R5bGUoKS5hdXRvV3JhcCgpKQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4g
PSBiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCk7Ci0gICAgY29uc3QgUmVuZGVyT2JqZWN0JiBs
YXN0T2JqZWN0ID0gdHJhaWxpbmdTcGFjZVJ1bi0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIWlzPFJl
bmRlclRleHQ+KGxhc3RPYmplY3QpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGNv
bnN0IFJlbmRlclRleHQmIGxhc3RUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4obGFzdE9iamVj
dCk7Ci0gICAgdW5zaWduZWQgZmlyc3RTcGFjZTsKLSAgICBpZiAobGFzdFRleHQudGV4dCgpLmlz
OEJpdCgpKQotICAgICAgICBmaXJzdFNwYWNlID0gZmluZEZpcnN0VHJhaWxpbmdTcGFjZShsYXN0
VGV4dCwgbGFzdFRleHQudGV4dCgpLmNoYXJhY3RlcnM4KCksIHRyYWlsaW5nU3BhY2VSdW4tPnN0
YXJ0KCksIHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSk7Ci0gICAgZWxzZQotICAgICAgICBmaXJz
dFNwYWNlID0gZmluZEZpcnN0VHJhaWxpbmdTcGFjZShsYXN0VGV4dCwgbGFzdFRleHQudGV4dCgp
LmNoYXJhY3RlcnMxNigpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdGFydCgpLCB0cmFpbGluZ1NwYWNl
UnVuLT5zdG9wKCkpOwotCi0gICAgaWYgKGZpcnN0U3BhY2UgPT0gdHJhaWxpbmdTcGFjZVJ1bi0+
c3RvcCgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIFRleHREaXJlY3Rpb24gZGly
ZWN0aW9uID0gc3R5bGUoKS5kaXJlY3Rpb24oKTsKLSAgICBib29sIHNob3VsZFJlb3JkZXIgPSB0
cmFpbGluZ1NwYWNlUnVuICE9IChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSID8gYmlk
aVJ1bnMubGFzdFJ1bigpIDogYmlkaVJ1bnMuZmlyc3RSdW4oKSk7Ci0gICAgaWYgKGZpcnN0U3Bh
Y2UgIT0gdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSkgewotICAgICAgICBCaWRpQ29udGV4dCog
YmFzZUNvbnRleHQgPSBjdXJyZW50Q29udGV4dDsKLSAgICAgICAgd2hpbGUgKEJpZGlDb250ZXh0
KiBwYXJlbnQgPSBiYXNlQ29udGV4dC0+cGFyZW50KCkpCi0gICAgICAgICAgICBiYXNlQ29udGV4
dCA9IHBhcmVudDsKLQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QmlkaVJ1bj4gbmV3VHJhaWxp
bmdSdW4gPSBzdGQ6Om1ha2VfdW5pcXVlPEJpZGlSdW4+KGZpcnN0U3BhY2UsIHRyYWlsaW5nU3Bh
Y2VSdW4tPm1fc3RvcCwgdHJhaWxpbmdTcGFjZVJ1bi0+cmVuZGVyZXIoKSwgYmFzZUNvbnRleHQs
IFVfT1RIRVJfTkVVVFJBTCk7Ci0gICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1fc3RvcCA9IGZp
cnN0U3BhY2U7Ci0gICAgICAgIHRyYWlsaW5nU3BhY2VSdW4gPSBuZXdUcmFpbGluZ1J1bi5nZXQo
KTsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpCi0gICAgICAg
ICAgICBiaWRpUnVucy5hcHBlbmRSdW4oV1RGTW92ZShuZXdUcmFpbGluZ1J1bikpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBiaWRpUnVucy5wcmVwZW5kUnVuKFdURk1vdmUobmV3VHJhaWxp
bmdSdW4pKTsKLSAgICAgICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VSdW47Ci0gICAgfQotICAgIGlm
ICghc2hvdWxkUmVvcmRlcikKLSAgICAgICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VSdW47Ci0KLSAg
ICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikgewotICAgICAgICBiaWRpUnVu
cy5tb3ZlUnVuVG9FbmQodHJhaWxpbmdTcGFjZVJ1bik7Ci0gICAgICAgIHRyYWlsaW5nU3BhY2VS
dW4tPm1fbGV2ZWwgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpZGlSdW5zLm1vdmVSdW5U
b0JlZ2lubmluZyh0cmFpbGluZ1NwYWNlUnVuKTsKLSAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+
bV9sZXZlbCA9IDE7Ci0gICAgfQotICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOwotfQotCi12
b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0
aW5nT2JqZWN0JiBmbG9hdGluZ09iamVjdCkKLXsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9J
TVBMSUNBVElPTighZmxvYXRpbmdPYmplY3Qub3JpZ2luYXRpbmdMaW5lKCkpOwotICAgIEFTU0VS
VChsYXN0Um9vdEJveCgpKTsKLSAgICBmbG9hdGluZ09iamVjdC5zZXRPcmlnaW5hdGluZ0xpbmUo
Kmxhc3RSb290Qm94KCkpOwotICAgIGxhc3RSb290Qm94KCktPmFwcGVuZEZsb2F0KGZsb2F0aW5n
T2JqZWN0LnJlbmRlcmVyKCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbm90aWZ5UmVzb2x2
ZXJUb1Jlc3VtZUluSXNvbGF0ZShJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBSZW5kZXJP
YmplY3QqIHJvb3QsIFJlbmRlck9iamVjdCogc3RhcnRPYmplY3QpCi17Ci0gICAgaWYgKHJvb3Qg
IT0gc3RhcnRPYmplY3QpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnQgPSBzdGFydE9i
amVjdC0+cGFyZW50KCk7Ci0gICAgICAgIG5vdGlmeVJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUo
cmVzb2x2ZXIsIHJvb3QsIHBhcmVudCk7Ci0gICAgICAgIG5vdGlmeU9ic2VydmVyRW50ZXJlZE9i
amVjdCgmcmVzb2x2ZXIsIHN0YXJ0T2JqZWN0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
dm9pZCBzZXRVcFJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUoSW5saW5lQmlkaVJlc29sdmVyJiBy
ZXNvbHZlciwgSW5saW5lQmlkaVJlc29sdmVyJiB0b3BSZXNvbHZlciwgQmlkaVJ1biYgaXNvbGF0
ZWRSdW4sIFJlbmRlck9iamVjdCogcm9vdCwgUmVuZGVyT2JqZWN0KiBzdGFydE9iamVjdCkKLXsK
LSAgICAvLyBTZXQgdXAgbV93aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlCi0gICAgcmVzb2x2ZXIu
d2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSgpID0gdG9wUmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxh
cHNpbmdTdGF0ZSgpOwotICAgIHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUoKS5z
ZXRDdXJyZW50VHJhbnNpdGlvbih0b3BSZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1RyYW5z
aXRpb25Gb3JJc29sYXRlZFJ1bihpc29sYXRlZFJ1bikpOwotCi0gICAgLy8gU2V0IHVwIG1fbmVz
dGVkSXNvbGF0ZUNvdW50Ci0gICAgbm90aWZ5UmVzb2x2ZXJUb1Jlc3VtZUluSXNvbGF0ZShyZXNv
bHZlciwgcm9vdCwgc3RhcnRPYmplY3QpOwotfQotCi0vLyBGSVhNRTogQmlkaVJlc29sdmVyIHNo
b3VsZCBoYXZlIHRoaXMgbG9naWMuCi1zdGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0QmlkaVJ1
bnNGb3JTZWdtZW50KElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVzb2x2ZXIsIEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZE9mUnVucywgVmlz
dWFsRGlyZWN0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KQotewotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcGFzcyBhIEJpZGlSdW5MaXN0IGludG8g
Y3JlYXRlQmlkaVJ1bnNGb3JMaW5lIGluc3RlYWQKLSAgICAvLyBvZiB0aGUgcmVzb2x2ZXIgb3du
aW5nIHRoZSBydW5zLgotICAgIEFTU0VSVCgmdG9wUmVzb2x2ZXIucnVucygpID09ICZiaWRpUnVu
cyk7Ci0gICAgQVNTRVJUKHRvcFJlc29sdmVyLnBvc2l0aW9uKCkgIT0gZW5kT2ZSdW5zKTsKLSAg
ICBSZW5kZXJPYmplY3QqIGN1cnJlbnRSb290ID0gdG9wUmVzb2x2ZXIucG9zaXRpb24oKS5yb290
KCk7Ci0gICAgdG9wUmVzb2x2ZXIuY3JlYXRlQmlkaVJ1bnNGb3JMaW5lKGVuZE9mUnVucywgb3Zl
cnJpZGUsIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7Ci0KLSAgICB3aGlsZSAoIXRvcFJlc29s
dmVyLmlzb2xhdGVkUnVucygpLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBJdCBkb2VzIG5vdCBt
YXR0ZXIgd2hpY2ggb3JkZXIgd2UgcmVzb2x2ZSB0aGUgcnVucyBhcyBsb25nIGFzIHdlIHJlc29s
dmUgdGhlbSBhbGwuCi0gICAgICAgIGF1dG8gaXNvbGF0ZWRSdW4gPSBXVEZNb3ZlKHRvcFJlc29s
dmVyLmlzb2xhdGVkUnVucygpLmxhc3QoKSk7Ci0gICAgICAgIHRvcFJlc29sdmVyLmlzb2xhdGVk
UnVucygpLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgY3VycmVudFJvb3QgPSAmaXNvbGF0ZWRSdW4u
cm9vdDsKLQotICAgICAgICBSZW5kZXJPYmplY3QmIHN0YXJ0T2JqZWN0ID0gaXNvbGF0ZWRSdW4u
b2JqZWN0OwotCi0gICAgICAgIC8vIE9ubHkgaW5saW5lcyBtYWtlIHNlbnNlIHdpdGggdW5pY29k
ZS1iaWRpOiBpc29sYXRlIChibG9ja3MgYXJlIGFscmVhZHkgaXNvbGF0ZWQpLgotICAgICAgICAv
LyBGSVhNRTogQmVjYXVzZSBlbnRlcklzb2xhdGUgaXMgbm90IHBhc3NlZCBhIFJlbmRlck9iamVj
dCwgd2UgaGF2ZSB0byBjcmF3bCB1cCB0aGUKLSAgICAgICAgLy8gdHJlZSB0byBzZWUgd2hpY2gg
cGFyZW50IGlubGluZSBpcyB0aGUgaXNvbGF0ZS4gV2UgY291bGQgY2hhbmdlIGVudGVySXNvbGF0
ZQotICAgICAgICAvLyB0byB0YWtlIGEgUmVuZGVyT2JqZWN0IGFuZCBkbyB0aGlzIGxvZ2ljIHRo
ZXJlLCBidXQgdGhhdCB3b3VsZCBiZSBhIGxheWVyaW5nCi0gICAgICAgIC8vIHZpb2xhdGlvbiBm
b3IgQmlkaVJlc29sdmVyICh3aGljaCBrbm93cyBub3RoaW5nIGFib3V0IFJlbmRlck9iamVjdCku
Ci0gICAgICAgIFJlbmRlcklubGluZSogaXNvbGF0ZWRJbmxpbmUgPSBkb3duY2FzdDxSZW5kZXJJ
bmxpbmU+KGhpZ2hlc3RDb250YWluaW5nSXNvbGF0ZVdpdGhpblJvb3Qoc3RhcnRPYmplY3QsIGN1
cnJlbnRSb290KSk7Ci0gICAgICAgIEFTU0VSVChpc29sYXRlZElubGluZSk7Ci0KLSAgICAgICAg
SW5saW5lQmlkaVJlc29sdmVyIGlzb2xhdGVkUmVzb2x2ZXI7Ci0gICAgICAgIEVVbmljb2RlQmlk
aSB1bmljb2RlQmlkaSA9IGlzb2xhdGVkSW5saW5lLT5zdHlsZSgpLnVuaWNvZGVCaWRpKCk7Ci0g
ICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uOwotICAgICAgICBpZiAodW5pY29kZUJpZGkg
PT0gUGxhaW50ZXh0KQotICAgICAgICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGlyZWN0
aW9uLCBJbmxpbmVJdGVyYXRvcihpc29sYXRlZElubGluZSwgJmlzb2xhdGVkUnVuLm9iamVjdCwg
MCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEFTU0VSVCh1bmljb2RlQmlkaSA9PSBJ
c29sYXRlIHx8IHVuaWNvZGVCaWRpID09IElzb2xhdGVPdmVycmlkZSk7Ci0gICAgICAgICAgICBk
aXJlY3Rpb24gPSBpc29sYXRlZElubGluZS0+c3R5bGUoKS5kaXJlY3Rpb24oKTsKLSAgICAgICAg
fQotICAgICAgICBpc29sYXRlZFJlc29sdmVyLnNldFN0YXR1cyhCaWRpU3RhdHVzKGRpcmVjdGlv
biwgaXNPdmVycmlkZSh1bmljb2RlQmlkaSkpKTsKLQotICAgICAgICBzZXRVcFJlc29sdmVyVG9S
ZXN1bWVJbklzb2xhdGUoaXNvbGF0ZWRSZXNvbHZlciwgdG9wUmVzb2x2ZXIsIGlzb2xhdGVkUnVu
LnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRJbmxpbmUsICZzdGFydE9iamVjdCk7Ci0KLSAgICAgICAg
Ly8gVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHJ1
biB3aXRoaW4gdGhlIGlzb2xhdGUgdGhhdCB3YXMgaWRlbnRpZmllZAotICAgICAgICAvLyBkdXJp
bmcgdGhlIGVhcmxpZXIgY2FsbCB0byBjcmVhdGVCaWRpUnVuc0ZvckxpbmUuIFRoaXMgY2FuIGJl
IGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlCi0gICAgICAgIC8vIGZpcnN0IHJ1biB3aXRoaW4g
dGhlIGlzb2xhdGUuCi0gICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVyYXRv
cihpc29sYXRlZElubGluZSwgJnN0YXJ0T2JqZWN0LCBpc29sYXRlZFJ1bi5wb3NpdGlvbik7Ci0g
ICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuc2V0UG9zaXRpb25JZ25vcmluZ05lc3RlZElzb2xhdGVz
KGl0ZXIpOwotCi0gICAgICAgIC8vIFdlIHN0b3AgYXQgdGhlIG5leHQgZW5kIG9mIGxpbmU7IHdl
IG1heSByZS1lbnRlciB0aGlzIGlzb2xhdGUgaW4gdGhlIG5leHQgY2FsbCB0byBjb25zdHJ1Y3RC
aWRpUnVucygpLgotICAgICAgICAvLyBGSVhNRTogV2hhdCBzaG91bGQgZW5kIGFuZCBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkgYmU/Ci0gICAgICAgIC8vIHJuaXdhIHNheXMgcHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5IGlzIGp1c3QgYSBXaW5JRSBoYWNrIGFuZCBjb3VsZCBhbHdheXMgYmUgZmFs
c2UgaGVyZT8KLSAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5jcmVhdGVCaWRpUnVuc0ZvckxpbmUo
ZW5kT2ZSdW5zLCBOb1Zpc3VhbE92ZXJyaWRlLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwot
ICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSB0aGUgcnVucyBmcm9tIHRoZSBy
ZXNvbHZlci4KLSAgICAgICAgLy8gV2UncmUgbm90IGd1YXJhbnRlZWQgdG8gZ2V0IGFueSBCaWRp
UnVucyBpbiB0aGUgcHJldmlvdXMgc3RlcC4gSWYgd2UgZG9uJ3QsIHdlIGFsbG93IHRoZSBwbGFj
ZWhvbGRlcgotICAgICAgICAvLyBpdHNlbGYgdG8gYmUgdHVybmVkIGludG8gYW4gSW5saW5lQm94
LiBXZSBjYW4ndCByZW1vdmUgaXQgaGVyZSB3aXRob3V0IHBvdGVudGlhbGx5IGxvc2luZyB0cmFj
ayBvZgotICAgICAgICAvLyB0aGUgbG9naWNhbGx5IGxhc3QgcnVuLgotICAgICAgICBpZiAoaXNv
bGF0ZWRSZXNvbHZlci5ydW5zKCkucnVuQ291bnQoKSkKLSAgICAgICAgICAgIGJpZGlSdW5zLnJl
cGxhY2VSdW5XaXRoUnVucygmaXNvbGF0ZWRSdW4ucnVuVG9SZXBsYWNlLCBpc29sYXRlZFJlc29s
dmVyLnJ1bnMoKSk7Ci0KLSAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyZWQgYW55IG5lc3RlZCBp
c29sYXRlIHJ1bnMsIGp1c3QgbW92ZSB0aGVtCi0gICAgICAgIC8vIHRvIHRoZSB0b3AgcmVzb2x2
ZXIncyBsaXN0IGZvciBsYXRlciBwcm9jZXNzaW5nLgotICAgICAgICB3aGlsZSAoIWlzb2xhdGVk
UmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhdXRvIHJ1
bldpdGhDb250ZXh0ID0gV1RGTW92ZShpc29sYXRlZFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmxh
c3QoKSk7Ci0gICAgICAgICAgICBpc29sYXRlZFJlc29sdmVyLmlzb2xhdGVkUnVucygpLnJlbW92
ZUxhc3QoKTsKLSAgICAgICAgICAgIHRvcFJlc29sdmVyLnNldFdoaXRlc3BhY2VDb2xsYXBzaW5n
VHJhbnNpdGlvbkZvcklzb2xhdGVkUnVuKHJ1bldpdGhDb250ZXh0LnJ1blRvUmVwbGFjZSwgaXNv
bGF0ZWRSZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1RyYW5zaXRpb25Gb3JJc29sYXRlZFJ1
bihydW5XaXRoQ29udGV4dC5ydW5Ub1JlcGxhY2UpKTsKLSAgICAgICAgICAgIHRvcFJlc29sdmVy
Lmlzb2xhdGVkUnVucygpLmFwcGVuZChXVEZNb3ZlKHJ1bldpdGhDb250ZXh0KSk7Ci0gICAgICAg
IH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyBsaW5lIGJveGVzIGZv
ciBhbGwgb2YgdGhlIHRleHQgcnVucyBpbiB0aGUgcmVzb2x2ZXIgYW5kIGNvbXB1dGVzIHRoZWly
IHBvc2l0aW9uLgotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94
ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxldmVsLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYg
YmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiBsaW5lSW5mbywg
VmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIEJpZGlSdW4qIHRy
YWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCi17Ci0g
ICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQot
ICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhpcyBvbmx5IGRvbmUgd2hlbiB3ZSBoYWQgcnVucz8KLSAg
ICBsaW5lSW5mby5zZXRMYXN0TGluZSghZW5kLnJlbmRlcmVyKCkpOwotCi0gICAgUm9vdElubGlu
ZUJveCogbGluZUJveCA9IGNvbnN0cnVjdExpbmUoYmlkaVJ1bnMsIGxpbmVJbmZvKTsKLSAgICBp
ZiAoIWxpbmVCb3gpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgbGluZUJveC0+c2V0
QmlkaUxldmVsKGJpZGlMZXZlbCk7Ci0gICAgbGluZUJveC0+c2V0RW5kc1dpdGhCcmVhayhsaW5l
SW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSk7Ci0gICAgCi0gICAgYm9vbCBpc1NWR1Jv
b3RJbmxpbmVCb3ggPSBpczxTVkdSb290SW5saW5lQm94PigqbGluZUJveCk7Ci0gICAgCi0gICAg
R2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAgdGV4dEJveERhdGFNYXA7Ci0gICAgCi0g
ICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBydW5zIGhvcml6b250YWxseS4K
LSAgICBpZiAoIWlzU1ZHUm9vdElubGluZUJveCkKLSAgICAgICAgY29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgbGluZUluZm8sIGJpZGlSdW5zLmZpcnN0UnVu
KCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGlj
YWxQb3NpdGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKLSAgICAKLSAgICAvLyBOb3cgcG9z
aXRpb24gb3VyIHRleHQgcnVucyB2ZXJ0aWNhbGx5LgotICAgIGNvbXB1dGVCbG9ja0RpcmVjdGlv
blBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgYmlkaVJ1bnMuZmlyc3RSdW4oKSwgdGV4dEJveERh
dGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7Ci0gICAgCi0gICAgLy8gU1ZHIHRleHQgbGF5
b3V0IGNvZGUgY29tcHV0ZXMgdmVydGljYWwgJiBob3Jpem9udGFsIHBvc2l0aW9ucyBvbiBpdHMg
b3duLgotICAgIC8vIE5vdGUgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGV4ZWN1dGUgY29tcHV0ZVZl
cnRpY2FsUG9zaXRpb25zRm9yTGluZSgpIGFzCi0gICAgLy8gaXQgY2FsbHMgSW5saW5lVGV4dEJv
eDo6cG9zaXRpb25MaW5lQm94KCksIHdoaWNoIHRyYWNrcyB3aGV0aGVyIHRoZSBib3gKLSAgICAv
LyBjb250YWlucyByZXZlcnNlZCB0ZXh0IG9yIG5vdC4gSWYgd2Ugd291bGRuJ3QgZG8gdGhhdCBl
ZGl0aW5nIGFuZCB0aHVzCi0gICAgLy8gdGV4dCBzZWxlY3Rpb24gaW4gUlRMIGJveGVzIHdvdWxk
IG5vdCB3b3JrIGFzIGV4cGVjdGVkLgotICAgIGlmIChpc1NWR1Jvb3RJbmxpbmVCb3gpIHsKLSAg
ICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oaXNTVkdUZXh0KCkpOwotICAg
ICAgICBkb3duY2FzdDxTVkdSb290SW5saW5lQm94PigqbGluZUJveCkuY29tcHV0ZVBlckNoYXJh
Y3RlckxheW91dEluZm9ybWF0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8vIENvbXB1dGUgb3Vy
IG92ZXJmbG93IG5vdy4KLSAgICBsaW5lQm94LT5jb21wdXRlT3ZlcmZsb3cobGluZUJveC0+bGlu
ZVRvcCgpLCBsaW5lQm94LT5saW5lQm90dG9tKCksIHRleHRCb3hEYXRhTWFwKTsKLSAgICAKLSAg
ICByZXR1cm4gbGluZUJveDsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlTGluZVJhbmdlKExpbmVM
YXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSwgUm9vdElu
bGluZUJveCogc3RvcExpbmUgPSAwKQotewotICAgIFJvb3RJbmxpbmVCb3gqIGJveFRvRGVsZXRl
ID0gc3RhcnRMaW5lOwotICAgIHdoaWxlIChib3hUb0RlbGV0ZSAmJiBib3hUb0RlbGV0ZSAhPSBz
dG9wTGluZSkgewotICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94
KGJveFRvRGVsZXRlKTsKLSAgICAgICAgLy8gTm90ZTogZGVsZXRlTGluZVJhbmdlKGZpcnN0Um9v
dEJveCgpKSBpcyBub3QgaWRlbnRpY2FsIHRvIGRlbGV0ZUxpbmVCb3hUcmVlKCkuCi0gICAgICAg
IC8vIGRlbGV0ZUxpbmVCb3hUcmVlIHVzZXMgbmV4dExpbmVCb3goKSBpbnN0ZWFkIG9mIG5leHRS
b290Qm94KCkgd2hlbiB0cmF2ZXJzaW5nLgotICAgICAgICBSb290SW5saW5lQm94KiBuZXh0ID0g
Ym94VG9EZWxldGUtPm5leHRSb290Qm94KCk7Ci0gICAgICAgIGJveFRvRGVsZXRlLT5kZWxldGVM
aW5lKCk7Ci0gICAgICAgIGJveFRvRGVsZXRlID0gbmV4dDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2
b2lkIHJlcGFpbnREaXJ0eUZsb2F0cyhMaW5lTGF5b3V0U3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRz
KQotewotICAgIC8vIEZsb2F0cyB0aGF0IGRpZCBub3QgaGF2ZSBsYXlvdXQgZGlkIG5vdCByZXBh
aW50IHdoZW4gd2UgbGFpZCB0aGVtIG91dC4gVGhleSB3b3VsZCBoYXZlCi0gICAgLy8gcGFpbnRl
ZCBieSBub3cgaWYgdGhleSBoYWQgbW92ZWQsIGJ1dCBpZiB0aGV5IHN0YXllZCBhdCAoMCwgMCks
IHRoZXkgc3RpbGwgbmVlZCB0byBiZQotICAgIC8vIHBhaW50ZWQuCi0gICAgZm9yIChhdXRvJiBm
bG9hdEJveCA6IGZsb2F0cykgewotICAgICAgICBpZiAoZmxvYXRCb3gtPmV2ZXJIYWRMYXlvdXQo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhdXRvJiBib3ggPSBmbG9hdEJveC0+
cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKCFib3gueCgpICYmICFib3gueSgpICYmIGJveC5jaGVj
a0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKSkKLSAgICAgICAgICAgIGJveC5yZXBhaW50KCk7Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0cyhMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lubGluZUNoaWxkKQotewotICAgIC8v
IFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGlydHkgbGluZQotICAgIElubGlu
ZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKLSAgICBSb290SW5saW5lQm94KiBzdGFydExpbmUgPSBk
ZXRlcm1pbmVTdGFydFBvc2l0aW9uKGxheW91dFN0YXRlLCByZXNvbHZlcik7Ci0gICAgCi0gICAg
dW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPSAwOwotICAgIGlmIChzdGFydExp
bmUpIHsKLSAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBsaW5lID0gc3RhcnRMaW5lLT5wcmV2
Um9vdEJveCgpOyBsaW5lICYmIGxpbmUtPmlzSHlwaGVuYXRlZCgpOyBsaW5lID0gbGluZS0+cHJl
dlJvb3RCb3goKSkKLSAgICAgICAgICAgIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKys7Ci0g
ICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgd291bGQgbWFrZSBtb3JlIHNlbnNlIG91dHNpZGUg
b2YgdGhpcyBmdW5jdGlvbiwgYnV0IHNpbmNlCi0gICAgLy8gZGV0ZXJtaW5lU3RhcnRQb3NpdGlv
biBjYW4gY2hhbmdlIHRoZSBmdWxsTGF5b3V0IGZsYWcgd2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUu
IEZhaWx1cmUgdG8gY2FsbAotICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRpb24gZmlyc3Qgd2ls
bCBicmVhayBmYXN0L3JlcGFpbnQvbGluZS1mbG93LXdpdGgtZmxvYXRzLTkuaHRtbC4KLSAgICBp
ZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkgJiYgaGFzSW5saW5lQ2hpbGQgJiYgIXNlbGZO
ZWVkc0xheW91dCgpKSB7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7IC8v
IE1hcmsgYXMgbmVlZGluZyBhIGZ1bGwgbGF5b3V0IHRvIGZvcmNlIHVzIHRvIHJlcGFpbnQuCi0g
ICAgICAgIGlmICghdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5uZWVkc0Z1bGxS
ZXBhaW50KCkgJiYgaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSAmJiBoYXNSZXBhaW50TGF5b3V0UmVj
dHMoKSkgewotICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBh
bHJlYWR5IGluc2lkZSBsYXlvdXQgdG8gZGlzY292ZXIKLSAgICAgICAgICAgIC8vIHRoYXQgdGhl
IGJsb2NrIHJlYWxseSBuZWVkZWQgYSBmdWxsIGxheW91dCwgd2UgbWlzc2VkIG91ciBjaGFuY2Ug
dG8gcmVwYWludCB0aGUgbGF5ZXIKLSAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQgc3RhcnRl
ZC4gIEx1Y2tpbHkgdGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRz
IG9yaWdpbmFsCi0gICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNh
biB1c2UgdGhhdCB0byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93LgotICAgICAgICAgICAgcmVw
YWludFVzaW5nQ29udGFpbmVyKGNvbnRhaW5lckZvclJlcGFpbnQoKSwgcmVwYWludExheW91dFJl
Y3RzKCkubV9yZXBhaW50UmVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY29udGFp
bnNGbG9hdHMoKSkKLSAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuc2V0TGFzdEZsb2F0
KG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5sYXN0KCkuZ2V0KCkpOwotCi0gICAgLy8gV2UgYWxz
byBmaW5kIHRoZSBmaXJzdCBjbGVhbiBsaW5lIGFuZCBleHRyYWN0IHRoZXNlIGxpbmVzLiAgV2Ug
d2lsbCBhZGQgdGhlbSBiYWNrCi0gICAgLy8gaWYgd2UgZGV0ZXJtaW5lIHRoYXQgd2UncmUgYWJs
ZSB0byBzeW5jaHJvbml6ZSBhZnRlciBoYW5kbGluZyBhbGwgb3VyIGRpcnR5IGxpbmVzLgotICAg
IElubGluZUl0ZXJhdG9yIGNsZWFuTGluZVN0YXJ0OwotICAgIEJpZGlTdGF0dXMgY2xlYW5MaW5l
QmlkaVN0YXR1czsKLSAgICBpZiAoIWxheW91dFN0YXRlLmlzRnVsbExheW91dCgpICYmIHN0YXJ0
TGluZSkKLSAgICAgICAgZGV0ZXJtaW5lRW5kUG9zaXRpb24obGF5b3V0U3RhdGUsIHN0YXJ0TGlu
ZSwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlTdGF0dXMpOwotCi0gICAgaWYgKHN0YXJ0
TGluZSkgewotICAgICAgICBpZiAoIWxheW91dFN0YXRlLnVzZXNSZXBhaW50Qm91bmRzKCkpCi0g
ICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRSZXBhaW50UmFuZ2UobG9naWNhbEhlaWdodCgpKTsK
LSAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBzdGFydExpbmUpOwotICAgIH0K
LQotICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkgJiYgbGFzdFJvb3RCb3goKSAm
JiBsYXN0Um9vdEJveCgpLT5lbmRzV2l0aEJyZWFrKCkpIHsKLSAgICAgICAgLy8gSWYgdGhlIGxh
c3QgbGluZSBiZWZvcmUgdGhlIHN0YXJ0IGxpbmUgZW5kcyB3aXRoIGEgbGluZSBicmVhayB0aGF0
IGNsZWFyIGZsb2F0cywKLSAgICAgICAgLy8gYWRqdXN0IHRoZSBoZWlnaHQgYWNjb3JkaW5nbHku
Ci0gICAgICAgIC8vIEEgbGluZSBicmVhayBjYW4gYmUgZWl0aGVyIHRoZSBmaXJzdCBvciB0aGUg
bGFzdCBvYmplY3Qgb24gYSBsaW5lLCBkZXBlbmRpbmcgb24gaXRzIGRpcmVjdGlvbi4KLSAgICAg
ICAgaWYgKElubGluZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RSb290Qm94KCktPmxhc3RMZWFm
Q2hpbGQoKSkgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBsYXN0T2JqZWN0ID0gJmxhc3RM
ZWFmQ2hpbGQtPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBpZiAoIWxhc3RPYmplY3QtPmlzQlIo
KSkKLSAgICAgICAgICAgICAgICBsYXN0T2JqZWN0ID0gJmxhc3RSb290Qm94KCktPmZpcnN0TGVh
ZkNoaWxkKCktPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBpZiAobGFzdE9iamVjdC0+aXNCUigp
KSB7Ci0gICAgICAgICAgICAgICAgQ2xlYXIgY2xlYXIgPSBsYXN0T2JqZWN0LT5zdHlsZSgpLmNs
ZWFyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENsZWFyOjpOb25lKQotICAgICAg
ICAgICAgICAgICAgICBjbGVhckZsb2F0cyhjbGVhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShsYXlvdXRTdGF0ZSwg
cmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBjb25zZWN1dGl2
ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgbGlua1RvRW5kTGluZUlmTmVlZGVkKGxheW91dFN0YXRl
KTsKLSAgICByZXBhaW50RGlydHlGbG9hdHMobGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkpOwotfQot
Ci0vLyBCZWZvcmUgcmVzdGFydGluZyB0aGUgbGF5b3V0IGxvb3Agd2l0aCBhIG5ldyBsb2dpY2Fs
SGVpZ2h0LCByZW1vdmUgYWxsIGZsb2F0cyB0aGF0IHdlcmUgYWRkZWQgYW5kIHJlc2V0IHRoZSBy
ZXNvbHZlci4KLWlubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYgUmVuZGVyQmxvY2tGbG93Ojpy
ZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVp
Z2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9hdGluZ09iamVjdCogbGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBvbGRFbmQpCi17Ci0gICAgcmVtb3ZlRmxvYXRpbmdPYmplY3RzQmVs
b3cobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgb2xkTG9naWNhbEhlaWdodCk7Ci0gICAgc2V0
TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKLSAgICByZXNvbHZlci5zZXRQb3NpdGlv
bklnbm9yaW5nTmVzdGVkSXNvbGF0ZXMob2xkRW5kKTsKLSAgICByZXR1cm4gb2xkRW5kOwotfQot
Ci12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVh
bkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKLXsK
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGVUb1VzZSA9IHN0eWxlKCk7Ci0gICAgYm9vbCBw
YWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRl
KCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5p
c1BhZ2luYXRlZCgpOwotICAgIExpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlJiBsaW5lV2hp
dGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSA9IHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3Rh
dGUoKTsKLSAgICBJbmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOwotICAg
IGJvb2wgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7Ci0gICAg
UmVuZGVyVGV4dEluZm8gcmVuZGVyVGV4dEluZm87Ci0gICAgVmVydGljYWxQb3NpdGlvbkNhY2hl
IHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKLQotICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKCp0
aGlzKTsKLQotICAgIHdoaWxlICghZW5kLmF0RW5kKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IElz
IHRoaXMgY2hlY2sgbmVjZXNzYXJ5IGJlZm9yZSB0aGUgZmlyc3QgaXRlcmF0aW9uIG9yIGNhbiBp
dCBiZSBtb3ZlZCB0byB0aGUgZW5kPwotICAgICAgICBpZiAoY2hlY2tGb3JFbmRMaW5lTWF0Y2gp
IHsKLSAgICAgICAgICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVNYXRjaGVkKG1hdGNoZWRFbmRM
aW5lKGxheW91dFN0YXRlLCByZXNvbHZlciwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlT
dGF0dXMpKTsKLSAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5lbmRMaW5lTWF0Y2hlZCgpKSB7
Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oSW5saW5lSXRlcmF0b3IocmVz
b2x2ZXIucG9zaXRpb24oKS5yb290KCksIDAsIDApLCAwKTsKLSAgICAgICAgICAgICAgICBsYXlv
dXRTdGF0ZS5tYXJnaW5JbmZvKCkuY2xlYXJNYXJnaW4oKTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxpbmVXaGl0ZXNwYWNlQ29s
bGFwc2luZ1N0YXRlLnJlc2V0KCk7Ci0KLSAgICAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5z
ZXRFbXB0eSh0cnVlKTsKLSAgICAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5yZXNldFJ1bnNG
cm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBv
bGRFbmQgPSBlbmQ7Ci0gICAgICAgIGJvb2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0
ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpOwotICAgICAgICBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChjb250YWluc0Zsb2F0cygpKSA/
IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5sYXN0KCkuZ2V0KCkgOiBudWxscHRyOwotCi0gICAg
ICAgIFdvcmRNZWFzdXJlbWVudHMgd29yZE1lYXN1cmVtZW50czsKLSAgICAgICAgZW5kID0gbGlu
ZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwg
cmVuZGVyVGV4dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzLCB3b3JkTWVhc3VyZW1lbnRzKTsKLSAgICAgICAgY2FjaGVQcmlvckNoYXJh
Y3RlcnNJZk5lZWRlZChyZW5kZXJUZXh0SW5mby5saW5lQnJlYWtJdGVyYXRvcik7Ci0gICAgICAg
IHJlbmRlclRleHRJbmZvLmxpbmVCcmVha0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7Ci0g
ICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsKLSAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgY3JlYXRpbmcgYW55IHJ1bnMgaW4gbmV4dExpbmVCcmVh
ayB0byBiZWdpbiB3aXRoIQotICAgICAgICAgICAgLy8gT25jZSBCaWRpUnVuTGlzdCBpcyBzZXBh
cmF0ZWQgZnJvbSBCaWRpUmVzb2x2ZXIgdGhpcyB3aWxsIG5vdCBiZSBuZWVkZWQuCi0gICAgICAg
ICAgICByZXNvbHZlci5ydW5zKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIHJlc29sdmVyLm1hcmtD
dXJyZW50UnVuRW1wdHkoKTsgLy8gRklYTUU6IFRoaXMgY2FuIHByb2JhYmx5IGJlIHJlcGxhY2Vk
IGJ5IGFuIEFTU0VSVCAob3IganVzdCByZW1vdmVkKS4KLSAgICAgICAgICAgIGxheW91dFN0YXRl
LnNldENoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lKHRydWUpOwotICAgICAgICAgICAgcmVzb2x2
ZXIuc2V0UG9zaXRpb24oSW5saW5lSXRlcmF0b3IocmVzb2x2ZXIucG9zaXRpb24oKS5yb290KCks
IDAsIDApLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNT
RVJUKGVuZCAhPSByZXNvbHZlci5wb3NpdGlvbigpKTsKLQotICAgICAgICAvLyBUaGlzIGlzIGEg
c2hvcnQtY3V0IGZvciBlbXB0eSBsaW5lcy4KLSAgICAgICAgaWYgKGxheW91dFN0YXRlLmxpbmVJ
bmZvKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobGFzdFJvb3RCb3goKSkKLSAgICAg
ICAgICAgICAgICBsYXN0Um9vdEJveCgpLT5zZXRMaW5lQnJlYWtJbmZvKGVuZC5yZW5kZXJlcigp
LCBlbmQub2Zmc2V0KCksIHJlc29sdmVyLnN0YXR1cygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIFZpc3VhbERpcmVjdGlvbk92ZXJyaWRlIG92ZXJyaWRlID0gKHN0eWxlVG9Vc2Uu
cnRsT3JkZXJpbmcoKSA9PSBPcmRlcjo6VmlzdWFsID8gKHN0eWxlVG9Vc2UuZGlyZWN0aW9uKCkg
PT0gVGV4dERpcmVjdGlvbjo6TFRSID8gVmlzdWFsTGVmdFRvUmlnaHRPdmVycmlkZSA6IFZpc3Vh
bFJpZ2h0VG9MZWZ0T3ZlcnJpZGUpIDogTm9WaXN1YWxPdmVycmlkZSk7Ci0KLSAgICAgICAgICAg
IGlmIChpc05ld1VCQVBhcmFncmFwaCAmJiBzdHlsZVRvVXNlLnVuaWNvZGVCaWRpKCkgPT0gUGxh
aW50ZXh0ICYmICFyZXNvbHZlci5jb250ZXh0KCktPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICAg
ICAgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdHlsZVRvVXNlLmRpcmVjdGlvbigpOwotICAg
ICAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRpcmVjdGlvbiwgcmVzb2x2ZXIu
cG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXIuc2V0U3RhdHVzKEJpZGlTdGF0
dXMoZGlyZWN0aW9uLCBpc092ZXJyaWRlKHN0eWxlVG9Vc2UudW5pY29kZUJpZGkoKSkpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIG93bmVyc2hpcCBpcyByZXZl
cnNlZC4gV2Ugc2hvdWxkIG93biB0aGUgQmlkaVJ1bkxpc3QgYW5kIHBhc3MgaXQgdG8gY3JlYXRl
QmlkaVJ1bnNGb3JMaW5lLgotICAgICAgICAgICAgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlS
dW5zID0gcmVzb2x2ZXIucnVucygpOwotICAgICAgICAgICAgY29uc3RydWN0QmlkaVJ1bnNGb3JT
ZWdtZW50KHJlc29sdmVyLCBiaWRpUnVucywgZW5kLCBvdmVycmlkZSwgbGF5b3V0U3RhdGUubGlu
ZUluZm8oKS5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSk7Ci0gICAgICAgICAgICBBU1NFUlQo
cmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmQpOwotCi0gICAgICAgICAgICBCaWRpUnVuKiB0cmFp
bGluZ1NwYWNlUnVuID0gIWxheW91dFN0YXRlLmxpbmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KCkgPyBoYW5kbGVUcmFpbGluZ1NwYWNlcyhiaWRpUnVucywgcmVzb2x2ZXIuY29udGV4
dCgpKSA6IG51bGxwdHI7Ci0KLSAgICAgICAgICAgIGlmIChiaWRpUnVucy5ydW5Db3VudCgpICYm
IGxpbmVCcmVha2VyLmxpbmVXYXNIeXBoZW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBiaWRp
UnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPm1faGFzSHlwaGVuID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcysrOwotICAgICAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICAgICAgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPSAwOwotCi0gICAgICAg
ICAgICAvLyBOb3cgdGhhdCB0aGUgcnVucyBoYXZlIGJlZW4gb3JkZXJlZCwgd2UgY3JlYXRlIHRo
ZSBsaW5lIGJveGVzLgotICAgICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSBmaWd1cmUg
b3V0IHdoZXJlIGJvcmRlci9wYWRkaW5nL21hcmdpbiBzaG91bGQgYmUgYXBwbGllZCBmb3IKLSAg
ICAgICAgICAgIC8vIGlubGluZSBmbG93IGJveGVzLgotCi0gICAgICAgICAgICBMYXlvdXRVbml0
IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAgICAgICBSb290SW5s
aW5lQm94KiBsaW5lQm94ID0gY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKHJlc29sdmVyLnN0
YXR1cygpLmNvbnRleHQtPmxldmVsKCksIGJpZGlSdW5zLCBlbmQsIGxheW91dFN0YXRlLmxpbmVJ
bmZvKCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgdHJhaWxpbmdTcGFjZVJ1biwgd29yZE1lYXN1
cmVtZW50cyk7Ci0KLSAgICAgICAgICAgIGJpZGlSdW5zLmNsZWFyKCk7Ci0gICAgICAgICAgICBy
ZXNvbHZlci5tYXJrQ3VycmVudFJ1bkVtcHR5KCk7IC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJs
eSBiZSByZXBsYWNlZCBieSBhbiBBU1NFUlQgKG9yIGp1c3QgcmVtb3ZlZCkuCi0KLSAgICAgICAg
ICAgIGlmIChsaW5lQm94KSB7Ci0gICAgICAgICAgICAgICAgbGluZUJveC0+c2V0TGluZUJyZWFr
SW5mbyhlbmQucmVuZGVyZXIoKSwgZW5kLm9mZnNldCgpLCByZXNvbHZlci5zdGF0dXMoKSk7Ci0g
ICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLnVzZXNSZXBhaW50Qm91bmRzKCkpCi0gICAg
ICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGlu
ZUJveCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBhZGp1
c3RtZW50OwotICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQgPSBmYWxzZTsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5tYXJnaW5JbmZv
KCkuc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAo
cGFnaW5hdGVkKQotICAgICAgICAgICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdp
bmF0aW9uKGxpbmVCb3gsIGFkanVzdG1lbnQsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0
ZS5mcmFnbWVudGVkRmxvdygpKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudCkgewot
ICAgICAgICAgICAgICAgICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IGxh
eW91dFN0YXRlLmxpbmVJbmZvKCkuaXNGaXJzdExpbmUoKSA/IEluZGVudFRleHQgOiBEb05vdElu
ZGVudFRleHQ7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkTGluZVdpZHRoID0g
YXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0LCBzaG91bGRJbmRl
bnRUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+YWRqdXN0QmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbihhZGp1c3RtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0
YXRlLnVzZXNSZXBhaW50Qm91bmRzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRT
dGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmVCb3gpOwotCi0gICAgICAgICAgICAg
ICAgICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKG9sZExvZ2ljYWxIZWlnaHQg
KyBhZGp1c3RtZW50LCBzaG91bGRJbmRlbnRUZXh0KSAhPSBvbGRMaW5lV2lkdGgpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZGVsZXRlIHRoaXMgbGluZSwgcmVtb3Zl
IGFsbCBmbG9hdHMgdGhhdCBnb3QgYWRkZWQsIGFuZCBsZXQgbGluZSBsYXlvdXQgcmUtcnVuLgot
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+ZGVsZXRlTGluZSgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgZW5kID0gcmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKG9s
ZExvZ2ljYWxIZWlnaHQsIG9sZExvZ2ljYWxIZWlnaHQgKyBhZGp1c3RtZW50LCBsYXN0RmxvYXRG
cm9tUHJldmlvdXNMaW5lLCByZXNvbHZlciwgb2xkRW5kKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAg
ICAgc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBp
ZiAocGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mcmFn
bWVudGVkRmxvdygpKQotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRGb3JM
aW5lKGxpbmVCb3gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZUJyZWFrZXIucG9zaXRpb25l
ZE9iamVjdHMoKS5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucygq
dGhpcywgKmxpbmVCcmVha2VyLnBvc2l0aW9uZWRPYmplY3RzKClbaV0sIERvTm90SW5kZW50VGV4
dCk7Ci0KLSAgICAgICAgaWYgKCFsYXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRW1wdHkoKSkgewot
ICAgICAgICAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRGaXJzdExpbmUoZmFsc2UpOwot
ICAgICAgICAgICAgY2xlYXJGbG9hdHMobGluZUJyZWFrZXIuY2xlYXIoKSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgbGFzdFJvb3RCb3goKSkgewotICAg
ICAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9m
bG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgICAgICAgICAgYXV0byBpdCA9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmJlZ2luKCk7Ci0gICAgICAgICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0
LmVuZCgpOwotICAgICAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9hdCA9IGxheW91dFN0YXRlLmZs
b2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBsYXN0RmxvYXRJ
dGVyYXRvciA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQobGFzdEZsb2F0KTsKLSAgICAgICAgICAg
ICAgICBBU1NFUlQobGFzdEZsb2F0SXRlcmF0b3IgIT0gZW5kKTsKLSAgICAgICAgICAgICAgICAr
K2xhc3RGbG9hdEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIGl0ID0gbGFzdEZsb2F0SXRlcmF0
b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7
Ci0gICAgICAgICAgICAgICAgYXV0byYgZmxvYXRpbmdPYmplY3QgPSAqaXQ7Ci0gICAgICAgICAg
ICAgICAgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKCpmbG9hdGluZ09iamVjdCk7Ci0g
ICAgICAgICAgICAgICAgLy8gSWYgYSBmbG9hdCdzIGdlb21ldHJ5IGhhcyBjaGFuZ2VkLCBnaXZl
IHVwIG9uIHN5bmNpbmcgd2l0aCBjbGVhbiBsaW5lcy4KLSAgICAgICAgICAgICAgICBhdXRvKiBm
bG9hdFdpdGhSZWN0ID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkuZmxvYXRXaXRoUmVjdChmbG9h
dGluZ09iamVjdC0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmbG9hdFdpdGhS
ZWN0IHx8IGZsb2F0V2l0aFJlY3QtPnJlY3QoKSAhPSBmbG9hdGluZ09iamVjdC0+ZnJhbWVSZWN0
KCkpCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gZmFsc2U7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5zZXRMYXN0
RmxvYXQoIWZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSA/IGZsb2F0aW5nT2JqZWN0U2V0Lmxh
c3QoKS5nZXQoKSA6IG51bGxwdHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGluZVdoaXRlc3Bh
Y2VDb2xsYXBzaW5nU3RhdGUucmVzZXQoKTsKLSAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24o
ZW5kLCBudW1iZXJPZklzb2xhdGVBbmNlc3RvcnMoZW5kKSk7Ci0gICAgfQotCi0gICAgLy8gSW4g
Y2FzZSB3ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSBsaW5lIHBvc2l0aW9ucyBkdXJpbmcgdGhpcyBs
YXlvdXQgdG8gYXZvaWQgd2lkb3dzCi0gICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUg
cG9zc2liaWxpdHkgb2YgaGF2aW5nIGEgbmV3IHdpZG93cyBzaXR1YXRpb24uCi0gICAgLy8gT3Ro
ZXJ3aXNlLCB3ZSByaXNrIGxlYXZpbmcgZW1wdHkgY29udGFpbmVycyB3aGljaCBpcyBhZ2FpbnN0
IHRoZSBibG9jayBmcmFnbWVudGF0aW9uIHByaW5jaXBsZXMuCi0gICAgaWYgKHBhZ2luYXRlZCAm
JiAhc3R5bGUoKS5oYXNBdXRvV2lkb3dzKCkgJiYgIWRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93
KCkpIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIGxpbmUgYm94ZXMgdG8gbWFrZSBzdXJlIHdlIGRp
ZG4ndCBjcmVhdGUgdW5hY2NlcHRhYmxlIHdpZG93cy4KLSAgICAgICAgLy8gSG93ZXZlciwgd2Un
bGwgcHJpb3JpdGl6ZSBvcnBoYW5zIC0gc28gbm90aGluZyB3ZSBkbyBoZXJlIHNob3VsZCBjcmVh
dGUKLSAgICAgICAgLy8gYSBuZXcgb3JwaGFuLgotCi0gICAgICAgIFJvb3RJbmxpbmVCb3gqIGxp
bmVCb3ggPSBsYXN0Um9vdEJveCgpOwotCi0gICAgICAgIC8vIENvdW50IGZyb20gdGhlIGVuZCBv
ZiB0aGUgYmxvY2sgYmFja3dhcmRzLCB0byBzZWUgaG93IG1hbnkgaGFuZ2luZwotICAgICAgICAv
LyBsaW5lcyB3ZSBoYXZlLgotICAgICAgICBSb290SW5saW5lQm94KiBmaXJzdExpbmVJbkJsb2Nr
ID0gZmlyc3RSb290Qm94KCk7Ci0gICAgICAgIGludCBudW1MaW5lc0hhbmdpbmcgPSAxOwotICAg
ICAgICB3aGlsZSAobGluZUJveCAmJiBsaW5lQm94ICE9IGZpcnN0TGluZUluQmxvY2sgJiYgIWxp
bmVCb3gtPmlzRmlyc3RBZnRlclBhZ2VCcmVhaygpKSB7Ci0gICAgICAgICAgICArK251bUxpbmVz
SGFuZ2luZzsKLSAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgd2VyZSBubyBicmVha3MgaW4gdGhlIGJs
b2NrLCB3ZSBkaWRuJ3QgY3JlYXRlIGFueSB3aWRvd3MuCi0gICAgICAgIGlmICghbGluZUJveCB8
fCAhbGluZUJveC0+aXNGaXJzdEFmdGVyUGFnZUJyZWFrKCkgfHwgbGluZUJveCA9PSBmaXJzdExp
bmVJbkJsb2NrKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChudW1MaW5lc0hh
bmdpbmcgPCBzdHlsZSgpLndpZG93cygpKSB7Ci0gICAgICAgICAgICAvLyBXZSBoYXZlIGRldGVj
dGVkIGEgd2lkb3cuIE5vdyB3ZSBuZWVkIHRvIHdvcmsgb3V0IGhvdyBtYW55Ci0gICAgICAgICAg
ICAvLyBsaW5lcyB0aGVyZSBhcmUgb24gdGhlIHByZXZpb3VzIHBhZ2UsIGFuZCBob3cgbWFueSB3
ZSBuZWVkCi0gICAgICAgICAgICAvLyB0byBzdGVhbC4KLSAgICAgICAgICAgIGludCBudW1MaW5l
c05lZWRlZCA9IHN0eWxlKCkud2lkb3dzKCkgLSBudW1MaW5lc0hhbmdpbmc7Ci0gICAgICAgICAg
ICBSb290SW5saW5lQm94KiBjdXJyZW50Rmlyc3RMaW5lT2ZOZXdQYWdlID0gbGluZUJveDsKLQot
ICAgICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgcHJldmlvdXMg
cGFnZS4KLSAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOwotICAg
ICAgICAgICAgaW50IG51bUxpbmVzSW5QcmV2aW91c1BhZ2UgPSAxOwotICAgICAgICAgICAgd2hp
bGUgKGxpbmVCb3ggJiYgbGluZUJveCAhPSBmaXJzdExpbmVJbkJsb2NrICYmICFsaW5lQm94LT5p
c0ZpcnN0QWZ0ZXJQYWdlQnJlYWsoKSkgewotICAgICAgICAgICAgICAgICsrbnVtTGluZXNJblBy
ZXZpb3VzUGFnZTsKLSAgICAgICAgICAgICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RC
b3goKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGV4
cGxpY2l0IHZhbHVlIGZvciBvcnBoYW5zLCByZXNwZWN0IHRoYXQuIElmIG5vdCwgd2Ugc3RpbGwK
LSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBjcmVhdGUgYSBzaXR1YXRpb24gd2hlcmUgd2UgbWFr
ZSBhbiBvcnBoYW4gYmlnZ2VyIHRoYW4gdGhlIGluaXRpYWwgdmFsdWUuCi0gICAgICAgICAgICAv
LyBUaGlzIG1lYW5zIHRoYXQgc2V0dGluZyB3aWRvd3MgaW1wbGllcyB3ZSBhbHNvIGNhcmUgYWJv
dXQgb3JwaGFucywgYnV0IGdpdmVuCi0gICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBz
YXlzIHRoZSBpbml0aWFsIG9ycGhhbiB2YWx1ZSBpcyBub24temVybywgdGhpcyBpcyBvay4gVGhl
Ci0gICAgICAgICAgICAvLyBhdXRob3IgaXMgYWx3YXlzIGZyZWUgdG8gc2V0IG9ycGhhbnMgZXhw
bGljaXRseSBhcyB3ZWxsLgotICAgICAgICAgICAgaW50IG9ycGhhbnMgPSBzdHlsZSgpLmhhc0F1
dG9PcnBoYW5zKCkgPyBzdHlsZSgpLmluaXRpYWxPcnBoYW5zKCkgOiBzdHlsZSgpLm9ycGhhbnMo
KTsKLSAgICAgICAgICAgIGludCBudW1MaW5lc0F2YWlsYWJsZSA9IG51bUxpbmVzSW5QcmV2aW91
c1BhZ2UgLSBvcnBoYW5zOwotICAgICAgICAgICAgaWYgKG51bUxpbmVzQXZhaWxhYmxlIDw9IDAp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgbnVtTGluZXNUb1Rh
a2UgPSBzdGQ6Om1pbihudW1MaW5lc0F2YWlsYWJsZSwgbnVtTGluZXNOZWVkZWQpOwotICAgICAg
ICAgICAgLy8gV2luZCBiYWNrIGZyb20gb3VyIGZpcnN0IHdpZG93ZWQgbGluZS4KLSAgICAgICAg
ICAgIGxpbmVCb3ggPSBjdXJyZW50Rmlyc3RMaW5lT2ZOZXdQYWdlOwotICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBudW1MaW5lc1RvVGFrZTsgKytpKQotICAgICAgICAgICAgICAgIGxp
bmVCb3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOwotCi0gICAgICAgICAgICAvLyBXZSBub3cg
d2FudCB0byBicmVhayBhdCB0aGlzIGxpbmUuIFJlbWVtYmVyIGZvciBuZXh0IGxheW91dCBhbmQg
dHJpZ2dlciByZWxheW91dC4KLSAgICAgICAgICAgIHNldEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93
KGxpbmVDb3VudChsaW5lQm94KSk7Ci0gICAgICAgICAgICBtYXJrTGluZXNEaXJ0eUluQmxvY2tS
YW5nZShsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGluZUJveC0+bGlu
ZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gpOwotICAgICAgICB9Ci0gICAgfQotICAgIGNs
ZWFyRGlkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3coKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OnJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNsZWFuTGluZSwgTGF5
b3V0VW5pdCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKQotewotICAgIGF1dG8qIGNsZWFu
TGluZUZsb2F0cyA9IGNsZWFuTGluZS5mbG9hdHNQdHIoKTsKLSAgICBpZiAoIWNsZWFuTGluZUZs
b2F0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yIChhdXRvJiBmbG9hdGluZ0JveCA6ICpj
bGVhbkxpbmVGbG9hdHMpIHsKLSAgICAgICAgaWYgKCFmbG9hdGluZ0JveCkKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICBhdXRvKiBmbG9hdGluZ09iamVjdCA9IGluc2VydEZsb2F0aW5n
T2JqZWN0KCpmbG9hdGluZ0JveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0Q2xlYW5MaW5lICYmIGZs
b2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSkgewotICAgICAgICAgICAgLy8gRmxvYXQg
Ym94IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGxpbmUgYW55bW9yZS4KLSAgICAgICAgICAgIEFT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGNsZWFuTGluZS5wcmV2Um9vdEJveCgpID09
IGZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7Ci0gICAgICAgICAgICBjbGVhbkxp
bmUucmVtb3ZlRmxvYXQoKmZsb2F0aW5nQm94KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Ci0gICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdGlu
Z09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwotICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0
T3JpZ2luYXRpbmdMaW5lKGNsZWFuTGluZSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9n
aWNhbFRvcEZvckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxv
YXRpbmdCb3gpICsgZGVsdGEpOwotICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOwotICAgIH0K
LX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5
b3V0U3RhdGUmIGxheW91dFN0YXRlKQotewotICAgIGF1dG8qIGZpcnN0Q2xlYW5MaW5lID0gbGF5
b3V0U3RhdGUuZW5kTGluZSgpOwotICAgIGlmIChmaXJzdENsZWFuTGluZSkgewotICAgICAgICBp
ZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkgewotICAgICAgICAgICAgYm9vbCBwYWdp
bmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkg
JiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1Bh
Z2luYXRlZCgpOwotICAgICAgICAgICAgLy8gQXR0YWNoIGFsbCB0aGUgcmVtYWluaW5nIGxpbmVz
LCBhbmQgdGhlbiBhZGp1c3QgdGhlaXIgeS1wb3NpdGlvbnMgYXMgbmVlZGVkLgotICAgICAgICAg
ICAgTGF5b3V0VW5pdCBkZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAtIGxheW91dFN0YXRlLmVuZExp
bmVMb2dpY2FsVG9wKCk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGxpbmUgPSBmaXJzdENsZWFu
TGluZTsgbGluZTsgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAg
ICBsaW5lLT5hdHRhY2hMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewot
ICAgICAgICAgICAgICAgICAgICBkZWx0YSAtPSBsaW5lLT5wYWdpbmF0aW9uU3RydXQoKTsKLSAg
ICAgICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVudDsKLSAgICAgICAgICAgICAg
ICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lLCBkZWx0YSwgb3ZlcmZs
b3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKLSAgICAgICAgICAgICAgICAgICAg
bGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChsaW5lLCBkZWx0YSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24oZGVsdGEp
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJh
Z21lbnRlZEZsb3coKSkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRGb3JMaW5l
KGxpbmUpOwotICAgICAgICAgICAgICAgIHJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKCpsaW5lLCBk
ZWx0YSwgbGluZSA9PSBmaXJzdENsZWFuTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBzZXRMb2dpY2FsSGVpZ2h0KGxhc3RSb290Qm94KCktPmxpbmVCb3R0b21XaXRoTGVhZGluZygp
KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgdGhlIHJlbWFp
bmluZyBsaW5lcy4KLSAgICAgICAgICAgIGRlbGV0ZUxpbmVSYW5nZShsYXlvdXRTdGF0ZSwgbGF5
b3V0U3RhdGUuZW5kTGluZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobV9m
bG9hdGluZ09iamVjdHMgJiYgKGxheW91dFN0YXRlLmNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5l
KCkgfHwgcG9zaXRpb25OZXdGbG9hdHMoKSkgJiYgbGFzdFJvb3RCb3goKSkgewotICAgICAgICAv
LyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0aGUgbGFzdCBsaW5lLCBpdCBtaWdodCBub3Qg
YmUgcG9zaXRpb25lZCB1cCB0byBub3cuCi0gICAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIGRvbmUg
YmVmb3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRkaW5nLCBvciB0aGUgZmxvYXQg
d2lsbAotICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWRkaW5nIGluY29ycmVjdGx5LiAtZHdoCi0g
ICAgICAgIGlmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSgpKSB7Ci0g
ICAgICAgICAgICBMYXlvdXRVbml0IGJvdHRvbVZpc3VhbE92ZXJmbG93ID0gbGFzdFJvb3RCb3go
KS0+bG9naWNhbEJvdHRvbVZpc3VhbE92ZXJmbG93KCk7Ci0gICAgICAgICAgICBMYXlvdXRVbml0
IGJvdHRvbUxheW91dE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+bG9naWNhbEJvdHRvbUxheW91
dE92ZXJmbG93KCk7Ci0gICAgICAgICAgICBhdXRvIG5ld0xpbmVCb3ggPSBzdGQ6Om1ha2VfdW5p
cXVlPFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveD4oKnRoaXMpOwotICAgICAgICAgICAgYXV0
byB0cmFpbGluZ0Zsb2F0c0xpbmVCb3ggPSBuZXdMaW5lQm94LmdldCgpOwotICAgICAgICAgICAg
bV9saW5lQm94ZXMuYXBwZW5kTGluZUJveChXVEZNb3ZlKG5ld0xpbmVCb3gpKTsKLSAgICAgICAg
ICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0Q29uc3RydWN0ZWQoKTsKLSAgICAgICAgICAg
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwIHRleHRCb3hEYXRhTWFwOwotICAgICAg
ICAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKLSAgICAg
ICAgICAgIExheW91dFVuaXQgYmxvY2tMb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOwot
ICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5hbGlnbkJveGVzSW5CbG9ja0RpcmVj
dGlvbihibG9ja0xvZ2ljYWxIZWlnaHQsIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUpOwotICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRMaW5lVG9wQm90
dG9tUG9zaXRpb25zKGJsb2NrTG9naWNhbEhlaWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0LCBibG9j
a0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCk7Ci0gICAgICAgICAgICB0cmFpbGlu
Z0Zsb2F0c0xpbmVCb3gtPnNldFBhZ2luYXRlZExpbmVXaWR0aChhdmFpbGFibGVMb2dpY2FsV2lk
dGhGb3JDb250ZW50KGJsb2NrTG9naWNhbEhlaWdodCkpOwotICAgICAgICAgICAgTGF5b3V0UmVj
dCBsb2dpY2FsTGF5b3V0T3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2FsSGVpZ2h0LCAxX2x1LCBi
b3R0b21MYXlvdXRPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7Ci0gICAgICAgICAgICBM
YXlvdXRSZWN0IGxvZ2ljYWxWaXN1YWxPdmVyZmxvdygwX2x1LCBibG9ja0xvZ2ljYWxIZWlnaHQs
IDFfbHUsIGJvdHRvbVZpc3VhbE92ZXJmbG93IC0gYmxvY2tMb2dpY2FsSGVpZ2h0KTsKLSAgICAg
ICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0T3ZlcmZsb3dGcm9tTG9naWNhbFJlY3Rz
KGxvZ2ljYWxMYXlvdXRPdmVyZmxvdywgbG9naWNhbFZpc3VhbE92ZXJmbG93LCB0cmFpbGluZ0Zs
b2F0c0xpbmVCb3gtPmxpbmVUb3AoKSwgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5saW5lQm90dG9t
KCkpOwotICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpCi0gICAg
ICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRGb3JMaW5lKHRyYWlsaW5nRmxvYXRzTGluZUJveCk7
Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdP
YmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgICAgIGF1dG8gaXQgPSBm
bG9hdGluZ09iamVjdFNldC5iZWdpbigpOwotICAgICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmVuZCgpOwotICAgICAgICBpZiAoYXV0byogbGFzdEZsb2F0ID0gbGF5b3V0U3RhdGUu
ZmxvYXRMaXN0KCkubGFzdEZsb2F0KCkpIHsKLSAgICAgICAgICAgIGF1dG8gbGFzdEZsb2F0SXRl
cmF0b3IgPSBmbG9hdGluZ09iamVjdFNldC5maW5kKGxhc3RGbG9hdCk7Ci0gICAgICAgICAgICBB
U1NFUlQobGFzdEZsb2F0SXRlcmF0b3IgIT0gZW5kKTsKLSAgICAgICAgICAgICsrbGFzdEZsb2F0
SXRlcmF0b3I7Ci0gICAgICAgICAgICBpdCA9IGxhc3RGbG9hdEl0ZXJhdG9yOwotICAgICAgICB9
Ci0gICAgICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBhcHBlbmRGbG9h
dGluZ09iamVjdFRvTGFzdExpbmUoKippdCk7Ci0gICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlz
dCgpLnNldExhc3RGbG9hdCghZmxvYXRpbmdPYmplY3RTZXQuaXNFbXB0eSgpID8gZmxvYXRpbmdP
YmplY3RTZXQubGFzdCgpLmdldCgpIDogbnVsbHB0cik7Ci0gICAgfQotfQotCi12b2lkIFJlbmRl
ckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0
VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsQm90dG9t
KQotewotICAgIEFTU0VSVCghbV9zaW1wbGVMaW5lTGF5b3V0KTsKLQotICAgIHNldExvZ2ljYWxI
ZWlnaHQoYm9yZGVyQW5kUGFkZGluZ0JlZm9yZSgpKTsKLSAgICAKLSAgICAvLyBMYXkgb3V0IG91
ciBoeXBvdGhldGljYWwgZ3JpZCBsaW5lIGFzIHRob3VnaCBpdCBvY2N1cnMgYXQgdGhlIHRvcCBv
ZiB0aGUgYmxvY2suCi0gICAgaWYgKHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCku
bGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91
dFN0YXRlKCktPmxpbmVHcmlkKCkgPT0gdGhpcykKLSAgICAgICAgbGF5b3V0TGluZUdyaWRCb3go
KTsKLQotICAgIFJlbmRlckZyYWdtZW50ZWRGbG93KiBmcmFnbWVudGVkRmxvdyA9IGVuY2xvc2lu
Z0ZyYWdtZW50ZWRGbG93KCk7Ci0gICAgYm9vbCBjbGVhckxpbmVzRm9yUGFnaW5hdGlvbiA9IGZp
cnN0Um9vdEJveCgpICYmIGZyYWdtZW50ZWRGbG93ICYmICFmcmFnbWVudGVkRmxvdy0+aGFzRnJh
Z21lbnRzKCk7Ci0KLSAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3Vy
IGxpbmUgYm94ZXMuCi0gICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKLSAg
ICBib29sIGlzRnVsbExheW91dCA9ICFmaXJzdFJvb3RCb3goKSB8fCBzZWxmTmVlZHNMYXlvdXQo
KSB8fCByZWxheW91dENoaWxkcmVuIHx8IGNsZWFyTGluZXNGb3JQYWdpbmF0aW9uOwotICAgIExp
bmVMYXlvdXRTdGF0ZSBsYXlvdXRTdGF0ZSgqdGhpcywgaXNGdWxsTGF5b3V0LCByZXBhaW50TG9n
aWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20sIGZyYWdtZW50ZWRGbG93KTsKLQotICAgIGlm
IChpc0Z1bGxMYXlvdXQpCi0gICAgICAgIGxpbmVCb3hlcygpLmRlbGV0ZUxpbmVCb3hlcygpOwot
Ci0gICAgLy8gVGV4dCB0cnVuY2F0aW9uIGtpY2tzIGluIGluIHR3byBjYXNlczoKLSAgICAvLyAg
ICAgMSkgSWYgeW91ciBvdmVyZmxvdyBpc24ndCB2aXNpYmxlIGFuZCB5b3VyIHRleHQtb3ZlcmZs
b3ctbW9kZSBpc24ndCBjbGlwLgotICAgIC8vICAgICAyKSBJZiB5b3UncmUgYW4gYW5vbnltb3Vz
IGJsb2NrIHdpdGggYSBibG9jayBwYXJlbnQgdGhhdCBzYXRpc2ZpZXMgIzEuCi0gICAgLy8gRklY
TUU6IENTUzMgc2F5cyB0aGF0IGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNsaXBwZWQgbXVzdCBhbHNv
IGtub3cgaG93IHRvIHRydW5jYXRlLiAgVGhpcyBpcyBpbnNhbmVseQotICAgIC8vIGRpZmZpY3Vs
dCB0byBmaWd1cmUgb3V0IGluIGdlbmVyYWwgKGVzcGVjaWFsbHkgaW4gdGhlIG1pZGRsZSBvZiBk
b2luZyBsYXlvdXQpLCBzbyB3ZSBvbmx5IGhhbmRsZSB0aGUKLSAgICAvLyBzaW1wbGUgY2FzZSBv
ZiBhbiBhbm9ueW1vdXMgYmxvY2sgdHJ1bmNhdGluZyB3aGVuIGl0J3MgcGFyZW50IGlzIGNsaXBw
ZWQuCi0gICAgYm9vbCBoYXNUZXh0T3ZlcmZsb3cgPSAoc3R5bGUoKS50ZXh0T3ZlcmZsb3coKSA9
PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIGhhc092ZXJmbG93Q2xpcCgpKQotICAgICAgICB8
fCAoaXNBbm9ueW1vdXNCbG9jaygpICYmIHBhcmVudCgpICYmIHBhcmVudCgpLT5pc1JlbmRlckJs
b2NrKCkgJiYgcGFyZW50KCktPnN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4dE92ZXJmbG93
OjpFbGxpcHNpcyAmJiBwYXJlbnQoKS0+aGFzT3ZlcmZsb3dDbGlwKCkpOwotCi0gICAgLy8gV2Fs
ayBhbGwgdGhlIGxpbmVzIGFuZCBkZWxldGUgb3VyIGVsbGlwc2lzIGxpbmUgYm94ZXMgaWYgdGhl
eSBleGlzdC4KLSAgICBpZiAoaGFzVGV4dE92ZXJmbG93KQotICAgICAgICAgZGVsZXRlRWxsaXBz
aXNMaW5lQm94ZXMoKTsKLQotICAgIGlmIChmaXJzdENoaWxkKCkpIHsKLSAgICAgICAgLy8gSW4g
ZnVsbCBsYXlvdXQgbW9kZSwgY2xlYXIgdGhlIGxpbmUgYm94ZXMgb2YgY2hpbGRyZW4gdXBmcm9u
dC4gT3RoZXJ3aXNlLAotICAgICAgICAvLyBzaWJsaW5ncyBjYW4gcnVuIGludG8gc3RhbGUgcm9v
dCBsaW5lYm94ZXMgZHVyaW5nIGxheW91dC4gVGhlbiBsYXlvdXQKLSAgICAgICAgLy8gdGhlIHJl
cGxhY2VkIGVsZW1lbnRzIGxhdGVyLiBJbiBwYXJ0aWFsIGxheW91dCBtb2RlLCBsaW5lIGJveGVz
IGFyZSBub3QKLSAgICAgICAgLy8gZGVsZXRlZCBhbmQgb25seSBkaXJ0aWVkLiBJbiB0aGF0IGNh
c2UsIHdlIGNhbiBsYXlvdXQgdGhlIHJlcGxhY2VkCi0gICAgICAgIC8vIGVsZW1lbnRzIGF0IHRo
ZSBzYW1lIHRpbWUuCi0gICAgICAgIGJvb2wgaGFzSW5saW5lQ2hpbGQgPSBmYWxzZTsKLSAgICAg
ICAgVmVjdG9yPFJlbmRlckJveCo+IHJlcGxhY2VkQ2hpbGRyZW47Ci0gICAgICAgIGZvciAoSW5s
aW5lV2Fsa2VyIHdhbGtlcigqdGhpcyk7ICF3YWxrZXIuYXRFbmQoKTsgd2Fsa2VyLmFkdmFuY2Uo
KSkgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0JiBvID0gKndhbGtlci5jdXJyZW50KCk7Ci0K
LSAgICAgICAgICAgIGlmICghaGFzSW5saW5lQ2hpbGQgJiYgby5pc0lubGluZSgpKQotICAgICAg
ICAgICAgICAgIGhhc0lubGluZUNoaWxkID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKG8uaXNS
ZXBsYWNlZCgpIHx8IG8uaXNGbG9hdGluZygpIHx8IG8uaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
IHsKLSAgICAgICAgICAgICAgICBSZW5kZXJCb3gmIGJveCA9IGRvd25jYXN0PFJlbmRlckJveD4o
byk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBib3guaGFzUmVs
YXRpdmVEaW1lbnNpb25zKCkpCi0gICAgICAgICAgICAgICAgICAgIGJveC5zZXRDaGlsZE5lZWRz
TGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENo
aWxkcmVuIGlzIHNldCBhbmQgdGhlIGNoaWxkIGhhcyBwZXJjZW50YWdlIHBhZGRpbmcgb3IgYW4g
ZW1iZWRkZWQgY29udGVudCBib3gsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGls
ZHMgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYg
Ym94Lm5lZWRzUHJlZmVycmVkV2lkdGhzUmVjYWxjdWxhdGlvbigpKQotICAgICAgICAgICAgICAg
ICAgICBib3guc2V0UHJlZmVycmVkTG9naWNhbFdpZHRoc0RpcnR5KHRydWUsIE1hcmtPbmx5VGhp
cyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQot
ICAgICAgICAgICAgICAgICAgICBib3guY29udGFpbmluZ0Jsb2NrKCktPmluc2VydFBvc2l0aW9u
ZWRPYmplY3QoYm94KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChib3guaXNGbG9hdGluZygp
KQotICAgICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5hcHBlbmQoRmxv
YXRXaXRoUmVjdDo6Y3JlYXRlKGJveCkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRnVs
bExheW91dCB8fCBib3gubmVlZHNMYXlvdXQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBS
ZXBsYWNlZCBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxsTGF5b3V0ICYm
IGlzPFJlbmRlclJ1YnlSdW4+KGJveCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJ
WE1FOiBUaGlzIHJlc2V0cyB0aGUgb3ZlcmhhbmdpbmcgbWFyZ2lucyB0aGF0IHdlIHNldCBkdXJp
bmcgbGluZSBsYXlvdXQgKHNlZSBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2Vn
bWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgYSBtb3JlIHN1aXRhYmxlIHBs
YWNlIGZvciB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWFyZ2luU3RhcnRGb3JD
aGlsZChib3gsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWFyZ2luRW5kRm9yQ2hp
bGQoYm94LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBi
b3guZGlydHlMaW5lQm94ZXMoaXNGdWxsTGF5b3V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGlzRnVsbExheW91dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkQ2hpbGRyZW4u
YXBwZW5kKCZib3gpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
ICAgICAgICBib3gubGF5b3V0SWZOZWVkZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9IGVsc2UgaWYgKG8uaXNUZXh0T3JMaW5lQnJlYWsoKSB8fCAoaXM8UmVuZGVySW5saW5l
PihvKSAmJiAhd2Fsa2VyLmF0RW5kT2ZJbmxpbmUoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAo
aXM8UmVuZGVySW5saW5lPihvKSkKLSAgICAgICAgICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVy
SW5saW5lPihvKS51cGRhdGVBbHdheXNDcmVhdGVMaW5lQm94ZXMobGF5b3V0U3RhdGUuaXNGdWxs
TGF5b3V0KCkpOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQo
KSB8fCBvLnNlbGZOZWVkc0xheW91dCgpKQotICAgICAgICAgICAgICAgICAgICBkaXJ0eUxpbmVC
b3hlc0ZvclJlbmRlcmVyKG8sIGxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKTsKLSAgICAgICAg
ICAgICAgICBvLmNsZWFyTmVlZHNMYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVwbGFjZWRDaGlsZHJlbi5zaXplKCk7
IGkrKykKLSAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVuW2ldLT5sYXlvdXRJZk5lZWRlZCgp
OwotCi0gICAgICAgIGxheW91dFJ1bnNBbmRGbG9hdHMobGF5b3V0U3RhdGUsIGhhc0lubGluZUNo
aWxkKTsKLSAgICB9Ci0KLSAgICAvLyBFeHBhbmQgdGhlIGxhc3QgbGluZSB0byBhY2NvbW1vZGF0
ZSBSdWJ5IGFuZCBlbXBoYXNpcyBtYXJrcy4KLSAgICBpbnQgbGFzdExpbmVBbm5vdGF0aW9uc0Fk
anVzdG1lbnQgPSAwOwotICAgIGlmIChsYXN0Um9vdEJveCgpKSB7Ci0gICAgICAgIExheW91dFVu
aXQgbG93ZXN0QWxsb3dlZFBvc2l0aW9uID0gc3RkOjptYXgobGFzdFJvb3RCb3goKS0+bGluZUJv
dHRvbSgpLCBsb2dpY2FsSGVpZ2h0KCkgKyBwYWRkaW5nQWZ0ZXIoKSk7Ci0gICAgICAgIGlmICgh
c3R5bGUoKS5pc0ZsaXBwZWRMaW5lc1dyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBsYXN0TGlu
ZUFubm90YXRpb25zQWRqdXN0bWVudCA9IGxhc3RSb290Qm94KCktPmNvbXB1dGVVbmRlckFubm90
YXRpb25BZGp1c3RtZW50KGxvd2VzdEFsbG93ZWRQb3NpdGlvbik7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gbGFzdFJvb3RCb3goKS0+
Y29tcHV0ZU92ZXJBbm5vdGF0aW9uQWRqdXN0bWVudChsb3dlc3RBbGxvd2VkUG9zaXRpb24pOwot
ICAgIH0KLSAgICAKLSAgICAvLyBOb3cgZG8gdGhlIGhhbmRsaW5nIG9mIHRoZSBib3R0b20gb2Yg
dGhlIGJsb2NrLCBhZGRpbmcgaW4gb3VyIGJvdHRvbSBib3JkZXIvcGFkZGluZyBhbmQKLSAgICAv
LyBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBjb2xsYXBzZWQgYm90dG9tIG1hcmdpbiBpbmZvcm1h
dGlvbi4gVGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQotICAgIC8vIGlmIG91ciBsYXN0
IGNoaWxkIHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoYXQgbWlnaHQgbmVlZCB0byBw
cm9wYWdhdGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bwotICAgIC8vIHVzLgotICAgIExheW91
dFVuaXQgYWZ0ZXJFZGdlID0gYm9yZGVyQW5kUGFkZGluZ0FmdGVyKCkgKyBzY3JvbGxiYXJMb2dp
Y2FsSGVpZ2h0KCkgKyBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVudDsKLSAgICBzZXRMb2dp
Y2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIGFmdGVyRWRnZSk7Ci0KLSAgICBpZiAoIWZpcnN0
Um9vdEJveCgpICYmIGhhc0xpbmVJZkVtcHR5KCkpCi0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQo
bG9naWNhbEhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCBpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0aWNhbExpbmUsIFBvc2l0aW9uT2ZJbnRlcmlvckxp
bmVCb3hlcykpOwotCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgYW55IGxpbmVzIHRoYXQgc3BpbGwg
b3V0IG9mIG91ciBibG9jay4gIElmIHdlIGRvLCB0aGVuIHdlIHdpbGwgcG9zc2libHkgbmVlZCB0
bwotICAgIC8vIHRydW5jYXRlIHRleHQuCi0gICAgaWYgKGhhc1RleHRPdmVyZmxvdykKLSAgICAg
ICAgY2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxv
dzo6Y2hlY2tGbG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxpbmVCb3gmIGNsZWFuTGluZSwgUmVuZGVy
Qm94JiBmbG9hdEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdpdGhSZWN0JiBtYXRjaGluZ0Zsb2F0V2l0
aFJlY3QsCi0gICAgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5Rmxv
YXQpCi17Ci0gICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIWZsb2F0Qm94T25D
bGVhbkxpbmUuc3R5bGUoKS5kZWxldGlvbkhhc0JlZ3VuKCkpOwotICAgIGlmICgmbWF0Y2hpbmdG
bG9hdFdpdGhSZWN0LnJlbmRlcmVyKCkgIT0gJmZsb2F0Qm94T25DbGVhbkxpbmUpIHsKLSAgICAg
ICAgZW5jb3VudGVyZWROZXdGbG9hdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgZmxvYXRCb3hPbkNsZWFuTGluZS5sYXlvdXRJZk5lZWRlZCgpOwotICAgIExheW91dFJlY3Qg
b3JpZ2luYWxGbG9hdFJlY3QgPSBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QucmVjdCgpOwotICAgIExh
eW91dFNpemUgbmV3U2l6ZSgKLSAgICAgICAgZmxvYXRCb3hPbkNsZWFuTGluZS53aWR0aCgpICsg
ZmxvYXRCb3hPbkNsZWFuTGluZS5ob3Jpem9udGFsTWFyZ2luRXh0ZW50KCksCi0gICAgICAgIGZs
b2F0Qm94T25DbGVhbkxpbmUuaGVpZ2h0KCkgKyBmbG9hdEJveE9uQ2xlYW5MaW5lLnZlcnRpY2Fs
TWFyZ2luRXh0ZW50KCkpOwotICAgIAotICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgdGhlIGNhcC1o
ZWlnaHQgYWxpZ25tZW50IGRvbmUgYnkgdGhlIGZpcnN0LWxldHRlciBmbG9hdHMgd2hlbiBpbml0
aWFsLWxldHRlciBpcyBzZXQsIHNvIGp1c3QgYWx3YXlzIHRyZWF0IGZpcnN0LWxldHRlciBmbG9h
dHMgYXMgZGlydHkuCi0gICAgaWYgKG9yaWdpbmFsRmxvYXRSZWN0LnNpemUoKSA9PSBuZXdTaXpl
ICYmIChmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuc3R5bGVUeXBlKCkgIT0gUHNldWRvSWQ6
OkZpcnN0TGV0dGVyIHx8ICFmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuaW5pdGlhbExldHRl
ckRyb3AoKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIExheW91dFVuaXQgZmxvYXRUb3AgPSBp
c0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9hdFJlY3QueSgpIDogb3JpZ2lu
YWxGbG9hdFJlY3QueCgpOwotICAgIExheW91dFVuaXQgZmxvYXRIZWlnaHQgPSBpc0hvcml6b250
YWxXcml0aW5nTW9kZSgpID8gc3RkOjptYXgob3JpZ2luYWxGbG9hdFJlY3QuaGVpZ2h0KCksIG5l
d1NpemUuaGVpZ2h0KCkpCi0gICAgICAgIDogc3RkOjptYXgob3JpZ2luYWxGbG9hdFJlY3Qud2lk
dGgoKSwgbmV3U2l6ZS53aWR0aCgpKTsKLSAgICBmbG9hdEhlaWdodCA9IHN0ZDo6bWluKGZsb2F0
SGVpZ2h0LCBMYXlvdXRVbml0OjptYXgoKSAtIGZsb2F0VG9wKTsKLSAgICBjbGVhbkxpbmUubWFy
a0RpcnR5KCk7Ci0gICAgbWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoY2xlYW5MaW5lLmxpbmVC
b3R0b21XaXRoTGVhZGluZygpLCBmbG9hdFRvcCArIGZsb2F0SGVpZ2h0LCAmY2xlYW5MaW5lKTsK
LSAgICBMYXlvdXRSZWN0IG5ld0Zsb2F0UmVjdCA9IG9yaWdpbmFsRmxvYXRSZWN0OwotICAgIG5l
d0Zsb2F0UmVjdC5zZXRTaXplKG5ld1NpemUpOwotICAgIG1hdGNoaW5nRmxvYXRXaXRoUmVjdC5h
ZGp1c3RSZWN0KG5ld0Zsb2F0UmVjdCk7Ci0gICAgZGlydGllZEJ5RmxvYXQgPSB0cnVlOwotfQot
Ci1Sb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZVN0YXJ0UG9zaXRpb24o
TGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
cikKLXsKLSAgICBSb290SW5saW5lQm94KiBjdXJyZW50TGluZSA9IG51bGxwdHI7Ci0gICAgUm9v
dElubGluZUJveCogbGFzdExpbmUgPSBudWxscHRyOwotCi0gICAgLy8gRklYTUU6IFRoaXMgZW50
aXJlIGZsb2F0LWNoZWNraW5nIGJsb2NrIG5lZWRzIHRvIGJlIGJyb2tlbiBpbnRvIGEgbmV3IGZ1
bmN0aW9uLgotICAgIGF1dG8mIGZsb2F0cyA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpOwotICAg
IGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKLSAgICBpZiAoIWxheW91dFN0YXRlLmlzRnVs
bExheW91dCgpKSB7Ci0gICAgICAgIC8vIFBhZ2luYXRlIGFsbCBvZiB0aGUgY2xlYW4gbGluZXMu
Ci0gICAgICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRl
eHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCku
bGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKLSAgICAgICAgTGF5b3V0VW5pdCBwYWdpbmF0
aW9uRGVsdGE7Ci0gICAgICAgIGF1dG8gZmxvYXRzSXRlcmF0b3IgPSBmbG9hdHMuYmVnaW4oKTsK
LSAgICAgICAgYXV0byBlbmQgPSBmbG9hdHMuZW5kKCk7Ci0gICAgICAgIGZvciAoY3VycmVudExp
bmUgPSBmaXJzdFJvb3RCb3goKTsgY3VycmVudExpbmUgJiYgIWN1cnJlbnRMaW5lLT5pc0RpcnR5
KCk7IGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAg
ICAgIGlmIChwYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoRm9yUGFn
aW5hdGVkTGluZUNoYW5nZWQoY3VycmVudExpbmUsIDAsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRG
bG93KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLT5tYXJrRGlydHkoKTsK
LSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIHBhZ2luYXRpb25EZWx0YSAtPSBjdXJyZW50TGluZS0+cGFnaW5hdGlvblN0cnV0KCk7
Ci0gICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVudDsKLSAgICAgICAgICAgICAg
ICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGN1cnJlbnRMaW5lLCBwYWdpbmF0aW9u
RGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsK
LSAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGlvbkRlbHRhKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChjb250YWluc0Zsb2F0cygpIHx8ICFmbG9hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBGSVhNRTogRG8gYmV0dGVyIGV2ZW50dWFsbHkuICBGb3Igbm93
IGlmIHdlIGV2ZXIgc2hpZnQgYmVjYXVzZSBvZiBwYWdpbmF0aW9uIGFuZCBmbG9hdHMgYXJlIHBy
ZXNlbnQganVzdCBnbyB0byBhIGZ1bGwgbGF5b3V0LgotICAgICAgICAgICAgICAgICAgICAgICAg
bGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbGF5
b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChjdXJyZW50TGluZSwgcGFnaW5hdGlv
bkRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmUtPmFkanVzdEJsb2NrRGly
ZWN0aW9uUG9zaXRpb24ocGFnaW5hdGlvbkRlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpCi0gICAgICAgICAg
ICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShjdXJyZW50TGluZSk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmIChhdXRvKiBjbGVhbkxpbmVGbG9hdHMgPSBjdXJyZW50TGlu
ZS0+ZmxvYXRzUHRyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyBmbG9hdCBoYXMg
YmVlbiBpbnNlcnRlZCBiZWZvcmUgdGhpcyBsaW5lIG9yIGJlZm9yZSBpdHMgbGFzdCBrbm93biBm
bG9hdCwganVzdCBkbyBhIGZ1bGwgbGF5b3V0LgotICAgICAgICAgICAgICAgIGJvb2wgZW5jb3Vu
dGVyZWROZXdGbG9hdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgZmxvYXRC
b3hPbkNsZWFuTGluZSA6ICpjbGVhbkxpbmVGbG9hdHMpIHsKLSAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKGZsb2F0c0l0ZXJhdG9yICE9IGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgh
ZmxvYXRCb3hPbkNsZWFuTGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgICAgICAgICBjaGVja0Zsb2F0SW5DbGVhbkxpbmUoKmN1cnJlbnRMaW5lLCAq
ZmxvYXRCb3hPbkNsZWFuTGluZSwgKmZsb2F0c0l0ZXJhdG9yLCBlbmNvdW50ZXJlZE5ld0Zsb2F0
LCBkaXJ0aWVkQnlGbG9hdCk7Ci0gICAgICAgICAgICAgICAgICAgICsrZmxvYXRzSXRlcmF0b3I7
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdHNJdGVyYXRvciA9PSBlbmQgfHwgZW5jb3Vu
dGVyZWROZXdGbG9hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFy
a0ZvckZ1bGxMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChk
aXJ0aWVkQnlGbG9hdCB8fCBlbmNvdW50ZXJlZE5ld0Zsb2F0KQotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBpZiBh
IG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBhZnRlciB0aGUgbGFzdCBrbm93biBmbG9hdC4K
LSAgICAgICAgaWYgKGZsb2F0c0l0ZXJhdG9yICE9IGVuZCkgewotICAgICAgICAgICAgaWYgKCFj
dXJyZW50TGluZSkKLSAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5tYXJrRm9yRnVsbExheW91
dCgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yICg7IGZsb2F0c0l0
ZXJhdG9yICE9IGVuZDsgKytmbG9hdHNJdGVyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBh
dXRvJiBmbG9hdFdpdGhSZWN0ID0gKmZsb2F0c0l0ZXJhdG9yOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoIWZsb2F0V2l0aFJlY3QtPnJlbmRlcmVyKCkubmVlZHNMYXlvdXQoKSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0
ZS5tYXJrRm9yRnVsbExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAo
bGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpIHsKLSAgICAgICAgbV9saW5lQm94ZXMuZGVsZXRl
TGluZUJveFRyZWUoKTsKLSAgICAgICAgY3VycmVudExpbmUgPSBudWxscHRyOwotICAgICAgICBB
U1NFUlQoIWZpcnN0Um9vdEJveCgpICYmICFsYXN0Um9vdEJveCgpKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBpZiAoY3VycmVudExpbmUpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBkaXJ0
eSBsaW5lLgotICAgICAgICAgICAgaWYgKFJvb3RJbmxpbmVCb3gqIHByZXZSb290Qm94ID0gY3Vy
cmVudExpbmUtPnByZXZSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEg
cHJldmlvdXMgbGluZS4KLSAgICAgICAgICAgICAgICBpZiAoIWRpcnRpZWRCeUZsb2F0ICYmICgh
cHJldlJvb3RCb3gtPmVuZHNXaXRoQnJlYWsoKQotICAgICAgICAgICAgICAgICAgICB8fCAhcHJl
dlJvb3RCb3gtPmxpbmVCcmVha09iaigpCi0gICAgICAgICAgICAgICAgICAgIHx8IChpczxSZW5k
ZXJUZXh0PigqcHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKQotICAgICAgICAgICAgICAgICAg
ICAmJiBwcmV2Um9vdEJveC0+bGluZUJyZWFrUG9zKCkgPj0gZG93bmNhc3Q8UmVuZGVyVGV4dD4o
KnByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSkudGV4dCgpLmxlbmd0aCgpKSkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGxpbmUgZGlkbid0IGJyZWFrIGNsZWFubHkg
b3IgYnJva2UgYXQgYSBuZXdsaW5lCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaGFzIGJl
ZW4gZGVsZXRlZCwgc28gdHJlYXQgaXQgYXMgZGlydHkgdG9vLgotICAgICAgICAgICAgICAgICAg
ICBjdXJyZW50TGluZSA9IHByZXZSb290Qm94OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRpcnR5IGxpbmVzLCB0
aGVuIGxhc3QgaXMganVzdCB0aGUgbGFzdCByb290IGJveC4KLSAgICAgICAgbGFzdExpbmUgPSBj
dXJyZW50TGluZSA/IGN1cnJlbnRMaW5lLT5wcmV2Um9vdEJveCgpIDogbGFzdFJvb3RCb3goKTsK
LSAgICB9Ci0KLSAgICBpZiAoIWZsb2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgTGF5b3V0VW5p
dCBzYXZlZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAgIC8vIFJlc3Rv
cmUgZmxvYXRzIGZyb20gY2xlYW4gbGluZXMuCi0gICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUg
PSBmaXJzdFJvb3RCb3goKTsKLSAgICAgICAgd2hpbGUgKGxpbmUgIT0gY3VycmVudExpbmUpIHsK
LSAgICAgICAgICAgIGlmIChhdXRvKiBjbGVhbkxpbmVGbG9hdHMgPSBsaW5lLT5mbG9hdHNQdHIo
KSkgewotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAqY2xlYW5MaW5l
RmxvYXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmxvYXRpbmdCb3gpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byogZmxv
YXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGluZ09iamVjdCgqZmxvYXRpbmdCb3gpOwotICAgICAg
ICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdP
YmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdP
YmplY3QtPnNldE9yaWdpbmF0aW5nTGluZSgqbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEZvckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5C
ZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gpKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRp
b25OZXdGbG9hdHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXRzLnNldExhc3RDbGVhbkZs
b2F0KCpmbG9hdGluZ0JveCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChzYXZlZExvZ2ljYWxIZWlnaHQpOwotICAgIH0KLQotICAgIGxheW91
dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKCFsYXN0TGluZSk7Ci0gICAgbGF5b3V0U3Rh
dGUubGluZUluZm8oKS5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoIWxhc3RMaW5lIHx8IGxh
c3RMaW5lLT5lbmRzV2l0aEJyZWFrKCkpOwotCi0gICAgaWYgKGxhc3RMaW5lKSB7Ci0gICAgICAg
IHNldExvZ2ljYWxIZWlnaHQobGFzdExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKLSAg
ICAgICAgSW5saW5lSXRlcmF0b3IgaXRlciA9IElubGluZUl0ZXJhdG9yKHRoaXMsIGxhc3RMaW5l
LT5saW5lQnJlYWtPYmooKSwgbGFzdExpbmUtPmxpbmVCcmVha1BvcygpKTsKLSAgICAgICAgcmVz
b2x2ZXIuc2V0UG9zaXRpb24oaXRlciwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGl0ZXIpKTsK
LSAgICAgICAgcmVzb2x2ZXIuc2V0U3RhdHVzKGxhc3RMaW5lLT5saW5lQnJlYWtCaWRpU3RhdHVz
KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5
bGUoKS5kaXJlY3Rpb24oKTsKLSAgICAgICAgaWYgKHN0eWxlKCkudW5pY29kZUJpZGkoKSA9PSBQ
bGFpbnRleHQpCi0gICAgICAgICAgICBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24s
IElubGluZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKCp0aGlz
KSwgMCkpOwotICAgICAgICByZXNvbHZlci5zZXRTdGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rpb24s
IGlzT3ZlcnJpZGUoc3R5bGUoKS51bmljb2RlQmlkaSgpKSkpOwotICAgICAgICBJbmxpbmVJdGVy
YXRvciBpdGVyID0gSW5saW5lSXRlcmF0b3IodGhpcywgYmlkaUZpcnN0U2tpcHBpbmdFbXB0eUlu
bGluZXMoKnRoaXMsICZyZXNvbHZlciksIDApOwotICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlv
bihpdGVyLCBudW1iZXJPZklzb2xhdGVBbmNlc3RvcnMoaXRlcikpOwotICAgIH0KLSAgICByZXR1
cm4gY3VycmVudExpbmU7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVFbmRQ
b3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQm94KiBzdGFy
dExpbmUsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0YXR1cyYgY2xlYW5M
aW5lQmlkaVN0YXR1cykKLXsKLSAgICBhdXRvIGl0ZXJhdG9yRm9yRmlyc3REaXJ0eUZsb2F0ID0g
W10oTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykgewotICAgICAgICBhdXRvIGxh
c3RDbGVhbkZsb2F0ID0gZmxvYXRzLmxhc3RDbGVhbkZsb2F0KCk7Ci0gICAgICAgIGlmICghbGFz
dENsZWFuRmxvYXQpCi0gICAgICAgICAgICByZXR1cm4gZmxvYXRzLmJlZ2luKCk7Ci0gICAgICAg
IGF1dG8qIGxhc3RDbGVhbkZsb2F0V2l0aFJlY3QgPSBmbG9hdHMuZmxvYXRXaXRoUmVjdCgqbGFz
dENsZWFuRmxvYXQpOwotICAgICAgICBBU1NFUlQobGFzdENsZWFuRmxvYXRXaXRoUmVjdCk7Ci0g
ICAgICAgIHJldHVybiArK2Zsb2F0cy5maW5kKCpsYXN0Q2xlYW5GbG9hdFdpdGhSZWN0KTsKLSAg
ICB9OwotCi0gICAgQVNTRVJUKCFsYXlvdXRTdGF0ZS5lbmRMaW5lKCkpOwotICAgIGF1dG8gZmxv
YXRzSXRlcmF0b3IgPSBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9hdChsYXlvdXRTdGF0ZS5mbG9h
dExpc3QoKSk7Ci0gICAgYXV0byBlbmQgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5lbmQoKTsK
LSAgICBSb290SW5saW5lQm94KiBsYXN0TGluZSA9IG51bGxwdHI7Ci0gICAgZm9yIChSb290SW5s
aW5lQm94KiBjdXJyZW50TGluZSA9IHN0YXJ0TGluZS0+bmV4dFJvb3RCb3goKTsgY3VycmVudExp
bmU7IGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAg
aWYgKCFjdXJyZW50TGluZS0+aXNEaXJ0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoYXV0byogY2xl
YW5MaW5lRmxvYXRzID0gY3VycmVudExpbmUtPmZsb2F0c1B0cigpKSB7Ci0gICAgICAgICAgICAg
ICAgYm9vbCBlbmNvdW50ZXJlZE5ld0Zsb2F0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9v
bCBkaXJ0aWVkQnlGbG9hdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgZmxv
YXRCb3hPbkNsZWFuTGluZSA6ICpjbGVhbkxpbmVGbG9hdHMpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKCFmbG9hdEJveE9uQ2xlYW5MaW5lKQotICAgICAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChmbG9hdHNJdGVyYXRvciAhPSBlbmQp
OwotICAgICAgICAgICAgICAgICAgICBjaGVja0Zsb2F0SW5DbGVhbkxpbmUoKmN1cnJlbnRMaW5l
LCAqZmxvYXRCb3hPbkNsZWFuTGluZSwgKmZsb2F0c0l0ZXJhdG9yLCBlbmNvdW50ZXJlZE5ld0Zs
b2F0LCBkaXJ0aWVkQnlGbG9hdCk7Ci0gICAgICAgICAgICAgICAgICAgICsrZmxvYXRzSXRlcmF0
b3I7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdHNJdGVyYXRvciA9PSBlbmQgfHwgZW5j
b3VudGVyZWROZXdGbG9hdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJl
bnRMaW5lLT5pc0RpcnR5KCkpCi0gICAgICAgICAgICBsYXN0TGluZSA9IG51bGxwdHI7Ci0gICAg
ICAgIGVsc2UgaWYgKCFsYXN0TGluZSkKLSAgICAgICAgICAgIGxhc3RMaW5lID0gY3VycmVudExp
bmU7Ci0gICAgfQotCi0gICAgaWYgKCFsYXN0TGluZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gQXQgdGhpcyBwb2ludCwgfGxhc3R8IGlzIHRoZSBmaXJzdCBsaW5lIGluIGEgcnVuIG9mIGNs
ZWFuIGxpbmVzIHRoYXQgZW5kcyB3aXRoIHRoZSBsYXN0IGxpbmUKLSAgICAvLyBpbiB0aGUgYmxv
Y2suCi0gICAgUm9vdElubGluZUJveCogcHJldmlvdXNMaW5lID0gbGFzdExpbmUtPnByZXZSb290
Qm94KCk7Ci0gICAgY2xlYW5MaW5lU3RhcnQgPSBJbmxpbmVJdGVyYXRvcih0aGlzLCBwcmV2aW91
c0xpbmUtPmxpbmVCcmVha09iaigpLCBwcmV2aW91c0xpbmUtPmxpbmVCcmVha1BvcygpKTsKLSAg
ICBjbGVhbkxpbmVCaWRpU3RhdHVzID0gcHJldmlvdXNMaW5lLT5saW5lQnJlYWtCaWRpU3RhdHVz
KCk7Ci0gICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxUb3AocHJldmlvdXNMaW5lLT5s
aW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Ci0KLSAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmUg
PSBsYXN0TGluZTsgbGluZTsgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAg
Ly8gRGlzY29ubmVjdCBhbGwgbGluZSBib3hlcyBmcm9tIHRoZWlyIHJlbmRlciBvYmplY3RzIHdo
aWxlIHByZXNlcnZpbmcgdGhlaXIgY29ubmVjdGlvbnMgdG8gb25lIGFub3RoZXIuCi0gICAgICAg
IGxpbmUtPmV4dHJhY3RMaW5lKCk7Ci0gICAgfQotICAgIGxheW91dFN0YXRlLnNldEVuZExpbmUo
bGFzdExpbmUpOwotfQotCi1ib29sIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdpbmF0aW9uQW5k
RmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCi17Ci0gICAgTGF5
b3V0VW5pdCBsaW5lRGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRMaW5l
TG9naWNhbFRvcCgpOwotCi0gICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCku
bGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91
dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwotICAgIGlmIChwYWdpbmF0
ZWQgJiYgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkgewotICAgICAgICAvLyBDaGVjayBh
bGwgbGluZXMgZnJvbSBoZXJlIHRvIHRoZSBlbmQsIGFuZCBzZWUgaWYgdGhlIGh5cG90aGV0aWNh
bCBuZXcgcG9zaXRpb24gZm9yIHRoZSBsaW5lcyB3aWxsIHJlc3VsdAotICAgICAgICAvLyBpbiBh
IGRpZmZlcmVudCBhdmFpbGFibGUgbGluZSB3aWR0aC4KLSAgICAgICAgZm9yIChSb290SW5saW5l
Qm94KiBsaW5lQm94ID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOyBsaW5lQm94OyBsaW5lQm94ID0g
bGluZUJveC0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewot
ICAgICAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgdGhlIHJlYWwgbW92ZSB3ZSdyZSBnb2luZyB0
byBkbywgc28gZG9uJ3QgdXBkYXRlIHRoZSBsaW5lIGJveCdzIHBhZ2luYXRpb24KLSAgICAgICAg
ICAgICAgICAvLyBzdHJ1dCB5ZXQuCi0gICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRQYWdp
bmF0aW9uU3RydXQgPSBsaW5lQm94LT5wYWdpbmF0aW9uU3RydXQoKTsKLSAgICAgICAgICAgICAg
ICBib29sIG92ZXJmbG93c0ZyYWdtZW50OwotICAgICAgICAgICAgICAgIGxpbmVEZWx0YSAtPSBv
bGRQYWdpbmF0aW9uU3RydXQ7Ci0gICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9y
UGFnaW5hdGlvbihsaW5lQm94LCBsaW5lRGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRT
dGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKLSAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRQYWdp
bmF0aW9uU3RydXQob2xkUGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGlmIChsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChsaW5lQm94LCBsaW5lRGVs
dGEsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpKQotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWxpbmVEZWx0YSB8fCAh
bV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIC8vIFNl
ZSBpZiBhbnkgZmxvYXRzIGVuZCBpbiB0aGUgcmFuZ2UgYWxvbmcgd2hpY2ggd2Ugd2FudCB0byBz
aGlmdCB0aGUgbGluZXMgdmVydGljYWxseS4KLSAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBz
dGQ6Om1pbihsb2dpY2FsSGVpZ2h0KCksIGxheW91dFN0YXRlLmVuZExpbmVMb2dpY2FsVG9wKCkp
OwotCi0gICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7
Ci0gICAgd2hpbGUgKFJvb3RJbmxpbmVCb3gqIG5leHRMaW5lID0gbGFzdExpbmUtPm5leHRSb290
Qm94KCkpCi0gICAgICAgIGxhc3RMaW5lID0gbmV4dExpbmU7Ci0KLSAgICBMYXlvdXRVbml0IGxv
Z2ljYWxCb3R0b20gPSBsYXN0TGluZS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkgKyBhYnNvbHV0
ZVZhbHVlKGxpbmVEZWx0YSk7Ci0KLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0byBlbmQgPSBm
bG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVj
dFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgYXV0byYgZmxv
YXRpbmdPYmplY3QgPSAqaXQtPmdldCgpOwotICAgICAgICBpZiAobG9naWNhbEJvdHRvbUZvckZs
b2F0KGZsb2F0aW5nT2JqZWN0KSA+PSBsb2dpY2FsVG9wICYmIGxvZ2ljYWxCb3R0b21Gb3JGbG9h
dChmbG9hdGluZ09iamVjdCkgPCBsb2dpY2FsQm90dG9tKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlbmRlckJsb2NrRmxv
dzo6bGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoUm9vdElubGluZUJveCogcm9vdEJv
eCwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRlckZyYWdtZW50ZWRGbG93KiBmcmFnbWVudGVk
RmxvdykgY29uc3QKLXsKLSAgICBpZiAoIWZyYWdtZW50ZWRGbG93KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogY3VycmVudEZyYWdtZW50ID0g
ZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KHJvb3RCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygpICsgbGlu
ZURlbHRhKTsKLSAgICAvLyBKdXN0IGJhaWwgaWYgdGhlIGZyYWdtZW50IGRpZG4ndCBjaGFuZ2Uu
Ci0gICAgaWYgKHJvb3RCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpID09IGN1cnJlbnRGcmFnbWVu
dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiByb290Qm94LT5wYWdpbmF0ZWRM
aW5lV2lkdGgoKSAhPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JDb250ZW50KGN1cnJlbnRGcmFn
bWVudCk7Ci19Ci0KLWJvb2wgUmVuZGVyQmxvY2tGbG93OjptYXRjaGVkRW5kTGluZShMaW5lTGF5
b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVy
LCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBl
bmRMaW5lU3RhdHVzKQotewotICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpID09IGVuZExpbmVT
dGFydCkgewotICAgICAgICBpZiAocmVzb2x2ZXIuc3RhdHVzKCkgIT0gZW5kTGluZVN0YXR1cykK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGNoZWNrUGFnaW5hdGlv
bkFuZEZsb2F0c0F0RW5kTGluZShsYXlvdXRTdGF0ZSk7Ci0gICAgfQotCi0gICAgLy8gVGhlIGZp
cnN0IGNsZWFuIGxpbmUgZG9lc24ndCBtYXRjaCwgYnV0IHdlIGNhbiBjaGVjayBhIGhhbmRmdWwg
b2YgZm9sbG93aW5nIGxpbmVzIHRvIHRyeQotICAgIC8vIHRvIG1hdGNoIGJhY2sgdXAuCi0gICAg
c3RhdGljIGNvbnN0IGludCBudW1MaW5lcyA9IDg7IC8vIFRoZSAjIG9mIGxpbmVzIHdlJ3JlIHdp
bGxpbmcgdG8gbWF0Y2ggYWdhaW5zdC4KLSAgICBSb290SW5saW5lQm94KiBvcmlnaW5hbEVuZExp
bmUgPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7Ci0gICAgUm9vdElubGluZUJveCogbGluZSA9IG9y
aWdpbmFsRW5kTGluZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpbmVzICYmIGxpbmU7
IGkrKywgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgaWYgKGxpbmUtPmxp
bmVCcmVha09iaigpID09IHJlc29sdmVyLnBvc2l0aW9uKCkucmVuZGVyZXIoKSAmJiBsaW5lLT5s
aW5lQnJlYWtQb3MoKSA9PSByZXNvbHZlci5wb3NpdGlvbigpLm9mZnNldCgpKSB7Ci0gICAgICAg
ICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guCi0gICAgICAgICAgICBpZiAobGluZS0+bGluZUJyZWFr
QmlkaVN0YXR1cygpICE9IHJlc29sdmVyLnN0YXR1cygpKQotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsgLy8gLi4uYnV0IHRoZSBiaWRpIHN0YXRlIGRvZXNuJ3QgbWF0Y2guCi0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGJvb2wgbWF0Y2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgUm9v
dElubGluZUJveCogcmVzdWx0ID0gbGluZS0+bmV4dFJvb3RCb3goKTsKLSAgICAgICAgICAgIGxh
eW91dFN0YXRlLnNldEVuZExpbmUocmVzdWx0KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQpIHsK
LSAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTG9naWNhbFRvcChsaW5lLT5s
aW5lQm90dG9tV2l0aExlYWRpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IGNoZWNr
UGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShsYXlvdXRTdGF0ZSk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIE5vdyBkZWxldGUgdGhlIGxpbmVzIHRoYXQgd2UgZmFpbGVkIHRv
IHN5bmMuCi0gICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0U3RhdGUsIG9yaWdpbmFs
RW5kTGluZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBtYXRjaGVkOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpnZW5l
cmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqIGlubGluZU9iaikKLXsK
LSAgICBBU1NFUlQoaW5saW5lT2JqLT5wYXJlbnQoKSA9PSB0aGlzKTsKLQotICAgIElubGluZUl0
ZXJhdG9yIGl0KHRoaXMsIGlubGluZU9iaiwgMCk7Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBw
YXNzIGNvcnJlY3QgdmFsdWUgZm9yIFdoaXRlc3BhY2VQb3NpdGlvbi4KLSAgICB3aGlsZSAoIWl0
LmF0RW5kKCkgJiYgIXJlcXVpcmVzTGluZUJveChpdCkpCi0gICAgICAgIGl0LmluY3JlbWVudCgp
OwotCi0gICAgcmV0dXJuICFpdC5hdEVuZCgpOwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6
YWRkT3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4oKQotewotICAgIGlmIChhdXRvIGxheW91dCA9
IHNpbXBsZUxpbmVMYXlvdXQoKSkgewotICAgICAgICBBU1NFUlQoIWhhc092ZXJmbG93Q2xpcCgp
KTsKLSAgICAgICAgU2ltcGxlTGluZUxheW91dDo6Y29sbGVjdEZsb3dPdmVyZmxvdygqdGhpcywg
KmxheW91dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTGF5b3V0VW5pdCBlbmRQYWRk
aW5nID0gaGFzT3ZlcmZsb3dDbGlwKCkgPyBwYWRkaW5nRW5kKCkgOiAwX2x1OwotICAgIC8vIEZJ
WE1FOiBOZWVkIHRvIGZpbmQgYW5vdGhlciB3YXkgdG8gZG8gdGhpcywgc2luY2Ugc2Nyb2xsYmFy
cyBjb3VsZCBzaG93IHdoZW4gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvLgotICAgIGlmIChoYXNPdmVy
Zmxvd0NsaXAoKSAmJiAhZW5kUGFkZGluZyAmJiBlbGVtZW50KCkgJiYgZWxlbWVudCgpLT5pc1Jv
b3RFZGl0YWJsZUVsZW1lbnQoKSAmJiBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkK
LSAgICAgICAgZW5kUGFkZGluZyA9IDE7Ci0gICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyID0g
Zmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7Ci0gICAg
ICAgIGFkZExheW91dE92ZXJmbG93KGN1cnItPnBhZGRlZExheW91dE92ZXJmbG93UmVjdChlbmRQ
YWRkaW5nKSk7Ci0gICAgICAgIFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBmcmFnbWVudCA9IGVu
Y2xvc2luZ0ZyYWdtZW50ZWRGbG93KCkgPyBjdXJyLT5jb250YWluaW5nRnJhZ21lbnQoKSA6IG51
bGxwdHI7Ci0gICAgICAgIGlmIChmcmFnbWVudCkKLSAgICAgICAgICAgIGZyYWdtZW50LT5hZGRM
YXlvdXRPdmVyZmxvd0ZvckJveCh0aGlzLCBjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3Qo
ZW5kUGFkZGluZykpOwotICAgICAgICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpKSB7Ci0gICAgICAg
ICAgICBMYXlvdXRSZWN0IGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0ID0gY3Vyci0+dmlzdWFsT3Zl
cmZsb3dSZWN0KGN1cnItPmxpbmVUb3AoKSwgY3Vyci0+bGluZUJvdHRvbSgpKTsKLSAgICAgICAg
ICAgIGFkZFZpc3VhbE92ZXJmbG93KGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKLSAgICAgICAg
ICAgIGlmIChmcmFnbWVudCkKLSAgICAgICAgICAgICAgICBmcmFnbWVudC0+YWRkVmlzdWFsT3Zl
cmZsb3dGb3JCb3godGhpcywgY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMo
KQotewotICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsK
LSAgICBib29sIGx0ciA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgIElu
ZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0gSW5kZW50VGV4dDsKLSAgICBmb3IgKFJv
b3RJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5l
eHRSb290Qm94KCkpIHsKLSAgICAgICAgaWYgKGN1cnItPmhhc0VsbGlwc2lzQm94KCkpIHsKLSAg
ICAgICAgICAgIGN1cnItPmNsZWFyVHJ1bmNhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBTaGlm
dCB0aGUgbGluZSBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MgaWYgd2UgY2Fubm90IGFjY29tb2RhdGUg
YW4gZWxsaXBzaXMuCi0gICAgICAgICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IGxvZ2ljYWxMZWZ0
T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwotICAgICAg
ICAgICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9y
TGluZShjdXJyLT5saW5lVG9wKCksIERvTm90SW5kZW50VGV4dCkgLSBsb2dpY2FsTGVmdDsKLSAg
ICAgICAgICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gY3Vyci0+bG9naWNhbFdpZHRoKCk7
Ci0gICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBj
dXJyLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChsdHIpCi0gICAgICAgICAgICAgICAgY3Vyci0+
YWRqdXN0TG9naWNhbFBvc2l0aW9uKChsb2dpY2FsTGVmdCAtIGN1cnItPmxvZ2ljYWxMZWZ0KCkp
LCAwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdXJyLT5hZGp1c3RMb2dp
Y2FsUG9zaXRpb24oLShjdXJyLT5sb2dpY2FsTGVmdCgpIC0gbG9naWNhbExlZnQpLCAwKTsKLSAg
ICAgICAgfQotICAgICAgICBzaG91bGRJbmRlbnRUZXh0ID0gRG9Ob3RJbmRlbnRUZXh0OwotICAg
IH0KLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3co
KQotewotICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRo
ZSBjdXJyZW50IGZvbnQuCi0gICAgLy8gRklYTUU6IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3Vy
YWJsZSwgYWxzbyBuZWVkIHRvIHVzZSAweDAwMkUgKEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBl
bGxpcHNpcyBpcyAibm90IHJlbmRlcmFibGUiCi0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQg
PSBzdHlsZSgpLmZvbnRDYXNjYWRlKCk7Ci0gICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEF0b21T
dHJpbmc+IGVsbGlwc2lzU3RyKCZob3Jpem9udGFsRWxsaXBzaXMsIDEpOwotICAgIGNvbnN0IEZv
bnRDYXNjYWRlJiBmaXJzdExpbmVGb250ID0gZmlyc3RMaW5lU3R5bGUoKS5mb250Q2FzY2FkZSgp
OwotICAgIGZsb2F0IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggPSBmaXJzdExpbmVGb250LndpZHRo
KGNvbnN0cnVjdFRleHRSdW4oJmhvcml6b250YWxFbGxpcHNpcywgMSwgZmlyc3RMaW5lU3R5bGUo
KSkpOwotICAgIGZsb2F0IGVsbGlwc2lzV2lkdGggPSAoZm9udCA9PSBmaXJzdExpbmVGb250KSA/
IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBmb250LndpZHRoKGNvbnN0cnVjdFRleHRSdW4oJmhv
cml6b250YWxFbGxpcHNpcywgMSwgc3R5bGUoKSkpOwotCi0gICAgLy8gRm9yIExUUiB0ZXh0IHRy
dW5jYXRpb24sIHdlIHdhbnQgdG8gZ2V0IHRoZSByaWdodCBlZGdlIG9mIG91ciBwYWRkaW5nIGJv
eCwgYW5kIHRoZW4gd2Ugd2FudCB0byBzZWUKLSAgICAvLyBpZiB0aGUgcmlnaHQgZWRnZSBvZiBh
IGxpbmUgYm94IGV4Y2VlZHMgdGhhdC4gIEZvciBSVEwsIHdlIHVzZSB0aGUgbGVmdCBlZGdlIG9m
IHRoZSBwYWRkaW5nIGJveCBhbmQKLSAgICAvLyBjaGVjayB0aGUgbGVmdCBlZGdlIG9mIHRoZSBs
aW5lIGJveCB0byBzZWUgaWYgaXQgaXMgbGVzcwotICAgIC8vIEluY2x1ZGUgdGhlIHNjcm9sbGJh
ciBmb3Igb3ZlcmZsb3cgYmxvY2tzLCB3aGljaCBtZWFucyB3ZSB3YW50IHRvIHVzZSAiY29udGVu
dFdpZHRoKCkiCi0gICAgYm9vbCBsdHIgPSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KTsKLSAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxlKCkudGV4dEFsaWduKCk7Ci0g
ICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOwotICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9
IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewotICAg
ICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IGZpcnN0TGluZSA/IEluZGVu
dFRleHQgOiBEb05vdEluZGVudFRleHQ7Ci0gICAgICAgIExheW91dFVuaXQgYmxvY2tSaWdodEVk
Z2UgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5k
ZW50VGV4dCk7Ci0gICAgICAgIExheW91dFVuaXQgYmxvY2tMZWZ0RWRnZSA9IGxvZ2ljYWxMZWZ0
T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwotICAgICAg
ICBMYXlvdXRVbml0IGxpbmVCb3hFZGdlIHsgbHRyID8gY3Vyci0+eCgpICsgY3Vyci0+bG9naWNh
bFdpZHRoKCkgOiBjdXJyLT54KCkgfTsKLSAgICAgICAgaWYgKChsdHIgJiYgbGluZUJveEVkZ2Ug
PiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFsdHIgJiYgbGluZUJveEVkZ2UgPCBibG9ja0xlZnRFZGdl
KSkgewotICAgICAgICAgICAgLy8gVGhpcyBsaW5lIHNwaWxscyBvdXQgb2Ygb3VyIGJveCBpbiB0
aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiAgTm93IHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBsaW5l
Ci0gICAgICAgICAgICAvLyBjYW4gYmUgdHJ1bmNhdGVkLiAgSW4gb3JkZXIgZm9yIHRydW5jYXRp
b24gdG8gYmUgcG9zc2libGUsIHRoZSBsaW5lIG11c3QgaGF2ZSBzdWZmaWNpZW50IHNwYWNlIHRv
Ci0gICAgICAgICAgICAvLyBhY2NvbW1vZGF0ZSBvdXIgdHJ1bmNhdGlvbiBzdHJpbmcsIGFuZCBu
byByZXBsYWNlZCBlbGVtZW50cyAoaW1hZ2VzLCB0YWJsZXMpIGNhbiBvdmVybGFwIHRoZSBlbGxp
cHNpcwotICAgICAgICAgICAgLy8gc3BhY2UuCi0gICAgICAgICAgICBMYXlvdXRVbml0IHdpZHRo
IHsgZmlyc3RMaW5lID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA6IGVsbGlwc2lzV2lkdGggfTsK
LSAgICAgICAgICAgIExheW91dFVuaXQgYmxvY2tFZGdlIHsgbHRyID8gYmxvY2tSaWdodEVkZ2Ug
OiBibG9ja0xlZnRFZGdlIH07Ci0gICAgICAgICAgICBpZiAoY3Vyci0+bGluZUNhbkFjY29tbW9k
YXRlRWxsaXBzaXMobHRyLCBibG9ja0VkZ2UsIGxpbmVCb3hFZGdlLCB3aWR0aCkpIHsKLSAgICAg
ICAgICAgICAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1cnItPnBsYWNlRWxsaXBzaXMo
ZWxsaXBzaXNTdHIsIGx0ciwgYmxvY2tMZWZ0RWRnZSwgYmxvY2tSaWdodEVkZ2UsIHdpZHRoKTsK
LQotICAgICAgICAgICAgICAgIGZsb2F0IGxvZ2ljYWxMZWZ0ID0gMDsgLy8gV2UgYXJlIG9ubHkg
aW50ZXJlc3RlZCBpbiB0aGUgZGVsdGEgZnJvbSB0aGUgYmFzZSBwb3NpdGlvbi4KLSAgICAgICAg
ICAgICAgICBmbG9hdCB0cnVuY2F0ZWRXaWR0aCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxp
bmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgICAgICAgICB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBjdXJyLCBudWxscHRyLCBs
b2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIHRydW5jYXRlZFdpZHRoLCAwKTsKLSAgICAg
ICAgICAgICAgICBpZiAobHRyKQotICAgICAgICAgICAgICAgICAgICBjdXJyLT5hZGp1c3RMb2dp
Y2FsUG9zaXRpb24obG9naWNhbExlZnQsIDApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0aW9uKC0odHJ1bmNhdGVkV2lk
dGggLSAobG9naWNhbExlZnQgKyB0b3RhbExvZ2ljYWxXaWR0aCkpLCAwKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBmaXJzdExpbmUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLWJv
b2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGNvbnN0IEZsb2F0aW5n
T2JqZWN0JiBuZXdGbG9hdCwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xp
bmUsIExpbmVJbmZvJiBsaW5lSW5mbywgTGluZVdpZHRoJiB3aWR0aCkKLXsKLSAgICBpZiAoIXBv
c2l0aW9uTmV3RmxvYXRzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHdpZHRoLnNo
cmlua0F2YWlsYWJsZVdpZHRoRm9yTmV3RmxvYXRJZk5lZWRlZChuZXdGbG9hdCk7Ci0KLSAgICAv
LyBXZSBvbmx5IGNvbm5lY3QgZmxvYXRzIHRvIGxpbmVzIGZvciBwYWdpbmF0aW9uIHB1cnBvc2Vz
IGlmIHRoZSBmbG9hdHMgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mCi0gICAgLy8gdGhlIGxpbmUgYW5k
IHRoZSBwcmV2aW91cyBsaW5lIGhhZCBhIGhhcmQgYnJlYWsgKHNvIHRoaXMgbGluZSBpcyBlaXRo
ZXIgdGhlIGZpcnN0IGluIHRoZSBibG9jawotICAgIC8vIG9yIGZvbGxvd3MgYSA8YnI+KS4KLSAg
ICBpZiAoIW5ld0Zsb2F0LnBhZ2luYXRpb25TdHJ1dCgpIHx8ICFsaW5lSW5mby5wcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkoKSB8fCAhbGluZUluZm8uaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9
IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICBBU1NFUlQoZmxvYXRpbmdPYmplY3RTZXQu
bGFzdCgpLmdldCgpID09ICZuZXdGbG9hdCk7Ci0KLSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNh
bFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChuZXdGbG9hdCk7Ci0gICAgTGF5b3V0VW5pdCBwYWdp
bmF0aW9uU3RydXQgPSBuZXdGbG9hdC5wYWdpbmF0aW9uU3RydXQoKTsKLQotICAgIGlmIChmbG9h
dExvZ2ljYWxUb3AgLSBwYWdpbmF0aW9uU3RydXQgIT0gbG9naWNhbEhlaWdodCgpICsgbGluZUlu
Zm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgLS1pdDsgLy8gTGFzdCBmbG9h
dCBpcyBuZXdGbG9hdCwgc2tpcCB0aGF0IG9uZS4KLSAgICBhdXRvIGJlZ2luID0gZmxvYXRpbmdP
YmplY3RTZXQuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gYmVnaW4pIHsKLSAgICAgICAgLS1p
dDsKLSAgICAgICAgYXV0byYgZmxvYXRpbmdPYmplY3QgPSAqaXQtPmdldCgpOwotICAgICAgICBp
ZiAoJmZsb2F0aW5nT2JqZWN0ID09IGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCi0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgaWYgKGxvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVj
dCkgPT0gbG9naWNhbEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkg
ewotICAgICAgICAgICAgZmxvYXRpbmdPYmplY3Quc2V0UGFnaW5hdGlvblN0cnV0KHBhZ2luYXRp
b25TdHJ1dCArIGZsb2F0aW5nT2JqZWN0LnBhZ2luYXRpb25TdHJ1dCgpKTsKLSAgICAgICAgICAg
IFJlbmRlckJveCYgZmxvYXRCb3ggPSBmbG9hdGluZ09iamVjdC5yZW5kZXJlcigpOwotICAgICAg
ICAgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94LCBsb2dpY2FsVG9wRm9yQ2hpbGQo
ZmxvYXRCb3gpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoZmxvYXRCb3gpICsgcGFnaW5hdGlvblN0
cnV0KTsKLQotICAgICAgICAgICAgaWYgKHVwZGF0ZUZyYWdtZW50UmFuZ2VGb3JCb3hDaGlsZChm
bG9hdEJveCkpCi0gICAgICAgICAgICAgICAgZmxvYXRCb3guc2V0TmVlZHNMYXlvdXQoTWFya09u
bHlUaGlzKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlzPFJlbmRlckJsb2NrPihmbG9hdEJveCkp
Ci0gICAgICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyQmxvY2s+KGZsb2F0Qm94KS5zZXRDaGls
ZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgICAgICBmbG9hdEJveC5sYXlvdXRJ
Zk5lZWRlZCgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIHRoZSBvbGQgbG9naWNhbCB0b3AgYmVm
b3JlIGNhbGxpbmcgcmVtb3ZlUGxhY2VkT2JqZWN0IHdoaWNoIHdpbGwgc2V0Ci0gICAgICAgICAg
ICAvLyBpc1BsYWNlZCB0byBmYWxzZS4gT3RoZXJ3aXNlIGl0IHdpbGwgdHJpZ2dlciBhbiBhc3Nl
cnQgaW4gbG9naWNhbFRvcEZvckZsb2F0LgotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dp
Y2FsVG9wID0gbG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KTsKLSAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmVQbGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsK
LSAgICAgICAgICAgIHNldExvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCwgb2xkTG9n
aWNhbFRvcCArIHBhZ2luYXRpb25TdHJ1dCk7Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0
cy0+YWRkUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyBKdXN0IHVwZGF0ZSB0aGUgbGluZSBpbmZvJ3MgcGFnaW5hdGlvbiBzdHJ1dCB3aXRo
b3V0IGFsdGVyaW5nIG91ciBsb2dpY2FsIGhlaWdodCB5ZXQuIElmIHRoZSBsaW5lIGVuZHMgdXAg
Y29udGFpbmluZwotICAgIC8vIG5vIGNvbnRlbnQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBpbXBy
b3Blcmx5IGdyb3cgdGhlIGhlaWdodCBvZiB0aGUgYmxvY2suCi0gICAgbGluZUluZm8uc2V0Rmxv
YXRQYWdpbmF0aW9uU3RydXQobGluZUluZm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSArIHBhZ2lu
YXRpb25TdHJ1dCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2tGbG93OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgcG9zaXRpb24sIElu
ZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KQotewotICAgIFRleHRBbGlnbk1vZGUgdGV4
dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKLSAgICBib29sIHNob3VsZEFwcGx5SW5kZW50
VGV4dCA9IGZhbHNlOwotICAgIHN3aXRjaCAodGV4dEFsaWduKSB7Ci0gICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpMZWZ0OgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0TGVmdDoKLSAgICAg
ICAgc2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6UmlnaHQ6Ci0gICAg
Y2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRSaWdodDoKLSAgICAgICAgc2hvdWxkQXBwbHlJbmRl
bnRUZXh0ID0gIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlN0YXJ0OgotICAgICAgICBzaG91bGRBcHBseUlu
ZGVudFRleHQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBz
aG91bGRBcHBseUluZGVudFRleHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgLy8gPHJkYXI6Ly9wcm9i
bGVtLzE1NDI3NTcxPgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xMjQ1MjIKLSAgICAvLyBUaGlzIHF1aXJrIGlzIGZvciBsZWdhY3kgY29udGVudCB0aGF0
IGRvZXNuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHRoZSBjZW50ZXIgcG9zaXRpb25pbmcgc2NoZW1l
Ci0gICAgLy8gYmVpbmcgaG9ub3JlZCAoZS5nLiwgZXB1YnMpLgotICAgIGlmIChzaG91bGRBcHBs
eUluZGVudFRleHQgfHwgc2V0dGluZ3MoKS51c2VMZWdhY3lUZXh0QWxpZ25Qb3NpdGlvbmVkRWxl
bWVudEJlaGF2aW9yKCkpIC8vIEZJWE1FOiBIYW5kbGUgVGV4dEFsaWduTW9kZTo6RW5kIGhlcmUK
LSAgICAgICAgcmV0dXJuIHN0YXJ0T2Zmc2V0Rm9yTGluZShwb3NpdGlvbiwgc2hvdWxkSW5kZW50
VGV4dCk7Ci0KLSAgICAvLyB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQoKSBoYW5kbGVz
IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIHNvIG5vIG5lZWQgdG8gY29uc2lkZXIgaXQgaGVy
ZQotICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gMDsKLSAgICBmbG9hdCBsb2dpY2FsTGVm
dCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShsb2dpY2FsSGVpZ2h0KCksIERvTm90SW5kZW50
VGV4dCk7Ci0gICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbG9naWNhbFJpZ2h0T2Zm
c2V0Rm9yTGluZShsb2dpY2FsSGVpZ2h0KCksIERvTm90SW5kZW50VGV4dCkgLSBsb2dpY2FsTGVm
dDsKLQotICAgIC8vIEZJWE1FOiBCdWcgMTI5MzExOiBXZSBuZWVkIHRvIHBhc3MgYSB2YWxpZCBS
b290SW5saW5lQm94IGhlcmUsIGNvbnNpZGVyaW5nIHRoZSBiaWRpIGxldmVsIHVzZWQgdG8gY29u
c3RydWN0IHRoZSBsaW5lLgotICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0
QWxpZ24sIDAsIDAsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoLCAwKTsKLQotICAgIGlmICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCkpCi0gICAgICAgIHJldHVybiBMYXlvdXRVbml0KGxvZ2ljYWxXaWR0aCgpIC0gbG9naWNhbExl
ZnQpOwotICAgIHJldHVybiBMYXlvdXRVbml0KGxvZ2ljYWxMZWZ0KTsKLX0KLQotdm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OnVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290SW5saW5lQm94KiBsaW5lQm94
KSBjb25zdAotewotICAgIEFTU0VSVChsaW5lQm94KTsKLQotICAgIGlmICghaGFzRnJhZ21lbnRS
YW5nZUluRnJhZ21lbnRlZEZsb3coKSkKLSAgICAgICAgbGluZUJveC0+Y2xlYXJDb250YWluaW5n
RnJhZ21lbnQoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGF1dG8gY29udGFpbmluZ0ZyYWdt
ZW50ID0gZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KGxpbmVCb3gtPmxpbmVUb3BXaXRoTGVhZGluZygp
KSkKLSAgICAgICAgICAgIGxpbmVCb3gtPnNldENvbnRhaW5pbmdGcmFnbWVudCgqY29udGFpbmlu
Z0ZyYWdtZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGluZUJveC0+Y2xlYXJDb250
YWluaW5nRnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICBSb290SW5saW5lQm94KiBwcmV2TGluZUJv
eCA9IGxpbmVCb3gtPnByZXZSb290Qm94KCk7Ci0gICAgaWYgKCFwcmV2TGluZUJveCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBjaGVjayBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhl
IG9uZSBpbiB8YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbnwgYmVjYXVzZSBpdCB0YWtl
cyBpbnRvCi0gICAgLy8gYWNjb3VudCBqdXN0IHRoZSBjb250YWluZXIgY2hhbmdlcyBiZXR3ZWVu
IGxpbmVzLiBUaGUgYmVmb3JlIG1lbnRpb25lZCBmdW5jdGlvbiBkb2Vzbid0IHNldCB0aGUgZmxh
ZwotICAgIC8vIGNvcnJlY3RseSBpZiB0aGUgbGluZSBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Ag
b2YgdGhlIGxhc3QgZnJhZ21lbnQgY29udGFpbmVyLgotICAgIGlmIChsaW5lQm94LT5jb250YWlu
aW5nRnJhZ21lbnQoKSAhPSBwcmV2TGluZUJveC0+Y29udGFpbmluZ0ZyYWdtZW50KCkpCi0gICAg
ICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VCcmVhayh0cnVlKTsKLX0KLQotfQoKUHJv
cGVydHkgY2hhbmdlcyBvbjogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpEZWxldGVkOiBzdm46ZW9sLXN0eWxlCiMjIC0xICswLDAg
IyMKLW5hdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAJKHJldmlzaW9uIDI0ODUwMCkK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYwLDcgKzYwLDcgQEAgUmVuZGVyUnVieVJ1biogUmVuZGVyUnVieUJhc2U6OnJ1
YnlSdW4oKQogICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihwYXJlbnQoKSk7CiB9
CiAKLVRleHRBbGlnbk1vZGUgUmVuZGVyUnVieUJhc2U6OnRleHRBbGlnbm1lbnRGb3JMaW5lKGJv
b2wgLyogZW5kc1dpdGhTb2Z0QnJlYWsgKi8pIGNvbnN0CitPcHRpb25hbDxUZXh0QWxpZ25Nb2Rl
PiBSZW5kZXJSdWJ5QmFzZTo6b3ZlcnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZShib29sIC8qIGVu
ZHNXaXRoU29mdEJyZWFrICovKSBjb25zdAogewogICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpK
dXN0aWZ5OwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNl
LmgJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJS
dWJ5QmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYzoKIHByaXZh
dGU6CiAgICAgYm9vbCBpc1J1YnlCYXNlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsg
fQogICAgIGJvb2wgaXNDaGlsZEFsbG93ZWQoY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUmVu
ZGVyU3R5bGUmKSBjb25zdCBvdmVycmlkZTsKLSAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbm1l
bnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0IG92ZXJyaWRlOworICAgIE9w
dGlvbmFsPFRleHRBbGlnbk1vZGU+IG92ZXJyaWRlVGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBl
bmRzV2l0aFNvZnRCcmVhaykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBhZGp1c3RJbmxpbmVE
aXJlY3Rpb25MaW5lQm91bmRzKGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCYg
bG9naWNhbExlZnQsIGZsb2F0JiBsb2dpY2FsV2lkdGgpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAg
ZmxvYXQgbV9pbml0aWFsT2Zmc2V0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclJ1YnlUZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyUnVieVRleHQuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyUnVieVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NywxMiArNTcs
MTIgQEAgYm9vbCBSZW5kZXJSdWJ5VGV4dDo6aXNDaGlsZEFsbG93ZWQoY29ucwogICAgIHJldHVy
biBjaGlsZC5pc0lubGluZSgpOwogfQogCi1UZXh0QWxpZ25Nb2RlIFJlbmRlclJ1YnlUZXh0Ojp0
ZXh0QWxpZ25tZW50Rm9yTGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdAorT3B0aW9u
YWw8VGV4dEFsaWduTW9kZT4gUmVuZGVyUnVieVRleHQ6Om92ZXJyaWRlVGV4dEFsaWdubWVudEZv
ckxpbmUoYm9vbCkgY29uc3QKIHsKICAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxl
KCkudGV4dEFsaWduKCk7CiAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgaXMgYm9ndXMgc2luY2Ug
dXNlciBjYW4gc2V0IHRoZSBpbml0aWFsIHZhbHVlLgogICAgIGlmICh0ZXh0QWxpZ24gIT0gUmVu
ZGVyU3R5bGU6OmluaXRpYWxUZXh0QWxpZ24oKSkKLSAgICAgICAgcmV0dXJuIFJlbmRlckJsb2Nr
Rmxvdzo6dGV4dEFsaWdubWVudEZvckxpbmUoZW5kc1dpdGhTb2Z0QnJlYWspOworICAgICAgICBy
ZXR1cm4geyB9OwogCiAgICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYWxsb3cgcnVi
eSB0ZXh0IHRvIGV4cGFuZCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHJ1YnkgYmFzZS4KICAg
ICByZXR1cm4gVGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieVRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtNTQsNyAr
NTQsNyBAQCBwcml2YXRlOgogCiAgICAgYm9vbCBhdm9pZHNGbG9hdHMoKSBjb25zdCBvdmVycmlk
ZTsKIAotICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0
aFNvZnRCcmVhaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgT3B0aW9uYWw8VGV4dEFsaWduTW9kZT4g
b3ZlcnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25z
dCBvdmVycmlkZTsKICAgICB2b2lkIGFkanVzdElubGluZURpcmVjdGlvbkxpbmVCb3VuZHMoaW50
IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIGxv
Z2ljYWxXaWR0aCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvU2ltcGxlTGluZUxheW91dEZ1bmN0aW9ucy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1NpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3BwCShyZXZp
c2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvU2ltcGxlTGluZUxheW91
dEZ1bmN0aW9ucy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1Niw3ICszNTYsNyBAQCB2b2lkIGdl
bmVyYXRlTGluZUJveFRyZWUoUmVuZGVyQmxvY2tGbG93CiAgICAgICAgIC8vIGxpbmVJbmZvLnNl
dExhc3RMaW5lKGxhc3RMaW5lKTsKICAgICAgICAgbGluZUluZm8uc2V0RW1wdHkoIWJpZGlSdW5z
LnJ1bkNvdW50KCkpOwogICAgICAgICBiaWRpUnVucy5zZXRMb2dpY2FsbHlMYXN0UnVuKGJpZGlS
dW5zLmxhc3RSdW4oKSk7Ci0gICAgICAgIGF1dG8qIHJvb3QgPSBmbG93LmNvbnN0cnVjdExpbmUo
YmlkaVJ1bnMsIGxpbmVJbmZvKTsKKyAgICAgICAgYXV0byogcm9vdCA9IGZsb3cuY29tcGxleExp
bmVMYXlvdXQoKS5jb25zdHJ1Y3RMaW5lKGJpZGlSdW5zLCBsaW5lSW5mbyk7CiAgICAgICAgIGJp
ZGlSdW5zLmNsZWFyKCk7CiAgICAgICAgIGlmICghcm9vdCkKICAgICAgICAgICAgIGNvbnRpbnVl
OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNw
cAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGlu
ZUJyZWFrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Niw3ICs2Niw3IEBAIHZvaWQgTGluZUJy
ZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFjZSgKICAgICAgICAgICAgICAgICBsaW5lSW5mby5p
bmNyZW1lbnRSdW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIG1fYmxvY2su
cG9zaXRpb25OZXdGbG9hdE9uTGluZSgqbV9ibG9jay5pbnNlcnRGbG9hdGluZ09iamVjdChkb3du
Y2FzdDxSZW5kZXJCb3g+KG9iamVjdCkpLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBsaW5l
SW5mbywgd2lkdGgpOworICAgICAgICAgICAgbV9ibG9jay5jb21wbGV4TGluZUxheW91dCgpLnBv
c2l0aW9uTmV3RmxvYXRPbkxpbmUoKm1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmplY3QoZG93bmNh
c3Q8UmVuZGVyQm94PihvYmplY3QpKSwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbGluZUlu
Zm8sIHdpZHRoKTsKICAgICAgICAgZWxzZSBpZiAob2JqZWN0LnN0eWxlKCkuaGFzVGV4dENvbWJp
bmUoKSAmJiBpczxSZW5kZXJDb21iaW5lVGV4dD4ob2JqZWN0KSkgewogICAgICAgICAgICAgZG93
bmNhc3Q8UmVuZGVyQ29tYmluZVRleHQ+KG9iamVjdCkuY29tYmluZVRleHRJZk5lZWRlZCgpOwog
ICAgICAgICAgICAgaWYgKGRvd25jYXN0PFJlbmRlckNvbWJpbmVUZXh0PihvYmplY3QpLmlzQ29t
YmluZWQoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2Vy
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFr
ZXIuaAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUv
TGluZUJyZWFrZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNjYsNyArNjYsNyBAQCBwcml2YXRlOgog
ICAgIEZsb2F0aW5nT2JqZWN0KiBpbnNlcnRGbG9hdGluZ09iamVjdChSZW5kZXJCb3gmIGZsb2F0
Qm94KSB7IHJldHVybiBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94KTsgfQog
ICAgIGJvb2wgcG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25zdCBGbG9hdGluZ09iamVjdCYgbmV3
RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5m
byYgbGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCiAgICAgewotICAgICAgICByZXR1cm4gbV9i
bG9jay5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKG5ld0Zsb2F0LCBsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCBsaW5lSW5mbywgd2lkdGgpOworICAgICAgICByZXR1cm4gbV9ibG9jay5jb21wbGV4
TGluZUxheW91dCgpLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUobmV3RmxvYXQsIGxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7CiAgICAgfQogCiAgICAgUmVuZGVyQmxv
Y2tGbG93JiBtX2Jsb2NrOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGlu
ZUlubGluZUhlYWRlcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
bGluZS9MaW5lSW5saW5lSGVhZGVycy5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCSh3b3JraW5nIGNvcHkpCkBA
IC0yNCw2ICsyNCw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiTGluZUluZm8uaCIK
ICNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0xMjks
NyArMTMwLDcgQEAgaW5saW5lIHZvaWQgc2V0U3RhdGljUG9zaXRpb25zKFJlbmRlckJsbwogICAg
ICAgICAvLyBBIHJlbGF0aXZlIHBvc2l0aW9uZWQgaW5saW5lIGVuY2xvc2VzIHVzLiBJbiB0aGlz
IGNhc2UsIHdlIGFsc28gaGF2ZSB0byBkZXRlcm1pbmUgb3VyCiAgICAgICAgIC8vIHBvc2l0aW9u
IGFzIHRob3VnaCB3ZSB3ZXJlIGFuIGlubGluZS4gU2V0IHxzdGF0aWNJbmxpbmVQb3NpdGlvbnwg
YW5kIHxzdGF0aWNCbG9ja1Bvc2l0aW9ufCBvbiB0aGUgcmVsYXRpdmUgcG9zaXRpb25lZAogICAg
ICAgICAvLyBpbmxpbmUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIHRoZSB2YWx1ZSBsYXRlci4KLSAg
ICAgICAgZG93bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGFpbmVyQmxvY2spLmxheWVyKCktPnNl
dFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUoYmxv
Y2tIZWlnaHQsIERvTm90SW5kZW50VGV4dCkpOworICAgICAgICBkb3duY2FzdDxSZW5kZXJJbmxp
bmU+KCpjb250YWluZXJCbG9jaykubGF5ZXIoKS0+c2V0U3RhdGljSW5saW5lUG9zaXRpb24oYmxv
Y2suY29tcGxleExpbmVMYXlvdXQoKS5zdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKGJsb2NrSGVp
Z2h0LCBEb05vdEluZGVudFRleHQpKTsKICAgICAgICAgZG93bmNhc3Q8UmVuZGVySW5saW5lPigq
Y29udGFpbmVyQmxvY2spLmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWln
aHQpOwogICAgIH0KICAgICBibG9jay51cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxk
KGNoaWxkLCBibG9ja0hlaWdodCwgc2hvdWxkSW5kZW50VGV4dCk7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5jcHAJKHJldmlzaW9uIDI0ODUw
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQyNSwxMyArNDI1LDYgQEAgdm9pZCBSZW5kZXJTVkdUZXh0OjpsYXlv
dXQoKQogICAgIGNsZWFyTmVlZHNMYXlvdXQoKTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPFJvb3RJ
bmxpbmVCb3g+IFJlbmRlclNWR1RleHQ6OmNyZWF0ZVJvb3RJbmxpbmVCb3goKQotewotICAgIGF1
dG8gYm94ID0gc3RkOjptYWtlX3VuaXF1ZTxTVkdSb290SW5saW5lQm94PigqdGhpcyk7Ci0gICAg
Ym94LT5zZXRIYXNWaXJ0dWFsTG9naWNhbEhlaWdodCgpOwotICAgIHJldHVybiBib3g7Ci19Ci0K
IGJvb2wgUmVuZGVyU1ZHVGV4dDo6bm9kZUF0RmxvYXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBGbG9hdFBvaW50JiBwb2lu
dEluUGFyZW50LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCiB7CiAgICAgUG9pbnRlckV2
ZW50c0hpdFJ1bGVzIGhpdFJ1bGVzKFBvaW50ZXJFdmVudHNIaXRSdWxlczo6U1ZHX1RFWFRfSElU
VEVTVElORywgcmVxdWVzdCwgc3R5bGUoKS5wb2ludGVyRXZlbnRzKCkpOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUZXh0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUZXh0LmgJKHJldmlzaW9uIDI0ODUw
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC04Nyw3ICs4Nyw2IEBAIHByaXZhdGU6CiAKICAgICBjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIGxvY2FsVG9QYXJlbnRUcmFuc2Zvcm0oKSBjb25zdCBvdmVycmlkZSB7IHJldHVy
biBtX2xvY2FsVHJhbnNmb3JtOyB9CiAgICAgQWZmaW5lVHJhbnNmb3JtIGxvY2FsVHJhbnNmb3Jt
KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9sb2NhbFRyYW5zZm9ybTsgfQotICAgIHN0ZDo6
dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBjcmVhdGVSb290SW5saW5lQm94KCkgb3ZlcnJpZGU7
CiAKICAgICBSZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdCBvdmVycmlkZTsKIApJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3VwZGF0aW5nL1JlbmRlclRyZWVCdWlsZGVy
TGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3VwZGF0aW5n
L1JlbmRlclRyZWVCdWlsZGVyTGlzdC5jcHAJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy91cGRhdGluZy9SZW5kZXJUcmVlQnVpbGRlckxpc3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyVHJlZUJ1aWxkZXJMaXN0LmgiCiAKKyNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5o
IgorI2luY2x1ZGUgIkxpbmVJbmxpbmVIZWFkZXJzLmgiCiAjaW5jbHVkZSAiUmVuZGVyQ2hpbGRJ
dGVyYXRvci5oIgogI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKICNpbmNsdWRlICJSZW5k
ZXJNdWx0aUNvbHVtbkZsb3cuaCIKQEAgLTMyLDYgKzM0LDE1IEBACiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAorLy8gRklYTUU6IFRoaXMgc2hvdWxkbid0IG5lZWQgSW5saW5lSXRlcmF0b3IKK3N0
YXRpYyBib29sIGdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKFJlbmRlckJsb2NrJiBj
dXJyZW50LCBSZW5kZXJPYmplY3QqIGlubGluZU9iaikKK3sKKyAgICBJbmxpbmVJdGVyYXRvciBp
dCgmY3VycmVudCwgaW5saW5lT2JqLCAwKTsKKyAgICB3aGlsZSAoIWl0LmF0RW5kKCkgJiYgIXJl
cXVpcmVzTGluZUJveChpdCkpCisgICAgICAgIGl0LmluY3JlbWVudCgpOworICAgIHJldHVybiAh
aXQuYXRFbmQoKTsKK30KKwogc3RhdGljIFJlbmRlckJsb2NrKiBnZXRQYXJlbnRPZkZpcnN0TGlu
ZUJveChSZW5kZXJCbG9jayYgY3VycmVudCwgUmVuZGVyT2JqZWN0JiBtYXJrZXIpCiB7CiAgICAg
Ym9vbCBpblF1aXJrc01vZGUgPSBjdXJyZW50LmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCk7CkBA
IC0zOSw3ICs1MCw3IEBAIHN0YXRpYyBSZW5kZXJCbG9jayogZ2V0UGFyZW50T2ZGaXJzdExpbmUK
ICAgICAgICAgaWYgKCZjaGlsZCA9PSAmbWFya2VyKQogICAgICAgICAgICAgY29udGludWU7CiAK
LSAgICAgICAgaWYgKGNoaWxkLmlzSW5saW5lKCkgJiYgKCFpczxSZW5kZXJJbmxpbmU+KGNoaWxk
KSB8fCBjdXJyZW50LmdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKCZjaGlsZCkpKQor
ICAgICAgICBpZiAoY2hpbGQuaXNJbmxpbmUoKSAmJiAoIWlzPFJlbmRlcklubGluZT4oY2hpbGQp
IHx8IGdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKGN1cnJlbnQsICZjaGlsZCkpKQog
ICAgICAgICAgICAgcmV0dXJuICZjdXJyZW50OwogCiAgICAgICAgIGlmIChjaGlsZC5pc0Zsb2F0
aW5nKCkgfHwgY2hpbGQuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCg==
</data>
<flag name="review"
          id="391788"
          type_id="1"
          status="+"
          setter="zalan"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>376032</attachid>
            <date>2019-08-11 00:37:35 -0700</date>
            <delta_ts>2019-08-11 04:02:08 -0700</delta_ts>
            <desc>patch</desc>
            <filename>complex-line-layout-separate-11.patch</filename>
            <type>text/plain</type>
            <size>360639</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0NyBAQAorMjAxOS0wOC0xMCAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgRmFjdG9yIGNvbXBsZXggbGlu
ZSBsYXlvdXQgcGF0aCBvdXQgZnJvbSBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDYxMgorCisgICAgICAgIFJldmlld2Vk
IGJ5IFphbGFuIEJ1anRhcy4KKworICAgICAgICBUaGlzIHBhdGNoIGZhY3RvcnMgdGhlIGxpbmUg
bGF5b3V0IGNvZGUgdGhhdCBpcyBjdXJyZW50bHkgcGFydCBvZiB0aGUgUmVuZGVyQmxvY2tGbG93
IGFuZCBsaXZlcyBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCisgICAgICAgIGludG8gYSBu
ZXcgQ29tcGxleExpbmVMYXlvdXQgY2xhc3MuIENvbXBsZXhMaW5lTGF5b3V0IGlzIGEgbWVtYmVy
IG9mIFJlbmRlckJsb2NrRmxvdy4KKworICAgICAgICBJbiB0aGUgZnV0dXJlIHdlIGNhbiBzdG9w
IGNvbnN0cnVjdGluZyBDb21wbGV4TGluZUxheW91dCBhdCBhbGwgd2hlbiB1c2luZyBvdGhlciBs
aW5lIGxheW91dCBwYXRocy4KKworICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiByZW5kZXJpbmcvQ29t
cGxleExpbmVMYXlvdXQuY3BwOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5l
TGF5b3V0OjpDb21wbGV4TGluZUxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGlu
ZUxheW91dDo6YXBwZW5kUnVuc0Zvck9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
TGluZUxheW91dDo6Y3JlYXRlUm9vdElubGluZUJveCk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4TGluZUxheW91dDo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUxpbmVCb3hlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29uc3RydWN0TGluZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6dGV4dEFsaWdubWVudEZvckxpbmUgY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnNldE1hcmdpbnNGb3JS
dWJ5UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojp1cGRhdGVSdWJ5
Rm9ySnVzdGlmaWVkVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6
Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Q29t
cGxleExpbmVMYXlvdXQ6OnVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0
aW9uc0ZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmNvbXB1
dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBsZXhMaW5lTGF5b3V0OjpyZW1vdmVJbmxpbmVCb3ggY29uc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0Zv
ckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmhhbmRsZVRyYWls
aW5nU3BhY2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjphcHBlbmRG
bG9hdGluZ09iamVjdFRvTGFzdExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVM
YXlvdXQ6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyk6CisgICAgICAgIChXZWJDb3JlOjpD
b21wbGV4TGluZUxheW91dDo6bGF5b3V0UnVuc0FuZEZsb2F0cyk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4TGluZUxheW91dDo6cmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXlvdXRSdW5zQW5kRmxvYXRz
SW5SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6cmVhdHRhY2hD
bGVhbkxpbmVGbG9hdHMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6Omxp
bmtUb0VuZExpbmVJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91
dDo6bGF5b3V0TGluZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0
OjpjaGVja0Zsb2F0SW5DbGVhbkxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVM
YXlvdXQ6OmRldGVybWluZVN0YXJ0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxl
eExpbmVMYXlvdXQ6OmRldGVybWluZUVuZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhMaW5lTGF5b3V0OjpjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmxpbmVXaWR0aEZvclBhZ2luYXRlZExp
bmVDaGFuZ2VkIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpt
YXRjaGVkRW5kTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6YWRk
T3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExp
bmVMYXlvdXQ6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhMaW5lTGF5b3V0OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojpwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0Ojp1cGRhdGVGcmFnbWVudEZv
ckxpbmUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OnN0eWxl
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpsYXlvdXRDb250
ZXh0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVu
c0Zvck9iamVjdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OmNyZWF0ZVJvb3RJbmxpbmVCb3gpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OmNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29uc3RydWN0TGluZSk6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnRleHRBbGlnbm1lbnRGb3JM
aW5lIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
c2V0TWFyZ2luc0ZvclJ1YnlSdW4pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93Ojp1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dCk6IERlbGV0ZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRU
ZXh0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6dXBkYXRl
TG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6OnJlbW92ZUlubGluZUJveCBjb25zdCk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0
aW9uc0ZvckxpbmUpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSk6IERlbGV0ZWQuCisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRp
UnVucyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxheW91
dFJ1bnNBbmRGbG9hdHMpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnJlYXR0YWNoQ2xl
YW5MaW5lRmxvYXRzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6bGlua1RvRW5kTGluZUlmTmVlZGVkKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6Y2hlY2tGbG9hdEluQ2xlYW5MaW5lKTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbik6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVu
ZFBvc2l0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKTogRGVsZXRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQg
Y29uc3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXRj
aGVkRW5kTGluZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Z2Vu
ZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjphZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbik6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlwc2lzTGlu
ZUJveGVzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y2hl
Y2tMaW5lc0ZvclRleHRPdmVyZmxvdyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6dXBkYXRlRnJhZ21lbnRG
b3JMaW5lIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvQ29tcGxleExpbmVM
YXlvdXQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6bGlu
ZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhMaW5lTGF5b3V0OjpsaW5lQm94ZXMg
Y29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleExpbmVMYXlvdXQ6OmZpcnN0Um9vdEJv
eCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4TGluZUxheW91dDo6bGFzdFJvb3RC
b3ggY29uc3QpOgorICAgICAgICAqIHJlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oOgorICAgICAg
ICAoV2ViQ29yZTo6SXNvbGF0ZVRyYWNrZXI6OmFkZEZha2VSdW5JZk5lY2Vzc2FyeSk6CisgICAg
ICAgIChXZWJDb3JlOjpJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bkludGVybmFsKToKKyAg
ICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2suaDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVyQmxvY2tGbG93LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVu
ZGVyQmxvY2tGbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6d2lsbEJl
RGVzdHJveWVkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0SW5s
aW5lQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVT
dGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6ZGVsZXRlTGluZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpoaXRUZXN0SW5saW5lQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjphZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6OnBhaW50SW5saW5lQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRTaW1wbGVMaW5lcyk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6OmVuc3VyZUxpbmVCb3hlcyk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5l
Qm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5lQm94ZXMgY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpmaXJzdFJvb3RCb3ggY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXN0Um9vdEJveCBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmZsb2F0aW5nT2JqZWN0cyk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXBsZXhMaW5lTGF5b3V0KToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6b3ZlcnJpZGVUZXh0QWxpZ25tZW50
Rm9yTGluZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVz
dElubGluZURpcmVjdGlvbkxpbmVCb3VuZHMgY29uc3QpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJSdWJ5QmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJSdWJ5QmFzZTo6b3Zl
cnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJSdWJ5QmFzZTo6dGV4dEFsaWdubWVudEZvckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5oOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJSdWJ5VGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJSdWJ5VGV4dDo6b3ZlcnJp
ZGVUZXh0QWxpZ25tZW50Rm9yTGluZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJS
dWJ5VGV4dDo6dGV4dEFsaWdubWVudEZvckxpbmUgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5oOgorICAgICAgICAqIHJlbmRlcmluZy9TaW1wbGVM
aW5lTGF5b3V0RnVuY3Rpb25zLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUxpbmVMYXlv
dXQ6OmdlbmVyYXRlTGluZUJveFRyZWUpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVC
cmVha2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpza2lwTGVhZGluZ1do
aXRlc3BhY2UpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmg6CisgICAg
ICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6CisgICAg
ICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhlYWRlcnMuaDoKKyAgICAgICAgKFdlYkNv
cmU6OnNldFN0YXRpY1Bvc2l0aW9ucyk6CisgICAgICAgICogcmVuZGVyaW5nL3N2Zy9SZW5kZXJT
VkdUZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1RleHQ6OmNyZWF0ZVJvb3RJ
bmxpbmVCb3gpOiBEZWxldGVkLgorICAgICAgICAqIHJlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4
dC5oOgorICAgICAgICAqIHJlbmRlcmluZy91cGRhdGluZy9SZW5kZXJUcmVlQnVpbGRlckxpc3Qu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Z2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQp
OgorICAgICAgICAoV2ViQ29yZTo6Z2V0UGFyZW50T2ZGaXJzdExpbmVCb3gpOgorCiAyMDE5LTA4
LTEwICBUaGliYXVsdCBTYXVuaWVyICA8dHNhdW5pZXJAaWdhbGlhLmNvbT4KIAogICAgICAgICBb
R1N0cmVhbWVyXVtXZWJSVENdIFJlbW92ZSB1bnVzZWQgR3N0QWRhcHRlcgpJbmRleDogU291cmNl
L1dlYkNvcmUvSGVhZGVycy5jbWFrZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9IZWFk
ZXJzLmNtYWtlCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9IZWFkZXJzLmNt
YWtlCSh3b3JraW5nIGNvcHkpCkBAIC0xMjM5LDYgKzEyMzksNyBAQCBzZXQoV2ViQ29yZV9QUklW
QVRFX0ZSQU1FV09SS19IRUFERVJTCiAgICAgcmVuZGVyaW5nL0JyZWFrTGluZXMuaAogICAgIHJl
bmRlcmluZy9DbGlwUGF0aE9wZXJhdGlvbi5oCiAgICAgcmVuZGVyaW5nL0NsaXBSZWN0LmgKKyAg
ICByZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuaAogICAgIHJlbmRlcmluZy9FdmVudFJlZ2lv
bi5oCiAgICAgcmVuZGVyaW5nL0Zsb2F0aW5nT2JqZWN0cy5oCiAgICAgcmVuZGVyaW5nL0dhcFJl
Y3RzLmgKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9Tb3VyY2VzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMjAyNSw2ICsyMDI1LDcgQEAgcmVu
ZGVyaW5nL0JvcmRlckVkZ2UuY3BwCiByZW5kZXJpbmcvQnJlYWtMaW5lcy5jcHAKIHJlbmRlcmlu
Zy9DU1NGaWx0ZXIuY3BwCiByZW5kZXJpbmcvQ2xpcFJlY3QuY3BwCityZW5kZXJpbmcvQ29tcGxl
eExpbmVMYXlvdXQuY3BwCiByZW5kZXJpbmcvQ291bnRlck5vZGUuY3BwCiByZW5kZXJpbmcvRWxs
aXBzaXNCb3guY3BwCiByZW5kZXJpbmcvRXZlbnRSZWdpb24uY3BwCkBAIC0yMDU0LDcgKzIwNTUs
NiBAQCByZW5kZXJpbmcvUG9pbnRlckV2ZW50c0hpdFJ1bGVzLmNwcAogcmVuZGVyaW5nL1JlbmRl
ckF0dGFjaG1lbnQuY3BwCiByZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCiByZW5kZXJpbmcvUmVu
ZGVyQmxvY2tGbG93LmNwcAotcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKIHJl
bmRlcmluZy9SZW5kZXJCb3guY3BwCiByZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3Bw
CiByZW5kZXJpbmcvUmVuZGVyQnV0dG9uLmNwcApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjQ4NTAwKQorKysg
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5n
IGNvcHkpCkBAIC00ODI0LDYgKzQ4MjQsNyBAQAogCQlFNEUzOUFGQjEzMzBFRkE4MDAzQUIyNzQg
LyogTGVnYWN5VGlsZUxheWVyUG9vbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRTRFMzlBRkExMzMwRUZBODAwM0FCMjc0IC8qIExlZ2FjeVRpbGVMYXll
clBvb2wuaCAqLzsgfTsKIAkJRTRFOEI0RUMyMTZCNzlFNTAwQjg4MzREIC8qIFN5c3RlbUZvbnRE
YXRhYmFzZUNvcmVUZXh0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBFNEU4QjRFQTIxNkI3OUU1MDBCODgzNEQgLyogU3lzdGVtRm9udERhdGFiYXNlQ29y
ZVRleHQuaCAqLzsgfTsKIAkJRTRFOEI0RjUyMTZCOTU2NTAwQjg4MzREIC8qIEZvbnRDYXNjYWRl
RGVzY3JpcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEU0RThCNEYyMjE2QjhCNjAwMEI4ODM0RCAvKiBGb250Q2FzY2FkZURlc2NyaXB0aW9uLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJRTRFOTRE
NjEyMkZGMTU4QTAwREQxOTFGIC8qIENvbXBsZXhMaW5lTGF5b3V0LmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEExQUM3ODIyRkFGRDUwMDAxN0I3NUIg
LyogQ29tcGxleExpbmVMYXlvdXQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQlFNEU5QjExOTE4MTA5MTZGMDAzQUNDREYgLyogU2ltcGxlTGluZUxh
eW91dFJlc29sdmVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBFNEU5QjExODE4MTA5MTZGMDAzQUNDREYgLyogU2ltcGxlTGluZUxheW91dFJlc29sdmVy
LmggKi87IH07CiAJCUU0RTlCMTFEMTgxNDU2OUMwMDNBQ0NERiAvKiBTaW1wbGVMaW5lTGF5b3V0
RnVuY3Rpb25zLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBFNEU5QjExQzE4MTQ1NjlDMDAzQUNDREYgLyogU2ltcGxlTGluZUxheW91dEZ1bmN0aW9ucy5o
ICovOyB9OwogCQlFNEY5RUVGMzE1NkRBMDA3MDBEMjNFN0UgLyogU3R5bGVTaGVldENvbnRlbnRz
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEY5RUVG
MTE1NkQ4NEM0MDBEMjNFN0UgLyogU3R5bGVTaGVldENvbnRlbnRzLmggKi87IHNldHRpbmdzID0g
e0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTEzMTAyLDcgKzEzMTAzLDcgQEAK
IAkJQkNFQTQ3N0MwOTdDQUFDODAwOTRDOUU0IC8qIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlv
bi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTQ29tcHV0ZWRT
dHlsZURlY2xhcmF0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ3
N0QwOTdDQUFDODAwOTRDOUU0IC8qIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9u
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0NzhDMDk3Q0FBQzgwMDk0QzlF
NCAvKiBDU1NWYWx1ZUtleXdvcmRzLmluICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBDU1NWYWx1
ZUtleXdvcmRzLmluOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlCQ0VBNDgxMzA5N0Q5
MzAyMDA5NEM5RTQgLyogUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQlCQ0VBNDgxMzA5N0Q5MzAyMDA5NEM5RTQgLyogQ29tcGxl
eExpbmVMYXlvdXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENv
bXBsZXhMaW5lTGF5b3V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4
MTUwOTdEOTMwMjAwOTRDOUU0IC8qIEJyZWFrTGluZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IEJyZWFrTGluZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlCQ0VBNDgxNjA5N0Q5MzAyMDA5NEM5RTQgLyogQnJlYWtMaW5lcy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQnJlYWtMaW5lcy5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlCQ0VBNDgxQTA5N0Q5MzAyMDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSW5saW5lVGV4dEJveC5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNDk1Niw2ICsxNDk1Nyw3IEBACiAJ
CUU0QTAwNzgyMUI4MjBFQzgwMDJDNUE2RSAvKiBEYXRhVVJMRGVjb2Rlci5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBEYXRhVVJMRGVjb2Rlci5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlFNEEwMDc4NDFCODIwRUQzMDAyQzVBNkUgLyogRGF0YVVSTERlY29kZXIu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRGF0YVVSTERlY29kZXIu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEExODIyRjFGMTNCRTU4MDBGRUY2
OTggLyogU3R5bGVJbnZhbGlkYXRpb25GdW5jdGlvbnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3R5bGVJ
bnZhbGlkYXRpb25GdW5jdGlvbnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTRB
MUFDNzgyMkZBRkQ1MDAwMTdCNzVCIC8qIENvbXBsZXhMaW5lTGF5b3V0LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbXBsZXhMaW5lTGF5b3V0Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUU0QTc5OTRFMjBFRTRBRTEwMEMxOTU2OCAvKiBDU1NQYXJzZXJDb250
ZXh0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IENTU1BhcnNlckNvbnRleHQu
aDsgcGF0aCA9IHBhcnNlci9DU1NQYXJzZXJDb250ZXh0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUU0QTc5OTUwMjBFRTRBRTIwMEMxOTU2OCAvKiBDU1NQYXJzZXJDb250ZXh0LmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IENTU1BhcnNlckNvbnRleHQu
Y3BwOyBwYXRoID0gcGFyc2VyL0NTU1BhcnNlckNvbnRleHQuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlFNEE4MTREMzFDNkRFQzQwMDBCRjg1QUMgLyogQ2xhc3NDaGFuZ2VJbnZh
bGlkYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ2xhc3NDaGFuZ2VJ
bnZhbGlkYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI2OTg1LDYgKzI2
OTg3LDggQEAKIAkJCQk1ODAzNzE1RjFBNjZGMDBBMDBCQUY1MTkgLyogQ2xpcFJlY3QuY3BwICov
LAogCQkJCTU4MDM3MTYwMUE2NkYwMEEwMEJBRjUxOSAvKiBDbGlwUmVjdC5oICovLAogCQkJCUJD
REQ0NTREMTIzNkM5NUMwMDlBNzk4NSAvKiBDb2x1bW5JbmZvLmggKi8sCisJCQkJQkNFQTQ4MTMw
OTdEOTMwMjAwOTRDOUU0IC8qIENvbXBsZXhMaW5lTGF5b3V0LmNwcCAqLywKKwkJCQlFNEExQUM3
ODIyRkFGRDUwMDAxN0I3NUIgLyogQ29tcGxleExpbmVMYXlvdXQuaCAqLywKIAkJCQk5MzkyRjE0
RjBBRDE4NjIzMDA2OTFCRDQgLyogQ291bnRlck5vZGUuY3BwICovLAogCQkJCTkzOTJGMTRCMEFE
MTg2MUIwMDY5MUJENCAvKiBDb3VudGVyTm9kZS5oICovLAogCQkJCTBGNTNGQjgxMjEzQjFCQjgw
MEM0MEQzNCAvKiBDU1NGaWx0ZXIuY3BwICovLApAQCAtMjcwNTIsNyArMjcwNTYsNiBAQAogCQkJ
CUJDRUE0ODIxMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9jay5oICovLAogCQkJCUJDRkI0
NUY0MTdEOEU0OTQwMDQ0NDQ0NiAvKiBSZW5kZXJCbG9ja0Zsb3cuY3BwICovLAogCQkJCUJDRkI0
NUYzMTdEOEUzOTIwMDQ0NDQ0NiAvKiBSZW5kZXJCbG9ja0Zsb3cuaCAqLywKLQkJCQlCQ0VBNDgx
MzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCAqLywKIAkJCQlC
Q0VBNDgyMjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQm94LmNwcCAqLywKIAkJCQlCQ0VBNDgy
MzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQm94LmggKi8sCiAJCQkJQkNFQjE3OUIxNDMzNzlG
NTAwNTJFQUU5IC8qIFJlbmRlckJveEZyYWdtZW50SW5mby5oICovLApAQCAtMzA4MTIsNiArMzA4
MTUsNyBAQAogCQkJCTFBN0ZBNjE5MEREQTNCM0EwMDI4RjhBNSAvKiBOZXR3b3JrU3RhdGVOb3Rp
Zmllci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTEzRUYzNDQxNjg0RUNGNDAwMzRDODNGIC8qIE5l
dHdvcmtTdG9yYWdlU2Vzc2lvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMjY5Mzk3MjQxQTRBNUI2
NDAwRTgzNDlEIC8qIE5GQS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTRFOTRENjEyMkZGMTU4QTAw
REQxOTFGIC8qIENvbXBsZXhMaW5lTGF5b3V0LmggaW4gSGVhZGVycyAqLywKIAkJCQkyNjkzOTcy
MjFBNEE0MTJGMDBFODM0OUQgLyogTkZBTm9kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMjY3NzI2
MDExQTVCM0FEOTAwM0MyNEREIC8qIE5GQVRvREZBLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VG
NDNERDBFNjc0MDEyMDAxQzEyODcgLyogTmluZVBpZWNlSW1hZ2UuaCBpbiBIZWFkZXJzICovLApJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3Bw
CShyZXZpc2lvbiAyNDg0MDQpCShmcm9tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwOjI0ODQwNCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9D
b21wbGV4TGluZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMjg5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIw
MTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBD
aGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEz
IEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisKKyNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCisjaW5jbHVkZSAiQmlkaVJlc29s
dmVyLmgiCisjaW5jbHVkZSAiQnJlYWtpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiRmxvYXRpbmdP
YmplY3RzLmgiCisjaW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgorI2luY2x1ZGUgIklubGlu
ZUVsZW1lbnRCb3guaCIKKyNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgorI2luY2x1ZGUgIklu
bGluZVRleHRCb3guaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0Qm94U3R5bGUuaCIKKyNpbmNsdWRl
ICJMaW5lTGF5b3V0U3RhdGUuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUmVu
ZGVyQmxvY2tGbG93LmgiCisjaW5jbHVkZSAiUmVuZGVyRnJhZ21lbnRDb250YWluZXIuaCIKKyNp
bmNsdWRlICJSZW5kZXJGcmFnbWVudGVkRmxvdy5oIgorI2luY2x1ZGUgIlJlbmRlckxheW91dFN0
YXRlLmgiCisjaW5jbHVkZSAiUmVuZGVyTGluZUJyZWFrLmgiCisjaW5jbHVkZSAiUmVuZGVyUnVi
eUJhc2UuaCIKKyNpbmNsdWRlICJSZW5kZXJSdWJ5VGV4dC5oIgorI2luY2x1ZGUgIlJlbmRlclZp
ZXcuaCIKKyNpbmNsdWRlICJTVkdSb290SW5saW5lQm94LmgiCisjaW5jbHVkZSAiU2V0dGluZ3Mu
aCIKKyNpbmNsdWRlICJTaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiVHJh
aWxpbmdGbG9hdHNSb290SW5saW5lQm94LmgiCisjaW5jbHVkZSAiVmVydGljYWxQb3NpdGlvbkNh
Y2hlLmgiCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3N0YXRpYyB2b2lkIGRldGVybWluZURpcmVjdGlvbmFsaXR5KFRleHREaXJlY3Rpb24m
IGRpciwgSW5saW5lSXRlcmF0b3IgaXRlcikKK3sKKyAgICB3aGlsZSAoIWl0ZXIuYXRFbmQoKSkg
eworICAgICAgICBpZiAoaXRlci5hdFBhcmFncmFwaFNlcGFyYXRvcigpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBpZiAoVUNoYXIgY3VycmVudCA9IGl0ZXIuY3VycmVudCgpKSB7Cisg
ICAgICAgICAgICBVQ2hhckRpcmVjdGlvbiBjaGFyRGlyZWN0aW9uID0gdV9jaGFyRGlyZWN0aW9u
KGN1cnJlbnQpOworICAgICAgICAgICAgaWYgKGNoYXJEaXJlY3Rpb24gPT0gVV9MRUZUX1RPX1JJ
R0hUKSB7CisgICAgICAgICAgICAgICAgZGlyID0gVGV4dERpcmVjdGlvbjo6TFRSOworICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGFyRGly
ZWN0aW9uID09IFVfUklHSFRfVE9fTEVGVCB8fCBjaGFyRGlyZWN0aW9uID09IFVfUklHSFRfVE9f
TEVGVF9BUkFCSUMpIHsKKyAgICAgICAgICAgICAgICBkaXIgPSBUZXh0RGlyZWN0aW9uOjpSVEw7
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIGl0ZXIuaW5jcmVtZW50KCk7CisgICAgfQorfQorCitpbmxpbmUgc3RkOjp1bmlxdWVfcHRy
PEJpZGlSdW4+IGNyZWF0ZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCYgb2Jq
LCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQoreworICAgIHJldHVybiBzdGQ6Om1ha2Vf
dW5pcXVlPEJpZGlSdW4+KHN0YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNv
bHZlci5kaXIoKSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9yT2Jq
ZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+KiBydW5zLCBpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRl
ck9iamVjdCYgb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQoreworICAgIGlmIChz
dGFydCA+IGVuZCB8fCBzaG91bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KG9iaikpCisgICAg
ICAgIHJldHVybjsKKworICAgIExpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlJiBsaW5lV2hp
dGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSA9IHJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nU3Rh
dGUoKTsKKyAgICBib29sIGhhdmVOZXh0VHJhbnNpdGlvbiA9IChsaW5lV2hpdGVzcGFjZUNvbGxh
cHNpbmdTdGF0ZS5jdXJyZW50VHJhbnNpdGlvbigpIDwgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5n
U3RhdGUubnVtVHJhbnNpdGlvbnMoKSk7CisgICAgSW5saW5lSXRlcmF0b3IgbmV4dFRyYW5zaXRp
b247CisgICAgaWYgKGhhdmVOZXh0VHJhbnNpdGlvbikKKyAgICAgICAgbmV4dFRyYW5zaXRpb24g
PSBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS50cmFuc2l0aW9ucygpW2xpbmVXaGl0ZXNw
YWNlQ29sbGFwc2luZ1N0YXRlLmN1cnJlbnRUcmFuc2l0aW9uKCldOworICAgIGlmIChsaW5lV2hp
dGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5iZXR3ZWVuVHJhbnNpdGlvbnMoKSkgeworICAgICAgICBp
ZiAoIWhhdmVOZXh0VHJhbnNpdGlvbiB8fCAoJm9iaiAhPSBuZXh0VHJhbnNpdGlvbi5yZW5kZXJl
cigpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBzdGFy
dCBwb2ludC4gU3RvcCBpZ25vcmluZyBvYmplY3RzIGFuZAorICAgICAgICAvLyBhZGp1c3Qgb3Vy
IHN0YXJ0LgorICAgICAgICBzdGFydCA9IG5leHRUcmFuc2l0aW9uLm9mZnNldCgpOworICAgICAg
ICBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5pbmNyZW1lbnRDdXJyZW50VHJhbnNpdGlv
bigpOworICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgICAgIGFwcGVuZFJ1bnNG
b3JPYmplY3QocnVucywgc3RhcnQsIGVuZCwgb2JqLCByZXNvbHZlcik7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWhhdmVOZXh0VHJh
bnNpdGlvbiB8fCAoJm9iaiAhPSBuZXh0VHJhbnNpdGlvbi5yZW5kZXJlcigpKSkgeworICAgICAg
ICAgICAgaWYgKHJ1bnMpCisgICAgICAgICAgICAgICAgcnVucy0+YXBwZW5kUnVuKGNyZWF0ZVJ1
bihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICAvLyBBbiBlbmQgdHJhbnNpdGlvbiBoYXMgYmVlbiBlbmNvdW50ZXJl
ZCB3aXRoaW4gb3VyIG9iamVjdC4gV2UgbmVlZCB0byBhcHBlbmQgYSBydW4gd2l0aCBvdXIgZW5k
cG9pbnQuCisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KG5leHRUcmFuc2l0aW9uLm9mZnNl
dCgpICsgMSkgPD0gZW5kKSB7CisgICAgICAgICAgICBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdT
dGF0ZS5pbmNyZW1lbnRDdXJyZW50VHJhbnNpdGlvbigpOworICAgICAgICAgICAgLy8gVGhlIGVu
ZCBvZiB0aGUgbGluZSBpcyBiZWZvcmUgdGhlIG9iamVjdCB3ZSdyZSBpbnNwZWN0aW5nLiBTa2lw
IGV2ZXJ5dGhpbmcgYW5kIHJldHVybgorICAgICAgICAgICAgaWYgKG5leHRUcmFuc2l0aW9uLnJl
ZmVyc1RvRW5kT2ZQcmV2aW91c05vZGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEp
ID4gc3RhcnQgJiYgcnVucykKKyAgICAgICAgICAgICAgICBydW5zLT5hcHBlbmRSdW4oY3JlYXRl
UnVuKHN0YXJ0LCBuZXh0VHJhbnNpdGlvbi5vZmZzZXQoKSArIDEsIG9iaiwgcmVzb2x2ZXIpKTsK
KyAgICAgICAgICAgIGFwcGVuZFJ1bnNGb3JPYmplY3QocnVucywgbmV4dFRyYW5zaXRpb24ub2Zm
c2V0KCkgKyAxLCBlbmQsIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKHJ1bnMp
CisgICAgICAgICAgICBydW5zLT5hcHBlbmRSdW4oY3JlYXRlUnVuKHN0YXJ0LCBlbmQsIG9iaiwg
cmVzb2x2ZXIpKTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBS
ZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZVJvb3RJbmxpbmVCb3goKQoreworICAgIHJldHVybiBzdGQ6
Om1ha2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KCp0aGlzKTsKK30KKworUm9vdElubGluZUJveCog
UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCkKK3sKKyAgICBh
dXRvIG5ld1Jvb3RCb3ggPSBjcmVhdGVSb290SW5saW5lQm94KCk7CisgICAgUm9vdElubGluZUJv
eCogcm9vdEJveCA9IG5ld1Jvb3RCb3guZ2V0KCk7CisgICAgbV9saW5lQm94ZXMuYXBwZW5kTGlu
ZUJveChXVEZNb3ZlKG5ld1Jvb3RCb3gpKTsKKworICAgIGlmIChVTkxJS0VMWShBWE9iamVjdENh
Y2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpKSAmJiBmaXJzdFJvb3RCb3goKSA9PSByb290Qm94
KSB7CisgICAgICAgIGlmIChBWE9iamVjdENhY2hlKiBjYWNoZSA9IGRvY3VtZW50KCkuZXhpc3Rp
bmdBWE9iamVjdENhY2hlKCkpCisgICAgICAgICAgICBjYWNoZS0+ZGVmZXJSZWNvbXB1dGVJc0ln
bm9yZWQoZWxlbWVudCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcm9vdEJveDsKK30KKworc3Rh
dGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9i
amVjdCogcmVuZGVyZXIsIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxz
ZSkKK3sKKyAgICBpZiAoaXNSb290TGluZUJveCkKKyAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJl
bmRlckJsb2NrRmxvdz4oKnJlbmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7
CisKKyAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKSkKKyAgICAgICAgcmV0dXJuIGRv
d25jYXN0PFJlbmRlclRleHQ+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lVGV4dEJveCgpOworCisg
ICAgaWYgKGlzPFJlbmRlckJveD4oKnJlbmRlcmVyKSkgeworICAgICAgICAvLyBGSVhNRTogVGhp
cyBpcyB0ZXJyaWJsZS4gVGhpcyBicmFuY2ggcmV0dXJucyBhbiAqb3duZWQqIHBvaW50ZXIhCisg
ICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCb3g+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5l
Qm94KCkucmVsZWFzZSgpOworICAgIH0KKworICAgIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KCpy
ZW5kZXJlcikpIHsKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVycmlibGUuIFRoaXMgYnJh
bmNoIHJldHVybnMgYW4gKm93bmVkKiBwb2ludGVyIQorICAgICAgICBhdXRvIGlubGluZUJveCA9
IGRvd25jYXN0PFJlbmRlckxpbmVCcmVhaz4oKnJlbmRlcmVyKS5jcmVhdGVJbmxpbmVCb3goKS5y
ZWxlYXNlKCk7CisgICAgICAgIC8vIFdlIG9ubHkgdHJlYXQgYSBib3ggYXMgdGV4dCBmb3IgYSA8
YnI+IGlmIHdlIGFyZSBvbiBhIGxpbmUgYnkgb3Vyc2VsZiBvciBpbiBzdHJpY3QgbW9kZQorICAg
ICAgICAvLyAoTm90ZSB0aGUgdXNlIG9mIHN0cmljdCBtb2RlLiBJbiAiYWxtb3N0IHN0cmljdCIg
bW9kZSwgd2UgZG9uJ3QgdHJlYXQgdGhlIGJveCBmb3IgPGJyPiBhcyB0ZXh0LikKKyAgICAgICAg
aW5saW5lQm94LT5zZXRCZWhhdmVzTGlrZVRleHQoaXNPbmx5UnVuIHx8IHJlbmRlcmVyLT5kb2N1
bWVudCgpLmluTm9RdWlya3NNb2RlKCkgfHwgcmVuZGVyZXItPmlzTGluZUJyZWFrT3Bwb3J0dW5p
dHkoKSk7CisgICAgICAgIHJldHVybiBpbmxpbmVCb3g7CisgICAgfQorCisgICAgcmV0dXJuIGRv
d25jYXN0PFJlbmRlcklubGluZT4oKnJlbmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93
Qm94KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVy
KFJlbmRlck9iamVjdCYgcmVuZGVyZXIsIGJvb2wgZnVsbExheW91dCkKK3sKKyAgICBpZiAoaXM8
UmVuZGVyVGV4dD4ocmVuZGVyZXIpKSB7CisgICAgICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQg
PSBkb3duY2FzdDxSZW5kZXJUZXh0PihyZW5kZXJlcik7CisgICAgICAgIHVwZGF0ZUNvdW50ZXJJ
Zk5lZWRlZChyZW5kZXJUZXh0KTsKKyAgICAgICAgcmVuZGVyVGV4dC5kaXJ0eUxpbmVCb3hlcyhm
dWxsTGF5b3V0KTsKKyAgICB9IGVsc2UgaWYgKGlzPFJlbmRlckxpbmVCcmVhaz4ocmVuZGVyZXIp
KQorICAgICAgICBkb3duY2FzdDxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKS5kaXJ0eUxpbmVC
b3hlcyhmdWxsTGF5b3V0KTsKKyAgICBlbHNlCisgICAgICAgIGRvd25jYXN0PFJlbmRlcklubGlu
ZT4ocmVuZGVyZXIpLmRpcnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOworfQorCitzdGF0aWMgYm9v
bCBwYXJlbnRJc0NvbnN0cnVjdGVkT3JIYXZlTmV4dChJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3gp
Cit7CisgICAgZG8geworICAgICAgICBpZiAocGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwg
cGFyZW50Qm94LT5uZXh0T25MaW5lKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcGFyZW50Qm94ID0gcGFyZW50Qm94LT5wYXJlbnQoKTsKKyAgICB9IHdoaWxlIChwYXJlbnRC
b3gpOworICAgIHJldHVybiBmYWxzZTsKK30KKworSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2tG
bG93OjpjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IExpbmVJbmZvJiBs
aW5lSW5mbywgSW5saW5lQm94KiBjaGlsZEJveCkKK3sKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSBh
biB1bmNvbnN0cnVjdGVkIGxpbmUgYm94IGZvciB0aGlzIG9iamVjdCB0aGF0IGlzIGFsc28KKyAg
ICAvLyB0aGUgbGFzdCBpdGVtIG9uIHRoZSBsaW5lLgorICAgIHVuc2lnbmVkIGxpbmVEZXB0aCA9
IDE7CisgICAgSW5saW5lRmxvd0JveCogcGFyZW50Qm94ID0gbnVsbHB0cjsKKyAgICBJbmxpbmVG
bG93Qm94KiByZXN1bHQgPSBudWxscHRyOworICAgIGJvb2wgaGFzRGVmYXVsdExpbmVCb3hDb250
YWluID0gc3R5bGUoKS5saW5lQm94Q29udGFpbigpID09IFJlbmRlclN0eWxlOjppbml0aWFsTGlu
ZUJveENvbnRhaW4oKTsKKyAgICBkbyB7CisgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKGlzPFJlbmRlcklubGluZT4oKm9iaikgfHwgb2JqID09IHRoaXMpOworCisgICAg
ICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IG9iaiAhPSB0aGlzID8gZG93bmNhc3Q8UmVu
ZGVySW5saW5lPihvYmopIDogbnVsbHB0cjsKKworICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94
IHdlIG1hZGUgZm9yIHRoaXMgcmVuZGVyIG9iamVjdC4KKyAgICAgICAgcGFyZW50Qm94ID0gaW5s
aW5lRmxvdyA/IGlubGluZUZsb3ctPmxhc3RMaW5lQm94KCkgOiBkb3duY2FzdDxSZW5kZXJCbG9j
a0Zsb3c+KCpvYmopLmxhc3RSb290Qm94KCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBib3ggb3Ig
aXRzIGFuY2VzdG9yIGlzIGNvbnN0cnVjdGVkIHRoZW4gaXQgaXMgZnJvbSBhIHByZXZpb3VzIGxp
bmUsIGFuZCB3ZSBuZWVkCisgICAgICAgIC8vIHRvIG1ha2UgYSBuZXcgYm94IGZvciBvdXIgbGlu
ZS4gIElmIHRoaXMgYm94IG9yIGl0cyBhbmNlc3RvciBpcyB1bmNvbnN0cnVjdGVkIGJ1dCBpdCBo
YXMKKyAgICAgICAgLy8gc29tZXRoaW5nIGZvbGxvd2luZyBpdCBvbiB0aGUgbGluZSwgdGhlbiB3
ZSBrbm93IHdlIGhhdmUgdG8gbWFrZSBhIG5ldyBib3gKKyAgICAgICAgLy8gYXMgd2VsbC4gIElu
IHRoaXMgc2l0dWF0aW9uIG91ciBpbmxpbmUgaGFzIGFjdHVhbGx5IGJlZW4gc3BsaXQgaW4gdHdv
IG9uCisgICAgICAgIC8vIHRoZSBzYW1lIGxpbmUgKHRoaXMgY2FuIGhhcHBlbiB3aXRoIHZlcnkg
ZmFuY3kgbGFuZ3VhZ2UgbWl4dHVyZXMpLgorICAgICAgICBib29sIGNvbnN0cnVjdGVkTmV3Qm94
ID0gZmFsc2U7CisgICAgICAgIGJvb2wgYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ID0gIWhhc0Rl
ZmF1bHRMaW5lQm94Q29udGFpbiB8fCAhaW5saW5lRmxvdyB8fCBpbmxpbmVGbG93LT5hbHdheXND
cmVhdGVMaW5lQm94ZXMoKTsKKyAgICAgICAgYm9vbCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCA9
IHBhcmVudEJveCAmJiAhcGFyZW50SXNDb25zdHJ1Y3RlZE9ySGF2ZU5leHQocGFyZW50Qm94KTsK
KyAgICAgICAgaWYgKGFsbG93ZWRUb0NvbnN0cnVjdE5ld0JveCAmJiAhY2FuVXNlRXhpc3RpbmdQ
YXJlbnRCb3gpIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9y
IHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKKyAgICAgICAgICAgIC8vIG1hZGUsIHdlIG5lZWQg
dG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAgICAg
SW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9
PSB0aGlzKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGRvd25jYXN0PElubGluZUZsb3dCb3g+
KG5ld0JveCk7CisgICAgICAgICAgICBwYXJlbnRCb3gtPnNldElzRmlyc3RMaW5lKGxpbmVJbmZv
LmlzRmlyc3RMaW5lKCkpOworICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwo
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisgICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRM
aW5lQm94Q29udGFpbikKKyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmNsZWFyRGVzY2VuZGFu
dHNIYXZlU2FtZUxpbmVIZWlnaHRBbmRCYXNlbGluZSgpOworICAgICAgICAgICAgY29uc3RydWN0
ZWROZXdCb3ggPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnN0cnVjdGVkTmV3
Qm94IHx8IGNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CisgICAgICAgICAgICBpZiAoIXJlc3Vs
dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRCb3g7CisKKyAgICAgICAgICAgIC8v
IElmIHdlIGhhdmUgaGl0IHRoZSBibG9jayBpdHNlbGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0
aGUgcm9vdAorICAgICAgICAgICAgLy8gaW5saW5lIGJveCBmb3IgdGhlIGxpbmUsIGFuZCBpdCBk
b2Vzbid0IGhhdmUgdG8gYmUgYXBwZW5kZWQgdG8gYW55IHBhcmVudAorICAgICAgICAgICAgLy8g
aW5saW5lLgorICAgICAgICAgICAgaWYgKGNoaWxkQm94KQorICAgICAgICAgICAgICAgIHBhcmVu
dEJveC0+YWRkVG9MaW5lKGNoaWxkQm94KTsKKworICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3Rl
ZE5ld0JveCB8fCBvYmogPT0gdGhpcykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICAgICAgY2hpbGRCb3ggPSBwYXJlbnRCb3g7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3
ZSd2ZSBleGNlZWRlZCBvdXIgbGluZSBkZXB0aCwgdGhlbiBqdW1wIHN0cmFpZ2h0IHRvIHRoZSBy
b290IGFuZCBza2lwIGFsbCB0aGUgcmVtYWluaW5nCisgICAgICAgIC8vIGludGVybWVkaWF0ZSBp
bmxpbmUgZmxvd3MuCisgICAgICAgIG9iaiA9ICgrK2xpbmVEZXB0aCA+PSBjTWF4TGluZURlcHRo
KSA/IHRoaXMgOiBvYmotPnBhcmVudCgpOworCisgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPiBzdGF0
aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhIVE1MU3BhY2VzKGNvbnN0IENoYXJhY3RlclR5cGUqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIHBvc2l0aW9uLCB1bnNpZ25lZCBlbmQpCit7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gcG9zaXRpb247IGkgPCBlbmQ7ICsraSkgeworICAgICAgICBpZiAoIWlzSFRN
TFNwYWNlKGNoYXJhY3RlcnNbaV0pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcmVhY2hlZEVuZE9mVGV4dFJlbmRl
cmVyKGNvbnN0IEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucykKK3sKKyAgICBCaWRpUnVu
KiBydW4gPSBiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCk7CisgICAgaWYgKCFydW4pCisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIGlmICghaXM8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigp
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGF1dG8mIHRleHQgPSBkb3duY2FzdDxSZW5k
ZXJUZXh0PihydW4tPnJlbmRlcmVyKCkpLnRleHQoKTsKKyAgICB1bnNpZ25lZCBwb3NpdGlvbiA9
IHJ1bi0+c3RvcCgpOworICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisgICAg
aWYgKHRleHQuaXM4Qml0KCkpCisgICAgICAgIHJldHVybiBlbmRzV2l0aEhUTUxTcGFjZXModGV4
dC5jaGFyYWN0ZXJzOCgpLCBwb3NpdGlvbiwgbGVuZ3RoKTsKKyAgICByZXR1cm4gZW5kc1dpdGhI
VE1MU3BhY2VzKHRleHQuY2hhcmFjdGVyczE2KCksIHBvc2l0aW9uLCBsZW5ndGgpOworfQorCitS
b290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8
QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgQVNT
RVJUKGJpZGlSdW5zLmZpcnN0UnVuKCkpOworCisgICAgYm9vbCByb290SGFzU2VsZWN0ZWRDaGls
ZHJlbiA9IGZhbHNlOworICAgIElubGluZUZsb3dCb3gqIHBhcmVudEJveCA9IDA7CisgICAgaW50
IHJ1bkNvdW50ID0gYmlkaVJ1bnMucnVuQ291bnQoKSAtIGxpbmVJbmZvLnJ1bnNGcm9tTGVhZGlu
Z1doaXRlc3BhY2UoKTsKKyAgICAKKyAgICBmb3IgKEJpZGlSdW4qIHIgPSBiaWRpUnVucy5maXJz
dFJ1bigpOyByOyByID0gci0+bmV4dCgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGJveCBmb3Ig
b3VyIG9iamVjdC4KKyAgICAgICAgYm9vbCBpc09ubHlSdW4gPSAocnVuQ291bnQgPT0gMSk7Cisg
ICAgICAgIGlmIChydW5Db3VudCA9PSAyICYmICFyLT5yZW5kZXJlcigpLmlzTGlzdE1hcmtlcigp
KQorICAgICAgICAgICAgaXNPbmx5UnVuID0gKCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSA/IGJpZGlSdW5zLmxhc3RSdW4oKSA6IGJpZGlSdW5zLmZpcnN0UnVuKCkpLT5yZW5kZXJl
cigpLmlzTGlzdE1hcmtlcigpOworCisgICAgICAgIGlmIChsaW5lSW5mby5pc0VtcHR5KCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlu
bGluZUJveEZvclJlbmRlcmVyKCZyLT5yZW5kZXJlcigpLCBmYWxzZSwgaXNPbmx5UnVuKTsKKyAg
ICAgICAgci0+c2V0Qm94KGJveCk7CisKKyAgICAgICAgaWYgKCFyb290SGFzU2VsZWN0ZWRDaGls
ZHJlbiAmJiBib3gtPnJlbmRlcmVyKCkuc2VsZWN0aW9uU3RhdGUoKSAhPSBSZW5kZXJPYmplY3Q6
OlNlbGVjdGlvbk5vbmUpCisgICAgICAgICAgICByb290SGFzU2VsZWN0ZWRDaGlsZHJlbiA9IHRy
dWU7CisgICAgICAgIAorICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIHBhcmVudCBib3ggeWV0LCBv
ciBpZiB0aGUgcnVuIGlzIG5vdCBzaW1wbHkgYSBzaWJsaW5nLAorICAgICAgICAvLyB0aGVuIHdl
IG5lZWQgdG8gY29uc3RydWN0IGlubGluZSBib3hlcyBhcyBuZWNlc3NhcnkgdG8gcHJvcGVybHkg
ZW5jbG9zZSB0aGUKKyAgICAgICAgLy8gcnVuJ3MgaW5saW5lIGJveC4gU2VnbWVudHMgY2FuIG9u
bHkgYmUgc2libGluZ3MgYXQgdGhlIHJvb3QgbGV2ZWwsIGFzCisgICAgICAgIC8vIHRoZXkgYXJl
IHBvc2l0aW9uZWQgc2VwYXJhdGVseS4KKyAgICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgJnBhcmVu
dEJveC0+cmVuZGVyZXIoKSAhPSByLT5yZW5kZXJlcigpLnBhcmVudCgpKSB7CisgICAgICAgICAg
ICAvLyBDcmVhdGUgbmV3IGlubGluZSBib3hlcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBhcHBy
b3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVu
dFRvVXNlID0gci0+cmVuZGVyZXIoKS5wYXJlbnQoKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9
IGNyZWF0ZUxpbmVCb3hlcyhwYXJlbnRUb1VzZSwgbGluZUluZm8sIGJveCk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5l
LgorICAgICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoYm94KTsKKyAgICAgICAgfQorCisg
ICAgICAgIGJvb2wgdmlzdWFsbHlPcmRlcmVkID0gci0+cmVuZGVyZXIoKS5zdHlsZSgpLnJ0bE9y
ZGVyaW5nKCkgPT0gT3JkZXI6OlZpc3VhbDsKKyAgICAgICAgYm94LT5zZXRCaWRpTGV2ZWwoci0+
bGV2ZWwoKSk7CisKKyAgICAgICAgaWYgKGlzPElubGluZVRleHRCb3g+KCpib3gpKSB7CisgICAg
ICAgICAgICBhdXRvJiB0ZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKmJveCk7Cisg
ICAgICAgICAgICB0ZXh0Qm94LnNldFN0YXJ0KHItPm1fc3RhcnQpOworICAgICAgICAgICAgdGV4
dEJveC5zZXRMZW4oci0+bV9zdG9wIC0gci0+bV9zdGFydCk7CisgICAgICAgICAgICB0ZXh0Qm94
LnNldERpck92ZXJyaWRlKHItPmRpck92ZXJyaWRlKHZpc3VhbGx5T3JkZXJlZCkpOworICAgICAg
ICAgICAgaWYgKHItPm1faGFzSHlwaGVuKQorICAgICAgICAgICAgICAgIHRleHRCb3guc2V0SGFz
SHlwaGVuKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2Ugc2hvdWxkIGhhdmUg
YSByb290IGlubGluZSBib3guICBJdCBzaG91bGQgYmUgdW5jb25zdHJ1Y3RlZCBhbmQKKyAgICAv
LyBiZSB0aGUgbGFzdCBjb250aW51YXRpb24gb2Ygb3VyIGxpbmUgbGlzdC4KKyAgICBBU1NFUlQo
bGFzdFJvb3RCb3goKSAmJiAhbGFzdFJvb3RCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKTsKKworICAg
IC8vIFNldCB0aGUgbV9zZWxlY3RlZENoaWxkcmVuIGZsYWcgb24gdGhlIHJvb3QgaW5saW5lIGJv
eCBpZiBvbmUgb2YgdGhlIGxlYWYgaW5saW5lIGJveAorICAgIC8vIGZyb20gdGhlIGJpZGkgcnVu
cyB3YWxrIGFib3ZlIGhhcyBhIHNlbGVjdGlvbiBzdGF0ZS4KKyAgICBpZiAocm9vdEhhc1NlbGVj
dGVkQ2hpbGRyZW4pCisgICAgICAgIGxhc3RSb290Qm94KCktPnJvb3QoKS5zZXRIYXNTZWxlY3Rl
ZENoaWxkcmVuKHRydWUpOworCisgICAgLy8gU2V0IGJpdHMgb24gb3VyIGlubGluZSBmbG93IGJv
eGVzIHRoYXQgaW5kaWNhdGUgd2hpY2ggc2lkZXMgc2hvdWxkCisgICAgLy8gcGFpbnQgYm9yZGVy
cy9tYXJnaW5zL3BhZGRpbmcuICBUaGlzIGtub3dsZWRnZSB3aWxsIHVsdGltYXRlbHkgYmUgdXNl
ZCB3aGVuCisgICAgLy8gd2UgZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIHBvc2l0aW9ucyBhbmQg
d2lkdGhzIG9mIGFsbCB0aGUgaW5saW5lIGJveGVzIG9uCisgICAgLy8gdGhlIGxpbmUuCisgICAg
Ym9vbCBpc0xvZ2ljYWxseUxhc3RSdW5XcmFwcGVkID0gYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1
bigpLT5yZW5kZXJlcigpLmlzVGV4dCgpID8gIXJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihiaWRp
UnVucykgOiAhaXM8UmVuZGVySW5saW5lPihiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJl
bmRlcmVyKCkpOworICAgIGxhc3RSb290Qm94KCktPmRldGVybWluZVNwYWNpbmdGb3JGbG93Qm94
ZXMobGluZUluZm8uaXNMYXN0TGluZSgpLCBpc0xvZ2ljYWxseUxhc3RSdW5XcmFwcGVkLCAmYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpKTsKKworICAgIC8vIE5vdyBtYXJr
IHRoZSBsaW5lIGJveGVzIGFzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgIGxhc3RSb290Qm94KCkt
PnNldENvbnN0cnVjdGVkKCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGxhc3QgbGluZS4KKyAgICBy
ZXR1cm4gbGFzdFJvb3RCb3goKTsKK30KKworVGV4dEFsaWduTW9kZSBSZW5kZXJCbG9ja0Zsb3c6
OnRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0Cit7Cisg
ICAgVGV4dEFsaWduTW9kZSBhbGlnbm1lbnQgPSBzdHlsZSgpLnRleHRBbGlnbigpOworI2lmIEVO
QUJMRShDU1MzX1RFWFQpCisgICAgVGV4dEp1c3RpZnkgdGV4dEp1c3RpZnkgPSBzdHlsZSgpLnRl
eHRKdXN0aWZ5KCk7CisgICAgaWYgKGFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5
ICYmIHRleHRKdXN0aWZ5ID09IFRleHRKdXN0aWZ5OjpOb25lKQorICAgICAgICByZXR1cm4gc3R5
bGUoKS5kaXJlY3Rpb24oKSA9PSBUZXh0RGlyZWN0aW9uOjpMVFIgPyBUZXh0QWxpZ25Nb2RlOjpM
ZWZ0IDogVGV4dEFsaWduTW9kZTo6UmlnaHQ7CisjZW5kaWYKKworICAgIGlmIChlbmRzV2l0aFNv
ZnRCcmVhaykKKyAgICAgICAgcmV0dXJuIGFsaWdubWVudDsKKworI2lmICFFTkFCTEUoQ1NTM19U
RVhUKQorICAgIHJldHVybiAoYWxpZ25tZW50ID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpID8g
VGV4dEFsaWduTW9kZTo6U3RhcnQgOiBhbGlnbm1lbnQ7CisjZWxzZQorICAgIGlmIChhbGlnbm1l
bnQgIT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSkKKyAgICAgICAgcmV0dXJuIGFsaWdubWVudDsK
KworICAgIFRleHRBbGlnbkxhc3QgYWxpZ25tZW50TGFzdCA9IHN0eWxlKCkudGV4dEFsaWduTGFz
dCgpOworICAgIHN3aXRjaCAoYWxpZ25tZW50TGFzdCkgeworICAgIGNhc2UgVGV4dEFsaWduTGFz
dDo6U3RhcnQ6CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICBjYXNl
IFRleHRBbGlnbkxhc3Q6OkVuZDoKKyAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OkVuZDsK
KyAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OkxlZnQ6CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25N
b2RlOjpMZWZ0OworICAgIGNhc2UgVGV4dEFsaWduTGFzdDo6UmlnaHQ6CisgICAgICAgIHJldHVy
biBUZXh0QWxpZ25Nb2RlOjpSaWdodDsKKyAgICBjYXNlIFRleHRBbGlnbkxhc3Q6OkNlbnRlcjoK
KyAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OkNlbnRlcjsKKyAgICBjYXNlIFRleHRBbGln
bkxhc3Q6Okp1c3RpZnk6CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5Owor
ICAgIGNhc2UgVGV4dEFsaWduTGFzdDo6QXV0bzoKKyAgICAgICAgaWYgKHRleHRKdXN0aWZ5ID09
IFRleHRKdXN0aWZ5OjpEaXN0cmlidXRlKQorICAgICAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1v
ZGU6Okp1c3RpZnk7CisgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICB9
CisgICAgcmV0dXJuIGFsaWdubWVudDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVM
b2dpY2FsV2lkdGhGb3JMZWZ0QWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9SaWdodERpcmVjdGlv
biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYg
dG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKK3sKKyAgICAv
LyBUaGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayBzaG91bGQgZGV0ZXJtaW5lIHdoYXQgaGFwcGVu
cyB3aXRoIHdpZGUgbGluZXMuCisgICAgLy8gSW4gcGFydGljdWxhciB3aXRoIFJUTCBibG9ja3Ms
IHdpZGUgbGluZXMgc2hvdWxkIHN0aWxsIHNwaWxsIG91dCB0byB0aGUgbGVmdC4KKyAgICBpZiAo
aXNMZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICBpZiAodG90YWxMb2dpY2FsV2lkdGgg
PiBhdmFpbGFibGVMb2dpY2FsV2lkdGggJiYgdHJhaWxpbmdTcGFjZVJ1bikKKyAgICAgICAgICAg
IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3RkOjptYXg8ZmxvYXQ+
KDAsIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKSAtIHRvdGFsTG9naWNh
bFdpZHRoICsgYXZhaWxhYmxlTG9naWNhbFdpZHRoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikKKyAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+
Ym94KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKKyAgICBlbHNlIGlmICh0b3RhbExvZ2ljYWxXaWR0
aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCkKKyAgICAgICAgbG9naWNhbExlZnQgLT0gKHRvdGFs
TG9naWNhbFdpZHRoIC0gYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKK30KKworc3RhdGljIHZvaWQg
dXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVkQmxvY2soYm9vbCBpc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBmbG9hdCYgbG9naWNhbExlZnQs
IGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQor
eworICAgIC8vIFdpZGUgbGluZXMgc3BpbGwgb3V0IG9mIHRoZSBibG9jayBiYXNlZCBvZmYgZGly
ZWN0aW9uLgorICAgIC8vIFNvIGV2ZW4gaWYgdGV4dC1hbGlnbiBpcyByaWdodCwgaWYgZGlyZWN0
aW9uIGlzIExUUiwgd2lkZSBsaW5lcyBzaG91bGQgb3ZlcmZsb3cgb3V0IG9mIHRoZSByaWdodAor
ICAgIC8vIHNpZGUgb2YgdGhlIGJsb2NrLgorICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KSB7CisgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7CisgICAgICAgICAgICB0b3RhbExv
Z2ljYWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCk7Cisg
ICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKDApOwor
ICAgICAgICB9CisgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHN0ZDo6bWF4KDAuZiwgYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgaWYgKHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNhbFdpZHRoICYm
IHRyYWlsaW5nU3BhY2VSdW4pIHsKKyAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNl
dExvZ2ljYWxXaWR0aChzdGQ6Om1heDxmbG9hdD4oMCwgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCkt
PmxvZ2ljYWxXaWR0aCgpIC0gdG90YWxMb2dpY2FsV2lkdGggKyBhdmFpbGFibGVMb2dpY2FsV2lk
dGgpKTsKKyAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+Ym94
KCktPmxvZ2ljYWxXaWR0aCgpOworICAgIH0gZWxzZQorICAgICAgICBsb2dpY2FsTGVmdCArPSBh
dmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aDsKK30KKworc3RhdGljIHZv
aWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKGJvb2wgaXNMZWZ0VG9S
aWdodERpcmVjdGlvbiwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxM
ZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCkKK3sKKyAgICBmbG9hdCB0cmFpbGluZ1NwYWNlV2lkdGggPSAwOworICAgIGlmICh0cmFpbGlu
Z1NwYWNlUnVuKSB7CisgICAgICAgIHRvdGFsTG9naWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VS
dW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgdHJhaWxpbmdTcGFjZVdpZHRoID0g
c3RkOjptaW4odHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpLCAoYXZhaWxh
YmxlTG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGggKyAxKSAvIDIpOworICAgICAgICB0
cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0Pigw
LCB0cmFpbGluZ1NwYWNlV2lkdGgpKTsKKyAgICB9CisgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24pCisgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHN0ZDo6bWF4PGZsb2F0PigoYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIC8gMiwgMCk7CisgICAgZWxzZQorICAg
ICAgICBsb2dpY2FsTGVmdCArPSB0b3RhbExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCA/IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgOiAoYXZh
aWxhYmxlTG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIC8gMiAtIHRyYWlsaW5nU3Bh
Y2VXaWR0aDsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVu
KEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biYgcmVuZGVyZXIsIFJlbmRlck9iamVjdCogcHJl
dmlvdXNPYmplY3QsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICBmbG9hdCBzdGFy
dE92ZXJoYW5nOworICAgIGZsb2F0IGVuZE92ZXJoYW5nOworICAgIFJlbmRlck9iamVjdCogbmV4
dE9iamVjdCA9IDA7CisgICAgZm9yIChCaWRpUnVuKiBydW5XaXRoTmV4dE9iamVjdCA9IHJ1bi0+
bmV4dCgpOyBydW5XaXRoTmV4dE9iamVjdDsgcnVuV2l0aE5leHRPYmplY3QgPSBydW5XaXRoTmV4
dE9iamVjdC0+bmV4dCgpKSB7CisgICAgICAgIGlmICghcnVuV2l0aE5leHRPYmplY3QtPnJlbmRl
cmVyKCkuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIXJ1bldpdGhOZXh0T2JqZWN0LT5ib3go
KS0+aXNMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgbmV4dE9iamVjdCA9ICZydW5XaXRoTmV4
dE9iamVjdC0+cmVuZGVyZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorICAgIHJlbmRlcmVyLmdldE92ZXJoYW5nKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksIHJlbmRl
cmVyLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gcHJldmlvdXNPYmplY3QgOiBu
ZXh0T2JqZWN0LCByZW5kZXJlci5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG5l
eHRPYmplY3QgOiBwcmV2aW91c09iamVjdCwgc3RhcnRPdmVyaGFuZywgZW5kT3ZlcmhhbmcpOwor
ICAgIHNldE1hcmdpblN0YXJ0Rm9yQ2hpbGQocmVuZGVyZXIsIExheW91dFVuaXQoLXN0YXJ0T3Zl
cmhhbmcpKTsKKyAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgt
ZW5kT3ZlcmhhbmcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZv
clRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnVuLCBSZW5kZXJUZXh0
JiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLAorICAgIEds
eXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQ
b3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMpCit7CisgICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250
czsKKyAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7CisKKyAgICBjb25zdCBGb250Q2Fz
Y2FkZSYgZm9udCA9IGxpbmVTdHlsZSgqcmVuZGVyZXIucGFyZW50KCksIGxpbmVJbmZvKS5mb250
Q2FzY2FkZSgpOworICAgIC8vIEFsd2F5cyBjb21wdXRlIGdseXBoIG92ZXJmbG93IGlmIHRoZSBi
bG9jaydzIGxpbmUtYm94LWNvbnRhaW4gdmFsdWUgaXMgImdseXBocyIuCisgICAgaWYgKGxpbmVC
b3gtPmZpdHNUb0dseXBocygpKSB7CisgICAgICAgIC8vIElmIHdlIGRvbid0IHN0aWNrIG91dCBv
ZiB0aGUgcm9vdCBsaW5lJ3MgZm9udCBib3gsIHRoZW4gZG9uJ3QgYm90aGVyIGNvbXB1dGluZyBv
dXIgZ2x5cGggb3ZlcmZsb3cuIFRoaXMgb3B0aW1pemF0aW9uCisgICAgICAgIC8vIHdpbGwga2Vl
cCB1cyBmcm9tIGNvbXB1dGluZyBnbHlwaCBib3VuZHMgaW4gbmVhcmx5IGFsbCBjYXNlcy4KKyAg
ICAgICAgYm9vbCBpbmNsdWRlUm9vdExpbmUgPSBsaW5lQm94LT5pbmNsdWRlc1Jvb3RMaW5lQm94
Rm9udE9yTGVhZGluZygpOworICAgICAgICBpbnQgYmFzZWxpbmVTaGlmdCA9IGxpbmVCb3gtPnZl
cnRpY2FsUG9zaXRpb25Gb3JCb3gocnVuLT5ib3goKSwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsK
KyAgICAgICAgaW50IHJvb3REZXNjZW50ID0gaW5jbHVkZVJvb3RMaW5lID8gZm9udC5mb250TWV0
cmljcygpLmRlc2NlbnQoKSA6IDA7CisgICAgICAgIGludCByb290QXNjZW50ID0gaW5jbHVkZVJv
b3RMaW5lID8gZm9udC5mb250TWV0cmljcygpLmFzY2VudCgpIDogMDsKKyAgICAgICAgaW50IGJv
eEFzY2VudCA9IGZvbnQuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSAtIGJhc2VsaW5lU2hpZnQ7Cisg
ICAgICAgIGludCBib3hEZXNjZW50ID0gZm9udC5mb250TWV0cmljcygpLmRlc2NlbnQoKSArIGJh
c2VsaW5lU2hpZnQ7CisgICAgICAgIGlmIChib3hBc2NlbnQgPiByb290RGVzY2VudCB8fCAgYm94
RGVzY2VudCA+IHJvb3RBc2NlbnQpCisgICAgICAgICAgICBnbHlwaE92ZXJmbG93LmNvbXB1dGVC
b3VuZHMgPSB0cnVlOyAKKyAgICB9CisgICAgCisgICAgTGF5b3V0VW5pdCBoeXBoZW5XaWR0aDsK
KyAgICBpZiAoZG93bmNhc3Q8SW5saW5lVGV4dEJveD4oKnJ1bi0+Ym94KCkpLmhhc0h5cGhlbigp
KQorICAgICAgICBoeXBoZW5XaWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aChyZW5kZXJlciwgZm9u
dCwgJmZhbGxiYWNrRm9udHMpOworCisgICAgZmxvYXQgbWVhc3VyZWRXaWR0aCA9IDA7CisKKyAg
ICBib29sIGtlcm5pbmdJc0VuYWJsZWQgPSBmb250LmVuYWJsZUtlcm5pbmcoKTsKKyAgICBib29s
IGNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCA9IHJlbmRlcmVyLmNhblVzZVNpbXBsZUZvbnRDb2Rl
UGF0aCgpOworICAgIAorICAgIC8vIFNpbmNlIHdlIGRvbid0IGNhY2hlIGdseXBoIG92ZXJmbG93
cywgd2UgbmVlZCB0byByZS1tZWFzdXJlIHRoZSBydW4gaWYKKyAgICAvLyB0aGUgc3R5bGUgaXMg
bGluZWJveC1jb250YWluOiBnbHlwaC4KKyAgICBpZiAoIWxpbmVCb3gtPmZpdHNUb0dseXBocygp
ICYmIGNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCkgeworICAgICAgICB1bnNpZ25lZCBsYXN0RW5k
T2Zmc2V0ID0gcnVuLT5tX3N0YXJ0OworICAgICAgICBib29sIGF0Rmlyc3RXb3JkTWVhc3VyZW1l
bnQgPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IHdvcmRNZWFzdXJl
bWVudHMuc2l6ZSgpOyBpIDwgc2l6ZSAmJiBsYXN0RW5kT2Zmc2V0IDwgcnVuLT5tX3N0b3A7ICsr
aSkgeworICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3Jk
TWVhc3VyZW1lbnRzW2ldOworICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudC53aWR0aCA8
PSAwIHx8IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9PSB3b3JkTWVhc3VyZW1lbnQuZW5k
T2Zmc2V0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHdvcmRN
ZWFzdXJlbWVudC5yZW5kZXJlciAhPSAmcmVuZGVyZXIgfHwgd29yZE1lYXN1cmVtZW50LnN0YXJ0
T2Zmc2V0ICE9IGxhc3RFbmRPZmZzZXQgfHwgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA+IHJ1
bi0+bV9zdG9wKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBsYXN0
RW5kT2Zmc2V0ID0gd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldDsKKyAgICAgICAgICAgIGlmIChr
ZXJuaW5nSXNFbmFibGVkICYmIGxhc3RFbmRPZmZzZXQgPT0gcnVuLT5tX3N0b3ApIHsKKyAgICAg
ICAgICAgICAgICBpbnQgd29yZExlbmd0aCA9IGxhc3RFbmRPZmZzZXQgLSB3b3JkTWVhc3VyZW1l
bnQuc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxvdyBvdmVyZmxvdzsK
KyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHJlbmRlcmVyLndpZHRoKHdvcmRNZWFz
dXJlbWVudC5zdGFydE9mZnNldCwgd29yZExlbmd0aCwgeFBvcyArIG1lYXN1cmVkV2lkdGgsIGxp
bmVJbmZvLmlzRmlyc3RMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICZ3b3JkTWVhc3VyZW1l
bnQuZmFsbGJhY2tGb250cywgJm92ZXJmbG93KTsKKyAgICAgICAgICAgICAgICBVQ2hhciBjID0g
cmVuZGVyZXIuY2hhcmFjdGVyQXQod29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0KTsKKyAgICAg
ICAgICAgICAgICAvLyByZW5kZXJlci53aWR0aCgpIG9taXRzIHdvcmQtc3BhY2luZyB2YWx1ZSBm
b3IgbGVhZGluZyB3aGl0ZXNwYWNlLCBzbyBsZXQncyBqdXN0IGFkZCBpdCBiYWNrIGhlcmUuCisg
ICAgICAgICAgICAgICAgaWYgKCFhdEZpcnN0V29yZE1lYXN1cmVtZW50ICYmIEZvbnRDYXNjYWRl
Ojp0cmVhdEFzU3BhY2UoYykpCisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0g
cmVuZGVyZXIuc3R5bGUoKS5mb250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCk7CisgICAgICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoICs9IHdvcmRNZWFzdXJlbWVu
dC53aWR0aDsKKyAgICAgICAgICAgIGF0Rmlyc3RXb3JkTWVhc3VyZW1lbnQgPSBmYWxzZTsKKwor
ICAgICAgICAgICAgaWYgKCF3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgICAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPjo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuZW5kKCk7CisgICAgICAgICAgICAg
ICAgZm9yIChIYXNoU2V0PGNvbnN0IEZvbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3b3JkTWVh
c3VyZW1lbnQuZmFsbGJhY2tGb250cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAg
ICAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuYWRkKCppdCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKG1lYXN1cmVkV2lkdGggJiYgbGFzdEVuZE9mZnNldCAhPSBydW4t
Pm1fc3RvcCkgeworICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggY2FjaGVk
IGRhdGEsIHdlJ2xsIG1lYXN1cmUgdGhlIHJ1biBhZ2Fpbi4KKyAgICAgICAgICAgIG1lYXN1cmVk
V2lkdGggPSAwOworICAgICAgICAgICAgZmFsbGJhY2tGb250cy5jbGVhcigpOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKCFtZWFzdXJlZFdpZHRoKQorICAgICAgICBtZWFzdXJlZFdpZHRo
ID0gcmVuZGVyZXIud2lkdGgocnVuLT5tX3N0YXJ0LCBydW4tPm1fc3RvcCAtIHJ1bi0+bV9zdGFy
dCwgeFBvcywgbGluZUluZm8uaXNGaXJzdExpbmUoKSwgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92
ZXJmbG93KTsKKworICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChtZWFzdXJlZFdpZHRo
ICsgaHlwaGVuV2lkdGgpOworICAgIGlmICghZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgQVNTRVJUKHJ1bi0+Ym94KCktPmJlaGF2ZXNMaWtlVGV4dCgpKTsKKyAgICAgICAgR2x5
cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXA6Oml0ZXJhdG9yIGl0ID0gdGV4dEJveERhdGFN
YXAuYWRkKGRvd25jYXN0PElubGluZVRleHRCb3g+KHJ1bi0+Ym94KCkpLCBzdGQ6Om1ha2VfcGFp
cihWZWN0b3I8Y29uc3QgRm9udCo+KCksIEdseXBoT3ZlcmZsb3coKSkpLml0ZXJhdG9yOworICAg
ICAgICBBU1NFUlQoaXQtPnZhbHVlLmZpcnN0LmlzRW1wdHkoKSk7CisgICAgICAgIGl0LT52YWx1
ZS5maXJzdCA9IGNvcHlUb1ZlY3RvcihmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgcnVuLT5ib3go
KS0+cGFyZW50KCktPmNsZWFyRGVzY2VuZGFudHNIYXZlU2FtZUxpbmVIZWlnaHRBbmRCYXNlbGlu
ZSgpOworICAgIH0KKworICAgIC8vIEluY2x1ZGUgdGV4dCBkZWNvcmF0aW9uIHZpc3VhbCBvdmVy
ZmxvdyBhcyBwYXJ0IG9mIHRoZSBnbHlwaCBvdmVyZmxvdy4KKyAgICBpZiAoIXJlbmRlcmVyLnN0
eWxlKCkudGV4dERlY29yYXRpb25zSW5FZmZlY3QoKS5pc0VtcHR5KCkpCisgICAgICAgIGdseXBo
T3ZlcmZsb3cuZXh0ZW5kVG8odmlzdWFsT3ZlcmZsb3dGb3JEZWNvcmF0aW9ucyhydW4tPmJveCgp
LT5saW5lU3R5bGUoKSwgZG93bmNhc3Q8SW5saW5lVGV4dEJveD4ocnVuLT5ib3goKSkpKTsKKwor
ICAgIGlmICghZ2x5cGhPdmVyZmxvdy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKHJ1bi0+
Ym94KCktPmJlaGF2ZXNMaWtlVGV4dCgpKTsKKyAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxi
YWNrRm9udHNNYXA6Oml0ZXJhdG9yIGl0ID0gdGV4dEJveERhdGFNYXAuYWRkKGRvd25jYXN0PElu
bGluZVRleHRCb3g+KHJ1bi0+Ym94KCkpLCBzdGQ6Om1ha2VfcGFpcihWZWN0b3I8Y29uc3QgRm9u
dCo+KCksIEdseXBoT3ZlcmZsb3coKSkpLml0ZXJhdG9yOworICAgICAgICBpdC0+dmFsdWUuc2Vj
b25kID0gZ2x5cGhPdmVyZmxvdzsKKyAgICAgICAgcnVuLT5ib3goKS0+Y2xlYXJLbm93blRvSGF2
ZU5vT3ZlcmZsb3coKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVS
dWJ5Rm9ySnVzdGlmaWVkVGV4dChSZW5kZXJSdWJ5UnVuJiBydWJ5UnVuLCBCaWRpUnVuJiByLCBj
b25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWdu
ZWQmIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwg
ZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGkpCit7CisgICAgaWYgKCFydWJ5
UnVuLnJ1YnlCYXNlKCkgfHwgIXJ1YnlSdW4ucnVieUJhc2UoKS0+Zmlyc3RSb290Qm94KCkgfHwg
cnVieVJ1bi5ydWJ5QmFzZSgpLT5maXJzdFJvb3RCb3goKS0+bmV4dFJvb3RCb3goKSB8fCAhci5y
ZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGF1dG8mIHJ1YnlCYXNlID0gKnJ1YnlSdW4ucnVieUJhc2UoKTsKKyAgICBhdXRvJiBy
b290Qm94ID0gKnJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpOworCisgICAgZmxvYXQgdG90YWxFeHBh
bnNpb24gPSAwOworICAgIHVuc2lnbmVkIHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuID0gMDsKKyAg
ICBmb3IgKGF1dG8qIGxlYWZDaGlsZCA9IHJvb3RCb3guZmlyc3RMZWFmQ2hpbGQoKTsgbGVhZkNo
aWxkOyBsZWFmQ2hpbGQgPSBsZWFmQ2hpbGQtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgICAgICBp
ZiAoIWxlYWZDaGlsZC0+aXNJbmxpbmVUZXh0Qm94KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICB1bnNpZ25lZCBvcHBvcnR1bml0aWVzSW5SdW4gPSBleHBhbnNpb25PcHBvcnR1
bml0aWVzW2krK107CisgICAgICAgIEFTU0VSVChvcHBvcnR1bml0aWVzSW5SdW4gPD0gZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCk7CisgICAgICAgIGF1dG8gZXhwYW5zaW9uID0gKGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRoKSAqIG9wcG9ydHVuaXRpZXNJblJ1biAv
IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7CisgICAgICAgIHRvdGFsRXhwYW5zaW9uICs9IGV4
cGFuc2lvbjsKKyAgICAgICAgdG90YWxPcHBvcnR1bml0aWVzSW5SdW4gKz0gb3Bwb3J0dW5pdGll
c0luUnVuOworICAgIH0KKworICAgIEFTU0VSVCghcnVieVJ1bi5oYXNPdmVycmlkZUNvbnRlbnRM
b2dpY2FsV2lkdGgoKSk7CisgICAgZmxvYXQgbmV3QmFzZVdpZHRoID0gcnVieVJ1bi5sb2dpY2Fs
V2lkdGgoKSArIHRvdGFsRXhwYW5zaW9uICsgbWFyZ2luU3RhcnRGb3JDaGlsZChydWJ5UnVuKSAr
IG1hcmdpbkVuZEZvckNoaWxkKHJ1YnlSdW4pOworICAgIGZsb2F0IG5ld1J1YnlSdW5XaWR0aCA9
IHJ1YnlSdW4ubG9naWNhbFdpZHRoKCkgKyB0b3RhbEV4cGFuc2lvbjsKKyAgICBydWJ5QmFzZS5z
ZXRJbml0aWFsT2Zmc2V0KChuZXdSdWJ5UnVuV2lkdGggLSBuZXdCYXNlV2lkdGgpIC8gMik7Cisg
ICAgcnVieVJ1bi5zZXRPdmVycmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdChuZXdS
dWJ5UnVuV2lkdGgpKTsKKyAgICBydWJ5UnVuLnNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7
CisgICAgcm9vdEJveC5tYXJrRGlydHkoKTsKKyAgICBpZiAoUmVuZGVyUnVieVRleHQqIHJ1YnlU
ZXh0ID0gcnVieVJ1bi5ydWJ5VGV4dCgpKSB7CisgICAgICAgIGlmIChSb290SW5saW5lQm94KiB0
ZXh0Um9vdEJveCA9IHJ1YnlUZXh0LT5maXJzdFJvb3RCb3goKSkKKyAgICAgICAgICAgIHRleHRS
b290Qm94LT5tYXJrRGlydHkoKTsKKyAgICB9CisgICAgcnVieVJ1bi5sYXlvdXRCbG9jayh0cnVl
KTsKKyAgICBydWJ5UnVuLmNsZWFyT3ZlcnJpZGVDb250ZW50TG9naWNhbFdpZHRoKCk7CisgICAg
ci5ib3goKS0+c2V0RXhwYW5zaW9uKG5ld1J1YnlSdW5XaWR0aCAtIHIuYm94KCktPmxvZ2ljYWxX
aWR0aCgpKTsKKworICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IHRvdGFsRXhwYW5zaW9uOworICAg
IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgLT0gdG90YWxPcHBvcnR1bml0aWVzSW5SdW47Cit9
CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlRXhwYW5zaW9uRm9ySnVzdGlmaWVkVGV4
dChCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgY29uc3QgVmVj
dG9yPHVuc2lnbmVkLCAxNj4mIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIHVuc2lnbmVkIGV4cGFu
c2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFp
bGFibGVMb2dpY2FsV2lkdGgpCit7CisgICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
IHx8IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA8PSB0b3RhbExvZ2ljYWxXaWR0aCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoQmlkaVJ1biogcnVuID0gZmly
c3RSdW47IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAgICAgaWYgKCFydW4tPmJveCgp
IHx8IHJ1biA9PSB0cmFpbGluZ1NwYWNlUnVuKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIAorICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKSkgeworICAg
ICAgICAgICAgdW5zaWduZWQgb3Bwb3J0dW5pdGllc0luUnVuID0gZXhwYW5zaW9uT3Bwb3J0dW5p
dGllc1tpKytdOworICAgICAgICAgICAgCisgICAgICAgICAgICBBU1NFUlQob3Bwb3J0dW5pdGll
c0luUnVuIDw9IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICAvLyBPbmx5IGp1c3RpZnkgdGV4dCBpZiB3aGl0ZXNwYWNlIGlzIGNvbGxhcHNlZC4K
KyAgICAgICAgICAgIGlmIChydW4tPnJlbmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdoaXRlU3Bh
Y2UoKSkgeworICAgICAgICAgICAgICAgIElubGluZVRleHRCb3gmIHRleHRCb3ggPSBkb3duY2Fz
dDxJbmxpbmVUZXh0Qm94PigqcnVuLT5ib3goKSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZXhw
YW5zaW9uID0gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRoKSAqIG9w
cG9ydHVuaXRpZXNJblJ1biAvIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7CisgICAgICAgICAg
ICAgICAgdGV4dEJveC5zZXRFeHBhbnNpb24oZXhwYW5zaW9uKTsKKyAgICAgICAgICAgICAgICB0
b3RhbExvZ2ljYWxXaWR0aCArPSBleHBhbnNpb247CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IC09IG9wcG9ydHVuaXRpZXNJblJ1bjsKKyAgICAg
ICAgfSBlbHNlIGlmIChpczxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkpKQorICAgICAg
ICAgICAgdXBkYXRlUnVieUZvckp1c3RpZmllZFRleHQoZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4o
cnVuLT5yZW5kZXJlcigpKSwgKnJ1biwgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgZXhwYW5zaW9u
T3Bwb3J0dW5pdHlDb3VudCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCwgaSk7CisKKyAgICAgICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlTG9n
aWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmIHRleHRBbGlnbiwgY29u
c3QgUm9vdElubGluZUJveCogcm9vdElubGluZUJveCwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1
biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBh
dmFpbGFibGVMb2dpY2FsV2lkdGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQorewor
ICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uOworICAgIGlmIChyb290SW5saW5lQm94ICYmIHN0
eWxlKCkudW5pY29kZUJpZGkoKSA9PSBQbGFpbnRleHQpCisgICAgICAgIGRpcmVjdGlvbiA9IHJv
b3RJbmxpbmVCb3gtPmRpcmVjdGlvbigpOworICAgIGVsc2UKKyAgICAgICAgZGlyZWN0aW9uID0g
c3R5bGUoKS5kaXJlY3Rpb24oKTsKKworICAgIC8vIEFybWVkIHdpdGggdGhlIHRvdGFsIHdpZHRo
IG9mIHRoZSBsaW5lICh3aXRob3V0IGp1c3RpZmljYXRpb24pLAorICAgIC8vIHdlIG5vdyBleGFt
aW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0
byBwb3NpdGlvbiB0aGUKKyAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gVGhlIHRvdGFsIHdp
ZHRoIG9mIHRoZSBsaW5lIGNhbiBiZSBpbmNyZWFzZWQgaWYgd2UgZW5kIHVwCisgICAgLy8ganVz
dGlmeWluZyB0ZXh0LgorICAgIHN3aXRjaCAodGV4dEFsaWduKSB7CisgICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpMZWZ0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0TGVmdDoKKyAgICAg
ICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVmdEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9n
aWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFRleHRBbGlnbk1vZGU6OlJpZ2h0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0
UmlnaHQ6CisgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvclJpZ2h0QWxpZ25lZEJsb2NrKHN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2Fs
TGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6Q2VudGVyOgorICAgIGNhc2UgVGV4dEFs
aWduTW9kZTo6V2ViS2l0Q2VudGVyOgorICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JDZW50
ZXJBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5n
U3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNh
bFdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5
OgorICAgICAgICBhZGp1c3RJbmxpbmVEaXJlY3Rpb25MaW5lQm91bmRzKGV4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQsIGxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAg
ICBpZiAoZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCkgeworICAgICAgICAgICAgaWYgKHRyYWls
aW5nU3BhY2VSdW4pIHsKKyAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFp
bGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICAgICAgdHJh
aWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aCgwKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEZBTExUSFJPVUdIOworICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6U3RhcnQ6CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4
dERpcmVjdGlvbjo6TFRSKQorICAgICAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yTGVmdEFs
aWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFj
ZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lk
dGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdo
dEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdT
cGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2Fs
V2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkVuZDoKKyAg
ICAgICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0RGlyZWN0aW9uOjpMVFIpCisgICAgICAgICAgICB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdodEFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNh
bFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JMZWZ0QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dp
Y2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7CisgICAgICAgIGJyZWFrOworICAgIH0K
K30KKworc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucyhSZW5kZXJCbG9j
a0Zsb3cmIGJsb2NrLCBmbG9hdCYgbGluZUxvZ2ljYWxMZWZ0LCBmbG9hdCYgbGluZUxvZ2ljYWxS
aWdodCwgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgYm9vbCBmaXJzdExpbmUsCisgICAg
SW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQsIExheW91dFVuaXQgYm94TG9naWNhbEhl
aWdodCkKK3sKKyAgICBMYXlvdXRVbml0IGxpbmVMb2dpY2FsSGVpZ2h0ID0gYmxvY2subWluTGlu
ZUhlaWdodEZvclJlcGxhY2VkUmVuZGVyZXIoZmlyc3RMaW5lLCBib3hMb2dpY2FsSGVpZ2h0KTsK
KyAgICBsaW5lTG9naWNhbExlZnQgPSBibG9jay5sb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoYmxv
Y2subG9naWNhbEhlaWdodCgpLCBzaG91bGRJbmRlbnRUZXh0LCBsaW5lTG9naWNhbEhlaWdodCk7
CisgICAgbGluZUxvZ2ljYWxSaWdodCA9IGJsb2NrLmxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUo
YmxvY2subG9naWNhbEhlaWdodCgpLCBzaG91bGRJbmRlbnRUZXh0LCBsaW5lTG9naWNhbEhlaWdo
dCk7CisgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbGluZUxvZ2ljYWxSaWdodCAtIGxpbmVM
b2dpY2FsTGVmdDsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJ
bmZvJiBsaW5lSW5mbywgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VS
dW4sIGJvb2wgcmVhY2hlZEVuZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRl
eHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNo
ZSwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBUZXh0QWxpZ25N
b2RlIHRleHRBbGlnbiA9IHRleHRBbGlnbm1lbnRGb3JMaW5lKCFyZWFjaGVkRW5kICYmICFsaW5l
Qm94LT5lbmRzV2l0aEJyZWFrKCkpOworICAgIAorICAgIC8vIENTUyAyLjE6ICInVGV4dC1pbmRl
bnQnIG9ubHkgYWZmZWN0cyBhIGxpbmUgaWYgaXQgaXMgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5l
IG9mIGFuIGVsZW1lbnQuIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1v
dXMgYmxvY2sgCisgICAgLy8gYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0
IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4iCisgICAgLy8gQ1NTMyAidGV4dC1pbmRlbnQi
LCAiLXdlYmtpdC1lYWNoLWxpbmUiIGFmZmVjdHMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJsb2Nr
IGNvbnRhaW5lciBhcyB3ZWxsIGFzIGVhY2ggbGluZSBhZnRlciBhIGZvcmNlZCBsaW5lIGJyZWFr
LAorICAgIC8vIGJ1dCBkb2VzIG5vdCBhZmZlY3QgbGluZXMgYWZ0ZXIgYSBzb2Z0IHdyYXAgYnJl
YWsuCisgICAgYm9vbCBpc0ZpcnN0TGluZSA9IGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgJiYgIShp
c0Fub255bW91c0Jsb2NrKCkgJiYgcGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSB0aGlzKTsKKyAg
ICBib29sIGlzQWZ0ZXJIYXJkTGluZUJyZWFrID0gbGluZUJveC0+cHJldlJvb3RCb3goKSAmJiBs
aW5lQm94LT5wcmV2Um9vdEJveCgpLT5lbmRzV2l0aEJyZWFrKCk7CisgICAgSW5kZW50VGV4dE9y
Tm90IHNob3VsZEluZGVudFRleHQgPSByZXF1aXJlc0luZGVudChpc0ZpcnN0TGluZSwgaXNBZnRl
ckhhcmRMaW5lQnJlYWssIHN0eWxlKCkpOworICAgIGZsb2F0IGxpbmVMb2dpY2FsTGVmdDsKKyAg
ICBmbG9hdCBsaW5lTG9naWNhbFJpZ2h0OworICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aDsKKyAgICB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKCp0aGlzLCBsaW5lTG9naWNhbExl
ZnQsIGxpbmVMb2dpY2FsUmlnaHQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaXNGaXJzdExpbmUs
IHNob3VsZEluZGVudFRleHQsIDApOworICAgIGJvb2wgbmVlZHNXb3JkU3BhY2luZzsKKworICAg
IGlmIChmaXJzdFJ1biAmJiBmaXJzdFJ1bi0+cmVuZGVyZXIoKS5pc1JlcGxhY2VkKCkpIHsKKyAg
ICAgICAgUmVuZGVyQm94JiByZW5kZXJCb3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KGZpcnN0UnVu
LT5yZW5kZXJlcigpKTsKKyAgICAgICAgdXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucygqdGhp
cywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lk
dGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0LCByZW5kZXJCb3gubG9naWNhbEhlaWdo
dCgpKTsKKyAgICB9CisKKyAgICBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2Vn
bWVudChsaW5lQm94LCBsaW5lSW5mbywgdGV4dEFsaWduLCBsaW5lTG9naWNhbExlZnQsIGF2YWls
YWJsZUxvZ2ljYWxXaWR0aCwgZmlyc3RSdW4sIHRyYWlsaW5nU3BhY2VSdW4sIHRleHRCb3hEYXRh
TWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHdvcmRNZWFzdXJlbWVudHMpOworICAgIC8vIFRo
ZSB3aWR0aHMgb2YgYWxsIHJ1bnMgYXJlIG5vdyBrbm93bi4gV2UgY2FuIG5vdyBwbGFjZSBldmVy
eSBpbmxpbmUgYm94IChhbmQKKyAgICAvLyBjb21wdXRlIGFjY3VyYXRlIHdpZHRocyBmb3IgdGhl
IGlubGluZSBmbG93IGJveGVzKS4KKyAgICBuZWVkc1dvcmRTcGFjaW5nID0gZmFsc2U7CisgICAg
bGluZUJveC0+cGxhY2VCb3hlc0luSW5saW5lRGlyZWN0aW9uKGxpbmVMb2dpY2FsTGVmdCwgbmVl
ZHNXb3JkU3BhY2luZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgRXhwYW5zaW9uQmVoYXZpb3IgZXhw
YW5zaW9uQmVoYXZpb3JGb3JJbmxpbmVUZXh0Qm94KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIElu
bGluZVRleHRCb3gmIHRleHRCb3gsIEJpZGlSdW4qIHByZXZpb3VzUnVuLCBCaWRpUnVuKiBuZXh0
UnVuLCBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiwgYm9vbCBpc0FmdGVyRXhwYW5zaW9uKQorewor
ICAgIC8vIFRhdGVjaHV5b2tvIGlzIG1vZGVsZWQgYXMgdGhlIE9iamVjdCBSZXBsYWNlbWVudCBD
aGFyYWN0ZXIgKFUrRkZGQyksIHdoaWNoIGNhbiBuZXZlciBoYXZlIGV4cGFuc2lvbiBvcHBvcnR1
bml0aWVzIGluc2lkZSBub3IgaW50cmluc2ljYWxseSBhZGphY2VudCB0byBpdC4KKyAgICBpZiAo
dGV4dEJveC5yZW5kZXJlcigpLnN0eWxlKCkudGV4dENvbWJpbmUoKSA9PSBUZXh0Q29tYmluZTo6
SG9yaXpvbnRhbCkKKyAgICAgICAgcmV0dXJuIEZvcmJpZExlYWRpbmdFeHBhbnNpb24gfCBGb3Ji
aWRUcmFpbGluZ0V4cGFuc2lvbjsKKworICAgIEV4cGFuc2lvbkJlaGF2aW9yIHJlc3VsdCA9IDA7
CisgICAgYm9vbCBzZXRMZWFkaW5nRXhwYW5zaW9uID0gZmFsc2U7CisgICAgYm9vbCBzZXRUcmFp
bGluZ0V4cGFuc2lvbiA9IGZhbHNlOworICAgIGlmICh0ZXh0QWxpZ24gPT0gVGV4dEFsaWduTW9k
ZTo6SnVzdGlmeSkgeworICAgICAgICAvLyBJZiB0aGUgbmV4dCBib3ggaXMgcnVieSwgYW5kIHdl
J3JlIGp1c3RpZnlpbmcsIGFuZCB0aGUgZmlyc3QgYm94IGluIHRoZSBydWJ5IGJhc2UgaGFzIGEg
bGVhZGluZyBleHBhbnNpb24sIGFuZCB3ZSBhcmUgYSB0ZXh0IGJveCwgdGhlbiBmb3JjZSBhIHRy
YWlsaW5nIGV4cGFuc2lvbi4KKyAgICAgICAgaWYgKG5leHRSdW4gJiYgaXM8UmVuZGVyUnVieVJ1
bj4obmV4dFJ1bi0+cmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4obmV4dFJ1
bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKSAmJiBuZXh0UnVuLT5yZW5kZXJlcigpLnN0eWxlKCku
Y29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHJ1YnlCYXNlID0gKmRv
d25jYXN0PFJlbmRlclJ1YnlSdW4+KG5leHRSdW4tPnJlbmRlcmVyKCkpLnJ1YnlCYXNlKCk7Cisg
ICAgICAgICAgICBpZiAocnVieUJhc2UuZmlyc3RSb290Qm94KCkgJiYgIXJ1YnlCYXNlLmZpcnN0
Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8qIGxl
YWZDaGlsZCA9IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChpczxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgbGVhZGluZ0V4cGFuc2lvbk9w
cG9ydHVuaXR5IGRvZXNuJ3QgYWN0dWFsbHkgd29yayBiZWNhdXNlIGl0IGRvZXNuJ3QgcGVyZm9y
bSB0aGUgVUJBCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRm9udENhc2NhZGU6OmxlYWRp
bmdFeHBhbnNpb25PcHBvcnR1bml0eShkb3duY2FzdDxSZW5kZXJUZXh0PihsZWFmQ2hpbGQtPnJl
bmRlcmVyKCkpLnN0cmluZ1ZpZXcoKSwgbGVhZkNoaWxkLT5kaXJlY3Rpb24oKSkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzZXRUcmFpbGluZ0V4cGFuc2lvbiA9IHRydWU7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZvcmNlVHJhaWxpbmdFeHBhbnNpb247
CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gU2FtZSB0
aGluZywgZXhjZXB0IGlmIHdlJ3JlIGZvbGxvd2luZyBhIHJ1YnkKKyAgICAgICAgaWYgKHByZXZp
b3VzUnVuICYmIGlzPFJlbmRlclJ1YnlSdW4+KHByZXZpb3VzUnVuLT5yZW5kZXJlcigpKSAmJiBk
b3duY2FzdDxSZW5kZXJSdWJ5UnVuPihwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSkucnVieUJhc2Uo
KSAmJiBwcmV2aW91c1J1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgp
KSB7CisgICAgICAgICAgICBhdXRvJiBydWJ5QmFzZSA9ICpkb3duY2FzdDxSZW5kZXJSdWJ5UnVu
PihwcmV2aW91c1J1bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKTsKKyAgICAgICAgICAgIGlmIChy
dWJ5QmFzZS5maXJzdFJvb3RCb3goKSAmJiAhcnVieUJhc2UuZmlyc3RSb290Qm94KCktPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byogbGVhZkNoaWxkID0gcnVieUJh
c2UuZmlyc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAg
ICBpZiAoaXM8SW5saW5lVGV4dEJveD4oKmxlYWZDaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGxlYWRpbmdFeHBhbnNpb25PcHBvcnR1bml0eSBkb2Vzbid0
IGFjdHVhbGx5IHdvcmsgYmVjYXVzZSBpdCBkb2Vzbid0IHBlcmZvcm0gdGhlIFVCQQorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKEZvbnRDYXNjYWRlOjp0cmFpbGluZ0V4cGFuc2lvbk9wcG9y
dHVuaXR5KGRvd25jYXN0PFJlbmRlclRleHQ+KGxlYWZDaGlsZC0+cmVuZGVyZXIoKSkuc3RyaW5n
VmlldygpLCBsZWFmQ2hpbGQtPmRpcmVjdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNldExlYWRpbmdFeHBhbnNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlc3VsdCB8PSBGb3JjZUxlYWRpbmdFeHBhbnNpb247CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UncmUgdGhlIGZpcnN0IGJveCBp
bnNpZGUgYSBydWJ5IGJhc2UsIGZvcmJpZCBhIGxlYWRpbmcgZXhwYW5zaW9uLCBhbmQgdmljZS12
ZXJzYQorICAgICAgICBpZiAoaXM8UmVuZGVyUnVieUJhc2U+KGJsb2NrKSkgeworICAgICAgICAg
ICAgUmVuZGVyUnVieUJhc2UmIHJ1YnlCYXNlID0gZG93bmNhc3Q8UmVuZGVyUnVieUJhc2U+KGJs
b2NrKTsKKyAgICAgICAgICAgIGlmICgmdGV4dEJveCA9PSBydWJ5QmFzZS5maXJzdFJvb3RCb3go
KS0+Zmlyc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgIHNldExlYWRpbmdFeHBhbnNp
b24gPSB0cnVlOworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGb3JiaWRMZWFkaW5nRXhwYW5z
aW9uOworICAgICAgICAgICAgfSBpZiAoJnRleHRCb3ggPT0gcnVieUJhc2UuZmlyc3RSb290Qm94
KCktPmxhc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgIHNldFRyYWlsaW5nRXhwYW5z
aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gRm9yYmlkVHJhaWxpbmdFeHBh
bnNpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzZXRMZWFk
aW5nRXhwYW5zaW9uKQorICAgICAgICByZXN1bHQgfD0gaXNBZnRlckV4cGFuc2lvbiA/IEZvcmJp
ZExlYWRpbmdFeHBhbnNpb24gOiBBbGxvd0xlYWRpbmdFeHBhbnNpb247CisgICAgaWYgKCFzZXRU
cmFpbGluZ0V4cGFuc2lvbikKKyAgICAgICAgcmVzdWx0IHw9IEFsbG93VHJhaWxpbmdFeHBhbnNp
b247CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFwcGx5RXhw
YW5zaW9uQmVoYXZpb3IoSW5saW5lVGV4dEJveCYgdGV4dEJveCwgRXhwYW5zaW9uQmVoYXZpb3Ig
ZXhwYW5zaW9uQmVoYXZpb3IpCit7CisgICAgc3dpdGNoIChleHBhbnNpb25CZWhhdmlvciAmIExl
YWRpbmdFeHBhbnNpb25NYXNrKSB7CisgICAgY2FzZSBGb3JjZUxlYWRpbmdFeHBhbnNpb246Cisg
ICAgICAgIHRleHRCb3guc2V0Rm9yY2VMZWFkaW5nRXhwYW5zaW9uKCk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgRm9yYmlkTGVhZGluZ0V4cGFuc2lvbjoKKyAgICAgICAgdGV4dEJveC5zZXRD
YW5IYXZlTGVhZGluZ0V4cGFuc2lvbihmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
QWxsb3dMZWFkaW5nRXhwYW5zaW9uOgorICAgICAgICB0ZXh0Qm94LnNldENhbkhhdmVMZWFkaW5n
RXhwYW5zaW9uKHRydWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAo
ZXhwYW5zaW9uQmVoYXZpb3IgJiBUcmFpbGluZ0V4cGFuc2lvbk1hc2spIHsKKyAgICBjYXNlIEZv
cmNlVHJhaWxpbmdFeHBhbnNpb246CisgICAgICAgIHRleHRCb3guc2V0Rm9yY2VUcmFpbGluZ0V4
cGFuc2lvbigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcmJpZFRyYWlsaW5nRXhwYW5z
aW9uOgorICAgICAgICB0ZXh0Qm94LnNldENhbkhhdmVUcmFpbGluZ0V4cGFuc2lvbihmYWxzZSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQWxsb3dUcmFpbGluZ0V4cGFuc2lvbjoKKyAgICAg
ICAgdGV4dEJveC5zZXRDYW5IYXZlVHJhaWxpbmdFeHBhbnNpb24odHJ1ZSk7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIGlubGluZUFuY2VzdG9ySGFzU3RhcnRC
b3JkZXJQYWRkaW5nT3JNYXJnaW4oY29uc3QgUmVuZGVyQmxvY2tGbG93JiBibG9jaywgY29uc3Qg
SW5saW5lQm94JiBib3gpCit7CisgICAgYm9vbCBpc0xUUiA9IGJsb2NrLnN0eWxlKCkuaXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpOworICAgIGZvciAoYXV0byogY3VycmVudEJveCA9IGJveC5wYXJl
bnQoKTsgY3VycmVudEJveDsgY3VycmVudEJveCA9IGN1cnJlbnRCb3gtPnBhcmVudCgpKSB7Cisg
ICAgICAgIGlmICgoaXNMVFIgJiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xvZ2lj
YWxMZWZ0KCkgPiAwKQorICAgICAgICAgICAgfHwgKCFpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJn
aW5Cb3JkZXJQYWRkaW5nTG9naWNhbFJpZ2h0KCkgPiAwKSkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlubGluZUFu
Y2VzdG9ySGFzRW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrRmxvdyYg
YmxvY2ssIGNvbnN0IElubGluZUJveCYgYm94KQoreworICAgIGJvb2wgaXNMVFIgPSBibG9jay5z
dHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRC
b3ggPSBib3gucGFyZW50KCk7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5w
YXJlbnQoKSkgeworICAgICAgICBpZiAoKGlzTFRSICYmIGN1cnJlbnRCb3gtPm1hcmdpbkJvcmRl
clBhZGRpbmdMb2dpY2FsUmlnaHQoKSA+IDApCisgICAgICAgICAgICB8fCAoIWlzTFRSICYmIGN1
cnJlbnRCb3gtPm1hcmdpbkJvcmRlclBhZGRpbmdMb2dpY2FsTGVmdCgpID4gMCkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorICAgIAorc3Rh
dGljIGJvb2wgaXNMYXN0SW5GbG93UnVuKEJpZGlSdW4mIHJ1blRvQ2hlY2spCit7CisgICAgZm9y
IChhdXRvKiBydW4gPSBydW5Ub0NoZWNrLm5leHQoKTsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkg
eworICAgICAgICBpZiAoIXJ1bi0+Ym94KCkgfHwgcnVuLT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpIHx8IHJ1bi0+Ym94KCktPmlzTGluZUJyZWFrKCkpCisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsK
K30KKyAgICAKK0JpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlv
blBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvLCBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0
LCAKKyAgICBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwg
QmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNN
YXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRp
b25DYWNoZSwKKyAgICBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQoreworICAg
IGJvb2wgbmVlZHNXb3JkU3BhY2luZyA9IGZhbHNlOworICAgIGJvb2wgY2FuSGFuZ1B1bmN0dWF0
aW9uQXRTdGFydCA9IHN0eWxlKCkuaGFuZ2luZ1B1bmN0dWF0aW9uKCkuY29udGFpbnMoSGFuZ2lu
Z1B1bmN0dWF0aW9uOjpGaXJzdCk7CisgICAgYm9vbCBjYW5IYW5nUHVuY3R1YXRpb25BdEVuZCA9
IHN0eWxlKCkuaGFuZ2luZ1B1bmN0dWF0aW9uKCkuY29udGFpbnMoSGFuZ2luZ1B1bmN0dWF0aW9u
OjpMYXN0KTsKKyAgICBib29sIGlzTFRSID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCk7CisgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LT5nZXRGbG93U3BhY2lu
Z0xvZ2ljYWxXaWR0aCgpOworICAgIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQg
PSAwOworICAgIGJvb2wgaXNBZnRlckV4cGFuc2lvbiA9IGlzPFJlbmRlclJ1YnlCYXNlPigqdGhp
cykgPyBkb3duY2FzdDxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpLmlzQWZ0ZXJFeHBhbnNpb24oKSA6
IHRydWU7CisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4gZXhwYW5zaW9uT3Bwb3J0dW5pdGllczsK
KworICAgIEJpZGlSdW4qIHJ1biA9IGZpcnN0UnVuOworICAgIEJpZGlSdW4qIHByZXZpb3VzUnVu
ID0gbnVsbHB0cjsKKyAgICBmb3IgKDsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgeworICAgICAg
ICBhdXRvIGNvbXB1dGVFeHBhbnNpb25PcHBvcnR1bml0aWVzID0gWyZleHBhbnNpb25PcHBvcnR1
bml0aWVzLCAmZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgdGV4dEFsaWduLCAmaXNBZnRlckV4
cGFuc2lvbl0gKFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssCisgICAgICAgICAgICBJbmxpbmVUZXh0
Qm94JiB0ZXh0Qm94LCBCaWRpUnVuKiBwcmV2aW91c1J1biwgQmlkaVJ1biogbmV4dFJ1biwgY29u
c3QgU3RyaW5nVmlldyYgc3RyaW5nVmlldywgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCisgICAg
ICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmdWaWV3LmlzRW1wdHkoKSkgeworICAgICAgICAg
ICAgICAgIC8vIEVtcHR5IHJ1bnMgc2hvdWxkIHN0aWxsIHByb2R1Y2UgYW4gZW50cnkgaW4gZXhw
YW5zaW9uT3Bwb3J0dW5pdGllcyBsaXN0IHNvIHRoYXQgdGhlIG51bWJlciBvZiBpdGVtcyBtYXRj
aGVzIHRoZSBudW1iZXIgb2YgcnVucy4KKyAgICAgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1
bml0aWVzLmFwcGVuZCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvciA9IGV4cGFu
c2lvbkJlaGF2aW9yRm9ySW5saW5lVGV4dEJveChibG9jaywgdGV4dEJveCwgcHJldmlvdXNSdW4s
IG5leHRSdW4sIHRleHRBbGlnbiwgaXNBZnRlckV4cGFuc2lvbik7CisgICAgICAgICAgICBhcHBs
eUV4cGFuc2lvbkJlaGF2aW9yKHRleHRCb3gsIGV4cGFuc2lvbkJlaGF2aW9yKTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIG9wcG9ydHVuaXRpZXNJblJ1bjsKKyAgICAgICAgICAgIHN0ZDo6dGllKG9w
cG9ydHVuaXRpZXNJblJ1biwgaXNBZnRlckV4cGFuc2lvbikgPSBGb250Q2FzY2FkZTo6ZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudChzdHJpbmdWaWV3LCBkaXJlY3Rpb24sIGV4cGFuc2lvbkJlaGF2
aW9yKTsKKyAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXBwZW5kKG9wcG9ydHVu
aXRpZXNJblJ1bik7CisgICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ICs9IG9w
cG9ydHVuaXRpZXNJblJ1bjsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFydW4tPmJveCgpIHx8
IHJ1bi0+cmVuZGVyZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBydW4tPmJveCgpLT5p
c0xpbmVCcmVhaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gUG9zaXRpb25lZCBvYmpl
Y3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVpcgorICAgICAgICAg
ICAgICAgICAgICAgIC8vIGNvcnJlY3Qgc3RhdGljIHggcG9zaXRpb24uICBUaGV5IGhhdmUgbm8g
ZWZmZWN0IG9uIHRoZSB3aWR0aC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHks
IGxpbmUgYnJlYWsgYm94ZXMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIHdpZHRoLgorICAgICAgICB9
CisgICAgICAgIGlmIChpczxSZW5kZXJUZXh0PihydW4tPnJlbmRlcmVyKCkpKSB7CisgICAgICAg
ICAgICBhdXRvJiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJl
cigpKTsKKyAgICAgICAgICAgIGF1dG8mIHRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94
PigqcnVuLT5ib3goKSk7CisgICAgICAgICAgICBpZiAoY2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFy
dCAmJiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpICYmIChpc0xUUiB8fCBpc0xhc3RJbkZsb3dSdW4o
KnJ1bikpCisgICAgICAgICAgICAgICAgJiYgIWlubGluZUFuY2VzdG9ySGFzU3RhcnRCb3JkZXJQ
YWRkaW5nT3JNYXJnaW4oKnRoaXMsICpydW4tPmJveCgpKSkgeworICAgICAgICAgICAgICAgIGZs
b2F0IGhhbmdTdGFydFdpZHRoID0gcmVuZGVyVGV4dC5oYW5nYWJsZVB1bmN0dWF0aW9uU3RhcnRX
aWR0aChydW4tPm1fc3RhcnQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCArPSBoYW5nU3RhcnRXaWR0aDsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUoKS5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxMZWZ0IC09IGhh
bmdTdGFydFdpZHRoOworICAgICAgICAgICAgICAgIGNhbkhhbmdQdW5jdHVhdGlvbkF0U3RhcnQg
PSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNh
bkhhbmdQdW5jdHVhdGlvbkF0RW5kICYmIGxpbmVJbmZvLmlzTGFzdExpbmUoKSAmJiBydW4tPm1f
c3RvcCA+IDAgJiYgKCFpc0xUUiB8fCBpc0xhc3RJbkZsb3dSdW4oKnJ1bikpCisgICAgICAgICAg
ICAgICAgJiYgIWlubGluZUFuY2VzdG9ySGFzRW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luKCp0aGlz
LCAqcnVuLT5ib3goKSkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBoYW5nRW5kV2lkdGggPSBy
ZW5kZXJUZXh0LmhhbmdhYmxlUHVuY3R1YXRpb25FbmRXaWR0aChydW4tPm1fc3RvcCAtIDEpOwor
ICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCArPSBoYW5nRW5kV2lkdGg7Cisg
ICAgICAgICAgICAgICAgaWYgKCFzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAg
ICAgICAgICAgICAgICAgICAgbG9naWNhbExlZnQgLT0gaGFuZ0VuZFdpZHRoOworICAgICAgICAg
ICAgICAgIGNhbkhhbmdQdW5jdHVhdGlvbkF0RW5kID0gZmFsc2U7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0ZXh0QWxpZ24gPT0gVGV4dEFsaWduTW9kZTo6
SnVzdGlmeSAmJiBydW4gIT0gdHJhaWxpbmdTcGFjZVJ1bikKKyAgICAgICAgICAgICAgICBjb21w
dXRlRXhwYW5zaW9uT3Bwb3J0dW5pdGllcygqdGhpcywgdGV4dEJveCwgcHJldmlvdXNSdW4sIHJ1
bi0+bmV4dCgpLCByZW5kZXJUZXh0LnN0cmluZ1ZpZXcocnVuLT5tX3N0YXJ0LCBydW4tPm1fc3Rv
cCksIHJ1bi0+Ym94KCktPmRpcmVjdGlvbigpKTsKKworICAgICAgICAgICAgaWYgKHVuc2lnbmVk
IGxlbmd0aCA9IHJlbmRlclRleHQudGV4dCgpLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFydW4tPm1fc3RhcnQgJiYgbmVlZHNXb3JkU3BhY2luZyAmJiBpc1NwYWNlT3JOZXdsaW5l
KHJlbmRlclRleHQuY2hhcmFjdGVyQXQocnVuLT5tX3N0YXJ0KSkpCisgICAgICAgICAgICAgICAg
ICAgIHRvdGFsTG9naWNhbFdpZHRoICs9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC5wYXJlbnQoKSwg
bGluZUluZm8pLmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKTsKKyAgICAgICAgICAgICAgICAv
LyBydW4tPm1fc3RhcnQgPT0gcnVuLT5tX3N0b3Agc2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZmYgdGhl
IHJ1biBpcyBhIHJlcGxhY2VkIHJ1biBmb3IgYmlkaTogaXNvbGF0ZS4KKyAgICAgICAgICAgICAg
ICBBU1NFUlQocnVuLT5tX3N0b3AgPiAwIHx8IHJ1bi0+bV9zdGFydCA9PSBydW4tPm1fc3RvcCk7
CisgICAgICAgICAgICAgICAgbmVlZHNXb3JkU3BhY2luZyA9IHJ1bi0+bV9zdG9wID09IGxlbmd0
aCAmJiAhaXNTcGFjZU9yTmV3bGluZShyZW5kZXJUZXh0LmNoYXJhY3RlckF0KHJ1bi0+bV9zdG9w
IC0gMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXRMb2dpY2FsV2lkdGhGb3JU
ZXh0UnVuKGxpbmVCb3gsIHJ1biwgcmVuZGVyVGV4dCwgdG90YWxMb2dpY2FsV2lkdGgsIGxpbmVJ
bmZvLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1l
bnRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbkhhbmdQdW5jdHVhdGlvbkF0
U3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5
ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoaXM8UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJl
cigpKSAmJiB0ZXh0QWxpZ24gPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiBydW4gIT0gdHJh
aWxpbmdTcGFjZVJ1biAmJiBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVyKCkp
LnJ1YnlCYXNlKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvKiBydWJ5QmFzZSA9IGRvd25jYXN0
PFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKTsKKyAgICAgICAgICAg
ICAgICBpZiAocnVieUJhc2UtPmZpcnN0Um9vdEJveCgpICYmICFydWJ5QmFzZS0+Zmlyc3RSb290
Qm94KCktPm5leHRSb290Qm94KCkgJiYgcnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VX
aGl0ZVNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVieUJhc2UtPnNldElzQWZ0ZXJF
eHBhbnNpb24oaXNBZnRlckV4cGFuc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0
byogbGVhZkNoaWxkID0gcnVieUJhc2UtPmZpcnN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgp
OyBsZWFmQ2hpbGQ7IGxlYWZDaGlsZCA9IGxlYWZDaGlsZC0+bmV4dExlYWZDaGlsZCgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzPElubGluZVRleHRCb3g+KCpsZWFmQ2hpbGQp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbXB1dGVFeHBhbnNpb25PcHBvcnR1bml0aWVzKCpydWJ5QmFzZSwgZG93bmNh
c3Q8SW5saW5lVGV4dEJveD4oKmxlYWZDaGlsZCksIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5k
ZXJlcigpKS5zdHJpbmdWaWV3KCksIGxlYWZDaGlsZC0+ZGlyZWN0aW9uKCkpOworICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIWVuY291bnRlcmVkSnVzdGlmaWVkUnVieSkKKyAgICAgICAgICAgICAgICBpc0Fm
dGVyRXhwYW5zaW9uID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghaXM8UmVuZGVySW5saW5l
PihydW4tPnJlbmRlcmVyKCkpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgcmVuZGVyQm94ID0g
ZG93bmNhc3Q8UmVuZGVyQm94PihydW4tPnJlbmRlcmVyKCkpOworICAgICAgICAgICAgICAgIGlm
IChpczxSZW5kZXJSdWJ5UnVuPihyZW5kZXJCb3gpKQorICAgICAgICAgICAgICAgICAgICBzZXRN
YXJnaW5zRm9yUnVieVJ1bihydW4sIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJlbmRlckJveCks
IHByZXZpb3VzUnVuID8gJnByZXZpb3VzUnVuLT5yZW5kZXJlcigpIDogbnVsbHB0ciwgbGluZUlu
Zm8pOworICAgICAgICAgICAgICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChsb2dpY2Fs
V2lkdGhGb3JDaGlsZChyZW5kZXJCb3gpKTsKKyAgICAgICAgICAgICAgICB0b3RhbExvZ2ljYWxX
aWR0aCArPSBtYXJnaW5TdGFydEZvckNoaWxkKHJlbmRlckJveCkgKyBtYXJnaW5FbmRGb3JDaGls
ZChyZW5kZXJCb3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG90YWxM
b2dpY2FsV2lkdGggKz0gcnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCk7CisgICAgICAgIHByZXZp
b3VzUnVuID0gcnVuOworICAgIH0KKworICAgIGlmIChpc0FmdGVyRXhwYW5zaW9uICYmICFleHBh
bnNpb25PcHBvcnR1bml0aWVzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBGSVhNRTogc2VlIDx3
ZWJraXQub3JnL2IvMTM5MzkzI2MxMT4KKyAgICAgICAgaW50IGxhc3RWYWxpZEV4cGFuc2lvbk9w
cG9ydHVuaXRpZXNJbmRleCA9IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuc2l6ZSgpIC0gMTsKKyAg
ICAgICAgd2hpbGUgKGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCA+PSAwICYm
ICFleHBhbnNpb25PcHBvcnR1bml0aWVzLmF0KGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRp
ZXNJbmRleCkpCisgICAgICAgICAgICAtLWxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJ
bmRleDsKKyAgICAgICAgaWYgKGxhc3RWYWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCA+
PSAwKSB7CisgICAgICAgICAgICBBU1NFUlQoZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hdChsYXN0
VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgpKTsKKyAgICAgICAgICAgIGV4cGFuc2lv
bk9wcG9ydHVuaXRpZXMuYXQobGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0luZGV4KS0t
OworICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudC0tOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGlzPFJlbmRlclJ1YnlCYXNlPigqdGhpcykgJiYgIWV4cGFuc2lvbk9w
cG9ydHVuaXR5Q291bnQpCisgICAgICAgIHRleHRBbGlnbiA9IFRleHRBbGlnbk1vZGU6OkNlbnRl
cjsKKworICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24sIGxpbmVC
b3gsIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZh
aWxhYmxlTG9naWNhbFdpZHRoLCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKKworICAgIGNv
bXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRUZXh0KGZpcnN0UnVuLCB0cmFpbGluZ1NwYWNlUnVu
LCBleHBhbnNpb25PcHBvcnR1bml0aWVzLCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCB0b3Rh
bExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKworICAgIHJldHVybiBydW47
Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVJbmxpbmVCb3goQmlkaVJ1biYgcnVu
LCBjb25zdCBSb290SW5saW5lQm94JiByb290TGluZUJveCkgY29uc3QKK3sKKyAgICBhdXRvKiBp
bmxpbmVCb3ggPSBydW4uYm94KCk7CisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgIGF1dG8qIGlu
bGluZVBhcmVudCA9IGlubGluZUJveC0+cGFyZW50KCk7CisgICAgd2hpbGUgKGlubGluZVBhcmVu
dCAmJiBpbmxpbmVQYXJlbnQgIT0gJnJvb3RMaW5lQm94KSB7CisgICAgICAgIEFTU0VSVCghaW5s
aW5lUGFyZW50LT5pc0RpcnR5KCkpOworICAgICAgICBpbmxpbmVQYXJlbnQgPSBpbmxpbmVQYXJl
bnQtPnBhcmVudCgpOworICAgIH0KKyAgICBBU1NFUlQoIXJvb3RMaW5lQm94LmlzRGlydHkoKSk7
CisjZW5kaWYKKyAgICBhdXRvKiBwYXJlbnQgPSBpbmxpbmVCb3gtPnBhcmVudCgpOworICAgIGlu
bGluZUJveC0+cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgYXV0byYgcmVuZGVyZXIgPSBydW4u
cmVuZGVyZXIoKTsKKyAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIpKQorICAgICAgICBk
b3duY2FzdDxSZW5kZXJUZXh0PihyZW5kZXJlcikucmVtb3ZlVGV4dEJveChkb3duY2FzdDxJbmxp
bmVUZXh0Qm94PigqaW5saW5lQm94KSk7CisgICAgZGVsZXRlIGlubGluZUJveDsKKyAgICBydW4u
c2V0Qm94KG51bGxwdHIpOworICAgIC8vIHJlbW92ZUZyb21QYXJlbnQoKSB1bm5lY2Vzc2FyaWx5
IGRpcnRpZXMgdGhlIGFuY2VzdG9yIHN1YnRyZWUuCisgICAgYXV0byogYW5jZXN0b3IgPSBwYXJl
bnQ7CisgICAgd2hpbGUgKGFuY2VzdG9yKSB7CisgICAgICAgIGFuY2VzdG9yLT5tYXJrRGlydHko
ZmFsc2UpOworICAgICAgICBpZiAoYW5jZXN0b3IgPT0gJnJvb3RMaW5lQm94KQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3ItPnBhcmVudCgpOworICAgIH0K
K30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9u
c0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogZmlyc3RSdW4sIEdseXBo
T3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxQb3Np
dGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpCit7CisgICAgc2V0TG9naWNhbEhlaWdo
dChsaW5lQm94LT5hbGlnbkJveGVzSW5CbG9ja0RpcmVjdGlvbihsb2dpY2FsSGVpZ2h0KCksIHRl
eHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpKTsKKworICAgIC8vIE5vdyBtYWtl
IHN1cmUgd2UgcGxhY2UgcmVwbGFjZWQgcmVuZGVyIG9iamVjdHMgY29ycmVjdGx5LgorICAgIGZv
ciAoYXV0byogcnVuID0gZmlyc3RSdW47IHJ1bjsgcnVuID0gcnVuLT5uZXh0KCkpIHsKKyAgICAg
ICAgQVNTRVJUKHJ1bi0+Ym94KCkpOworICAgICAgICBpZiAoIXJ1bi0+Ym94KCkpCisgICAgICAg
ICAgICBjb250aW51ZTsgLy8gU2tpcCBydW5zIHdpdGggbm8gbGluZSBib3hlcy4KKworICAgICAg
ICAvLyBBbGlnbiBwb3NpdGlvbmVkIGJveGVzIHdpdGggdGhlIHRvcCBvZiB0aGUgbGluZSBib3gu
ICBUaGlzIGlzCisgICAgICAgIC8vIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uIG9mIGFuIGFw
cHJvcHJpYXRlIHkgcG9zaXRpb24uCisgICAgICAgIGF1dG8mIHJlbmRlcmVyID0gcnVuLT5yZW5k
ZXJlcigpOworICAgICAgICBpZiAocmVuZGVyZXIuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisg
ICAgICAgICAgICBydW4tPmJveCgpLT5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxIZWlnaHQoKSk7CisK
KyAgICAgICAgLy8gUG9zaXRpb24gaXMgdXNlZCB0byBwcm9wZXJseSBwb3NpdGlvbiBib3RoIHJl
cGxhY2VkIGVsZW1lbnRzIGFuZAorICAgICAgICAvLyB0byB1cGRhdGUgdGhlIHN0YXRpYyBub3Jt
YWwgZmxvdyB4L3kgb2YgcG9zaXRpb25lZCBlbGVtZW50cy4KKyAgICAgICAgYm9vbCBpbmxpbmVC
b3hJc1JlZHVuZGFudCA9IGZhbHNlOworICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVy
ZXIpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVUZXh0Qm94ID0gZG93bmNhc3Q8SW5saW5l
VGV4dEJveD4oKnJ1bi0+Ym94KCkpOworICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4o
cmVuZGVyZXIpLnBvc2l0aW9uTGluZUJveChpbmxpbmVUZXh0Qm94KTsKKyAgICAgICAgICAgIGlu
bGluZUJveElzUmVkdW5kYW50ID0gIWlubGluZVRleHRCb3guaGFzVGV4dENvbnRlbnQoKTsKKyAg
ICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJCb3g+KHJlbmRlcmVyKSkgeworICAgICAgICAgICAg
ZG93bmNhc3Q8UmVuZGVyQm94PihyZW5kZXJlcikucG9zaXRpb25MaW5lQm94KGRvd25jYXN0PElu
bGluZUVsZW1lbnRCb3g+KCpydW4tPmJveCgpKSk7CisgICAgICAgICAgICBpbmxpbmVCb3hJc1Jl
ZHVuZGFudCA9IHJlbmRlcmVyLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpOworICAgICAgICB9IGVs
c2UgaWYgKGlzPFJlbmRlckxpbmVCcmVhaz4ocmVuZGVyZXIpKQorICAgICAgICAgICAgZG93bmNh
c3Q8UmVuZGVyTGluZUJyZWFrPihyZW5kZXJlcikucmVwbGFjZUlubGluZUJveFdyYXBwZXIoZG93
bmNhc3Q8SW5saW5lRWxlbWVudEJveD4oKnJ1bi0+Ym94KCkpKTsKKyAgICAgICAgLy8gQ2hlY2sg
aWYgd2UgbmVlZCB0byBrZWVwIHRoaXMgYm94IG9uIHRoZSBsaW5lIGF0IGFsbC4KKyAgICAgICAg
aWYgKGlubGluZUJveElzUmVkdW5kYW50KQorICAgICAgICAgICAgcmVtb3ZlSW5saW5lQm94KCpy
dW4sICpsaW5lQm94KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NvbGxhcHNp
YmxlU3BhY2UoVUNoYXIgY2hhcmFjdGVyLCBjb25zdCBSZW5kZXJUZXh0JiByZW5kZXJlcikKK3sK
KyAgICBpZiAoY2hhcmFjdGVyID09ICcgJyB8fCBjaGFyYWN0ZXIgPT0gJ1x0JyB8fCBjaGFyYWN0
ZXIgPT0gc29mdEh5cGhlbikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGNoYXJhY3Rl
ciA9PSAnXG4nKQorICAgICAgICByZXR1cm4gIXJlbmRlcmVyLnN0eWxlKCkucHJlc2VydmVOZXds
aW5lKCk7CisgICAgaWYgKGNoYXJhY3RlciA9PSBub0JyZWFrU3BhY2UpCisgICAgICAgIHJldHVy
biByZW5kZXJlci5zdHlsZSgpLm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNwYWNlOworICAgIHJl
dHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CitzdGF0
aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRGaXJzdFRyYWlsaW5nU3BhY2UoY29uc3QgUmVuZGVyVGV4
dCYgbGFzdFRleHQsIGNvbnN0IENoYXJhY3RlclR5cGUqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0
YXJ0LCB1bnNpZ25lZCBzdG9wKQoreworICAgIHVuc2lnbmVkIGZpcnN0U3BhY2UgPSBzdG9wOwor
ICAgIHdoaWxlIChmaXJzdFNwYWNlID4gc3RhcnQpIHsKKyAgICAgICAgVUNoYXIgY3VycmVudCA9
IGNoYXJhY3RlcnNbZmlyc3RTcGFjZSAtIDFdOworICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVT
cGFjZShjdXJyZW50LCBsYXN0VGV4dCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmly
c3RTcGFjZS0tOworICAgIH0KKworICAgIHJldHVybiBmaXJzdFNwYWNlOworfQorCitpbmxpbmUg
QmlkaVJ1biogUmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlz
dDxCaWRpUnVuPiYgYmlkaVJ1bnMsIEJpZGlDb250ZXh0KiBjdXJyZW50Q29udGV4dCkKK3sKKyAg
ICBpZiAoIWJpZGlSdW5zLnJ1bkNvdW50KCkKKyAgICAgICAgfHwgIWJpZGlSdW5zLmxvZ2ljYWxs
eUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5zdHlsZSgpLmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgp
CisgICAgICAgIHx8ICFiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkuc3R5
bGUoKS5hdXRvV3JhcCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIEJpZGlSdW4q
IHRyYWlsaW5nU3BhY2VSdW4gPSBiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCk7CisgICAgY29u
c3QgUmVuZGVyT2JqZWN0JiBsYXN0T2JqZWN0ID0gdHJhaWxpbmdTcGFjZVJ1bi0+cmVuZGVyZXIo
KTsKKyAgICBpZiAoIWlzPFJlbmRlclRleHQ+KGxhc3RPYmplY3QpKQorICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKworICAgIGNvbnN0IFJlbmRlclRleHQmIGxhc3RUZXh0ID0gZG93bmNhc3Q8UmVu
ZGVyVGV4dD4obGFzdE9iamVjdCk7CisgICAgdW5zaWduZWQgZmlyc3RTcGFjZTsKKyAgICBpZiAo
bGFzdFRleHQudGV4dCgpLmlzOEJpdCgpKQorICAgICAgICBmaXJzdFNwYWNlID0gZmluZEZpcnN0
VHJhaWxpbmdTcGFjZShsYXN0VGV4dCwgbGFzdFRleHQudGV4dCgpLmNoYXJhY3RlcnM4KCksIHRy
YWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCksIHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSk7CisgICAg
ZWxzZQorICAgICAgICBmaXJzdFNwYWNlID0gZmluZEZpcnN0VHJhaWxpbmdTcGFjZShsYXN0VGV4
dCwgbGFzdFRleHQudGV4dCgpLmNoYXJhY3RlcnMxNigpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdGFy
dCgpLCB0cmFpbGluZ1NwYWNlUnVuLT5zdG9wKCkpOworCisgICAgaWYgKGZpcnN0U3BhY2UgPT0g
dHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAg
IFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGUoKS5kaXJlY3Rpb24oKTsKKyAgICBib29s
IHNob3VsZFJlb3JkZXIgPSB0cmFpbGluZ1NwYWNlUnVuICE9IChkaXJlY3Rpb24gPT0gVGV4dERp
cmVjdGlvbjo6TFRSID8gYmlkaVJ1bnMubGFzdFJ1bigpIDogYmlkaVJ1bnMuZmlyc3RSdW4oKSk7
CisgICAgaWYgKGZpcnN0U3BhY2UgIT0gdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSkgeworICAg
ICAgICBCaWRpQ29udGV4dCogYmFzZUNvbnRleHQgPSBjdXJyZW50Q29udGV4dDsKKyAgICAgICAg
d2hpbGUgKEJpZGlDb250ZXh0KiBwYXJlbnQgPSBiYXNlQ29udGV4dC0+cGFyZW50KCkpCisgICAg
ICAgICAgICBiYXNlQ29udGV4dCA9IHBhcmVudDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8
QmlkaVJ1bj4gbmV3VHJhaWxpbmdSdW4gPSBzdGQ6Om1ha2VfdW5pcXVlPEJpZGlSdW4+KGZpcnN0
U3BhY2UsIHRyYWlsaW5nU3BhY2VSdW4tPm1fc3RvcCwgdHJhaWxpbmdTcGFjZVJ1bi0+cmVuZGVy
ZXIoKSwgYmFzZUNvbnRleHQsIFVfT1RIRVJfTkVVVFJBTCk7CisgICAgICAgIHRyYWlsaW5nU3Bh
Y2VSdW4tPm1fc3RvcCA9IGZpcnN0U3BhY2U7CisgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4gPSBu
ZXdUcmFpbGluZ1J1bi5nZXQoKTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0RGlyZWN0
aW9uOjpMVFIpCisgICAgICAgICAgICBiaWRpUnVucy5hcHBlbmRSdW4oV1RGTW92ZShuZXdUcmFp
bGluZ1J1bikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiaWRpUnVucy5wcmVwZW5kUnVu
KFdURk1vdmUobmV3VHJhaWxpbmdSdW4pKTsKKyAgICAgICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VS
dW47CisgICAgfQorICAgIGlmICghc2hvdWxkUmVvcmRlcikKKyAgICAgICAgcmV0dXJuIHRyYWls
aW5nU3BhY2VSdW47CisKKyAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikg
eworICAgICAgICBiaWRpUnVucy5tb3ZlUnVuVG9FbmQodHJhaWxpbmdTcGFjZVJ1bik7CisgICAg
ICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1fbGV2ZWwgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAg
IGJpZGlSdW5zLm1vdmVSdW5Ub0JlZ2lubmluZyh0cmFpbGluZ1NwYWNlUnVuKTsKKyAgICAgICAg
dHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9IDE7CisgICAgfQorICAgIHJldHVybiB0cmFpbGlu
Z1NwYWNlUnVuOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kRmxvYXRpbmdPYmpl
Y3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0JiBmbG9hdGluZ09iamVjdCkKK3sKKyAgICBBU1NF
UlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdPYmplY3Qub3JpZ2luYXRpbmdM
aW5lKCkpOworICAgIEFTU0VSVChsYXN0Um9vdEJveCgpKTsKKyAgICBmbG9hdGluZ09iamVjdC5z
ZXRPcmlnaW5hdGluZ0xpbmUoKmxhc3RSb290Qm94KCkpOworICAgIGxhc3RSb290Qm94KCktPmFw
cGVuZEZsb2F0KGZsb2F0aW5nT2JqZWN0LnJlbmRlcmVyKCkpOworfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgbm90aWZ5UmVzb2x2ZXJUb1Jlc3VtZUluSXNvbGF0ZShJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyLCBSZW5kZXJPYmplY3QqIHJvb3QsIFJlbmRlck9iamVjdCogc3RhcnRPYmplY3Qp
Cit7CisgICAgaWYgKHJvb3QgIT0gc3RhcnRPYmplY3QpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0
KiBwYXJlbnQgPSBzdGFydE9iamVjdC0+cGFyZW50KCk7CisgICAgICAgIG5vdGlmeVJlc29sdmVy
VG9SZXN1bWVJbklzb2xhdGUocmVzb2x2ZXIsIHJvb3QsIHBhcmVudCk7CisgICAgICAgIG5vdGlm
eU9ic2VydmVyRW50ZXJlZE9iamVjdCgmcmVzb2x2ZXIsIHN0YXJ0T2JqZWN0KTsKKyAgICB9Cit9
CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRVcFJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUoSW5s
aW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgSW5saW5lQmlkaVJlc29sdmVyJiB0b3BSZXNvbHZl
ciwgQmlkaVJ1biYgaXNvbGF0ZWRSdW4sIFJlbmRlck9iamVjdCogcm9vdCwgUmVuZGVyT2JqZWN0
KiBzdGFydE9iamVjdCkKK3sKKyAgICAvLyBTZXQgdXAgbV93aGl0ZXNwYWNlQ29sbGFwc2luZ1N0
YXRlCisgICAgcmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSgpID0gdG9wUmVzb2x2
ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSgpOworICAgIHJlc29sdmVyLndoaXRlc3BhY2VD
b2xsYXBzaW5nU3RhdGUoKS5zZXRDdXJyZW50VHJhbnNpdGlvbih0b3BSZXNvbHZlci53aGl0ZXNw
YWNlQ29sbGFwc2luZ1RyYW5zaXRpb25Gb3JJc29sYXRlZFJ1bihpc29sYXRlZFJ1bikpOworCisg
ICAgLy8gU2V0IHVwIG1fbmVzdGVkSXNvbGF0ZUNvdW50CisgICAgbm90aWZ5UmVzb2x2ZXJUb1Jl
c3VtZUluSXNvbGF0ZShyZXNvbHZlciwgcm9vdCwgc3RhcnRPYmplY3QpOworfQorCisvLyBGSVhN
RTogQmlkaVJlc29sdmVyIHNob3VsZCBoYXZlIHRoaXMgbG9naWMuCitzdGF0aWMgaW5saW5lIHZv
aWQgY29uc3RydWN0QmlkaVJ1bnNGb3JTZWdtZW50KElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVz
b2x2ZXIsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZE9mUnVucywgVmlzdWFsRGlyZWN0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIGJvb2wgcHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KQoreworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcGFzcyBh
IEJpZGlSdW5MaXN0IGludG8gY3JlYXRlQmlkaVJ1bnNGb3JMaW5lIGluc3RlYWQKKyAgICAvLyBv
ZiB0aGUgcmVzb2x2ZXIgb3duaW5nIHRoZSBydW5zLgorICAgIEFTU0VSVCgmdG9wUmVzb2x2ZXIu
cnVucygpID09ICZiaWRpUnVucyk7CisgICAgQVNTRVJUKHRvcFJlc29sdmVyLnBvc2l0aW9uKCkg
IT0gZW5kT2ZSdW5zKTsKKyAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRSb290ID0gdG9wUmVzb2x2
ZXIucG9zaXRpb24oKS5yb290KCk7CisgICAgdG9wUmVzb2x2ZXIuY3JlYXRlQmlkaVJ1bnNGb3JM
aW5lKGVuZE9mUnVucywgb3ZlcnJpZGUsIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CisKKyAg
ICB3aGlsZSAoIXRvcFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmlzRW1wdHkoKSkgeworICAgICAg
ICAvLyBJdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggb3JkZXIgd2UgcmVzb2x2ZSB0aGUgcnVucyBh
cyBsb25nIGFzIHdlIHJlc29sdmUgdGhlbSBhbGwuCisgICAgICAgIGF1dG8gaXNvbGF0ZWRSdW4g
PSBXVEZNb3ZlKHRvcFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmxhc3QoKSk7CisgICAgICAgIHRv
cFJlc29sdmVyLmlzb2xhdGVkUnVucygpLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgY3VycmVudFJv
b3QgPSAmaXNvbGF0ZWRSdW4ucm9vdDsKKworICAgICAgICBSZW5kZXJPYmplY3QmIHN0YXJ0T2Jq
ZWN0ID0gaXNvbGF0ZWRSdW4ub2JqZWN0OworCisgICAgICAgIC8vIE9ubHkgaW5saW5lcyBtYWtl
IHNlbnNlIHdpdGggdW5pY29kZS1iaWRpOiBpc29sYXRlIChibG9ja3MgYXJlIGFscmVhZHkgaXNv
bGF0ZWQpLgorICAgICAgICAvLyBGSVhNRTogQmVjYXVzZSBlbnRlcklzb2xhdGUgaXMgbm90IHBh
c3NlZCBhIFJlbmRlck9iamVjdCwgd2UgaGF2ZSB0byBjcmF3bCB1cCB0aGUKKyAgICAgICAgLy8g
dHJlZSB0byBzZWUgd2hpY2ggcGFyZW50IGlubGluZSBpcyB0aGUgaXNvbGF0ZS4gV2UgY291bGQg
Y2hhbmdlIGVudGVySXNvbGF0ZQorICAgICAgICAvLyB0byB0YWtlIGEgUmVuZGVyT2JqZWN0IGFu
ZCBkbyB0aGlzIGxvZ2ljIHRoZXJlLCBidXQgdGhhdCB3b3VsZCBiZSBhIGxheWVyaW5nCisgICAg
ICAgIC8vIHZpb2xhdGlvbiBmb3IgQmlkaVJlc29sdmVyICh3aGljaCBrbm93cyBub3RoaW5nIGFi
b3V0IFJlbmRlck9iamVjdCkuCisgICAgICAgIFJlbmRlcklubGluZSogaXNvbGF0ZWRJbmxpbmUg
PSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KGhpZ2hlc3RDb250YWluaW5nSXNvbGF0ZVdpdGhpblJv
b3Qoc3RhcnRPYmplY3QsIGN1cnJlbnRSb290KSk7CisgICAgICAgIEFTU0VSVChpc29sYXRlZElu
bGluZSk7CisKKyAgICAgICAgSW5saW5lQmlkaVJlc29sdmVyIGlzb2xhdGVkUmVzb2x2ZXI7Cisg
ICAgICAgIEVVbmljb2RlQmlkaSB1bmljb2RlQmlkaSA9IGlzb2xhdGVkSW5saW5lLT5zdHlsZSgp
LnVuaWNvZGVCaWRpKCk7CisgICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uOworICAgICAg
ICBpZiAodW5pY29kZUJpZGkgPT0gUGxhaW50ZXh0KQorICAgICAgICAgICAgZGV0ZXJtaW5lRGly
ZWN0aW9uYWxpdHkoZGlyZWN0aW9uLCBJbmxpbmVJdGVyYXRvcihpc29sYXRlZElubGluZSwgJmlz
b2xhdGVkUnVuLm9iamVjdCwgMCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VS
VCh1bmljb2RlQmlkaSA9PSBJc29sYXRlIHx8IHVuaWNvZGVCaWRpID09IElzb2xhdGVPdmVycmlk
ZSk7CisgICAgICAgICAgICBkaXJlY3Rpb24gPSBpc29sYXRlZElubGluZS0+c3R5bGUoKS5kaXJl
Y3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpc29sYXRlZFJlc29sdmVyLnNldFN0YXR1cyhC
aWRpU3RhdHVzKGRpcmVjdGlvbiwgaXNPdmVycmlkZSh1bmljb2RlQmlkaSkpKTsKKworICAgICAg
ICBzZXRVcFJlc29sdmVyVG9SZXN1bWVJbklzb2xhdGUoaXNvbGF0ZWRSZXNvbHZlciwgdG9wUmVz
b2x2ZXIsIGlzb2xhdGVkUnVuLnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRJbmxpbmUsICZzdGFydE9i
amVjdCk7CisKKyAgICAgICAgLy8gVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGlzIHRoZSBiZWdpbm5p
bmcgb2YgdGhlIGZpcnN0IHJ1biB3aXRoaW4gdGhlIGlzb2xhdGUgdGhhdCB3YXMgaWRlbnRpZmll
ZAorICAgICAgICAvLyBkdXJpbmcgdGhlIGVhcmxpZXIgY2FsbCB0byBjcmVhdGVCaWRpUnVuc0Zv
ckxpbmUuIFRoaXMgY2FuIGJlIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlCisgICAgICAgIC8v
IGZpcnN0IHJ1biB3aXRoaW4gdGhlIGlzb2xhdGUuCisgICAgICAgIElubGluZUl0ZXJhdG9yIGl0
ZXIgPSBJbmxpbmVJdGVyYXRvcihpc29sYXRlZElubGluZSwgJnN0YXJ0T2JqZWN0LCBpc29sYXRl
ZFJ1bi5wb3NpdGlvbik7CisgICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuc2V0UG9zaXRpb25JZ25v
cmluZ05lc3RlZElzb2xhdGVzKGl0ZXIpOworCisgICAgICAgIC8vIFdlIHN0b3AgYXQgdGhlIG5l
eHQgZW5kIG9mIGxpbmU7IHdlIG1heSByZS1lbnRlciB0aGlzIGlzb2xhdGUgaW4gdGhlIG5leHQg
Y2FsbCB0byBjb25zdHJ1Y3RCaWRpUnVucygpLgorICAgICAgICAvLyBGSVhNRTogV2hhdCBzaG91
bGQgZW5kIGFuZCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgYmU/CisgICAgICAgIC8vIHJuaXdh
IHNheXMgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5IGlzIGp1c3QgYSBXaW5JRSBoYWNrIGFuZCBj
b3VsZCBhbHdheXMgYmUgZmFsc2UgaGVyZT8KKyAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5jcmVh
dGVCaWRpUnVuc0ZvckxpbmUoZW5kT2ZSdW5zLCBOb1Zpc3VhbE92ZXJyaWRlLCBwcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkpOworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSB0
aGUgcnVucyBmcm9tIHRoZSByZXNvbHZlci4KKyAgICAgICAgLy8gV2UncmUgbm90IGd1YXJhbnRl
ZWQgdG8gZ2V0IGFueSBCaWRpUnVucyBpbiB0aGUgcHJldmlvdXMgc3RlcC4gSWYgd2UgZG9uJ3Qs
IHdlIGFsbG93IHRoZSBwbGFjZWhvbGRlcgorICAgICAgICAvLyBpdHNlbGYgdG8gYmUgdHVybmVk
IGludG8gYW4gSW5saW5lQm94LiBXZSBjYW4ndCByZW1vdmUgaXQgaGVyZSB3aXRob3V0IHBvdGVu
dGlhbGx5IGxvc2luZyB0cmFjayBvZgorICAgICAgICAvLyB0aGUgbG9naWNhbGx5IGxhc3QgcnVu
LgorICAgICAgICBpZiAoaXNvbGF0ZWRSZXNvbHZlci5ydW5zKCkucnVuQ291bnQoKSkKKyAgICAg
ICAgICAgIGJpZGlSdW5zLnJlcGxhY2VSdW5XaXRoUnVucygmaXNvbGF0ZWRSdW4ucnVuVG9SZXBs
YWNlLCBpc29sYXRlZFJlc29sdmVyLnJ1bnMoKSk7CisKKyAgICAgICAgLy8gSWYgd2UgZW5jb3Vu
dGVyZWQgYW55IG5lc3RlZCBpc29sYXRlIHJ1bnMsIGp1c3QgbW92ZSB0aGVtCisgICAgICAgIC8v
IHRvIHRoZSB0b3AgcmVzb2x2ZXIncyBsaXN0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICAgICAg
ICB3aGlsZSAoIWlzb2xhdGVkUmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBhdXRvIHJ1bldpdGhDb250ZXh0ID0gV1RGTW92ZShpc29sYXRlZFJlc29sdmVy
Lmlzb2xhdGVkUnVucygpLmxhc3QoKSk7CisgICAgICAgICAgICBpc29sYXRlZFJlc29sdmVyLmlz
b2xhdGVkUnVucygpLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIHRvcFJlc29sdmVyLnNldFdo
aXRlc3BhY2VDb2xsYXBzaW5nVHJhbnNpdGlvbkZvcklzb2xhdGVkUnVuKHJ1bldpdGhDb250ZXh0
LnJ1blRvUmVwbGFjZSwgaXNvbGF0ZWRSZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1RyYW5z
aXRpb25Gb3JJc29sYXRlZFJ1bihydW5XaXRoQ29udGV4dC5ydW5Ub1JlcGxhY2UpKTsKKyAgICAg
ICAgICAgIHRvcFJlc29sdmVyLmlzb2xhdGVkUnVucygpLmFwcGVuZChXVEZNb3ZlKHJ1bldpdGhD
b250ZXh0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY29uc3Ry
dWN0cyBsaW5lIGJveGVzIGZvciBhbGwgb2YgdGhlIHRleHQgcnVucyBpbiB0aGUgcmVzb2x2ZXIg
YW5kIGNvbXB1dGVzIHRoZWlyIHBvc2l0aW9uLgorUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tG
bG93OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxldmVsLCBCaWRp
UnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExp
bmVJbmZvJiBsaW5lSW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRN
ZWFzdXJlbWVudHMpCit7CisgICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQorICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhpcyBvbmx5IGRvbmUgd2hl
biB3ZSBoYWQgcnVucz8KKyAgICBsaW5lSW5mby5zZXRMYXN0TGluZSghZW5kLnJlbmRlcmVyKCkp
OworCisgICAgUm9vdElubGluZUJveCogbGluZUJveCA9IGNvbnN0cnVjdExpbmUoYmlkaVJ1bnMs
IGxpbmVJbmZvKTsKKyAgICBpZiAoIWxpbmVCb3gpCisgICAgICAgIHJldHVybiBudWxscHRyOwor
CisgICAgbGluZUJveC0+c2V0QmlkaUxldmVsKGJpZGlMZXZlbCk7CisgICAgbGluZUJveC0+c2V0
RW5kc1dpdGhCcmVhayhsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSk7CisgICAg
CisgICAgYm9vbCBpc1NWR1Jvb3RJbmxpbmVCb3ggPSBpczxTVkdSb290SW5saW5lQm94PigqbGlu
ZUJveCk7CisgICAgCisgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAgdGV4dEJv
eERhdGFNYXA7CisgICAgCisgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBy
dW5zIGhvcml6b250YWxseS4KKyAgICBpZiAoIWlzU1ZHUm9vdElubGluZUJveCkKKyAgICAgICAg
Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgbGluZUluZm8s
IGJpZGlSdW5zLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpLCB0ZXh0
Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB3b3JkTWVhc3VyZW1lbnRzKTsKKyAg
ICAKKyAgICAvLyBOb3cgcG9zaXRpb24gb3VyIHRleHQgcnVucyB2ZXJ0aWNhbGx5LgorICAgIGNv
bXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgYmlkaVJ1bnMuZmly
c3RSdW4oKSwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7CisgICAgCisg
ICAgLy8gU1ZHIHRleHQgbGF5b3V0IGNvZGUgY29tcHV0ZXMgdmVydGljYWwgJiBob3Jpem9udGFs
IHBvc2l0aW9ucyBvbiBpdHMgb3duLgorICAgIC8vIE5vdGUgdGhhdCB3ZSBzdGlsbCBuZWVkIHRv
IGV4ZWN1dGUgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZSgpIGFzCisgICAgLy8gaXQg
Y2FsbHMgSW5saW5lVGV4dEJveDo6cG9zaXRpb25MaW5lQm94KCksIHdoaWNoIHRyYWNrcyB3aGV0
aGVyIHRoZSBib3gKKyAgICAvLyBjb250YWlucyByZXZlcnNlZCB0ZXh0IG9yIG5vdC4gSWYgd2Ug
d291bGRuJ3QgZG8gdGhhdCBlZGl0aW5nIGFuZCB0aHVzCisgICAgLy8gdGV4dCBzZWxlY3Rpb24g
aW4gUlRMIGJveGVzIHdvdWxkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgorICAgIGlmIChpc1NWR1Jv
b3RJbmxpbmVCb3gpIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04o
aXNTVkdUZXh0KCkpOworICAgICAgICBkb3duY2FzdDxTVkdSb290SW5saW5lQm94PigqbGluZUJv
eCkuY29tcHV0ZVBlckNoYXJhY3RlckxheW91dEluZm9ybWF0aW9uKCk7CisgICAgfQorICAgIAor
ICAgIC8vIENvbXB1dGUgb3VyIG92ZXJmbG93IG5vdy4KKyAgICBsaW5lQm94LT5jb21wdXRlT3Zl
cmZsb3cobGluZUJveC0+bGluZVRvcCgpLCBsaW5lQm94LT5saW5lQm90dG9tKCksIHRleHRCb3hE
YXRhTWFwKTsKKyAgICAKKyAgICByZXR1cm4gbGluZUJveDsKK30KKworc3RhdGljIHZvaWQgZGVs
ZXRlTGluZVJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIFJvb3RJbmxpbmVCb3gq
IHN0YXJ0TGluZSwgUm9vdElubGluZUJveCogc3RvcExpbmUgPSAwKQoreworICAgIFJvb3RJbmxp
bmVCb3gqIGJveFRvRGVsZXRlID0gc3RhcnRMaW5lOworICAgIHdoaWxlIChib3hUb0RlbGV0ZSAm
JiBib3hUb0RlbGV0ZSAhPSBzdG9wTGluZSkgeworICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVS
ZXBhaW50UmFuZ2VGcm9tQm94KGJveFRvRGVsZXRlKTsKKyAgICAgICAgLy8gTm90ZTogZGVsZXRl
TGluZVJhbmdlKGZpcnN0Um9vdEJveCgpKSBpcyBub3QgaWRlbnRpY2FsIHRvIGRlbGV0ZUxpbmVC
b3hUcmVlKCkuCisgICAgICAgIC8vIGRlbGV0ZUxpbmVCb3hUcmVlIHVzZXMgbmV4dExpbmVCb3go
KSBpbnN0ZWFkIG9mIG5leHRSb290Qm94KCkgd2hlbiB0cmF2ZXJzaW5nLgorICAgICAgICBSb290
SW5saW5lQm94KiBuZXh0ID0gYm94VG9EZWxldGUtPm5leHRSb290Qm94KCk7CisgICAgICAgIGJv
eFRvRGVsZXRlLT5kZWxldGVMaW5lKCk7CisgICAgICAgIGJveFRvRGVsZXRlID0gbmV4dDsKKyAg
ICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlcGFpbnREaXJ0eUZsb2F0cyhMaW5lTGF5b3V0U3RhdGU6
OkZsb2F0TGlzdCYgZmxvYXRzKQoreworICAgIC8vIEZsb2F0cyB0aGF0IGRpZCBub3QgaGF2ZSBs
YXlvdXQgZGlkIG5vdCByZXBhaW50IHdoZW4gd2UgbGFpZCB0aGVtIG91dC4gVGhleSB3b3VsZCBo
YXZlCisgICAgLy8gcGFpbnRlZCBieSBub3cgaWYgdGhleSBoYWQgbW92ZWQsIGJ1dCBpZiB0aGV5
IHN0YXllZCBhdCAoMCwgMCksIHRoZXkgc3RpbGwgbmVlZCB0byBiZQorICAgIC8vIHBhaW50ZWQu
CisgICAgZm9yIChhdXRvJiBmbG9hdEJveCA6IGZsb2F0cykgeworICAgICAgICBpZiAoZmxvYXRC
b3gtPmV2ZXJIYWRMYXlvdXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhdXRv
JiBib3ggPSBmbG9hdEJveC0+cmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKCFib3gueCgpICYmICFi
b3gueSgpICYmIGJveC5jaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKSkKKyAgICAgICAgICAg
IGJveC5yZXBhaW50KCk7CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0
UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lubGlu
ZUNoaWxkKQoreworICAgIC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGly
dHkgbGluZQorICAgIElubGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKKyAgICBSb290SW5saW5l
Qm94KiBzdGFydExpbmUgPSBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKGxheW91dFN0YXRlLCByZXNv
bHZlcik7CisgICAgCisgICAgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPSAw
OworICAgIGlmIChzdGFydExpbmUpIHsKKyAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBsaW5l
ID0gc3RhcnRMaW5lLT5wcmV2Um9vdEJveCgpOyBsaW5lICYmIGxpbmUtPmlzSHlwaGVuYXRlZCgp
OyBsaW5lID0gbGluZS0+cHJldlJvb3RCb3goKSkKKyAgICAgICAgICAgIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzKys7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgd291bGQgbWFrZSBt
b3JlIHNlbnNlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbiwgYnV0IHNpbmNlCisgICAgLy8gZGV0
ZXJtaW5lU3RhcnRQb3NpdGlvbiBjYW4gY2hhbmdlIHRoZSBmdWxsTGF5b3V0IGZsYWcgd2UgaGF2
ZSB0byBkbyB0aGlzIGhlcmUuIEZhaWx1cmUgdG8gY2FsbAorICAgIC8vIGRldGVybWluZVN0YXJ0
UG9zaXRpb24gZmlyc3Qgd2lsbCBicmVhayBmYXN0L3JlcGFpbnQvbGluZS1mbG93LXdpdGgtZmxv
YXRzLTkuaHRtbC4KKyAgICBpZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkgJiYgaGFzSW5s
aW5lQ2hpbGQgJiYgIXNlbGZOZWVkc0xheW91dCgpKSB7CisgICAgICAgIHNldE5lZWRzTGF5b3V0
KE1hcmtPbmx5VGhpcyk7IC8vIE1hcmsgYXMgbmVlZGluZyBhIGZ1bGwgbGF5b3V0IHRvIGZvcmNl
IHVzIHRvIHJlcGFpbnQuCisgICAgICAgIGlmICghdmlldygpLmZyYW1lVmlldygpLmxheW91dENv
bnRleHQoKS5uZWVkc0Z1bGxSZXBhaW50KCkgJiYgaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSAmJiBo
YXNSZXBhaW50TGF5b3V0UmVjdHMoKSkgeworICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0
ZWQgdW50aWwgd2Ugd2VyZSBhbHJlYWR5IGluc2lkZSBsYXlvdXQgdG8gZGlzY292ZXIKKyAgICAg
ICAgICAgIC8vIHRoYXQgdGhlIGJsb2NrIHJlYWxseSBuZWVkZWQgYSBmdWxsIGxheW91dCwgd2Ug
bWlzc2VkIG91ciBjaGFuY2UgdG8gcmVwYWludCB0aGUgbGF5ZXIKKyAgICAgICAgICAgIC8vIGJl
Zm9yZSBsYXlvdXQgc3RhcnRlZC4gIEx1Y2tpbHkgdGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJl
cGFpbnQgcmVjdCBmb3IgaXRzIG9yaWdpbmFsCisgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQg
c2l6ZSwgYW5kIHNvIHdlIGNhbiB1c2UgdGhhdCB0byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93
LgorICAgICAgICAgICAgcmVwYWludFVzaW5nQ29udGFpbmVyKGNvbnRhaW5lckZvclJlcGFpbnQo
KSwgcmVwYWludExheW91dFJlY3RzKCkubV9yZXBhaW50UmVjdCk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAoY29udGFpbnNGbG9hdHMoKSkKKyAgICAgICAgbGF5b3V0U3RhdGUuZmxvYXRM
aXN0KCkuc2V0TGFzdEZsb2F0KG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5sYXN0KCkuZ2V0KCkp
OworCisgICAgLy8gV2UgYWxzbyBmaW5kIHRoZSBmaXJzdCBjbGVhbiBsaW5lIGFuZCBleHRyYWN0
IHRoZXNlIGxpbmVzLiAgV2Ugd2lsbCBhZGQgdGhlbSBiYWNrCisgICAgLy8gaWYgd2UgZGV0ZXJt
aW5lIHRoYXQgd2UncmUgYWJsZSB0byBzeW5jaHJvbml6ZSBhZnRlciBoYW5kbGluZyBhbGwgb3Vy
IGRpcnR5IGxpbmVzLgorICAgIElubGluZUl0ZXJhdG9yIGNsZWFuTGluZVN0YXJ0OworICAgIEJp
ZGlTdGF0dXMgY2xlYW5MaW5lQmlkaVN0YXR1czsKKyAgICBpZiAoIWxheW91dFN0YXRlLmlzRnVs
bExheW91dCgpICYmIHN0YXJ0TGluZSkKKyAgICAgICAgZGV0ZXJtaW5lRW5kUG9zaXRpb24obGF5
b3V0U3RhdGUsIHN0YXJ0TGluZSwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlTdGF0dXMp
OworCisgICAgaWYgKHN0YXJ0TGluZSkgeworICAgICAgICBpZiAoIWxheW91dFN0YXRlLnVzZXNS
ZXBhaW50Qm91bmRzKCkpCisgICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRSZXBhaW50UmFuZ2Uo
bG9naWNhbEhlaWdodCgpKTsKKyAgICAgICAgZGVsZXRlTGluZVJhbmdlKGxheW91dFN0YXRlLCBz
dGFydExpbmUpOworICAgIH0KKworICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkg
JiYgbGFzdFJvb3RCb3goKSAmJiBsYXN0Um9vdEJveCgpLT5lbmRzV2l0aEJyZWFrKCkpIHsKKyAg
ICAgICAgLy8gSWYgdGhlIGxhc3QgbGluZSBiZWZvcmUgdGhlIHN0YXJ0IGxpbmUgZW5kcyB3aXRo
IGEgbGluZSBicmVhayB0aGF0IGNsZWFyIGZsb2F0cywKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBo
ZWlnaHQgYWNjb3JkaW5nbHkuCisgICAgICAgIC8vIEEgbGluZSBicmVhayBjYW4gYmUgZWl0aGVy
IHRoZSBmaXJzdCBvciB0aGUgbGFzdCBvYmplY3Qgb24gYSBsaW5lLCBkZXBlbmRpbmcgb24gaXRz
IGRpcmVjdGlvbi4KKyAgICAgICAgaWYgKElubGluZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RS
b290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkgeworICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBs
YXN0T2JqZWN0ID0gJmxhc3RMZWFmQ2hpbGQtPnJlbmRlcmVyKCk7CisgICAgICAgICAgICBpZiAo
IWxhc3RPYmplY3QtPmlzQlIoKSkKKyAgICAgICAgICAgICAgICBsYXN0T2JqZWN0ID0gJmxhc3RS
b290Qm94KCktPmZpcnN0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCk7CisgICAgICAgICAgICBpZiAo
bGFzdE9iamVjdC0+aXNCUigpKSB7CisgICAgICAgICAgICAgICAgQ2xlYXIgY2xlYXIgPSBsYXN0
T2JqZWN0LT5zdHlsZSgpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENs
ZWFyOjpOb25lKQorICAgICAgICAgICAgICAgICAgICBjbGVhckZsb2F0cyhjbGVhcik7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsYXlvdXRSdW5zQW5kRmxvYXRzSW5S
YW5nZShsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRp
U3RhdHVzLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgbGlua1RvRW5kTGluZUlm
TmVlZGVkKGxheW91dFN0YXRlKTsKKyAgICByZXBhaW50RGlydHlGbG9hdHMobGF5b3V0U3RhdGUu
ZmxvYXRMaXN0KCkpOworfQorCisvLyBCZWZvcmUgcmVzdGFydGluZyB0aGUgbGF5b3V0IGxvb3Ag
d2l0aCBhIG5ldyBsb2dpY2FsSGVpZ2h0LCByZW1vdmUgYWxsIGZsb2F0cyB0aGF0IHdlcmUgYWRk
ZWQgYW5kIHJlc2V0IHRoZSByZXNvbHZlci4KK2lubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYg
UmVuZGVyQmxvY2tGbG93OjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0
VW5pdCBvbGRMb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBvbGRFbmQpCit7CisgICAgcmVtb3Zl
RmxvYXRpbmdPYmplY3RzQmVsb3cobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgb2xkTG9naWNh
bEhlaWdodCk7CisgICAgc2V0TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKKyAgICBy
ZXNvbHZlci5zZXRQb3NpdGlvbklnbm9yaW5nTmVzdGVkSXNvbGF0ZXMob2xkRW5kKTsKKyAgICBy
ZXR1cm4gb2xkRW5kOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZs
b2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25z
dCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcykKK3sKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGVUb1VzZSA9IHN0
eWxlKCk7CisgICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29u
dGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQo
KS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOworICAgIExpbmVXaGl0ZXNwYWNlQ29sbGFw
c2luZ1N0YXRlJiBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZSA9IHJlc29sdmVyLndoaXRl
c3BhY2VDb2xsYXBzaW5nU3RhdGUoKTsKKyAgICBJbmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZl
ci5wb3NpdGlvbigpOworICAgIGJvb2wgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBsYXlvdXRTdGF0
ZS5lbmRMaW5lKCk7CisgICAgUmVuZGVyVGV4dEluZm8gcmVuZGVyVGV4dEluZm87CisgICAgVmVy
dGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKKworICAgIExpbmVCcmVh
a2VyIGxpbmVCcmVha2VyKCp0aGlzKTsKKworICAgIHdoaWxlICghZW5kLmF0RW5kKCkpIHsKKyAg
ICAgICAgLy8gRklYTUU6IElzIHRoaXMgY2hlY2sgbmVjZXNzYXJ5IGJlZm9yZSB0aGUgZmlyc3Qg
aXRlcmF0aW9uIG9yIGNhbiBpdCBiZSBtb3ZlZCB0byB0aGUgZW5kPworICAgICAgICBpZiAoY2hl
Y2tGb3JFbmRMaW5lTWF0Y2gpIHsKKyAgICAgICAgICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVN
YXRjaGVkKG1hdGNoZWRFbmRMaW5lKGxheW91dFN0YXRlLCByZXNvbHZlciwgY2xlYW5MaW5lU3Rh
cnQsIGNsZWFuTGluZUJpZGlTdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5l
bmRMaW5lTWF0Y2hlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24o
SW5saW5lSXRlcmF0b3IocmVzb2x2ZXIucG9zaXRpb24oKS5yb290KCksIDAsIDApLCAwKTsKKyAg
ICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5tYXJnaW5JbmZvKCkuY2xlYXJNYXJnaW4oKTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLnJlc2V0KCk7CisKKyAgICAgICAgbGF5b3V0
U3RhdGUubGluZUluZm8oKS5zZXRFbXB0eSh0cnVlKTsKKyAgICAgICAgbGF5b3V0U3RhdGUubGlu
ZUluZm8oKS5yZXNldFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKKworICAgICAgICBjb25z
dCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7CisgICAgICAgIGJvb2wgaXNOZXdVQkFQYXJh
Z3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgp
OworICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChj
b250YWluc0Zsb2F0cygpKSA/IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5sYXN0KCkuZ2V0KCkg
OiBudWxscHRyOworCisgICAgICAgIFdvcmRNZWFzdXJlbWVudHMgd29yZE1lYXN1cmVtZW50czsK
KyAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0
U3RhdGUubGluZUluZm8oKSwgcmVuZGVyVGV4dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xp
bmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCB3b3JkTWVhc3VyZW1lbnRzKTsKKyAgICAg
ICAgY2FjaGVQcmlvckNoYXJhY3RlcnNJZk5lZWRlZChyZW5kZXJUZXh0SW5mby5saW5lQnJlYWtJ
dGVyYXRvcik7CisgICAgICAgIHJlbmRlclRleHRJbmZvLmxpbmVCcmVha0l0ZXJhdG9yLnJlc2V0
UHJpb3JDb250ZXh0KCk7CisgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkp
IHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgY3JlYXRpbmcgYW55IHJ1
bnMgaW4gbmV4dExpbmVCcmVhayB0byBiZWdpbiB3aXRoIQorICAgICAgICAgICAgLy8gT25jZSBC
aWRpUnVuTGlzdCBpcyBzZXBhcmF0ZWQgZnJvbSBCaWRpUmVzb2x2ZXIgdGhpcyB3aWxsIG5vdCBi
ZSBuZWVkZWQuCisgICAgICAgICAgICByZXNvbHZlci5ydW5zKCkuY2xlYXIoKTsKKyAgICAgICAg
ICAgIHJlc29sdmVyLm1hcmtDdXJyZW50UnVuRW1wdHkoKTsgLy8gRklYTUU6IFRoaXMgY2FuIHBy
b2JhYmx5IGJlIHJlcGxhY2VkIGJ5IGFuIEFTU0VSVCAob3IganVzdCByZW1vdmVkKS4KKyAgICAg
ICAgICAgIGxheW91dFN0YXRlLnNldENoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lKHRydWUpOwor
ICAgICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oSW5saW5lSXRlcmF0b3IocmVzb2x2ZXIu
cG9zaXRpb24oKS5yb290KCksIDAsIDApLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisKKyAgICAgICAgQVNTRVJUKGVuZCAhPSByZXNvbHZlci5wb3NpdGlvbigpKTsKKworICAg
ICAgICAvLyBUaGlzIGlzIGEgc2hvcnQtY3V0IGZvciBlbXB0eSBsaW5lcy4KKyAgICAgICAgaWYg
KGxheW91dFN0YXRlLmxpbmVJbmZvKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobGFz
dFJvb3RCb3goKSkKKyAgICAgICAgICAgICAgICBsYXN0Um9vdEJveCgpLT5zZXRMaW5lQnJlYWtJ
bmZvKGVuZC5yZW5kZXJlcigpLCBlbmQub2Zmc2V0KCksIHJlc29sdmVyLnN0YXR1cygpKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZpc3VhbERpcmVjdGlvbk92ZXJyaWRlIG92ZXJy
aWRlID0gKHN0eWxlVG9Vc2UucnRsT3JkZXJpbmcoKSA9PSBPcmRlcjo6VmlzdWFsID8gKHN0eWxl
VG9Vc2UuZGlyZWN0aW9uKCkgPT0gVGV4dERpcmVjdGlvbjo6TFRSID8gVmlzdWFsTGVmdFRvUmln
aHRPdmVycmlkZSA6IFZpc3VhbFJpZ2h0VG9MZWZ0T3ZlcnJpZGUpIDogTm9WaXN1YWxPdmVycmlk
ZSk7CisKKyAgICAgICAgICAgIGlmIChpc05ld1VCQVBhcmFncmFwaCAmJiBzdHlsZVRvVXNlLnVu
aWNvZGVCaWRpKCkgPT0gUGxhaW50ZXh0ICYmICFyZXNvbHZlci5jb250ZXh0KCktPnBhcmVudCgp
KSB7CisgICAgICAgICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdHlsZVRvVXNl
LmRpcmVjdGlvbigpOworICAgICAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlvbmFsaXR5KGRp
cmVjdGlvbiwgcmVzb2x2ZXIucG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXIu
c2V0U3RhdHVzKEJpZGlTdGF0dXMoZGlyZWN0aW9uLCBpc092ZXJyaWRlKHN0eWxlVG9Vc2UudW5p
Y29kZUJpZGkoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlz
IG93bmVyc2hpcCBpcyByZXZlcnNlZC4gV2Ugc2hvdWxkIG93biB0aGUgQmlkaVJ1bkxpc3QgYW5k
IHBhc3MgaXQgdG8gY3JlYXRlQmlkaVJ1bnNGb3JMaW5lLgorICAgICAgICAgICAgQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mIGJpZGlSdW5zID0gcmVzb2x2ZXIucnVucygpOworICAgICAgICAgICAgY29u
c3RydWN0QmlkaVJ1bnNGb3JTZWdtZW50KHJlc29sdmVyLCBiaWRpUnVucywgZW5kLCBvdmVycmlk
ZSwgbGF5b3V0U3RhdGUubGluZUluZm8oKS5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSk7Cisg
ICAgICAgICAgICBBU1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmQpOworCisgICAgICAg
ICAgICBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuID0gIWxheW91dFN0YXRlLmxpbmVJbmZvKCku
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkgPyBoYW5kbGVUcmFpbGluZ1NwYWNlcyhiaWRpUnVu
cywgcmVzb2x2ZXIuY29udGV4dCgpKSA6IG51bGxwdHI7CisKKyAgICAgICAgICAgIGlmIChiaWRp
UnVucy5ydW5Db3VudCgpICYmIGxpbmVCcmVha2VyLmxpbmVXYXNIeXBoZW5hdGVkKCkpIHsKKyAg
ICAgICAgICAgICAgICBiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPm1faGFzSHlwaGVuID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcysrOworICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGlu
ZXMgPSAwOworCisgICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgcnVucyBoYXZlIGJlZW4gb3Jk
ZXJlZCwgd2UgY3JlYXRlIHRoZSBsaW5lIGJveGVzLgorICAgICAgICAgICAgLy8gQXQgdGhlIHNh
bWUgdGltZSB3ZSBmaWd1cmUgb3V0IHdoZXJlIGJvcmRlci9wYWRkaW5nL21hcmdpbiBzaG91bGQg
YmUgYXBwbGllZCBmb3IKKyAgICAgICAgICAgIC8vIGlubGluZSBmbG93IGJveGVzLgorCisgICAg
ICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Cisg
ICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY3JlYXRlTGluZUJveGVzRnJvbUJp
ZGlSdW5zKHJlc29sdmVyLnN0YXR1cygpLmNvbnRleHQtPmxldmVsKCksIGJpZGlSdW5zLCBlbmQs
IGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgdHJhaWxpbmdT
cGFjZVJ1biwgd29yZE1lYXN1cmVtZW50cyk7CisKKyAgICAgICAgICAgIGJpZGlSdW5zLmNsZWFy
KCk7CisgICAgICAgICAgICByZXNvbHZlci5tYXJrQ3VycmVudFJ1bkVtcHR5KCk7IC8vIEZJWE1F
OiBUaGlzIGNhbiBwcm9iYWJseSBiZSByZXBsYWNlZCBieSBhbiBBU1NFUlQgKG9yIGp1c3QgcmVt
b3ZlZCkuCisKKyAgICAgICAgICAgIGlmIChsaW5lQm94KSB7CisgICAgICAgICAgICAgICAgbGlu
ZUJveC0+c2V0TGluZUJyZWFrSW5mbyhlbmQucmVuZGVyZXIoKSwgZW5kLm9mZnNldCgpLCByZXNv
bHZlci5zdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLnVzZXNSZXBh
aW50Qm91bmRzKCkpCisgICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLnVwZGF0ZVJlcGFp
bnRSYW5nZUZyb21Cb3gobGluZUJveCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgTGF5b3V0VW5pdCBhZGp1c3RtZW50OworICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dz
RnJhZ21lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsYXlv
dXRTdGF0ZS5tYXJnaW5JbmZvKCkuc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhmYWxzZSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKQorICAgICAgICAgICAgICAgICAgICBhZGp1c3RM
aW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmVCb3gsIGFkanVzdG1lbnQsIG92ZXJmbG93c0Zy
YWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAgICAgICBp
ZiAoYWRqdXN0bWVudCkgeworICAgICAgICAgICAgICAgICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hv
dWxkSW5kZW50VGV4dCA9IGxheW91dFN0YXRlLmxpbmVJbmZvKCkuaXNGaXJzdExpbmUoKSA/IElu
ZGVudFRleHQgOiBEb05vdEluZGVudFRleHQ7CisgICAgICAgICAgICAgICAgICAgIExheW91dFVu
aXQgb2xkTGluZVdpZHRoID0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2Fs
SGVpZ2h0LCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+
YWRqdXN0QmxvY2tEaXJlY3Rpb25Qb3NpdGlvbihhZGp1c3RtZW50KTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGxheW91dFN0YXRlLnVzZXNSZXBhaW50Qm91bmRzKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmVCb3gp
OworCisgICAgICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5l
KG9sZExvZ2ljYWxIZWlnaHQgKyBhZGp1c3RtZW50LCBzaG91bGRJbmRlbnRUZXh0KSAhPSBvbGRM
aW5lV2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZGVsZXRl
IHRoaXMgbGluZSwgcmVtb3ZlIGFsbCBmbG9hdHMgdGhhdCBnb3QgYWRkZWQsIGFuZCBsZXQgbGlu
ZSBsYXlvdXQgcmUtcnVuLgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+ZGVsZXRl
TGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gcmVzdGFydExheW91dFJ1bnNB
bmRGbG9hdHNJblJhbmdlKG9sZExvZ2ljYWxIZWlnaHQsIG9sZExvZ2ljYWxIZWlnaHQgKyBhZGp1
c3RtZW50LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCByZXNvbHZlciwgb2xkRW5kKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5saW5lQm90dG9t
V2l0aExlYWRpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
IChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQorICAgICAgICAgICAgICAgICAgICAgICAg
dXBkYXRlRnJhZ21lbnRGb3JMaW5lKGxpbmVCb3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlu
ZUJyZWFrZXIucG9zaXRpb25lZE9iamVjdHMoKS5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHNl
dFN0YXRpY1Bvc2l0aW9ucygqdGhpcywgKmxpbmVCcmVha2VyLnBvc2l0aW9uZWRPYmplY3RzKClb
aV0sIERvTm90SW5kZW50VGV4dCk7CisKKyAgICAgICAgaWYgKCFsYXlvdXRTdGF0ZS5saW5lSW5m
bygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRG
aXJzdExpbmUoZmFsc2UpOworICAgICAgICAgICAgY2xlYXJGbG9hdHMobGluZUJyZWFrZXIuY2xl
YXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgbGFz
dFJvb3RCb3goKSkgeworICAgICAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0
aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgICAgICAgICAgYXV0
byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7CisgICAgICAgICAgICBhdXRvIGVuZCA9
IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgICAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9h
dCA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7CisgICAgICAgICAgICAg
ICAgYXV0byBsYXN0RmxvYXRJdGVyYXRvciA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQobGFzdEZs
b2F0KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQobGFzdEZsb2F0SXRlcmF0b3IgIT0gZW5kKTsK
KyAgICAgICAgICAgICAgICArK2xhc3RGbG9hdEl0ZXJhdG9yOworICAgICAgICAgICAgICAgIGl0
ID0gbGFzdEZsb2F0SXRlcmF0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDsg
aXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICAgICAgYXV0byYgZmxvYXRpbmdPYmplY3Qg
PSAqaXQ7CisgICAgICAgICAgICAgICAgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKCpm
bG9hdGluZ09iamVjdCk7CisgICAgICAgICAgICAgICAgLy8gSWYgYSBmbG9hdCdzIGdlb21ldHJ5
IGhhcyBjaGFuZ2VkLCBnaXZlIHVwIG9uIHN5bmNpbmcgd2l0aCBjbGVhbiBsaW5lcy4KKyAgICAg
ICAgICAgICAgICBhdXRvKiBmbG9hdFdpdGhSZWN0ID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCku
ZmxvYXRXaXRoUmVjdChmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKSk7CisgICAgICAgICAgICAg
ICAgaWYgKCFmbG9hdFdpdGhSZWN0IHx8IGZsb2F0V2l0aFJlY3QtPnJlY3QoKSAhPSBmbG9hdGlu
Z09iamVjdC0+ZnJhbWVSZWN0KCkpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrRm9yRW5kTGlu
ZU1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXlvdXRTdGF0ZS5m
bG9hdExpc3QoKS5zZXRMYXN0RmxvYXQoIWZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSA/IGZs
b2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS5nZXQoKSA6IG51bGxwdHIpOworICAgICAgICB9CisKKyAg
ICAgICAgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUucmVzZXQoKTsKKyAgICAgICAgcmVz
b2x2ZXIuc2V0UG9zaXRpb24oZW5kLCBudW1iZXJPZklzb2xhdGVBbmNlc3RvcnMoZW5kKSk7Cisg
ICAgfQorCisgICAgLy8gSW4gY2FzZSB3ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSBsaW5lIHBvc2l0
aW9ucyBkdXJpbmcgdGhpcyBsYXlvdXQgdG8gYXZvaWQgd2lkb3dzCisgICAgLy8gdGhlbiB3ZSBu
ZWVkIHRvIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgb2YgaGF2aW5nIGEgbmV3IHdpZG93cyBzaXR1
YXRpb24uCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSByaXNrIGxlYXZpbmcgZW1wdHkgY29udGFpbmVy
cyB3aGljaCBpcyBhZ2FpbnN0IHRoZSBibG9jayBmcmFnbWVudGF0aW9uIHByaW5jaXBsZXMuCisg
ICAgaWYgKHBhZ2luYXRlZCAmJiAhc3R5bGUoKS5oYXNBdXRvV2lkb3dzKCkgJiYgIWRpZEJyZWFr
QXRMaW5lVG9Bdm9pZFdpZG93KCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGxpbmUgYm94ZXMg
dG8gbWFrZSBzdXJlIHdlIGRpZG4ndCBjcmVhdGUgdW5hY2NlcHRhYmxlIHdpZG93cy4KKyAgICAg
ICAgLy8gSG93ZXZlciwgd2UnbGwgcHJpb3JpdGl6ZSBvcnBoYW5zIC0gc28gbm90aGluZyB3ZSBk
byBoZXJlIHNob3VsZCBjcmVhdGUKKyAgICAgICAgLy8gYSBuZXcgb3JwaGFuLgorCisgICAgICAg
IFJvb3RJbmxpbmVCb3gqIGxpbmVCb3ggPSBsYXN0Um9vdEJveCgpOworCisgICAgICAgIC8vIENv
dW50IGZyb20gdGhlIGVuZCBvZiB0aGUgYmxvY2sgYmFja3dhcmRzLCB0byBzZWUgaG93IG1hbnkg
aGFuZ2luZworICAgICAgICAvLyBsaW5lcyB3ZSBoYXZlLgorICAgICAgICBSb290SW5saW5lQm94
KiBmaXJzdExpbmVJbkJsb2NrID0gZmlyc3RSb290Qm94KCk7CisgICAgICAgIGludCBudW1MaW5l
c0hhbmdpbmcgPSAxOworICAgICAgICB3aGlsZSAobGluZUJveCAmJiBsaW5lQm94ICE9IGZpcnN0
TGluZUluQmxvY2sgJiYgIWxpbmVCb3gtPmlzRmlyc3RBZnRlclBhZ2VCcmVhaygpKSB7CisgICAg
ICAgICAgICArK251bUxpbmVzSGFuZ2luZzsKKyAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94
LT5wcmV2Um9vdEJveCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlcmUgd2VyZSBu
byBicmVha3MgaW4gdGhlIGJsb2NrLCB3ZSBkaWRuJ3QgY3JlYXRlIGFueSB3aWRvd3MuCisgICAg
ICAgIGlmICghbGluZUJveCB8fCAhbGluZUJveC0+aXNGaXJzdEFmdGVyUGFnZUJyZWFrKCkgfHwg
bGluZUJveCA9PSBmaXJzdExpbmVJbkJsb2NrKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIGlmIChudW1MaW5lc0hhbmdpbmcgPCBzdHlsZSgpLndpZG93cygpKSB7CisgICAgICAgICAg
ICAvLyBXZSBoYXZlIGRldGVjdGVkIGEgd2lkb3cuIE5vdyB3ZSBuZWVkIHRvIHdvcmsgb3V0IGhv
dyBtYW55CisgICAgICAgICAgICAvLyBsaW5lcyB0aGVyZSBhcmUgb24gdGhlIHByZXZpb3VzIHBh
Z2UsIGFuZCBob3cgbWFueSB3ZSBuZWVkCisgICAgICAgICAgICAvLyB0byBzdGVhbC4KKyAgICAg
ICAgICAgIGludCBudW1MaW5lc05lZWRlZCA9IHN0eWxlKCkud2lkb3dzKCkgLSBudW1MaW5lc0hh
bmdpbmc7CisgICAgICAgICAgICBSb290SW5saW5lQm94KiBjdXJyZW50Rmlyc3RMaW5lT2ZOZXdQ
YWdlID0gbGluZUJveDsKKworICAgICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsaW5l
cyBpbiB0aGUgcHJldmlvdXMgcGFnZS4KKyAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5w
cmV2Um9vdEJveCgpOworICAgICAgICAgICAgaW50IG51bUxpbmVzSW5QcmV2aW91c1BhZ2UgPSAx
OworICAgICAgICAgICAgd2hpbGUgKGxpbmVCb3ggJiYgbGluZUJveCAhPSBmaXJzdExpbmVJbkJs
b2NrICYmICFsaW5lQm94LT5pc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsoKSkgeworICAgICAgICAgICAg
ICAgICsrbnVtTGluZXNJblByZXZpb3VzUGFnZTsKKyAgICAgICAgICAgICAgICBsaW5lQm94ID0g
bGluZUJveC0+cHJldlJvb3RCb3goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
SWYgdGhlcmUgd2FzIGFuIGV4cGxpY2l0IHZhbHVlIGZvciBvcnBoYW5zLCByZXNwZWN0IHRoYXQu
IElmIG5vdCwgd2Ugc3RpbGwKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBjcmVhdGUgYSBzaXR1
YXRpb24gd2hlcmUgd2UgbWFrZSBhbiBvcnBoYW4gYmlnZ2VyIHRoYW4gdGhlIGluaXRpYWwgdmFs
dWUuCisgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgc2V0dGluZyB3aWRvd3MgaW1wbGll
cyB3ZSBhbHNvIGNhcmUgYWJvdXQgb3JwaGFucywgYnV0IGdpdmVuCisgICAgICAgICAgICAvLyB0
aGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoZSBpbml0aWFsIG9ycGhhbiB2YWx1ZSBpcyBub24temVy
bywgdGhpcyBpcyBvay4gVGhlCisgICAgICAgICAgICAvLyBhdXRob3IgaXMgYWx3YXlzIGZyZWUg
dG8gc2V0IG9ycGhhbnMgZXhwbGljaXRseSBhcyB3ZWxsLgorICAgICAgICAgICAgaW50IG9ycGhh
bnMgPSBzdHlsZSgpLmhhc0F1dG9PcnBoYW5zKCkgPyBzdHlsZSgpLmluaXRpYWxPcnBoYW5zKCkg
OiBzdHlsZSgpLm9ycGhhbnMoKTsKKyAgICAgICAgICAgIGludCBudW1MaW5lc0F2YWlsYWJsZSA9
IG51bUxpbmVzSW5QcmV2aW91c1BhZ2UgLSBvcnBoYW5zOworICAgICAgICAgICAgaWYgKG51bUxp
bmVzQXZhaWxhYmxlIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAg
ICBpbnQgbnVtTGluZXNUb1Rha2UgPSBzdGQ6Om1pbihudW1MaW5lc0F2YWlsYWJsZSwgbnVtTGlu
ZXNOZWVkZWQpOworICAgICAgICAgICAgLy8gV2luZCBiYWNrIGZyb20gb3VyIGZpcnN0IHdpZG93
ZWQgbGluZS4KKyAgICAgICAgICAgIGxpbmVCb3ggPSBjdXJyZW50Rmlyc3RMaW5lT2ZOZXdQYWdl
OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lc1RvVGFrZTsgKytpKQor
ICAgICAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpOworCisgICAg
ICAgICAgICAvLyBXZSBub3cgd2FudCB0byBicmVhayBhdCB0aGlzIGxpbmUuIFJlbWVtYmVyIGZv
ciBuZXh0IGxheW91dCBhbmQgdHJpZ2dlciByZWxheW91dC4KKyAgICAgICAgICAgIHNldEJyZWFr
QXRMaW5lVG9Bdm9pZFdpZG93KGxpbmVDb3VudChsaW5lQm94KSk7CisgICAgICAgICAgICBtYXJr
TGluZXNEaXJ0eUluQmxvY2tSYW5nZShsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRp
bmcoKSwgbGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gpOworICAgICAg
ICB9CisgICAgfQorICAgIGNsZWFyRGlkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3coKTsKK30KKwor
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVC
b3gmIGNsZWFuTGluZSwgTGF5b3V0VW5pdCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKQor
eworICAgIGF1dG8qIGNsZWFuTGluZUZsb2F0cyA9IGNsZWFuTGluZS5mbG9hdHNQdHIoKTsKKyAg
ICBpZiAoIWNsZWFuTGluZUZsb2F0cykKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChhdXRv
JiBmbG9hdGluZ0JveCA6ICpjbGVhbkxpbmVGbG9hdHMpIHsKKyAgICAgICAgaWYgKCFmbG9hdGlu
Z0JveCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhdXRvKiBmbG9hdGluZ09iamVj
dCA9IGluc2VydEZsb2F0aW5nT2JqZWN0KCpmbG9hdGluZ0JveCk7CisgICAgICAgIGlmIChpc0Zp
cnN0Q2xlYW5MaW5lICYmIGZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSkgeworICAg
ICAgICAgICAgLy8gRmxvYXQgYm94IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGxpbmUgYW55bW9y
ZS4KKyAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGNsZWFuTGlu
ZS5wcmV2Um9vdEJveCgpID09IGZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7Cisg
ICAgICAgICAgICBjbGVhbkxpbmUucmVtb3ZlRmxvYXQoKmZsb2F0aW5nQm94KTsKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKCFmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOworICAgICAgICBm
bG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRpbmdMaW5lKGNsZWFuTGluZSk7CisgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEZvckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5C
ZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gpICsgZGVsdGEpOworICAgICAgICBwb3NpdGlvbk5l
d0Zsb2F0cygpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmtUb0VuZExp
bmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQoreworICAgIGF1dG8qIGZp
cnN0Q2xlYW5MaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOworICAgIGlmIChmaXJzdENsZWFu
TGluZSkgeworICAgICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkgeworICAg
ICAgICAgICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4
dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5s
YXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOworICAgICAgICAgICAgLy8gQXR0YWNoIGFsbCB0
aGUgcmVtYWluaW5nIGxpbmVzLCBhbmQgdGhlbiBhZGp1c3QgdGhlaXIgeS1wb3NpdGlvbnMgYXMg
bmVlZGVkLgorICAgICAgICAgICAgTGF5b3V0VW5pdCBkZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAt
IGxheW91dFN0YXRlLmVuZExpbmVMb2dpY2FsVG9wKCk7CisgICAgICAgICAgICBmb3IgKGF1dG8q
IGxpbmUgPSBmaXJzdENsZWFuTGluZTsgbGluZTsgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCkp
IHsKKyAgICAgICAgICAgICAgICBsaW5lLT5hdHRhY2hMaW5lKCk7CisgICAgICAgICAgICAgICAg
aWYgKHBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBkZWx0YSAtPSBsaW5lLT5wYWdp
bmF0aW9uU3RydXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVu
dDsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihs
aW5lLCBkZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93
KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKKyAg
ICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChs
aW5lLCBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdEJsb2NrRGlyZWN0
aW9uUG9zaXRpb24oZGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBp
ZiAobGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkKKyAgICAgICAgICAgICAgICAgICAgdXBk
YXRlRnJhZ21lbnRGb3JMaW5lKGxpbmUpOworICAgICAgICAgICAgICAgIHJlYXR0YWNoQ2xlYW5M
aW5lRmxvYXRzKCpsaW5lLCBkZWx0YSwgbGluZSA9PSBmaXJzdENsZWFuTGluZSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxhc3RSb290Qm94KCktPmxpbmVC
b3R0b21XaXRoTGVhZGluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERl
bGV0ZSBhbGwgdGhlIHJlbWFpbmluZyBsaW5lcy4KKyAgICAgICAgICAgIGRlbGV0ZUxpbmVSYW5n
ZShsYXlvdXRTdGF0ZSwgbGF5b3V0U3RhdGUuZW5kTGluZSgpKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgKGxheW91dFN0YXRlLmNoZWNrRm9y
RmxvYXRzRnJvbUxhc3RMaW5lKCkgfHwgcG9zaXRpb25OZXdGbG9hdHMoKSkgJiYgbGFzdFJvb3RC
b3goKSkgeworICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0aGUgbGFzdCBs
aW5lLCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCisgICAgICAgIC8vIFRo
aXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRk
aW5nLCBvciB0aGUgZmxvYXQgd2lsbAorICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWRkaW5nIGlu
Y29ycmVjdGx5LiAtZHdoCisgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zy
b21MYXN0TGluZSgpKSB7CisgICAgICAgICAgICBMYXlvdXRVbml0IGJvdHRvbVZpc3VhbE92ZXJm
bG93ID0gbGFzdFJvb3RCb3goKS0+bG9naWNhbEJvdHRvbVZpc3VhbE92ZXJmbG93KCk7CisgICAg
ICAgICAgICBMYXlvdXRVbml0IGJvdHRvbUxheW91dE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+
bG9naWNhbEJvdHRvbUxheW91dE92ZXJmbG93KCk7CisgICAgICAgICAgICBhdXRvIG5ld0xpbmVC
b3ggPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveD4oKnRoaXMp
OworICAgICAgICAgICAgYXV0byB0cmFpbGluZ0Zsb2F0c0xpbmVCb3ggPSBuZXdMaW5lQm94Lmdl
dCgpOworICAgICAgICAgICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveChXVEZNb3ZlKG5ld0xp
bmVCb3gpKTsKKyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0Q29uc3RydWN0
ZWQoKTsKKyAgICAgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwIHRleHRC
b3hEYXRhTWFwOworICAgICAgICAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9z
aXRpb25DYWNoZTsKKyAgICAgICAgICAgIExheW91dFVuaXQgYmxvY2tMb2dpY2FsSGVpZ2h0ID0g
bG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5hbGln
bkJveGVzSW5CbG9ja0RpcmVjdGlvbihibG9ja0xvZ2ljYWxIZWlnaHQsIHRleHRCb3hEYXRhTWFw
LCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOworICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5l
Qm94LT5zZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKGJsb2NrTG9naWNhbEhlaWdodCwgYmxvY2tM
b2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCk7Cisg
ICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldFBhZ2luYXRlZExpbmVXaWR0aChh
dmFpbGFibGVMb2dpY2FsV2lkdGhGb3JDb250ZW50KGJsb2NrTG9naWNhbEhlaWdodCkpOworICAg
ICAgICAgICAgTGF5b3V0UmVjdCBsb2dpY2FsTGF5b3V0T3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dp
Y2FsSGVpZ2h0LCAxX2x1LCBib3R0b21MYXlvdXRPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdo
dCk7CisgICAgICAgICAgICBMYXlvdXRSZWN0IGxvZ2ljYWxWaXN1YWxPdmVyZmxvdygwX2x1LCBi
bG9ja0xvZ2ljYWxIZWlnaHQsIDFfbHUsIGJvdHRvbVZpc3VhbE92ZXJmbG93IC0gYmxvY2tMb2dp
Y2FsSGVpZ2h0KTsKKyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0T3ZlcmZs
b3dGcm9tTG9naWNhbFJlY3RzKGxvZ2ljYWxMYXlvdXRPdmVyZmxvdywgbG9naWNhbFZpc3VhbE92
ZXJmbG93LCB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPmxpbmVUb3AoKSwgdHJhaWxpbmdGbG9hdHNM
aW5lQm94LT5saW5lQm90dG9tKCkpOworICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZyYWdt
ZW50ZWRGbG93KCkpCisgICAgICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRGb3JMaW5lKHRyYWls
aW5nRmxvYXRzTGluZUJveCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBGbG9hdGluZ09i
amVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Cisg
ICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOworICAgICAgICBhdXRv
IGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgICAgICBpZiAoYXV0byogbGFzdEZs
b2F0ID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkubGFzdEZsb2F0KCkpIHsKKyAgICAgICAgICAg
IGF1dG8gbGFzdEZsb2F0SXRlcmF0b3IgPSBmbG9hdGluZ09iamVjdFNldC5maW5kKGxhc3RGbG9h
dCk7CisgICAgICAgICAgICBBU1NFUlQobGFzdEZsb2F0SXRlcmF0b3IgIT0gZW5kKTsKKyAgICAg
ICAgICAgICsrbGFzdEZsb2F0SXRlcmF0b3I7CisgICAgICAgICAgICBpdCA9IGxhc3RGbG9hdEl0
ZXJhdG9yOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpCisgICAg
ICAgICAgICBhcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoKippdCk7CisgICAgICAgIGxh
eW91dFN0YXRlLmZsb2F0TGlzdCgpLnNldExhc3RGbG9hdCghZmxvYXRpbmdPYmplY3RTZXQuaXNF
bXB0eSgpID8gZmxvYXRpbmdPYmplY3RTZXQubGFzdCgpLmdldCgpIDogbnVsbHB0cik7CisgICAg
fQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlv
dXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJl
cGFpbnRMb2dpY2FsQm90dG9tKQoreworICAgIEFTU0VSVCghbV9zaW1wbGVMaW5lTGF5b3V0KTsK
KworICAgIHNldExvZ2ljYWxIZWlnaHQoYm9yZGVyQW5kUGFkZGluZ0JlZm9yZSgpKTsKKyAgICAK
KyAgICAvLyBMYXkgb3V0IG91ciBoeXBvdGhldGljYWwgZ3JpZCBsaW5lIGFzIHRob3VnaCBpdCBv
Y2N1cnMgYXQgdGhlIHRvcCBvZiB0aGUgYmxvY2suCisgICAgaWYgKHZpZXcoKS5mcmFtZVZpZXco
KS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5
b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCktPmxpbmVHcmlkKCkgPT0gdGhpcykKKyAgICAgICAg
bGF5b3V0TGluZUdyaWRCb3goKTsKKworICAgIFJlbmRlckZyYWdtZW50ZWRGbG93KiBmcmFnbWVu
dGVkRmxvdyA9IGVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCk7CisgICAgYm9vbCBjbGVhckxpbmVz
Rm9yUGFnaW5hdGlvbiA9IGZpcnN0Um9vdEJveCgpICYmIGZyYWdtZW50ZWRGbG93ICYmICFmcmFn
bWVudGVkRmxvdy0+aGFzRnJhZ21lbnRzKCk7CisKKyAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNo
b3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCisgICAgLy8gRklYTUU6IEhhbmRsZSByZXNp
emUgZXZlbnR1YWxseSEKKyAgICBib29sIGlzRnVsbExheW91dCA9ICFmaXJzdFJvb3RCb3goKSB8
fCBzZWxmTmVlZHNMYXlvdXQoKSB8fCByZWxheW91dENoaWxkcmVuIHx8IGNsZWFyTGluZXNGb3JQ
YWdpbmF0aW9uOworICAgIExpbmVMYXlvdXRTdGF0ZSBsYXlvdXRTdGF0ZSgqdGhpcywgaXNGdWxs
TGF5b3V0LCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20sIGZyYWdtZW50
ZWRGbG93KTsKKworICAgIGlmIChpc0Z1bGxMYXlvdXQpCisgICAgICAgIGxpbmVCb3hlcygpLmRl
bGV0ZUxpbmVCb3hlcygpOworCisgICAgLy8gVGV4dCB0cnVuY2F0aW9uIGtpY2tzIGluIGluIHR3
byBjYXNlczoKKyAgICAvLyAgICAgMSkgSWYgeW91ciBvdmVyZmxvdyBpc24ndCB2aXNpYmxlIGFu
ZCB5b3VyIHRleHQtb3ZlcmZsb3ctbW9kZSBpc24ndCBjbGlwLgorICAgIC8vICAgICAyKSBJZiB5
b3UncmUgYW4gYW5vbnltb3VzIGJsb2NrIHdpdGggYSBibG9jayBwYXJlbnQgdGhhdCBzYXRpc2Zp
ZXMgIzEuCisgICAgLy8gRklYTUU6IENTUzMgc2F5cyB0aGF0IGRlc2NlbmRhbnRzIHRoYXQgYXJl
IGNsaXBwZWQgbXVzdCBhbHNvIGtub3cgaG93IHRvIHRydW5jYXRlLiAgVGhpcyBpcyBpbnNhbmVs
eQorICAgIC8vIGRpZmZpY3VsdCB0byBmaWd1cmUgb3V0IGluIGdlbmVyYWwgKGVzcGVjaWFsbHkg
aW4gdGhlIG1pZGRsZSBvZiBkb2luZyBsYXlvdXQpLCBzbyB3ZSBvbmx5IGhhbmRsZSB0aGUKKyAg
ICAvLyBzaW1wbGUgY2FzZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgdHJ1bmNhdGluZyB3aGVuIGl0
J3MgcGFyZW50IGlzIGNsaXBwZWQuCisgICAgYm9vbCBoYXNUZXh0T3ZlcmZsb3cgPSAoc3R5bGUo
KS50ZXh0T3ZlcmZsb3coKSA9PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIGhhc092ZXJmbG93
Q2xpcCgpKQorICAgICAgICB8fCAoaXNBbm9ueW1vdXNCbG9jaygpICYmIHBhcmVudCgpICYmIHBh
cmVudCgpLT5pc1JlbmRlckJsb2NrKCkgJiYgcGFyZW50KCktPnN0eWxlKCkudGV4dE92ZXJmbG93
KCkgPT0gVGV4dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBwYXJlbnQoKS0+aGFzT3ZlcmZsb3dDbGlw
KCkpOworCisgICAgLy8gV2FsayBhbGwgdGhlIGxpbmVzIGFuZCBkZWxldGUgb3VyIGVsbGlwc2lz
IGxpbmUgYm94ZXMgaWYgdGhleSBleGlzdC4KKyAgICBpZiAoaGFzVGV4dE92ZXJmbG93KQorICAg
ICAgICAgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKKworICAgIGlmIChmaXJzdENoaWxkKCkp
IHsKKyAgICAgICAgLy8gSW4gZnVsbCBsYXlvdXQgbW9kZSwgY2xlYXIgdGhlIGxpbmUgYm94ZXMg
b2YgY2hpbGRyZW4gdXBmcm9udC4gT3RoZXJ3aXNlLAorICAgICAgICAvLyBzaWJsaW5ncyBjYW4g
cnVuIGludG8gc3RhbGUgcm9vdCBsaW5lYm94ZXMgZHVyaW5nIGxheW91dC4gVGhlbiBsYXlvdXQK
KyAgICAgICAgLy8gdGhlIHJlcGxhY2VkIGVsZW1lbnRzIGxhdGVyLiBJbiBwYXJ0aWFsIGxheW91
dCBtb2RlLCBsaW5lIGJveGVzIGFyZSBub3QKKyAgICAgICAgLy8gZGVsZXRlZCBhbmQgb25seSBk
aXJ0aWVkLiBJbiB0aGF0IGNhc2UsIHdlIGNhbiBsYXlvdXQgdGhlIHJlcGxhY2VkCisgICAgICAg
IC8vIGVsZW1lbnRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgIGJvb2wgaGFzSW5saW5lQ2hp
bGQgPSBmYWxzZTsKKyAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+IHJlcGxhY2VkQ2hpbGRyZW47
CisgICAgICAgIGZvciAoSW5saW5lV2Fsa2VyIHdhbGtlcigqdGhpcyk7ICF3YWxrZXIuYXRFbmQo
KTsgd2Fsa2VyLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgUmVuZGVyT2JqZWN0JiBvID0gKndh
bGtlci5jdXJyZW50KCk7CisKKyAgICAgICAgICAgIGlmICghaGFzSW5saW5lQ2hpbGQgJiYgby5p
c0lubGluZSgpKQorICAgICAgICAgICAgICAgIGhhc0lubGluZUNoaWxkID0gdHJ1ZTsKKworICAg
ICAgICAgICAgaWYgKG8uaXNSZXBsYWNlZCgpIHx8IG8uaXNGbG9hdGluZygpIHx8IG8uaXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJCb3gmIGJveCA9IGRv
d25jYXN0PFJlbmRlckJveD4obyk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGls
ZHJlbiB8fCBib3guaGFzUmVsYXRpdmVEaW1lbnNpb25zKCkpCisgICAgICAgICAgICAgICAgICAg
IGJveC5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisKKyAgICAgICAgICAgICAg
ICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgdGhlIGNoaWxkIGhhcyBwZXJjZW50
YWdlIHBhZGRpbmcgb3IgYW4gZW1iZWRkZWQgY29udGVudCBib3gsIHdlIGFsc28gbmVlZCB0byBp
bnZhbGlkYXRlIHRoZSBjaGlsZHMgcHJlZiB3aWR0aHMuCisgICAgICAgICAgICAgICAgaWYgKHJl
bGF5b3V0Q2hpbGRyZW4gJiYgYm94Lm5lZWRzUHJlZmVycmVkV2lkdGhzUmVjYWxjdWxhdGlvbigp
KQorICAgICAgICAgICAgICAgICAgICBib3guc2V0UHJlZmVycmVkTG9naWNhbFdpZHRoc0RpcnR5
KHRydWUsIE1hcmtPbmx5VGhpcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoYm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgICAgICBib3guY29udGFpbmluZ0Jsb2Nr
KCktPmluc2VydFBvc2l0aW9uZWRPYmplY3QoYm94KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlm
IChib3guaXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5mbG9h
dExpc3QoKS5hcHBlbmQoRmxvYXRXaXRoUmVjdDo6Y3JlYXRlKGJveCkpOworICAgICAgICAgICAg
ICAgIGVsc2UgaWYgKGlzRnVsbExheW91dCB8fCBib3gubmVlZHNMYXlvdXQoKSkgeworICAgICAg
ICAgICAgICAgICAgICAvLyBSZXBsYWNlZCBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICBp
ZiAoaXNGdWxsTGF5b3V0ICYmIGlzPFJlbmRlclJ1YnlSdW4+KGJveCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHJlc2V0cyB0aGUgb3ZlcmhhbmdpbmcgbWFyZ2lu
cyB0aGF0IHdlIHNldCBkdXJpbmcgbGluZSBsYXlvdXQgKHNlZSBjb21wdXRlSW5saW5lRGlyZWN0
aW9uUG9zaXRpb25zRm9yU2VnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQg
YSBtb3JlIHN1aXRhYmxlIHBsYWNlIGZvciB0aGlzLgorICAgICAgICAgICAgICAgICAgICAgICAg
c2V0TWFyZ2luU3RhcnRGb3JDaGlsZChib3gsIDApOworICAgICAgICAgICAgICAgICAgICAgICAg
c2V0TWFyZ2luRW5kRm9yQ2hpbGQoYm94LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICBib3guZGlydHlMaW5lQm94ZXMoaXNGdWxsTGF5b3V0KTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJlcGxhY2VkQ2hpbGRyZW4uYXBwZW5kKCZib3gpOworICAgICAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgICAgICBib3gubGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG8uaXNUZXh0T3JMaW5lQnJlYWsoKSB8
fCAoaXM8UmVuZGVySW5saW5lPihvKSAmJiAhd2Fsa2VyLmF0RW5kT2ZJbmxpbmUoKSkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoaXM8UmVuZGVySW5saW5lPihvKSkKKyAgICAgICAgICAgICAgICAg
ICAgZG93bmNhc3Q8UmVuZGVySW5saW5lPihvKS51cGRhdGVBbHdheXNDcmVhdGVMaW5lQm94ZXMo
bGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXRT
dGF0ZS5pc0Z1bGxMYXlvdXQoKSB8fCBvLnNlbGZOZWVkc0xheW91dCgpKQorICAgICAgICAgICAg
ICAgICAgICBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVyKG8sIGxheW91dFN0YXRlLmlzRnVsbExh
eW91dCgpKTsKKyAgICAgICAgICAgICAgICBvLmNsZWFyTmVlZHNMYXlvdXQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVwbGFj
ZWRDaGlsZHJlbi5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVuW2ld
LT5sYXlvdXRJZk5lZWRlZCgpOworCisgICAgICAgIGxheW91dFJ1bnNBbmRGbG9hdHMobGF5b3V0
U3RhdGUsIGhhc0lubGluZUNoaWxkKTsKKyAgICB9CisKKyAgICAvLyBFeHBhbmQgdGhlIGxhc3Qg
bGluZSB0byBhY2NvbW1vZGF0ZSBSdWJ5IGFuZCBlbXBoYXNpcyBtYXJrcy4KKyAgICBpbnQgbGFz
dExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQgPSAwOworICAgIGlmIChsYXN0Um9vdEJveCgpKSB7
CisgICAgICAgIExheW91dFVuaXQgbG93ZXN0QWxsb3dlZFBvc2l0aW9uID0gc3RkOjptYXgobGFz
dFJvb3RCb3goKS0+bGluZUJvdHRvbSgpLCBsb2dpY2FsSGVpZ2h0KCkgKyBwYWRkaW5nQWZ0ZXIo
KSk7CisgICAgICAgIGlmICghc3R5bGUoKS5pc0ZsaXBwZWRMaW5lc1dyaXRpbmdNb2RlKCkpCisg
ICAgICAgICAgICBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0bWVudCA9IGxhc3RSb290Qm94KCkt
PmNvbXB1dGVVbmRlckFubm90YXRpb25BZGp1c3RtZW50KGxvd2VzdEFsbG93ZWRQb3NpdGlvbik7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50
ID0gbGFzdFJvb3RCb3goKS0+Y29tcHV0ZU92ZXJBbm5vdGF0aW9uQWRqdXN0bWVudChsb3dlc3RB
bGxvd2VkUG9zaXRpb24pOworICAgIH0KKyAgICAKKyAgICAvLyBOb3cgZG8gdGhlIGhhbmRsaW5n
IG9mIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLCBhZGRpbmcgaW4gb3VyIGJvdHRvbSBib3JkZXIv
cGFkZGluZyBhbmQKKyAgICAvLyBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBjb2xsYXBzZWQgYm90
dG9tIG1hcmdpbiBpbmZvcm1hdGlvbi4gVGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQor
ICAgIC8vIGlmIG91ciBsYXN0IGNoaWxkIHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRo
YXQgbWlnaHQgbmVlZCB0byBwcm9wYWdhdGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bworICAg
IC8vIHVzLgorICAgIExheW91dFVuaXQgYWZ0ZXJFZGdlID0gYm9yZGVyQW5kUGFkZGluZ0FmdGVy
KCkgKyBzY3JvbGxiYXJMb2dpY2FsSGVpZ2h0KCkgKyBsYXN0TGluZUFubm90YXRpb25zQWRqdXN0
bWVudDsKKyAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIGFmdGVyRWRnZSk7
CisKKyAgICBpZiAoIWZpcnN0Um9vdEJveCgpICYmIGhhc0xpbmVJZkVtcHR5KCkpCisgICAgICAg
IHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCBpc0hv
cml6b250YWxXcml0aW5nTW9kZSgpID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0aWNhbExpbmUsIFBv
c2l0aW9uT2ZJbnRlcmlvckxpbmVCb3hlcykpOworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW55
IGxpbmVzIHRoYXQgc3BpbGwgb3V0IG9mIG91ciBibG9jay4gIElmIHdlIGRvLCB0aGVuIHdlIHdp
bGwgcG9zc2libHkgbmVlZCB0bworICAgIC8vIHRydW5jYXRlIHRleHQuCisgICAgaWYgKGhhc1Rl
eHRPdmVyZmxvdykKKyAgICAgICAgY2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOworfQorCit2
b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tGbG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxpbmVCb3gm
IGNsZWFuTGluZSwgUmVuZGVyQm94JiBmbG9hdEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdpdGhSZWN0
JiBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QsCisgICAgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwg
Ym9vbCYgZGlydGllZEJ5RmxvYXQpCit7CisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04oIWZsb2F0Qm94T25DbGVhbkxpbmUuc3R5bGUoKS5kZWxldGlvbkhhc0JlZ3VuKCkpOwor
ICAgIGlmICgmbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LnJlbmRlcmVyKCkgIT0gJmZsb2F0Qm94T25D
bGVhbkxpbmUpIHsKKyAgICAgICAgZW5jb3VudGVyZWROZXdGbG9hdCA9IHRydWU7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgZmxvYXRCb3hPbkNsZWFuTGluZS5sYXlvdXRJZk5lZWRlZCgp
OworICAgIExheW91dFJlY3Qgb3JpZ2luYWxGbG9hdFJlY3QgPSBtYXRjaGluZ0Zsb2F0V2l0aFJl
Y3QucmVjdCgpOworICAgIExheW91dFNpemUgbmV3U2l6ZSgKKyAgICAgICAgZmxvYXRCb3hPbkNs
ZWFuTGluZS53aWR0aCgpICsgZmxvYXRCb3hPbkNsZWFuTGluZS5ob3Jpem9udGFsTWFyZ2luRXh0
ZW50KCksCisgICAgICAgIGZsb2F0Qm94T25DbGVhbkxpbmUuaGVpZ2h0KCkgKyBmbG9hdEJveE9u
Q2xlYW5MaW5lLnZlcnRpY2FsTWFyZ2luRXh0ZW50KCkpOworICAgIAorICAgIC8vIFdlIGhhdmUg
dG8gcmVzZXQgdGhlIGNhcC1oZWlnaHQgYWxpZ25tZW50IGRvbmUgYnkgdGhlIGZpcnN0LWxldHRl
ciBmbG9hdHMgd2hlbiBpbml0aWFsLWxldHRlciBpcyBzZXQsIHNvIGp1c3QgYWx3YXlzIHRyZWF0
IGZpcnN0LWxldHRlciBmbG9hdHMgYXMgZGlydHkuCisgICAgaWYgKG9yaWdpbmFsRmxvYXRSZWN0
LnNpemUoKSA9PSBuZXdTaXplICYmIChmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuc3R5bGVU
eXBlKCkgIT0gUHNldWRvSWQ6OkZpcnN0TGV0dGVyIHx8ICFmbG9hdEJveE9uQ2xlYW5MaW5lLnN0
eWxlKCkuaW5pdGlhbExldHRlckRyb3AoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIExheW91
dFVuaXQgZmxvYXRUb3AgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9h
dFJlY3QueSgpIDogb3JpZ2luYWxGbG9hdFJlY3QueCgpOworICAgIExheW91dFVuaXQgZmxvYXRI
ZWlnaHQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gc3RkOjptYXgob3JpZ2luYWxGbG9h
dFJlY3QuaGVpZ2h0KCksIG5ld1NpemUuaGVpZ2h0KCkpCisgICAgICAgIDogc3RkOjptYXgob3Jp
Z2luYWxGbG9hdFJlY3Qud2lkdGgoKSwgbmV3U2l6ZS53aWR0aCgpKTsKKyAgICBmbG9hdEhlaWdo
dCA9IHN0ZDo6bWluKGZsb2F0SGVpZ2h0LCBMYXlvdXRVbml0OjptYXgoKSAtIGZsb2F0VG9wKTsK
KyAgICBjbGVhbkxpbmUubWFya0RpcnR5KCk7CisgICAgbWFya0xpbmVzRGlydHlJbkJsb2NrUmFu
Z2UoY2xlYW5MaW5lLmxpbmVCb3R0b21XaXRoTGVhZGluZygpLCBmbG9hdFRvcCArIGZsb2F0SGVp
Z2h0LCAmY2xlYW5MaW5lKTsKKyAgICBMYXlvdXRSZWN0IG5ld0Zsb2F0UmVjdCA9IG9yaWdpbmFs
RmxvYXRSZWN0OworICAgIG5ld0Zsb2F0UmVjdC5zZXRTaXplKG5ld1NpemUpOworICAgIG1hdGNo
aW5nRmxvYXRXaXRoUmVjdC5hZGp1c3RSZWN0KG5ld0Zsb2F0UmVjdCk7CisgICAgZGlydGllZEJ5
RmxvYXQgPSB0cnVlOworfQorCitSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVy
bWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlk
aVJlc29sdmVyJiByZXNvbHZlcikKK3sKKyAgICBSb290SW5saW5lQm94KiBjdXJyZW50TGluZSA9
IG51bGxwdHI7CisgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBudWxscHRyOworCisgICAg
Ly8gRklYTUU6IFRoaXMgZW50aXJlIGZsb2F0LWNoZWNraW5nIGJsb2NrIG5lZWRzIHRvIGJlIGJy
b2tlbiBpbnRvIGEgbmV3IGZ1bmN0aW9uLgorICAgIGF1dG8mIGZsb2F0cyA9IGxheW91dFN0YXRl
LmZsb2F0TGlzdCgpOworICAgIGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKKyAgICBpZiAo
IWxheW91dFN0YXRlLmlzRnVsbExheW91dCgpKSB7CisgICAgICAgIC8vIFBhZ2luYXRlIGFsbCBv
ZiB0aGUgY2xlYW4gbGluZXMuCisgICAgICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmZyYW1l
VmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXco
KS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKKyAgICAgICAg
TGF5b3V0VW5pdCBwYWdpbmF0aW9uRGVsdGE7CisgICAgICAgIGF1dG8gZmxvYXRzSXRlcmF0b3Ig
PSBmbG9hdHMuYmVnaW4oKTsKKyAgICAgICAgYXV0byBlbmQgPSBmbG9hdHMuZW5kKCk7CisgICAg
ICAgIGZvciAoY3VycmVudExpbmUgPSBmaXJzdFJvb3RCb3goKTsgY3VycmVudExpbmUgJiYgIWN1
cnJlbnRMaW5lLT5pc0RpcnR5KCk7IGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUtPm5leHRSb290
Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKKyAgICAgICAgICAgICAgICBp
ZiAobGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoY3VycmVudExpbmUsIDAsIGxheW91
dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRM
aW5lLT5tYXJrRGlydHkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIHBhZ2luYXRpb25EZWx0YSAtPSBjdXJyZW50TGluZS0+
cGFnaW5hdGlvblN0cnV0KCk7CisgICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NGcmFnbWVu
dDsKKyAgICAgICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGN1cnJl
bnRMaW5lLCBwYWdpbmF0aW9uRGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5m
cmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGlvbkRlbHRhKSB7
CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0Zsb2F0cygpIHx8ICFmbG9hdHMuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogRG8gYmV0dGVyIGV2
ZW50dWFsbHkuICBGb3Igbm93IGlmIHdlIGV2ZXIgc2hpZnQgYmVjYXVzZSBvZiBwYWdpbmF0aW9u
IGFuZCBmbG9hdHMgYXJlIHByZXNlbnQganVzdCBnbyB0byBhIGZ1bGwgbGF5b3V0LgorICAgICAg
ICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChjdXJy
ZW50TGluZSwgcGFnaW5hdGlvbkRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudExp
bmUtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24ocGFnaW5hdGlvbkRlbHRhKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmZyYWdtZW50ZWRG
bG93KCkpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShjdXJyZW50
TGluZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdXRvKiBjbGVhbkxpbmVG
bG9hdHMgPSBjdXJyZW50TGluZS0+ZmxvYXRzUHRyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJ
ZiBhIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBiZWZvcmUgdGhpcyBsaW5lIG9yIGJlZm9y
ZSBpdHMgbGFzdCBrbm93biBmbG9hdCwganVzdCBkbyBhIGZ1bGwgbGF5b3V0LgorICAgICAgICAg
ICAgICAgIGJvb2wgZW5jb3VudGVyZWROZXdGbG9hdCA9IGZhbHNlOworICAgICAgICAgICAgICAg
IGZvciAoYXV0byYgZmxvYXRCb3hPbkNsZWFuTGluZSA6ICpjbGVhbkxpbmVGbG9hdHMpIHsKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0c0l0ZXJhdG9yICE9IGVuZCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmICghZmxvYXRCb3hPbkNsZWFuTGluZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBjaGVja0Zsb2F0SW5DbGVhbkxp
bmUoKmN1cnJlbnRMaW5lLCAqZmxvYXRCb3hPbkNsZWFuTGluZSwgKmZsb2F0c0l0ZXJhdG9yLCBl
bmNvdW50ZXJlZE5ld0Zsb2F0LCBkaXJ0aWVkQnlGbG9hdCk7CisgICAgICAgICAgICAgICAgICAg
ICsrZmxvYXRzSXRlcmF0b3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdHNJdGVyYXRv
ciA9PSBlbmQgfHwgZW5jb3VudGVyZWROZXdGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChkaXJ0aWVkQnlGbG9hdCB8fCBlbmNvdW50ZXJlZE5ld0Zsb2F0KQor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICAvLyBDaGVjayBpZiBhIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBhZnRlciB0aGUg
bGFzdCBrbm93biBmbG9hdC4KKyAgICAgICAgaWYgKGZsb2F0c0l0ZXJhdG9yICE9IGVuZCkgewor
ICAgICAgICAgICAgaWYgKCFjdXJyZW50TGluZSkKKyAgICAgICAgICAgICAgICBsYXlvdXRTdGF0
ZS5tYXJrRm9yRnVsbExheW91dCgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAg
ICAgZm9yICg7IGZsb2F0c0l0ZXJhdG9yICE9IGVuZDsgKytmbG9hdHNJdGVyYXRvcikgeworICAg
ICAgICAgICAgICAgICAgICBhdXRvJiBmbG9hdFdpdGhSZWN0ID0gKmZsb2F0c0l0ZXJhdG9yOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0V2l0aFJlY3QtPnJlbmRlcmVyKCkubmVlZHNM
YXlvdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
ICAgICAgICBsYXlvdXRTdGF0ZS5tYXJrRm9yRnVsbExheW91dCgpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAobGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpIHsKKyAgICAgICAg
bV9saW5lQm94ZXMuZGVsZXRlTGluZUJveFRyZWUoKTsKKyAgICAgICAgY3VycmVudExpbmUgPSBu
dWxscHRyOworICAgICAgICBBU1NFUlQoIWZpcnN0Um9vdEJveCgpICYmICFsYXN0Um9vdEJveCgp
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3VycmVudExpbmUpIHsKKyAgICAgICAgICAg
IC8vIFdlIGhhdmUgYSBkaXJ0eSBsaW5lLgorICAgICAgICAgICAgaWYgKFJvb3RJbmxpbmVCb3gq
IHByZXZSb290Qm94ID0gY3VycmVudExpbmUtPnByZXZSb290Qm94KCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBXZSBoYXZlIGEgcHJldmlvdXMgbGluZS4KKyAgICAgICAgICAgICAgICBpZiAoIWRp
cnRpZWRCeUZsb2F0ICYmICghcHJldlJvb3RCb3gtPmVuZHNXaXRoQnJlYWsoKQorICAgICAgICAg
ICAgICAgICAgICB8fCAhcHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpCisgICAgICAgICAgICAg
ICAgICAgIHx8IChpczxSZW5kZXJUZXh0PigqcHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKQor
ICAgICAgICAgICAgICAgICAgICAmJiBwcmV2Um9vdEJveC0+bGluZUJyZWFrUG9zKCkgPj0gZG93
bmNhc3Q8UmVuZGVyVGV4dD4oKnByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSkudGV4dCgpLmxl
bmd0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGxpbmUgZGlk
bid0IGJyZWFrIGNsZWFubHkgb3IgYnJva2UgYXQgYSBuZXdsaW5lCisgICAgICAgICAgICAgICAg
ICAgIC8vIHRoYXQgaGFzIGJlZW4gZGVsZXRlZCwgc28gdHJlYXQgaXQgYXMgZGlydHkgdG9vLgor
ICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IHByZXZSb290Qm94OworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBoYXZl
IG5vIGRpcnR5IGxpbmVzLCB0aGVuIGxhc3QgaXMganVzdCB0aGUgbGFzdCByb290IGJveC4KKyAg
ICAgICAgbGFzdExpbmUgPSBjdXJyZW50TGluZSA/IGN1cnJlbnRMaW5lLT5wcmV2Um9vdEJveCgp
IDogbGFzdFJvb3RCb3goKTsKKyAgICB9CisKKyAgICBpZiAoIWZsb2F0cy5pc0VtcHR5KCkpIHsK
KyAgICAgICAgTGF5b3V0VW5pdCBzYXZlZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7
CisgICAgICAgIC8vIFJlc3RvcmUgZmxvYXRzIGZyb20gY2xlYW4gbGluZXMuCisgICAgICAgIFJv
b3RJbmxpbmVCb3gqIGxpbmUgPSBmaXJzdFJvb3RCb3goKTsKKyAgICAgICAgd2hpbGUgKGxpbmUg
IT0gY3VycmVudExpbmUpIHsKKyAgICAgICAgICAgIGlmIChhdXRvKiBjbGVhbkxpbmVGbG9hdHMg
PSBsaW5lLT5mbG9hdHNQdHIoKSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgZmxvYXRp
bmdCb3ggOiAqY2xlYW5MaW5lRmxvYXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmxv
YXRpbmdCb3gpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
ICAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGluZ09iamVjdCgqZmxv
YXRpbmdCb3gpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBM
SUNBVElPTighZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldE9yaWdpbmF0aW5nTGluZSgqbGluZSk7CisgICAg
ICAgICAgICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEZvckNoaWxkKCpmbG9h
dGluZ0JveCkgLSBtYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gpKTsKKyAgICAgICAg
ICAgICAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKKyAgICAgICAgICAgICAgICAgICAgZmxv
YXRzLnNldExhc3RDbGVhbkZsb2F0KCpmbG9hdGluZ0JveCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCk7Cisg
ICAgICAgIH0KKyAgICAgICAgc2V0TG9naWNhbEhlaWdodChzYXZlZExvZ2ljYWxIZWlnaHQpOwor
ICAgIH0KKworICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKCFsYXN0TGlu
ZSk7CisgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkoIWxhc3RMaW5lIHx8IGxhc3RMaW5lLT5lbmRzV2l0aEJyZWFrKCkpOworCisgICAgaWYgKGxh
c3RMaW5lKSB7CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobGFzdExpbmUtPmxpbmVCb3R0b21X
aXRoTGVhZGluZygpKTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgaXRlciA9IElubGluZUl0ZXJh
dG9yKHRoaXMsIGxhc3RMaW5lLT5saW5lQnJlYWtPYmooKSwgbGFzdExpbmUtPmxpbmVCcmVha1Bv
cygpKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oaXRlciwgbnVtYmVyT2ZJc29sYXRl
QW5jZXN0b3JzKGl0ZXIpKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0U3RhdHVzKGxhc3RMaW5lLT5s
aW5lQnJlYWtCaWRpU3RhdHVzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRleHREaXJlY3Rp
b24gZGlyZWN0aW9uID0gc3R5bGUoKS5kaXJlY3Rpb24oKTsKKyAgICAgICAgaWYgKHN0eWxlKCku
dW5pY29kZUJpZGkoKSA9PSBQbGFpbnRleHQpCisgICAgICAgICAgICBkZXRlcm1pbmVEaXJlY3Rp
b25hbGl0eShkaXJlY3Rpb24sIElubGluZUl0ZXJhdG9yKHRoaXMsIGJpZGlGaXJzdFNraXBwaW5n
RW1wdHlJbmxpbmVzKCp0aGlzKSwgMCkpOworICAgICAgICByZXNvbHZlci5zZXRTdGF0dXMoQmlk
aVN0YXR1cyhkaXJlY3Rpb24sIGlzT3ZlcnJpZGUoc3R5bGUoKS51bmljb2RlQmlkaSgpKSkpOwor
ICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0b3IodGhpcywgYmlkaUZp
cnN0U2tpcHBpbmdFbXB0eUlubGluZXMoKnRoaXMsICZyZXNvbHZlciksIDApOworICAgICAgICBy
ZXNvbHZlci5zZXRQb3NpdGlvbihpdGVyLCBudW1iZXJPZklzb2xhdGVBbmNlc3RvcnMoaXRlcikp
OworICAgIH0KKyAgICByZXR1cm4gY3VycmVudExpbmU7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjpkZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBS
b290SW5saW5lQm94KiBzdGFydExpbmUsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwg
QmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cykKK3sKKyAgICBhdXRvIGl0ZXJhdG9yRm9y
Rmlyc3REaXJ0eUZsb2F0ID0gW10oTGluZUxheW91dFN0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykg
eworICAgICAgICBhdXRvIGxhc3RDbGVhbkZsb2F0ID0gZmxvYXRzLmxhc3RDbGVhbkZsb2F0KCk7
CisgICAgICAgIGlmICghbGFzdENsZWFuRmxvYXQpCisgICAgICAgICAgICByZXR1cm4gZmxvYXRz
LmJlZ2luKCk7CisgICAgICAgIGF1dG8qIGxhc3RDbGVhbkZsb2F0V2l0aFJlY3QgPSBmbG9hdHMu
ZmxvYXRXaXRoUmVjdCgqbGFzdENsZWFuRmxvYXQpOworICAgICAgICBBU1NFUlQobGFzdENsZWFu
RmxvYXRXaXRoUmVjdCk7CisgICAgICAgIHJldHVybiArK2Zsb2F0cy5maW5kKCpsYXN0Q2xlYW5G
bG9hdFdpdGhSZWN0KTsKKyAgICB9OworCisgICAgQVNTRVJUKCFsYXlvdXRTdGF0ZS5lbmRMaW5l
KCkpOworICAgIGF1dG8gZmxvYXRzSXRlcmF0b3IgPSBpdGVyYXRvckZvckZpcnN0RGlydHlGbG9h
dChsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKSk7CisgICAgYXV0byBlbmQgPSBsYXlvdXRTdGF0ZS5m
bG9hdExpc3QoKS5lbmQoKTsKKyAgICBSb290SW5saW5lQm94KiBsYXN0TGluZSA9IG51bGxwdHI7
CisgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyZW50TGluZSA9IHN0YXJ0TGluZS0+bmV4dFJv
b3RCb3goKTsgY3VycmVudExpbmU7IGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUtPm5leHRSb290
Qm94KCkpIHsKKyAgICAgICAgaWYgKCFjdXJyZW50TGluZS0+aXNEaXJ0eSgpKSB7CisgICAgICAg
ICAgICBpZiAoYXV0byogY2xlYW5MaW5lRmxvYXRzID0gY3VycmVudExpbmUtPmZsb2F0c1B0cigp
KSB7CisgICAgICAgICAgICAgICAgYm9vbCBlbmNvdW50ZXJlZE5ld0Zsb2F0ID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgYm9vbCBkaXJ0aWVkQnlGbG9hdCA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIGZvciAoYXV0byYgZmxvYXRCb3hPbkNsZWFuTGluZSA6ICpjbGVhbkxpbmVGbG9hdHMpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCFmbG9hdEJveE9uQ2xlYW5MaW5lKQorICAgICAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChmbG9h
dHNJdGVyYXRvciAhPSBlbmQpOworICAgICAgICAgICAgICAgICAgICBjaGVja0Zsb2F0SW5DbGVh
bkxpbmUoKmN1cnJlbnRMaW5lLCAqZmxvYXRCb3hPbkNsZWFuTGluZSwgKmZsb2F0c0l0ZXJhdG9y
LCBlbmNvdW50ZXJlZE5ld0Zsb2F0LCBkaXJ0aWVkQnlGbG9hdCk7CisgICAgICAgICAgICAgICAg
ICAgICsrZmxvYXRzSXRlcmF0b3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdHNJdGVy
YXRvciA9PSBlbmQgfHwgZW5jb3VudGVyZWROZXdGbG9hdCkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgaWYgKGN1cnJlbnRMaW5lLT5pc0RpcnR5KCkpCisgICAgICAgICAgICBsYXN0TGlu
ZSA9IG51bGxwdHI7CisgICAgICAgIGVsc2UgaWYgKCFsYXN0TGluZSkKKyAgICAgICAgICAgIGxh
c3RMaW5lID0gY3VycmVudExpbmU7CisgICAgfQorCisgICAgaWYgKCFsYXN0TGluZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gQXQgdGhpcyBwb2ludCwgfGxhc3R8IGlzIHRoZSBmaXJzdCBs
aW5lIGluIGEgcnVuIG9mIGNsZWFuIGxpbmVzIHRoYXQgZW5kcyB3aXRoIHRoZSBsYXN0IGxpbmUK
KyAgICAvLyBpbiB0aGUgYmxvY2suCisgICAgUm9vdElubGluZUJveCogcHJldmlvdXNMaW5lID0g
bGFzdExpbmUtPnByZXZSb290Qm94KCk7CisgICAgY2xlYW5MaW5lU3RhcnQgPSBJbmxpbmVJdGVy
YXRvcih0aGlzLCBwcmV2aW91c0xpbmUtPmxpbmVCcmVha09iaigpLCBwcmV2aW91c0xpbmUtPmxp
bmVCcmVha1BvcygpKTsKKyAgICBjbGVhbkxpbmVCaWRpU3RhdHVzID0gcHJldmlvdXNMaW5lLT5s
aW5lQnJlYWtCaWRpU3RhdHVzKCk7CisgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZUxvZ2ljYWxU
b3AocHJldmlvdXNMaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7CisKKyAgICBmb3IgKFJv
b3RJbmxpbmVCb3gqIGxpbmUgPSBsYXN0TGluZTsgbGluZTsgbGluZSA9IGxpbmUtPm5leHRSb290
Qm94KCkpIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBhbGwgbGluZSBib3hlcyBmcm9tIHRoZWly
IHJlbmRlciBvYmplY3RzIHdoaWxlIHByZXNlcnZpbmcgdGhlaXIgY29ubmVjdGlvbnMgdG8gb25l
IGFub3RoZXIuCisgICAgICAgIGxpbmUtPmV4dHJhY3RMaW5lKCk7CisgICAgfQorICAgIGxheW91
dFN0YXRlLnNldEVuZExpbmUobGFzdExpbmUpOworfQorCitib29sIFJlbmRlckJsb2NrRmxvdzo6
Y2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUpCit7CisgICAgTGF5b3V0VW5pdCBsaW5lRGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBs
YXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgpOworCisgICAgYm9vbCBwYWdpbmF0ZWQgPSB2
aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygp
LmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgp
OworICAgIGlmIChwYWdpbmF0ZWQgJiYgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkgewor
ICAgICAgICAvLyBDaGVjayBhbGwgbGluZXMgZnJvbSBoZXJlIHRvIHRoZSBlbmQsIGFuZCBzZWUg
aWYgdGhlIGh5cG90aGV0aWNhbCBuZXcgcG9zaXRpb24gZm9yIHRoZSBsaW5lcyB3aWxsIHJlc3Vs
dAorICAgICAgICAvLyBpbiBhIGRpZmZlcmVudCBhdmFpbGFibGUgbGluZSB3aWR0aC4KKyAgICAg
ICAgZm9yIChSb290SW5saW5lQm94KiBsaW5lQm94ID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOyBs
aW5lQm94OyBsaW5lQm94ID0gbGluZUJveC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAg
aWYgKHBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgdGhlIHJlYWwg
bW92ZSB3ZSdyZSBnb2luZyB0byBkbywgc28gZG9uJ3QgdXBkYXRlIHRoZSBsaW5lIGJveCdzIHBh
Z2luYXRpb24KKyAgICAgICAgICAgICAgICAvLyBzdHJ1dCB5ZXQuCisgICAgICAgICAgICAgICAg
TGF5b3V0VW5pdCBvbGRQYWdpbmF0aW9uU3RydXQgPSBsaW5lQm94LT5wYWdpbmF0aW9uU3RydXQo
KTsKKyAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50OworICAgICAgICAgICAg
ICAgIGxpbmVEZWx0YSAtPSBvbGRQYWdpbmF0aW9uU3RydXQ7CisgICAgICAgICAgICAgICAgYWRq
dXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBsaW5lRGVsdGEsIG92ZXJmbG93
c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAgICAg
ICBsaW5lQm94LT5zZXRQYWdpbmF0aW9uU3RydXQob2xkUGFnaW5hdGlvblN0cnV0KTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdl
ZChsaW5lQm94LCBsaW5lRGVsdGEsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBp
ZiAoIWxpbmVEZWx0YSB8fCAhbV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybiB0cnVl
OworICAgIAorICAgIC8vIFNlZSBpZiBhbnkgZmxvYXRzIGVuZCBpbiB0aGUgcmFuZ2UgYWxvbmcg
d2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGluZXMgdmVydGljYWxseS4KKyAgICBMYXlvdXRV
bml0IGxvZ2ljYWxUb3AgPSBzdGQ6Om1pbihsb2dpY2FsSGVpZ2h0KCksIGxheW91dFN0YXRlLmVu
ZExpbmVMb2dpY2FsVG9wKCkpOworCisgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBsYXlv
dXRTdGF0ZS5lbmRMaW5lKCk7CisgICAgd2hpbGUgKFJvb3RJbmxpbmVCb3gqIG5leHRMaW5lID0g
bGFzdExpbmUtPm5leHRSb290Qm94KCkpCisgICAgICAgIGxhc3RMaW5lID0gbmV4dExpbmU7CisK
KyAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20gPSBsYXN0TGluZS0+bGluZUJvdHRvbVdpdGhM
ZWFkaW5nKCkgKyBhYnNvbHV0ZVZhbHVlKGxpbmVEZWx0YSk7CisKKyAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7
CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICBmb3IgKGF1dG8g
aXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAg
ICAgY29uc3QgYXV0byYgZmxvYXRpbmdPYmplY3QgPSAqaXQtPmdldCgpOworICAgICAgICBpZiAo
bG9naWNhbEJvdHRvbUZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA+PSBsb2dpY2FsVG9wICYmIGxv
Z2ljYWxCb3R0b21Gb3JGbG9hdChmbG9hdGluZ09iamVjdCkgPCBsb2dpY2FsQm90dG9tKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiti
b29sIFJlbmRlckJsb2NrRmxvdzo6bGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoUm9v
dElubGluZUJveCogcm9vdEJveCwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRlckZyYWdtZW50
ZWRGbG93KiBmcmFnbWVudGVkRmxvdykgY29uc3QKK3sKKyAgICBpZiAoIWZyYWdtZW50ZWRGbG93
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciog
Y3VycmVudEZyYWdtZW50ID0gZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KHJvb3RCb3gtPmxpbmVUb3BX
aXRoTGVhZGluZygpICsgbGluZURlbHRhKTsKKyAgICAvLyBKdXN0IGJhaWwgaWYgdGhlIGZyYWdt
ZW50IGRpZG4ndCBjaGFuZ2UuCisgICAgaWYgKHJvb3RCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgp
ID09IGN1cnJlbnRGcmFnbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBy
b290Qm94LT5wYWdpbmF0ZWRMaW5lV2lkdGgoKSAhPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JD
b250ZW50KGN1cnJlbnRGcmFnbWVudCk7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93OjptYXRj
aGVkRW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBj
b25zdCBCaWRpU3RhdHVzJiBlbmRMaW5lU3RhdHVzKQoreworICAgIGlmIChyZXNvbHZlci5wb3Np
dGlvbigpID09IGVuZExpbmVTdGFydCkgeworICAgICAgICBpZiAocmVzb2x2ZXIuc3RhdHVzKCkg
IT0gZW5kTGluZVN0YXR1cykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0
dXJuIGNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShsYXlvdXRTdGF0ZSk7CisgICAg
fQorCisgICAgLy8gVGhlIGZpcnN0IGNsZWFuIGxpbmUgZG9lc24ndCBtYXRjaCwgYnV0IHdlIGNh
biBjaGVjayBhIGhhbmRmdWwgb2YgZm9sbG93aW5nIGxpbmVzIHRvIHRyeQorICAgIC8vIHRvIG1h
dGNoIGJhY2sgdXAuCisgICAgc3RhdGljIGNvbnN0IGludCBudW1MaW5lcyA9IDg7IC8vIFRoZSAj
IG9mIGxpbmVzIHdlJ3JlIHdpbGxpbmcgdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICBSb290SW5saW5l
Qm94KiBvcmlnaW5hbEVuZExpbmUgPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7CisgICAgUm9vdElu
bGluZUJveCogbGluZSA9IG9yaWdpbmFsRW5kTGluZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IG51bUxpbmVzICYmIGxpbmU7IGkrKywgbGluZSA9IGxpbmUtPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgaWYgKGxpbmUtPmxpbmVCcmVha09iaigpID09IHJlc29sdmVyLnBvc2l0aW9uKCkucmVu
ZGVyZXIoKSAmJiBsaW5lLT5saW5lQnJlYWtQb3MoKSA9PSByZXNvbHZlci5wb3NpdGlvbigpLm9m
ZnNldCgpKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guCisgICAgICAgICAgICBp
ZiAobGluZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpICE9IHJlc29sdmVyLnN0YXR1cygpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gLi4uYnV0IHRoZSBiaWRpIHN0YXRlIGRvZXNu
J3QgbWF0Y2guCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2wgbWF0Y2hlZCA9IGZhbHNl
OworICAgICAgICAgICAgUm9vdElubGluZUJveCogcmVzdWx0ID0gbGluZS0+bmV4dFJvb3RCb3go
KTsKKyAgICAgICAgICAgIGxheW91dFN0YXRlLnNldEVuZExpbmUocmVzdWx0KTsKKyAgICAgICAg
ICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5l
TG9naWNhbFRvcChsaW5lLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7CisgICAgICAgICAgICAg
ICAgbWF0Y2hlZCA9IGNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShsYXlvdXRTdGF0
ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vdyBkZWxldGUgdGhlIGxpbmVz
IHRoYXQgd2UgZmFpbGVkIHRvIHN5bmMuCisgICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5
b3V0U3RhdGUsIG9yaWdpbmFsRW5kTGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBt
YXRjaGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29s
IFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmpl
Y3QqIGlubGluZU9iaikKK3sKKyAgICBBU1NFUlQoaW5saW5lT2JqLT5wYXJlbnQoKSA9PSB0aGlz
KTsKKworICAgIElubGluZUl0ZXJhdG9yIGl0KHRoaXMsIGlubGluZU9iaiwgMCk7CisgICAgLy8g
RklYTUU6IFdlIHNob3VsZCBwYXNzIGNvcnJlY3QgdmFsdWUgZm9yIFdoaXRlc3BhY2VQb3NpdGlv
bi4KKyAgICB3aGlsZSAoIWl0LmF0RW5kKCkgJiYgIXJlcXVpcmVzTGluZUJveChpdCkpCisgICAg
ICAgIGl0LmluY3JlbWVudCgpOworCisgICAgcmV0dXJuICFpdC5hdEVuZCgpOworfQorCit2b2lk
IFJlbmRlckJsb2NrRmxvdzo6YWRkT3ZlcmZsb3dGcm9tSW5saW5lQ2hpbGRyZW4oKQoreworICAg
IGlmIChhdXRvIGxheW91dCA9IHNpbXBsZUxpbmVMYXlvdXQoKSkgeworICAgICAgICBBU1NFUlQo
IWhhc092ZXJmbG93Q2xpcCgpKTsKKyAgICAgICAgU2ltcGxlTGluZUxheW91dDo6Y29sbGVjdEZs
b3dPdmVyZmxvdygqdGhpcywgKmxheW91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
TGF5b3V0VW5pdCBlbmRQYWRkaW5nID0gaGFzT3ZlcmZsb3dDbGlwKCkgPyBwYWRkaW5nRW5kKCkg
OiAwX2x1OworICAgIC8vIEZJWE1FOiBOZWVkIHRvIGZpbmQgYW5vdGhlciB3YXkgdG8gZG8gdGhp
cywgc2luY2Ugc2Nyb2xsYmFycyBjb3VsZCBzaG93IHdoZW4gd2UgZG9uJ3Qgd2FudCB0aGVtIHRv
LgorICAgIGlmIChoYXNPdmVyZmxvd0NsaXAoKSAmJiAhZW5kUGFkZGluZyAmJiBlbGVtZW50KCkg
JiYgZWxlbWVudCgpLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQoKSAmJiBzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSkKKyAgICAgICAgZW5kUGFkZGluZyA9IDE7CisgICAgZm9yIChSb290
SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0
Um9vdEJveCgpKSB7CisgICAgICAgIGFkZExheW91dE92ZXJmbG93KGN1cnItPnBhZGRlZExheW91
dE92ZXJmbG93UmVjdChlbmRQYWRkaW5nKSk7CisgICAgICAgIFJlbmRlckZyYWdtZW50Q29udGFp
bmVyKiBmcmFnbWVudCA9IGVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCkgPyBjdXJyLT5jb250YWlu
aW5nRnJhZ21lbnQoKSA6IG51bGxwdHI7CisgICAgICAgIGlmIChmcmFnbWVudCkKKyAgICAgICAg
ICAgIGZyYWdtZW50LT5hZGRMYXlvdXRPdmVyZmxvd0ZvckJveCh0aGlzLCBjdXJyLT5wYWRkZWRM
YXlvdXRPdmVyZmxvd1JlY3QoZW5kUGFkZGluZykpOworICAgICAgICBpZiAoIWhhc092ZXJmbG93
Q2xpcCgpKSB7CisgICAgICAgICAgICBMYXlvdXRSZWN0IGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0
ID0gY3Vyci0+dmlzdWFsT3ZlcmZsb3dSZWN0KGN1cnItPmxpbmVUb3AoKSwgY3Vyci0+bGluZUJv
dHRvbSgpKTsKKyAgICAgICAgICAgIGFkZFZpc3VhbE92ZXJmbG93KGNoaWxkVmlzdWFsT3ZlcmZs
b3dSZWN0KTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCkKKyAgICAgICAgICAgICAgICBmcmFn
bWVudC0+YWRkVmlzdWFsT3ZlcmZsb3dGb3JCb3godGhpcywgY2hpbGRWaXN1YWxPdmVyZmxvd1Jl
Y3QpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGVsZXRl
RWxsaXBzaXNMaW5lQm94ZXMoKQoreworICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5
bGUoKS50ZXh0QWxpZ24oKTsKKyAgICBib29sIGx0ciA9IHN0eWxlKCkuaXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpOworICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0gSW5kZW50
VGV4dDsKKyAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3Vy
cjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgaWYgKGN1cnItPmhhc0Vs
bGlwc2lzQm94KCkpIHsKKyAgICAgICAgICAgIGN1cnItPmNsZWFyVHJ1bmNhdGlvbigpOworCisg
ICAgICAgICAgICAvLyBTaGlmdCB0aGUgbGluZSBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MgaWYgd2Ug
Y2Fubm90IGFjY29tb2RhdGUgYW4gZWxsaXBzaXMuCisgICAgICAgICAgICBmbG9hdCBsb2dpY2Fs
TGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZElu
ZGVudFRleHQpOworICAgICAgICAgICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbG9n
aWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIERvTm90SW5kZW50VGV4dCkg
LSBsb2dpY2FsTGVmdDsKKyAgICAgICAgICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gY3Vy
ci0+bG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGln
bm1lbnQodGV4dEFsaWduLCBjdXJyLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgs
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgMCk7CisKKyAgICAgICAgICAgIGlmIChsdHIpCisgICAg
ICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0aW9uKChsb2dpY2FsTGVmdCAtIGN1
cnItPmxvZ2ljYWxMZWZ0KCkpLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBjdXJyLT5hZGp1c3RMb2dpY2FsUG9zaXRpb24oLShjdXJyLT5sb2dpY2FsTGVmdCgpIC0gbG9n
aWNhbExlZnQpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzaG91bGRJbmRlbnRUZXh0ID0gRG9O
b3RJbmRlbnRUZXh0OworICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrTGlu
ZXNGb3JUZXh0T3ZlcmZsb3coKQoreworICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggb2YgdGhl
IGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCisgICAgLy8gRklYTUU6IENTUzMgc2F5
cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRvIHVzZSAweDAwMkUgKEZVTEwgU1RP
UCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJlbmRlcmFibGUiCisgICAgY29uc3Qg
Rm9udENhc2NhZGUmIGZvbnQgPSBzdHlsZSgpLmZvbnRDYXNjYWRlKCk7CisgICAgc3RhdGljIE5l
dmVyRGVzdHJveWVkPEF0b21TdHJpbmc+IGVsbGlwc2lzU3RyKCZob3Jpem9udGFsRWxsaXBzaXMs
IDEpOworICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmaXJzdExpbmVGb250ID0gZmlyc3RMaW5lU3R5
bGUoKS5mb250Q2FzY2FkZSgpOworICAgIGZsb2F0IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggPSBm
aXJzdExpbmVGb250LndpZHRoKGNvbnN0cnVjdFRleHRSdW4oJmhvcml6b250YWxFbGxpcHNpcywg
MSwgZmlyc3RMaW5lU3R5bGUoKSkpOworICAgIGZsb2F0IGVsbGlwc2lzV2lkdGggPSAoZm9udCA9
PSBmaXJzdExpbmVGb250KSA/IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBmb250LndpZHRoKGNv
bnN0cnVjdFRleHRSdW4oJmhvcml6b250YWxFbGxpcHNpcywgMSwgc3R5bGUoKSkpOworCisgICAg
Ly8gRm9yIExUUiB0ZXh0IHRydW5jYXRpb24sIHdlIHdhbnQgdG8gZ2V0IHRoZSByaWdodCBlZGdl
IG9mIG91ciBwYWRkaW5nIGJveCwgYW5kIHRoZW4gd2Ugd2FudCB0byBzZWUKKyAgICAvLyBpZiB0
aGUgcmlnaHQgZWRnZSBvZiBhIGxpbmUgYm94IGV4Y2VlZHMgdGhhdC4gIEZvciBSVEwsIHdlIHVz
ZSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBwYWRkaW5nIGJveCBhbmQKKyAgICAvLyBjaGVjayB0aGUg
bGVmdCBlZGdlIG9mIHRoZSBsaW5lIGJveCB0byBzZWUgaWYgaXQgaXMgbGVzcworICAgIC8vIElu
Y2x1ZGUgdGhlIHNjcm9sbGJhciBmb3Igb3ZlcmZsb3cgYmxvY2tzLCB3aGljaCBtZWFucyB3ZSB3
YW50IHRvIHVzZSAiY29udGVudFdpZHRoKCkiCisgICAgYm9vbCBsdHIgPSBzdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKTsKKyAgICBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiA9IHN0eWxl
KCkudGV4dEFsaWduKCk7CisgICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOworICAgIGZvciAoUm9v
dElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4
dFJvb3RCb3goKSkgeworICAgICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9
IGZpcnN0TGluZSA/IEluZGVudFRleHQgOiBEb05vdEluZGVudFRleHQ7CisgICAgICAgIExheW91
dFVuaXQgYmxvY2tSaWdodEVkZ2UgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGN1cnItPmxp
bmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7CisgICAgICAgIExheW91dFVuaXQgYmxvY2tMZWZ0
RWRnZSA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZElu
ZGVudFRleHQpOworICAgICAgICBMYXlvdXRVbml0IGxpbmVCb3hFZGdlIHsgbHRyID8gY3Vyci0+
eCgpICsgY3Vyci0+bG9naWNhbFdpZHRoKCkgOiBjdXJyLT54KCkgfTsKKyAgICAgICAgaWYgKChs
dHIgJiYgbGluZUJveEVkZ2UgPiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFsdHIgJiYgbGluZUJveEVk
Z2UgPCBibG9ja0xlZnRFZGdlKSkgeworICAgICAgICAgICAgLy8gVGhpcyBsaW5lIHNwaWxscyBv
dXQgb2Ygb3VyIGJveCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiAgTm93IHdlIG5lZWQg
dG8gc2VlIGlmIHRoZSBsaW5lCisgICAgICAgICAgICAvLyBjYW4gYmUgdHJ1bmNhdGVkLiAgSW4g
b3JkZXIgZm9yIHRydW5jYXRpb24gdG8gYmUgcG9zc2libGUsIHRoZSBsaW5lIG11c3QgaGF2ZSBz
dWZmaWNpZW50IHNwYWNlIHRvCisgICAgICAgICAgICAvLyBhY2NvbW1vZGF0ZSBvdXIgdHJ1bmNh
dGlvbiBzdHJpbmcsIGFuZCBubyByZXBsYWNlZCBlbGVtZW50cyAoaW1hZ2VzLCB0YWJsZXMpIGNh
biBvdmVybGFwIHRoZSBlbGxpcHNpcworICAgICAgICAgICAgLy8gc3BhY2UuCisgICAgICAgICAg
ICBMYXlvdXRVbml0IHdpZHRoIHsgZmlyc3RMaW5lID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA6
IGVsbGlwc2lzV2lkdGggfTsKKyAgICAgICAgICAgIExheW91dFVuaXQgYmxvY2tFZGdlIHsgbHRy
ID8gYmxvY2tSaWdodEVkZ2UgOiBibG9ja0xlZnRFZGdlIH07CisgICAgICAgICAgICBpZiAoY3Vy
ci0+bGluZUNhbkFjY29tbW9kYXRlRWxsaXBzaXMobHRyLCBibG9ja0VkZ2UsIGxpbmVCb3hFZGdl
LCB3aWR0aCkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGN1
cnItPnBsYWNlRWxsaXBzaXMoZWxsaXBzaXNTdHIsIGx0ciwgYmxvY2tMZWZ0RWRnZSwgYmxvY2tS
aWdodEVkZ2UsIHdpZHRoKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IGxvZ2ljYWxMZWZ0ID0g
MDsgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZGVsdGEgZnJvbSB0aGUgYmFzZSBw
b3NpdGlvbi4KKyAgICAgICAgICAgICAgICBmbG9hdCB0cnVuY2F0ZWRXaWR0aCA9IGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsK
KyAgICAgICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWdu
LCBjdXJyLCBudWxscHRyLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIHRydW5jYXRl
ZFdpZHRoLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAobHRyKQorICAgICAgICAgICAgICAgICAg
ICBjdXJyLT5hZGp1c3RMb2dpY2FsUG9zaXRpb24obG9naWNhbExlZnQsIDApOworICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0TG9naWNhbFBvc2l0
aW9uKC0odHJ1bmNhdGVkV2lkdGggLSAobG9naWNhbExlZnQgKyB0b3RhbExvZ2ljYWxXaWR0aCkp
LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaXJzdExpbmUgPSBmYWxz
ZTsKKyAgICB9Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zsb2F0T25M
aW5lKGNvbnN0IEZsb2F0aW5nT2JqZWN0JiBuZXdGbG9hdCwgRmxvYXRpbmdPYmplY3QqIGxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVJbmZvJiBsaW5lSW5mbywgTGluZVdpZHRoJiB3aWR0
aCkKK3sKKyAgICBpZiAoIXBvc2l0aW9uTmV3RmxvYXRzKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHdpZHRoLnNocmlua0F2YWlsYWJsZVdpZHRoRm9yTmV3RmxvYXRJZk5lZWRlZChu
ZXdGbG9hdCk7CisKKyAgICAvLyBXZSBvbmx5IGNvbm5lY3QgZmxvYXRzIHRvIGxpbmVzIGZvciBw
YWdpbmF0aW9uIHB1cnBvc2VzIGlmIHRoZSBmbG9hdHMgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mCisg
ICAgLy8gdGhlIGxpbmUgYW5kIHRoZSBwcmV2aW91cyBsaW5lIGhhZCBhIGhhcmQgYnJlYWsgKHNv
IHRoaXMgbGluZSBpcyBlaXRoZXIgdGhlIGZpcnN0IGluIHRoZSBibG9jaworICAgIC8vIG9yIGZv
bGxvd3MgYSA8YnI+KS4KKyAgICBpZiAoIW5ld0Zsb2F0LnBhZ2luYXRpb25TdHJ1dCgpIHx8ICFs
aW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSB8fCAhbGluZUluZm8uaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBm
bG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBBU1NFUlQo
ZmxvYXRpbmdPYmplY3RTZXQubGFzdCgpLmdldCgpID09ICZuZXdGbG9hdCk7CisKKyAgICBMYXlv
dXRVbml0IGZsb2F0TG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JGbG9hdChuZXdGbG9hdCk7Cisg
ICAgTGF5b3V0VW5pdCBwYWdpbmF0aW9uU3RydXQgPSBuZXdGbG9hdC5wYWdpbmF0aW9uU3RydXQo
KTsKKworICAgIGlmIChmbG9hdExvZ2ljYWxUb3AgLSBwYWdpbmF0aW9uU3RydXQgIT0gbG9naWNh
bEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAg
LS1pdDsgLy8gTGFzdCBmbG9hdCBpcyBuZXdGbG9hdCwgc2tpcCB0aGF0IG9uZS4KKyAgICBhdXRv
IGJlZ2luID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gYmVn
aW4pIHsKKyAgICAgICAgLS1pdDsKKyAgICAgICAgYXV0byYgZmxvYXRpbmdPYmplY3QgPSAqaXQt
PmdldCgpOworICAgICAgICBpZiAoJmZsb2F0aW5nT2JqZWN0ID09IGxhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGxvZ2ljYWxUb3BGb3JG
bG9hdChmbG9hdGluZ09iamVjdCkgPT0gbG9naWNhbEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQ
YWdpbmF0aW9uU3RydXQoKSkgeworICAgICAgICAgICAgZmxvYXRpbmdPYmplY3Quc2V0UGFnaW5h
dGlvblN0cnV0KHBhZ2luYXRpb25TdHJ1dCArIGZsb2F0aW5nT2JqZWN0LnBhZ2luYXRpb25TdHJ1
dCgpKTsKKyAgICAgICAgICAgIFJlbmRlckJveCYgZmxvYXRCb3ggPSBmbG9hdGluZ09iamVjdC5y
ZW5kZXJlcigpOworICAgICAgICAgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94LCBs
b2dpY2FsVG9wRm9yQ2hpbGQoZmxvYXRCb3gpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoZmxvYXRC
b3gpICsgcGFnaW5hdGlvblN0cnV0KTsKKworICAgICAgICAgICAgaWYgKHVwZGF0ZUZyYWdtZW50
UmFuZ2VGb3JCb3hDaGlsZChmbG9hdEJveCkpCisgICAgICAgICAgICAgICAgZmxvYXRCb3guc2V0
TmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzPFJlbmRl
ckJsb2NrPihmbG9hdEJveCkpCisgICAgICAgICAgICAgICAgZG93bmNhc3Q8UmVuZGVyQmxvY2s+
KGZsb2F0Qm94KS5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAgICAgICAg
ICBmbG9hdEJveC5sYXlvdXRJZk5lZWRlZCgpOworCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBv
bGQgbG9naWNhbCB0b3AgYmVmb3JlIGNhbGxpbmcgcmVtb3ZlUGxhY2VkT2JqZWN0IHdoaWNoIHdp
bGwgc2V0CisgICAgICAgICAgICAvLyBpc1BsYWNlZCB0byBmYWxzZS4gT3RoZXJ3aXNlIGl0IHdp
bGwgdHJpZ2dlciBhbiBhc3NlcnQgaW4gbG9naWNhbFRvcEZvckZsb2F0LgorICAgICAgICAgICAg
TGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2Jq
ZWN0KTsKKyAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmVQbGFjZWRPYmplY3Qo
JmZsb2F0aW5nT2JqZWN0KTsKKyAgICAgICAgICAgIHNldExvZ2ljYWxUb3BGb3JGbG9hdChmbG9h
dGluZ09iamVjdCwgb2xkTG9naWNhbFRvcCArIHBhZ2luYXRpb25TdHJ1dCk7CisgICAgICAgICAg
ICBtX2Zsb2F0aW5nT2JqZWN0cy0+YWRkUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVjdCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBKdXN0IHVwZGF0ZSB0aGUgbGluZSBpbmZvJ3MgcGFn
aW5hdGlvbiBzdHJ1dCB3aXRob3V0IGFsdGVyaW5nIG91ciBsb2dpY2FsIGhlaWdodCB5ZXQuIElm
IHRoZSBsaW5lIGVuZHMgdXAgY29udGFpbmluZworICAgIC8vIG5vIGNvbnRlbnQsIHRoZW4gd2Ug
ZG9uJ3Qgd2FudCB0byBpbXByb3Blcmx5IGdyb3cgdGhlIGhlaWdodCBvZiB0aGUgYmxvY2suCisg
ICAgbGluZUluZm8uc2V0RmxvYXRQYWdpbmF0aW9uU3RydXQobGluZUluZm8uZmxvYXRQYWdpbmF0
aW9uU3RydXQoKSArIHBhZ2luYXRpb25TdHJ1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0xh
eW91dFVuaXQgUmVuZGVyQmxvY2tGbG93OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91
dFVuaXQgcG9zaXRpb24sIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KQoreworICAg
IFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKKyAgICBib29s
IHNob3VsZEFwcGx5SW5kZW50VGV4dCA9IGZhbHNlOworICAgIHN3aXRjaCAodGV4dEFsaWduKSB7
CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpMZWZ0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6
V2ViS2l0TGVmdDoKKyAgICAgICAgc2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gc3R5bGUoKS5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVGV4dEFsaWdu
TW9kZTo6UmlnaHQ6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRSaWdodDoKKyAgICAg
ICAgc2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlN0YXJ0OgorICAg
ICAgICBzaG91bGRBcHBseUluZGVudFRleHQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBzaG91bGRBcHBseUluZGVudFRleHQgPSBmYWxzZTsKKyAgICB9Cisg
ICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzE1NDI3NTcxPgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjQ1MjIKKyAgICAvLyBUaGlzIHF1aXJrIGlzIGZvciBs
ZWdhY3kgY29udGVudCB0aGF0IGRvZXNuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHRoZSBjZW50ZXIg
cG9zaXRpb25pbmcgc2NoZW1lCisgICAgLy8gYmVpbmcgaG9ub3JlZCAoZS5nLiwgZXB1YnMpLgor
ICAgIGlmIChzaG91bGRBcHBseUluZGVudFRleHQgfHwgc2V0dGluZ3MoKS51c2VMZWdhY3lUZXh0
QWxpZ25Qb3NpdGlvbmVkRWxlbWVudEJlaGF2aW9yKCkpIC8vIEZJWE1FOiBIYW5kbGUgVGV4dEFs
aWduTW9kZTo6RW5kIGhlcmUKKyAgICAgICAgcmV0dXJuIHN0YXJ0T2Zmc2V0Rm9yTGluZShwb3Np
dGlvbiwgc2hvdWxkSW5kZW50VGV4dCk7CisKKyAgICAvLyB1cGRhdGVMb2dpY2FsV2lkdGhGb3JB
bGlnbm1lbnQoKSBoYW5kbGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIHNvIG5vIG5lZWQg
dG8gY29uc2lkZXIgaXQgaGVyZQorICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gMDsKKyAg
ICBmbG9hdCBsb2dpY2FsTGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShsb2dpY2FsSGVp
Z2h0KCksIERvTm90SW5kZW50VGV4dCk7CisgICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRo
ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShsb2dpY2FsSGVpZ2h0KCksIERvTm90SW5kZW50
VGV4dCkgLSBsb2dpY2FsTGVmdDsKKworICAgIC8vIEZJWE1FOiBCdWcgMTI5MzExOiBXZSBuZWVk
IHRvIHBhc3MgYSB2YWxpZCBSb290SW5saW5lQm94IGhlcmUsIGNvbnNpZGVyaW5nIHRoZSBiaWRp
IGxldmVsIHVzZWQgdG8gY29uc3RydWN0IHRoZSBsaW5lLgorICAgIHVwZGF0ZUxvZ2ljYWxXaWR0
aEZvckFsaWdubWVudCh0ZXh0QWxpZ24sIDAsIDAsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxX
aWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCAwKTsKKworICAgIGlmICghc3R5bGUoKS5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIHJldHVybiBMYXlvdXRVbml0KGxvZ2ljYWxX
aWR0aCgpIC0gbG9naWNhbExlZnQpOworICAgIHJldHVybiBMYXlvdXRVbml0KGxvZ2ljYWxMZWZ0
KTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290
SW5saW5lQm94KiBsaW5lQm94KSBjb25zdAoreworICAgIEFTU0VSVChsaW5lQm94KTsKKworICAg
IGlmICghaGFzRnJhZ21lbnRSYW5nZUluRnJhZ21lbnRlZEZsb3coKSkKKyAgICAgICAgbGluZUJv
eC0+Y2xlYXJDb250YWluaW5nRnJhZ21lbnQoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGF1
dG8gY29udGFpbmluZ0ZyYWdtZW50ID0gZnJhZ21lbnRBdEJsb2NrT2Zmc2V0KGxpbmVCb3gtPmxp
bmVUb3BXaXRoTGVhZGluZygpKSkKKyAgICAgICAgICAgIGxpbmVCb3gtPnNldENvbnRhaW5pbmdG
cmFnbWVudCgqY29udGFpbmluZ0ZyYWdtZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
bGluZUJveC0+Y2xlYXJDb250YWluaW5nRnJhZ21lbnQoKTsKKyAgICB9CisKKyAgICBSb290SW5s
aW5lQm94KiBwcmV2TGluZUJveCA9IGxpbmVCb3gtPnByZXZSb290Qm94KCk7CisgICAgaWYgKCFw
cmV2TGluZUJveCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBjaGVjayBpcyBtb3Jl
IGFjY3VyYXRlIHRoYW4gdGhlIG9uZSBpbiB8YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlv
bnwgYmVjYXVzZSBpdCB0YWtlcyBpbnRvCisgICAgLy8gYWNjb3VudCBqdXN0IHRoZSBjb250YWlu
ZXIgY2hhbmdlcyBiZXR3ZWVuIGxpbmVzLiBUaGUgYmVmb3JlIG1lbnRpb25lZCBmdW5jdGlvbiBk
b2Vzbid0IHNldCB0aGUgZmxhZworICAgIC8vIGNvcnJlY3RseSBpZiB0aGUgbGluZSBpcyBwb3Np
dGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhlIGxhc3QgZnJhZ21lbnQgY29udGFpbmVyLgorICAgIGlm
IChsaW5lQm94LT5jb250YWluaW5nRnJhZ21lbnQoKSAhPSBwcmV2TGluZUJveC0+Y29udGFpbmlu
Z0ZyYWdtZW50KCkpCisgICAgICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VCcmVhayh0
cnVlKTsKK30KKworfQoKUHJvcGVydHkgY2hhbmdlcyBvbjogU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0NvbXBsZXhMaW5lTGF5b3V0LmNwcApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxl
CiMjIC0wLDAgKzEgIyMKK25hdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvQ29tcGxleExpbmVMYXlvdXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21wbGV4TGluZUxheW91dC5jcHAJ
KHJldmlzaW9uIDI0ODQwNCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Db21wbGV4TGlu
ZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5j
LiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxOSBBcHBsZSBJ
bmMuIEFsbCByaWdodCByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBP
aCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lz
dGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29tcGxleExpbmVMYXlvdXQuaCIKIAogI2lu
Y2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKQEAgLTQy
LDE2ICs0MywyMyBAQAogI2luY2x1ZGUgIlJlbmRlckxpbmVCcmVhay5oIgogI2luY2x1ZGUgIlJl
bmRlclJ1YnlCYXNlLmgiCiAjaW5jbHVkZSAiUmVuZGVyUnVieVRleHQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJTVkdUZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlNWR1Jv
b3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlNpbXBsZUxp
bmVMYXlvdXRGdW5jdGlvbnMuaCIKICNpbmNsdWRlICJUcmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVC
b3guaCIKICNpbmNsdWRlICJWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUuaCIKICNpbmNsdWRlIDx3dGYv
U3RkTGliRXh0cmFzLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorQ29tcGxleExpbmVMYXlv
dXQ6OkNvbXBsZXhMaW5lTGF5b3V0KFJlbmRlckJsb2NrRmxvdyYgZmxvdykKKyAgICA6IG1fZmxv
dyhmbG93KQoreworfQorCitDb21wbGV4TGluZUxheW91dDo6fkNvbXBsZXhMaW5lTGF5b3V0KCkg
PSBkZWZhdWx0OworCiBzdGF0aWMgdm9pZCBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShUZXh0RGly
ZWN0aW9uJiBkaXIsIElubGluZUl0ZXJhdG9yIGl0ZXIpCiB7CiAgICAgd2hpbGUgKCFpdGVyLmF0
RW5kKCkpIHsKQEAgLTc3LDkgKzg1LDkgQEAgaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxCaWRpUnVu
PiBjcmVhdGVSdQogICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEJpZGlSdW4+KHN0YXJ0LCBl
bmQsIG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSk7CiB9CiAKLXZvaWQg
UmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+
KiBydW5zLCBpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCYgb2JqLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6YXBwZW5kUnVuc0Zv
ck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiogcnVucywgaW50IHN0YXJ0LCBpbnQgZW5kLCBS
ZW5kZXJPYmplY3QmIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKIHsKLSAgICBp
ZiAoc3RhcnQgPiBlbmQgfHwgc2hvdWxkU2tpcENyZWF0aW5nUnVuc0Zvck9iamVjdChvYmopKQor
ICAgIGlmIChzdGFydCA+IGVuZCB8fCBSZW5kZXJCbG9jazo6c2hvdWxkU2tpcENyZWF0aW5nUnVu
c0Zvck9iamVjdChvYmopKQogICAgICAgICByZXR1cm47CiAKICAgICBMaW5lV2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZSYgbGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUgPSByZXNvbHZlci53
aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7CkBAIC0xMTksMjkgKzEyNywzNSBAQCB2b2lkIFJl
bmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjCiAgICAgfQogfQogCi1zdGQ6OnVuaXF1
ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVSb290SW5saW5lQm94
KCkKK3N0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBDb21wbGV4TGluZUxheW91dDo6Y3Jl
YXRlUm9vdElubGluZUJveCgpCiB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Um9vdElu
bGluZUJveD4oKnRoaXMpOworICAgIGlmIChpczxSZW5kZXJTVkdUZXh0PihtX2Zsb3cpKSB7Cisg
ICAgICAgIGF1dG8gYm94ID0gc3RkOjptYWtlX3VuaXF1ZTxTVkdSb290SW5saW5lQm94Pihkb3du
Y2FzdDxSZW5kZXJTVkdUZXh0PihtX2Zsb3cpKTsKKyAgICAgICAgYm94LT5zZXRIYXNWaXJ0dWFs
TG9naWNhbEhlaWdodCgpOworICAgICAgICByZXR1cm4gYm94OworICAgIH0KKyAgICAgICAgCisg
ICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Um9vdElubGluZUJveD4obV9mbG93KTsKIH0KIAot
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5l
Qm94KCkKK1Jvb3RJbmxpbmVCb3gqIENvbXBsZXhMaW5lTGF5b3V0OjpjcmVhdGVBbmRBcHBlbmRS
b290SW5saW5lQm94KCkKIHsKICAgICBhdXRvIG5ld1Jvb3RCb3ggPSBjcmVhdGVSb290SW5saW5l
Qm94KCk7CiAgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IG5ld1Jvb3RCb3guZ2V0KCk7CiAg
ICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveChXVEZNb3ZlKG5ld1Jvb3RCb3gpKTsKIAogICAg
IGlmIChVTkxJS0VMWShBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpKSAmJiBm
aXJzdFJvb3RCb3goKSA9PSByb290Qm94KSB7Ci0gICAgICAgIGlmIChBWE9iamVjdENhY2hlKiBj
YWNoZSA9IGRvY3VtZW50KCkuZXhpc3RpbmdBWE9iamVjdENhY2hlKCkpCi0gICAgICAgICAgICBj
YWNoZS0+ZGVmZXJSZWNvbXB1dGVJc0lnbm9yZWQoZWxlbWVudCgpKTsKKyAgICAgICAgaWYgKEFY
T2JqZWN0Q2FjaGUqIGNhY2hlID0gbV9mbG93LmRvY3VtZW50KCkuZXhpc3RpbmdBWE9iamVjdENh
Y2hlKCkpCisgICAgICAgICAgICBjYWNoZS0+ZGVmZXJSZWNvbXB1dGVJc0lnbm9yZWQobV9mbG93
LmVsZW1lbnQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJvb3RCb3g7CiB9CiAKLXN0YXRpYyBp
bmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCitp
bmxpbmUgSW5saW5lQm94KiBDb21wbGV4TGluZUxheW91dDo6Y3JlYXRlSW5saW5lQm94Rm9yUmVu
ZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgYm9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlz
T25seVJ1bikKIHsKICAgICBpZiAoaXNSb290TGluZUJveCkKLSAgICAgICAgcmV0dXJuIGRvd25j
YXN0PFJlbmRlckJsb2NrRmxvdz4oKnJlbmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5l
Qm94KCk7CisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJl
cikuY29tcGxleExpbmVMYXlvdXQoKS5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7CiAK
ICAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKSkKICAgICAgICAgcmV0dXJuIGRvd25j
YXN0PFJlbmRlclRleHQ+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lVGV4dEJveCgpOwpAQCAtMTg1
LDcgKzE5OSw3IEBAIHN0YXRpYyBib29sIHBhcmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXgKICAg
ICByZXR1cm4gZmFsc2U7CiB9CiAKLUlubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3Jl
YXRlTGluZUJveGVzKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8s
IElubGluZUJveCogY2hpbGRCb3gpCitJbmxpbmVGbG93Qm94KiBDb21wbGV4TGluZUxheW91dDo6
Y3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUlu
Zm8sIElubGluZUJveCogY2hpbGRCb3gpCiB7CiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5j
b25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhpcyBvYmplY3QgdGhhdCBpcyBhbHNvCiAgICAgLy8g
dGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4KQEAgLTE5NCwyOCArMjA4LDI4IEBAIElubGluZUZs
b3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGkKICAgICBJbmxpbmVGbG93Qm94KiByZXN1
bHQgPSBudWxscHRyOwogICAgIGJvb2wgaGFzRGVmYXVsdExpbmVCb3hDb250YWluID0gc3R5bGUo
KS5saW5lQm94Q29udGFpbigpID09IFJlbmRlclN0eWxlOjppbml0aWFsTGluZUJveENvbnRhaW4o
KTsKICAgICBkbyB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlz
PFJlbmRlcklubGluZT4oKm9iaikgfHwgb2JqID09IHRoaXMpOworICAgICAgICBSRUxFQVNFX0FT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGlzPFJlbmRlcklubGluZT4oKm9iaikgfHwg
b2JqID09ICZtX2Zsb3cpOwogCi0gICAgICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IG9i
aiAhPSB0aGlzID8gZG93bmNhc3Q8UmVuZGVySW5saW5lPihvYmopIDogbnVsbHB0cjsKKyAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gb2JqICE9ICZtX2Zsb3cgPyBkb3duY2FzdDxS
ZW5kZXJJbmxpbmU+KG9iaikgOiBudWxscHRyOwogCiAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBi
b3ggd2UgbWFkZSBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LgogICAgICAgICBwYXJlbnRCb3ggPSBp
bmxpbmVGbG93ID8gaW5saW5lRmxvdy0+bGFzdExpbmVCb3goKSA6IGRvd25jYXN0PFJlbmRlckJs
b2NrRmxvdz4oKm9iaikubGFzdFJvb3RCb3goKTsKIAogICAgICAgICAvLyBJZiB0aGlzIGJveCBv
ciBpdHMgYW5jZXN0b3IgaXMgY29uc3RydWN0ZWQgdGhlbiBpdCBpcyBmcm9tIGEgcHJldmlvdXMg
bGluZSwgYW5kIHdlIG5lZWQKLSAgICAgICAgLy8gdG8gbWFrZSBhIG5ldyBib3ggZm9yIG91ciBs
aW5lLiAgSWYgdGhpcyBib3ggb3IgaXRzIGFuY2VzdG9yIGlzIHVuY29uc3RydWN0ZWQgYnV0IGl0
IGhhcworICAgICAgICAvLyB0byBtYWtlIGEgbmV3IGJveCBmb3Igb3VyIGxpbmUuIElmIHRoaXMg
Ym94IG9yIGl0cyBhbmNlc3RvciBpcyB1bmNvbnN0cnVjdGVkIGJ1dCBpdCBoYXMKICAgICAgICAg
Ly8gc29tZXRoaW5nIGZvbGxvd2luZyBpdCBvbiB0aGUgbGluZSwgdGhlbiB3ZSBrbm93IHdlIGhh
dmUgdG8gbWFrZSBhIG5ldyBib3gKLSAgICAgICAgLy8gYXMgd2VsbC4gIEluIHRoaXMgc2l0dWF0
aW9uIG91ciBpbmxpbmUgaGFzIGFjdHVhbGx5IGJlZW4gc3BsaXQgaW4gdHdvIG9uCisgICAgICAg
IC8vIGFzIHdlbGwuIEluIHRoaXMgc2l0dWF0aW9uIG91ciBpbmxpbmUgaGFzIGFjdHVhbGx5IGJl
ZW4gc3BsaXQgaW4gdHdvIG9uCiAgICAgICAgIC8vIHRoZSBzYW1lIGxpbmUgKHRoaXMgY2FuIGhh
cHBlbiB3aXRoIHZlcnkgZmFuY3kgbGFuZ3VhZ2UgbWl4dHVyZXMpLgogICAgICAgICBib29sIGNv
bnN0cnVjdGVkTmV3Qm94ID0gZmFsc2U7CiAgICAgICAgIGJvb2wgYWxsb3dlZFRvQ29uc3RydWN0
TmV3Qm94ID0gIWhhc0RlZmF1bHRMaW5lQm94Q29udGFpbiB8fCAhaW5saW5lRmxvdyB8fCBpbmxp
bmVGbG93LT5hbHdheXNDcmVhdGVMaW5lQm94ZXMoKTsKICAgICAgICAgYm9vbCBjYW5Vc2VFeGlz
dGluZ1BhcmVudEJveCA9IHBhcmVudEJveCAmJiAhcGFyZW50SXNDb25zdHJ1Y3RlZE9ySGF2ZU5l
eHQocGFyZW50Qm94KTsKICAgICAgICAgaWYgKGFsbG93ZWRUb0NvbnN0cnVjdE5ld0JveCAmJiAh
Y2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFr
ZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKKyAgICAgICAgICAgIC8v
IFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9iamVjdC4gT25jZQog
ICAgICAgICAgICAgLy8gbWFkZSwgd2UgbmVlZCB0byBwbGFjZSBpdCBhdCB0aGUgZW5kIG9mIHRo
ZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAgICBJbmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0ZUlu
bGluZUJveEZvclJlbmRlcmVyKG9iaiwgb2JqID09IHRoaXMpOworICAgICAgICAgICAgSW5saW5l
Qm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSAmbV9m
bG93KTsKICAgICAgICAgICAgIHBhcmVudEJveCA9IGRvd25jYXN0PElubGluZUZsb3dCb3g+KG5l
d0JveCk7CiAgICAgICAgICAgICBwYXJlbnRCb3gtPnNldElzRmlyc3RMaW5lKGxpbmVJbmZvLmlz
Rmlyc3RMaW5lKCkpOwotICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwoaXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisgICAgICAgICAgICBwYXJlbnRCb3gtPnNldElzSG9y
aXpvbnRhbChtX2Zsb3cuaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CiAgICAgICAgICAgICBp
ZiAoIWhhc0RlZmF1bHRMaW5lQm94Q29udGFpbikKICAgICAgICAgICAgICAgICBwYXJlbnRCb3gt
PmNsZWFyRGVzY2VuZGFudHNIYXZlU2FtZUxpbmVIZWlnaHRBbmRCYXNlbGluZSgpOwogICAgICAg
ICAgICAgY29uc3RydWN0ZWROZXdCb3ggPSB0cnVlOwpAQCAtMjMxLDcgKzI0NSw3IEBAIElubGlu
ZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGkKICAgICAgICAgICAgIGlmIChjaGls
ZEJveCkKICAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7CiAK
LSAgICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCisgICAg
ICAgICAgICBpZiAoIWNvbnN0cnVjdGVkTmV3Qm94IHx8IG9iaiA9PSAmbV9mbG93KQogICAgICAg
ICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsKQEAg
LTIzOSw3ICsyNTMsNyBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxp
CiAKICAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3VyIGxpbmUgZGVwdGgsIHRoZW4ganVt
cCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwgdGhlIHJlbWFpbmluZwogICAgICAg
ICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgotICAgICAgICBvYmogPSAoKytsaW5lRGVw
dGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5wYXJlbnQoKTsKKyAgICAgICAgb2Jq
ID0gKCsrbGluZURlcHRoID49IGNNYXhMaW5lRGVwdGgpID8gJm1fZmxvdyA6IG9iai0+cGFyZW50
KCk7CiAKICAgICB9IHdoaWxlICh0cnVlKTsKIApAQCAtMjcwLDcgKzI4NCw3IEBAIHN0YXRpYyBi
b29sIHJlYWNoZWRFbmRPZlRleHRSZW5kZXJlcihjb24KICAgICByZXR1cm4gZW5kc1dpdGhIVE1M
U3BhY2VzKHRleHQuY2hhcmFjdGVyczE2KCksIHBvc2l0aW9uLCBsZW5ndGgpOwogfQogCi1Sb290
SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8Qmlk
aVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCitSb290SW5saW5lQm94
KiBDb21wbGV4TGluZUxheW91dDo6Y29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYg
YmlkaVJ1bnMsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKIHsKICAgICBBU1NFUlQoYmlkaVJ1
bnMuZmlyc3RSdW4oKSk7CiAKQEAgLTMxOSw3ICszMzMsNyBAQCBSb290SW5saW5lQm94KiBSZW5k
ZXJCbG9ja0Zsb3c6OmNvbnN0cnVjCiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBXZSBzaG91
bGQgaGF2ZSBhIHJvb3QgaW5saW5lIGJveC4gIEl0IHNob3VsZCBiZSB1bmNvbnN0cnVjdGVkIGFu
ZAorICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94LiBJdCBzaG91bGQgYmUg
dW5jb25zdHJ1Y3RlZCBhbmQKICAgICAvLyBiZSB0aGUgbGFzdCBjb250aW51YXRpb24gb2Ygb3Vy
IGxpbmUgbGlzdC4KICAgICBBU1NFUlQobGFzdFJvb3RCb3goKSAmJiAhbGFzdFJvb3RCb3goKS0+
aXNDb25zdHJ1Y3RlZCgpKTsKIApAQCAtMzI5LDcgKzM0Myw3IEBAIFJvb3RJbmxpbmVCb3gqIFJl
bmRlckJsb2NrRmxvdzo6Y29uc3RydWMKICAgICAgICAgbGFzdFJvb3RCb3goKS0+cm9vdCgpLnNl
dEhhc1NlbGVjdGVkQ2hpbGRyZW4odHJ1ZSk7CiAKICAgICAvLyBTZXQgYml0cyBvbiBvdXIgaW5s
aW5lIGZsb3cgYm94ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCBzaWRlcyBzaG91bGQKLSAgICAvLyBw
YWludCBib3JkZXJzL21hcmdpbnMvcGFkZGluZy4gIFRoaXMga25vd2xlZGdlIHdpbGwgdWx0aW1h
dGVseSBiZSB1c2VkIHdoZW4KKyAgICAvLyBwYWludCBib3JkZXJzL21hcmdpbnMvcGFkZGluZy4g
VGhpcyBrbm93bGVkZ2Ugd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgd2hlbgogICAgIC8vIHdlIGRl
dGVybWluZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbnMgYW5kIHdpZHRocyBvZiBhbGwgdGhlIGlu
bGluZSBib3hlcyBvbgogICAgIC8vIHRoZSBsaW5lLgogICAgIGJvb2wgaXNMb2dpY2FsbHlMYXN0
UnVuV3JhcHBlZCA9IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5pc1Rl
eHQoKSA/ICFyZWFjaGVkRW5kT2ZUZXh0UmVuZGVyZXIoYmlkaVJ1bnMpIDogIWlzPFJlbmRlcklu
bGluZT4oYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpKTsKQEAgLTM0Miw4
ICszNTYsMTEgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93Ojpjb25zdHJ1YwogICAg
IHJldHVybiBsYXN0Um9vdEJveCgpOwogfQogCi1UZXh0QWxpZ25Nb2RlIFJlbmRlckJsb2NrRmxv
dzo6dGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3QKK1Rl
eHRBbGlnbk1vZGUgQ29tcGxleExpbmVMYXlvdXQ6OnRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wg
ZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0CiB7CisgICAgaWYgKGF1dG8gb3ZlcnJpZGVBbGlnbm1l
bnQgPSBtX2Zsb3cub3ZlcnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZShlbmRzV2l0aFNvZnRCcmVh
aykpCisgICAgICAgIHJldHVybiAqb3ZlcnJpZGVBbGlnbm1lbnQ7CisKICAgICBUZXh0QWxpZ25N
b2RlIGFsaWdubWVudCA9IHN0eWxlKCkudGV4dEFsaWduKCk7CiAjaWYgRU5BQkxFKENTUzNfVEVY
VCkKICAgICBUZXh0SnVzdGlmeSB0ZXh0SnVzdGlmeSA9IHN0eWxlKCkudGV4dEp1c3RpZnkoKTsK
QEAgLTQzNCw3ICs0NTEsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JDZW50
ZXJBCiAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxl
TG9naWNhbFdpZHRoID8gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRo
KSA6IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgLyAyIC0gdHJh
aWxpbmdTcGFjZVdpZHRoOwogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6c2V0TWFyZ2luc0Zv
clJ1YnlSdW4oQmlkaVJ1biogcnVuLCBSZW5kZXJSdWJ5UnVuJiByZW5kZXJlciwgUmVuZGVyT2Jq
ZWN0KiBwcmV2aW91c09iamVjdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQordm9pZCBDb21w
bGV4TGluZUxheW91dDo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biogcnVuLCBSZW5kZXJS
dWJ5UnVuJiByZW5kZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09iamVjdCwgY29uc3QgTGlu
ZUluZm8mIGxpbmVJbmZvKQogewogICAgIGZsb2F0IHN0YXJ0T3Zlcmhhbmc7CiAgICAgZmxvYXQg
ZW5kT3Zlcmhhbmc7CkBAIC00NDYsOCArNDYzLDggQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNl
dE1hcmdpbnNGb3JSdWJ5UgogICAgICAgICB9CiAgICAgfQogICAgIHJlbmRlcmVyLmdldE92ZXJo
YW5nKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCksIHJlbmRlcmVyLnN0eWxlKCkuaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbigpID8gcHJldmlvdXNPYmplY3QgOiBuZXh0T2JqZWN0LCByZW5kZXJlci5zdHls
ZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG5leHRPYmplY3QgOiBwcmV2aW91c09iamVj
dCwgc3RhcnRPdmVyaGFuZywgZW5kT3ZlcmhhbmcpOwotICAgIHNldE1hcmdpblN0YXJ0Rm9yQ2hp
bGQocmVuZGVyZXIsIExheW91dFVuaXQoLXN0YXJ0T3ZlcmhhbmcpKTsKLSAgICBzZXRNYXJnaW5F
bmRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgtZW5kT3ZlcmhhbmcpKTsKKyAgICBtX2Zs
b3cuc2V0TWFyZ2luU3RhcnRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgtc3RhcnRPdmVy
aGFuZykpOworICAgIG1fZmxvdy5zZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0
VW5pdCgtZW5kT3ZlcmhhbmcpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldExvZ2ljYWxX
aWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogcnVuLCBSZW5k
ZXJUZXh0JiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLApA
QCAtNTQzLDcgKzU2MCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dpY2FsV2lkdGhGb3JU
ZXgKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVSdWJ5Rm9ySnVzdGlm
aWVkVGV4dChSZW5kZXJSdWJ5UnVuJiBydWJ5UnVuLCBCaWRpUnVuJiByLCBjb25zdCBWZWN0b3I8
dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQmIGV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxh
YmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGkpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0Ojp1cGRh
dGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChSZW5kZXJSdWJ5UnVuJiBydWJ5UnVuLCBCaWRpUnVuJiBy
LCBjb25zdCBWZWN0b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5z
aWduZWQmIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0
aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBzaXplX3QmIGkpCiB7CiAgICAgaWYgKCFy
dWJ5UnVuLnJ1YnlCYXNlKCkgfHwgIXJ1YnlSdW4ucnVieUJhc2UoKS0+Zmlyc3RSb290Qm94KCkg
fHwgcnVieVJ1bi5ydWJ5QmFzZSgpLT5maXJzdFJvb3RCb3goKS0+bmV4dFJvb3RCb3goKSB8fCAh
ci5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkpCiAgICAgICAgIHJldHVy
bjsKQEAgLTU2NSw3ICs1ODIsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlUnVieUZv
ckp1c3RpCiAgICAgfQogCiAgICAgQVNTRVJUKCFydWJ5UnVuLmhhc092ZXJyaWRlQ29udGVudExv
Z2ljYWxXaWR0aCgpKTsKLSAgICBmbG9hdCBuZXdCYXNlV2lkdGggPSBydWJ5UnVuLmxvZ2ljYWxX
aWR0aCgpICsgdG90YWxFeHBhbnNpb24gKyBtYXJnaW5TdGFydEZvckNoaWxkKHJ1YnlSdW4pICsg
bWFyZ2luRW5kRm9yQ2hpbGQocnVieVJ1bik7CisgICAgZmxvYXQgbmV3QmFzZVdpZHRoID0gcnVi
eVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFsRXhwYW5zaW9uICsgbV9mbG93Lm1hcmdpblN0YXJ0
Rm9yQ2hpbGQocnVieVJ1bikgKyBtX2Zsb3cubWFyZ2luRW5kRm9yQ2hpbGQocnVieVJ1bik7CiAg
ICAgZmxvYXQgbmV3UnVieVJ1bldpZHRoID0gcnVieVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFs
RXhwYW5zaW9uOwogICAgIHJ1YnlCYXNlLnNldEluaXRpYWxPZmZzZXQoKG5ld1J1YnlSdW5XaWR0
aCAtIG5ld0Jhc2VXaWR0aCkgLyAyKTsKICAgICBydWJ5UnVuLnNldE92ZXJyaWRlQ29udGVudExv
Z2ljYWxXaWR0aChMYXlvdXRVbml0KG5ld1J1YnlSdW5XaWR0aCkpOwpAQCAtNTgzLDcgKzYwMCw3
IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVSdWJ5Rm9ySnVzdGkKICAgICBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50IC09IHRvdGFsT3Bwb3J0dW5pdGllc0luUnVuOwogfQogCi12b2lk
IFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1
biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNp
Z25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBv
cnR1bml0eUNvdW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUV4cGFuc2lvbkZvckp1
c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4s
IGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNp
Z25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwg
ZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQogewogICAgIGlmICghZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCB8fCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPD0gdG90YWxMb2dpY2FsV2lkdGgp
CiAgICAgICAgIHJldHVybjsKQEAgLTYxNCw3ICs2MzEsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6Y29tcHV0ZUV4cGFuc2lvbkZvCiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6
dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmIHRleHRB
bGlnbiwgY29uc3QgUm9vdElubGluZUJveCogcm9vdElubGluZUJveCwgQmlkaVJ1biogdHJhaWxp
bmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgs
IGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNv
dW50KQordm9pZCBDb21wbGV4TGluZUxheW91dDo6dXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25t
ZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmIHRleHRBbGlnbiwgY29uc3QgUm9vdElubGluZUJveCog
cm9vdElubGluZUJveCwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxM
ZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lk
dGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KQogewogICAgIFRleHREaXJlY3Rpb24g
ZGlyZWN0aW9uOwogICAgIGlmIChyb290SW5saW5lQm94ICYmIHN0eWxlKCkudW5pY29kZUJpZGko
KSA9PSBQbGFpbnRleHQpCkBAIC02NDAsNyArNjU3LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OnVwZGF0ZUxvZ2ljYWxXaWR0aAogICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JDZW50ZXJB
bGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3Bh
Y2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdp
ZHRoKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5Ogot
ICAgICAgICBhZGp1c3RJbmxpbmVEaXJlY3Rpb25MaW5lQm91bmRzKGV4cGFuc2lvbk9wcG9ydHVu
aXR5Q291bnQsIGxvZ2ljYWxMZWZ0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOworICAgICAgICBt
X2Zsb3cuYWRqdXN0SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyhleHBhbnNpb25PcHBvcnR1bml0
eUNvdW50LCBsb2dpY2FsTGVmdCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKICAgICAgICAgaWYg
KGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpIHsKICAgICAgICAgICAgIGlmICh0cmFpbGluZ1Nw
YWNlUnVuKSB7CiAgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdT
cGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOwpAQCAtNjczLDcgKzY5MCw3IEBAIHN0YXRp
YyB2b2lkIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMKICAgICBhdmFpbGFibGVMb2dpY2Fs
V2lkdGggPSBsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxMZWZ0OwogfQogCi12b2lkIFJl
bmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9v
dElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBm
aXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLCBHbHlw
aE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9z
aXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3Jk
TWVhc3VyZW1lbnRzKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6Y29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1
biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hl
LCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAgIFRleHRBbGlnbk1v
ZGUgdGV4dEFsaWduID0gdGV4dEFsaWdubWVudEZvckxpbmUoIXJlYWNoZWRFbmQgJiYgIWxpbmVC
b3gtPmVuZHNXaXRoQnJlYWsoKSk7CiAgICAgCkBAIC02ODEsMTggKzY5OCwxOCBAQCB2b2lkIFJl
bmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjCiAgICAgLy8gYm94IGlzIG9ubHkgYWZm
ZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4iCiAg
ICAgLy8gQ1NTMyAidGV4dC1pbmRlbnQiLCAiLXdlYmtpdC1lYWNoLWxpbmUiIGFmZmVjdHMgdGhl
IGZpcnN0IGxpbmUgb2YgdGhlIGJsb2NrIGNvbnRhaW5lciBhcyB3ZWxsIGFzIGVhY2ggbGluZSBh
ZnRlciBhIGZvcmNlZCBsaW5lIGJyZWFrLAogICAgIC8vIGJ1dCBkb2VzIG5vdCBhZmZlY3QgbGlu
ZXMgYWZ0ZXIgYSBzb2Z0IHdyYXAgYnJlYWsuCi0gICAgYm9vbCBpc0ZpcnN0TGluZSA9IGxpbmVJ
bmZvLmlzRmlyc3RMaW5lKCkgJiYgIShpc0Fub255bW91c0Jsb2NrKCkgJiYgcGFyZW50KCktPmZp
cnN0Q2hpbGQoKSAhPSB0aGlzKTsKKyAgICBib29sIGlzRmlyc3RMaW5lID0gbGluZUluZm8uaXNG
aXJzdExpbmUoKSAmJiAhKG1fZmxvdy5pc0Fub255bW91c0Jsb2NrKCkgJiYgbV9mbG93LnBhcmVu
dCgpLT5maXJzdENoaWxkKCkgIT0gJm1fZmxvdyk7CiAgICAgYm9vbCBpc0FmdGVySGFyZExpbmVC
cmVhayA9IGxpbmVCb3gtPnByZXZSb290Qm94KCkgJiYgbGluZUJveC0+cHJldlJvb3RCb3goKS0+
ZW5kc1dpdGhCcmVhaygpOwogICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0g
cmVxdWlyZXNJbmRlbnQoaXNGaXJzdExpbmUsIGlzQWZ0ZXJIYXJkTGluZUJyZWFrLCBzdHlsZSgp
KTsKICAgICBmbG9hdCBsaW5lTG9naWNhbExlZnQ7CiAgICAgZmxvYXQgbGluZUxvZ2ljYWxSaWdo
dDsKICAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGg7Ci0gICAgdXBkYXRlTG9naWNhbElu
bGluZVBvc2l0aW9ucygqdGhpcywgbGluZUxvZ2ljYWxMZWZ0LCBsaW5lTG9naWNhbFJpZ2h0LCBh
dmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBzaG91bGRJbmRlbnRUZXh0LCAwKTsK
KyAgICB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKG1fZmxvdywgbGluZUxvZ2ljYWxMZWZ0
LCBsaW5lTG9naWNhbFJpZ2h0LCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlzRmlyc3RMaW5lLCBz
aG91bGRJbmRlbnRUZXh0LCAwKTsKICAgICBib29sIG5lZWRzV29yZFNwYWNpbmc7CiAKICAgICBp
ZiAoZmlyc3RSdW4gJiYgZmlyc3RSdW4tPnJlbmRlcmVyKCkuaXNSZXBsYWNlZCgpKSB7CiAgICAg
ICAgIFJlbmRlckJveCYgcmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PihmaXJzdFJ1bi0+
cmVuZGVyZXIoKSk7Ci0gICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRoaXMs
IGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxhYmxlTG9naWNhbFdpZHRo
LCBpc0ZpcnN0TGluZSwgc2hvdWxkSW5kZW50VGV4dCwgcmVuZGVyQm94LmxvZ2ljYWxIZWlnaHQo
KSk7CisgICAgICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMobV9mbG93LCBsaW5lTG9n
aWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaXNGaXJz
dExpbmUsIHNob3VsZEluZGVudFRleHQsIHJlbmRlckJveC5sb2dpY2FsSGVpZ2h0KCkpOwogICAg
IH0KIAogICAgIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KGxpbmVC
b3gsIGxpbmVJbmZvLCB0ZXh0QWxpZ24sIGxpbmVMb2dpY2FsTGVmdCwgYXZhaWxhYmxlTG9naWNh
bFdpZHRoLCBmaXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgdGV4dEJveERhdGFNYXAsIHZlcnRp
Y2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7CkBAIC04MjUsNyArODQyLDcgQEAg
c3RhdGljIGJvb2wgaXNMYXN0SW5GbG93UnVuKEJpZGlSdW4mIHJ1bgogICAgIHJldHVybiB0cnVl
OwogfQogICAgIAotQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0
aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5l
SW5mbyYgbGluZUluZm8sIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduLCBmbG9hdCYgbG9naWNhbExl
ZnQsIAorQmlkaVJ1biogQ29tcGxleExpbmVMYXlvdXQ6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Q
b3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZv
JiBsaW5lSW5mbywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwK
ICAgICBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAm
IHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25D
YWNoZSwKICAgICBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewpAQCAtODM1
LDcgKzg1Miw3IEBAIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZUQKICAg
ICBib29sIGlzTFRSID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7CiAgICAgZmxv
YXQgdG90YWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LT5nZXRGbG93U3BhY2luZ0xvZ2ljYWxXaWR0
aCgpOwogICAgIHVuc2lnbmVkIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgPSAwOwotICAgIGJv
b2wgaXNBZnRlckV4cGFuc2lvbiA9IGlzPFJlbmRlclJ1YnlCYXNlPigqdGhpcykgPyBkb3duY2Fz
dDxSZW5kZXJSdWJ5QmFzZT4oKnRoaXMpLmlzQWZ0ZXJFeHBhbnNpb24oKSA6IHRydWU7CisgICAg
Ym9vbCBpc0FmdGVyRXhwYW5zaW9uID0gaXM8UmVuZGVyUnVieUJhc2U+KG1fZmxvdykgPyBkb3du
Y2FzdDxSZW5kZXJSdWJ5QmFzZT4obV9mbG93KS5pc0FmdGVyRXhwYW5zaW9uKCkgOiB0cnVlOwog
ICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXM7CiAKICAgICBC
aWRpUnVuKiBydW4gPSBmaXJzdFJ1bjsKQEAgLTg1NywxNSArODc0LDE1IEBAIEJpZGlSdW4qIFJl
bmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZUQKICAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQgKz0gb3Bwb3J0dW5pdGllc0luUnVuOwogICAgICAgICB9OwogICAgICAgICBp
ZiAoIXJ1bi0+Ym94KCkgfHwgcnVuLT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
IHx8IHJ1bi0+Ym94KCktPmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAv
LyBQb3NpdGlvbmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0
IHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBzdGF0aWMgeCBwb3NpdGlv
bi4gIFRoZXkgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIHdpZHRoLgotICAgICAgICAgICAgICAgICAg
ICAgIC8vIFNpbWlsYXJseSwgbGluZSBicmVhayBib3hlcyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUg
d2lkdGguCisgICAgICAgICAgICAvLyBQb3NpdGlvbmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGlj
aXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyIGNvcnJlY3Qgc3RhdGljIHggcG9zaXRpb24uCisg
ICAgICAgICAgICAvLyBUaGV5IGhhdmUgbm8gZWZmZWN0IG9uIHRoZSB3aWR0aC4gU2ltaWxhcmx5
LCBsaW5lIGJyZWFrIGJveGVzIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSB3aWR0aC4KKyAgICAgICAg
ICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChpczxSZW5kZXJUZXh0PihydW4t
PnJlbmRlcmVyKCkpKSB7CiAgICAgICAgICAgICBhdXRvJiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8
UmVuZGVyVGV4dD4ocnVuLT5yZW5kZXJlcigpKTsKICAgICAgICAgICAgIGF1dG8mIHRleHRCb3gg
PSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqcnVuLT5ib3goKSk7CiAgICAgICAgICAgICBpZiAo
Y2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFydCAmJiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpICYmIChp
c0xUUiB8fCBpc0xhc3RJbkZsb3dSdW4oKnJ1bikpCi0gICAgICAgICAgICAgICAgJiYgIWlubGlu
ZUFuY2VzdG9ySGFzU3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4oKnRoaXMsICpydW4tPmJveCgp
KSkgeworICAgICAgICAgICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc1N0YXJ0Qm9yZGVyUGFk
ZGluZ09yTWFyZ2luKG1fZmxvdywgKnJ1bi0+Ym94KCkpKSB7CiAgICAgICAgICAgICAgICAgZmxv
YXQgaGFuZ1N0YXJ0V2lkdGggPSByZW5kZXJUZXh0LmhhbmdhYmxlUHVuY3R1YXRpb25TdGFydFdp
ZHRoKHJ1bi0+bV9zdGFydCk7CiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRo
ICs9IGhhbmdTdGFydFdpZHRoOwogICAgICAgICAgICAgICAgIGlmIChzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSkKQEAgLTg3NCw3ICs4OTEsNyBAQCBCaWRpUnVuKiBSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAg
ICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25BdEVuZCAmJiBsaW5lSW5mby5pc0xhc3RMaW5l
KCkgJiYgcnVuLT5tX3N0b3AgPiAwICYmICghaXNMVFIgfHwgaXNMYXN0SW5GbG93UnVuKCpydW4p
KQotICAgICAgICAgICAgICAgICYmICFpbmxpbmVBbmNlc3Rvckhhc0VuZEJvcmRlclBhZGRpbmdP
ck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7CisgICAgICAgICAgICAgICAgJiYgIWlubGlu
ZUFuY2VzdG9ySGFzRW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luKG1fZmxvdywgKnJ1bi0+Ym94KCkp
KSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgaGFuZ0VuZFdpZHRoID0gcmVuZGVyVGV4dC5oYW5n
YWJsZVB1bmN0dWF0aW9uRW5kV2lkdGgocnVuLT5tX3N0b3AgLSAxKTsKICAgICAgICAgICAgICAg
ICBhdmFpbGFibGVMb2dpY2FsV2lkdGggKz0gaGFuZ0VuZFdpZHRoOwogICAgICAgICAgICAgICAg
IGlmICghc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCkBAIC04ODMsNyArOTAwLDcg
QEAgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRAogICAgICAgICAgICAg
fQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAodGV4dEFsaWduID09IFRleHRBbGlnbk1v
ZGU6Okp1c3RpZnkgJiYgcnVuICE9IHRyYWlsaW5nU3BhY2VSdW4pCi0gICAgICAgICAgICAgICAg
Y29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMoKnRoaXMsIHRleHRCb3gsIHByZXZpb3VzUnVu
LCBydW4tPm5leHQoKSwgcmVuZGVyVGV4dC5zdHJpbmdWaWV3KHJ1bi0+bV9zdGFydCwgcnVuLT5t
X3N0b3ApLCBydW4tPmJveCgpLT5kaXJlY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgY29tcHV0
ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMobV9mbG93LCB0ZXh0Qm94LCBwcmV2aW91c1J1biwgcnVu
LT5uZXh0KCksIHJlbmRlclRleHQuc3RyaW5nVmlldyhydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9w
KSwgcnVuLT5ib3goKS0+ZGlyZWN0aW9uKCkpOwogCiAgICAgICAgICAgICBpZiAodW5zaWduZWQg
bGVuZ3RoID0gcmVuZGVyVGV4dC50ZXh0KCkubGVuZ3RoKCkpIHsKICAgICAgICAgICAgICAgICBp
ZiAoIXJ1bi0+bV9zdGFydCAmJiBuZWVkc1dvcmRTcGFjaW5nICYmIGlzU3BhY2VPck5ld2xpbmUo
cmVuZGVyVGV4dC5jaGFyYWN0ZXJBdChydW4tPm1fc3RhcnQpKSkKQEAgLTkxOCw4ICs5MzUsOCBA
QCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgICAgICAgICAg
ICAgYXV0byYgcmVuZGVyQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PihydW4tPnJlbmRlcmVyKCkp
OwogICAgICAgICAgICAgICAgIGlmIChpczxSZW5kZXJSdWJ5UnVuPihyZW5kZXJCb3gpKQogICAg
ICAgICAgICAgICAgICAgICBzZXRNYXJnaW5zRm9yUnVieVJ1bihydW4sIGRvd25jYXN0PFJlbmRl
clJ1YnlSdW4+KHJlbmRlckJveCksIHByZXZpb3VzUnVuID8gJnByZXZpb3VzUnVuLT5yZW5kZXJl
cigpIDogbnVsbHB0ciwgbGluZUluZm8pOwotICAgICAgICAgICAgICAgIHJ1bi0+Ym94KCktPnNl
dExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JDaGlsZChyZW5kZXJCb3gpKTsKLSAgICAgICAg
ICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCArPSBtYXJnaW5TdGFydEZvckNoaWxkKHJlbmRlckJv
eCkgKyBtYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJCb3gpOworICAgICAgICAgICAgICAgIHJ1bi0+
Ym94KCktPnNldExvZ2ljYWxXaWR0aChtX2Zsb3cubG9naWNhbFdpZHRoRm9yQ2hpbGQocmVuZGVy
Qm94KSk7CisgICAgICAgICAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggKz0gbV9mbG93Lm1hcmdp
blN0YXJ0Rm9yQ2hpbGQocmVuZGVyQm94KSArIG1fZmxvdy5tYXJnaW5FbmRGb3JDaGlsZChyZW5k
ZXJCb3gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTkzOSw3ICs5NTYsNyBAQCBC
aWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVECiAgICAgICAgIH0KICAgICB9
CiAKLSAgICBpZiAoaXM8UmVuZGVyUnVieUJhc2U+KCp0aGlzKSAmJiAhZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCkKKyAgICBpZiAoaXM8UmVuZGVyUnVieUJhc2U+KG1fZmxvdykgJiYgIWV4cGFu
c2lvbk9wcG9ydHVuaXR5Q291bnQpCiAgICAgICAgIHRleHRBbGlnbiA9IFRleHRBbGlnbk1vZGU6
OkNlbnRlcjsKIAogICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24s
IGxpbmVCb3gsIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0
aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKQEAg
LTk0OSw3ICs5NjYsNyBAQCBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVE
CiAgICAgcmV0dXJuIHJ1bjsKIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlbW92ZUlubGlu
ZUJveChCaWRpUnVuJiBydW4sIGNvbnN0IFJvb3RJbmxpbmVCb3gmIHJvb3RMaW5lQm94KSBjb25z
dAordm9pZCBDb21wbGV4TGluZUxheW91dDo6cmVtb3ZlSW5saW5lQm94KEJpZGlSdW4mIHJ1biwg
Y29uc3QgUm9vdElubGluZUJveCYgcm9vdExpbmVCb3gpIGNvbnN0CiB7CiAgICAgYXV0byogaW5s
aW5lQm94ID0gcnVuLmJveCgpOwogI2lmICFBU1NFUlRfRElTQUJMRUQKQEAgLTk3OCwxMCArOTk1
LDkgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlbW92ZUlubGluZUJveChCaQogICAgIH0KIH0K
IAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0Zv
ckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogZmlyc3RSdW4sIEdseXBoT3Zl
cmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxQb3NpdGlv
bkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0Ojpj
b21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVC
b3gsIEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYg
dGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNh
Y2hlKQogewotICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tE
aXJlY3Rpb24obG9naWNhbEhlaWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlv
bkNhY2hlKSk7CisgICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hl
c0luQmxvY2tEaXJlY3Rpb24obV9mbG93LmxvZ2ljYWxIZWlnaHQoKSwgdGV4dEJveERhdGFNYXAs
IHZlcnRpY2FsUG9zaXRpb25DYWNoZSkpOwogCiAgICAgLy8gTm93IG1ha2Ugc3VyZSB3ZSBwbGFj
ZSByZXBsYWNlZCByZW5kZXIgb2JqZWN0cyBjb3JyZWN0bHkuCiAgICAgZm9yIChhdXRvKiBydW4g
PSBmaXJzdFJ1bjsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgewpAQCAtOTg5LDExICsxMDA1LDEx
IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlQmxvY2tEaXJlY3QKICAgICAgICAgaWYg
KCFydW4tPmJveCgpKQogICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgcnVucyB3aXRoIG5v
IGxpbmUgYm94ZXMuCiAKLSAgICAgICAgLy8gQWxpZ24gcG9zaXRpb25lZCBib3hlcyB3aXRoIHRo
ZSB0b3Agb2YgdGhlIGxpbmUgYm94LiAgVGhpcyBpcworICAgICAgICAvLyBBbGlnbiBwb3NpdGlv
bmVkIGJveGVzIHdpdGggdGhlIHRvcCBvZiB0aGUgbGluZSBib3guIFRoaXMgaXMKICAgICAgICAg
Ly8gYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gb2YgYW4gYXBwcm9wcmlhdGUgeSBwb3NpdGlv
bi4KICAgICAgICAgYXV0byYgcmVuZGVyZXIgPSBydW4tPnJlbmRlcmVyKCk7CiAgICAgICAgIGlm
IChyZW5kZXJlci5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJ1bi0+Ym94
KCktPnNldExvZ2ljYWxUb3AobG9naWNhbEhlaWdodCgpKTsKKyAgICAgICAgICAgIHJ1bi0+Ym94
KCktPnNldExvZ2ljYWxUb3AobV9mbG93LmxvZ2ljYWxIZWlnaHQoKSk7CiAKICAgICAgICAgLy8g
UG9zaXRpb24gaXMgdXNlZCB0byBwcm9wZXJseSBwb3NpdGlvbiBib3RoIHJlcGxhY2VkIGVsZW1l
bnRzIGFuZAogICAgICAgICAvLyB0byB1cGRhdGUgdGhlIHN0YXRpYyBub3JtYWwgZmxvdyB4L3kg
b2YgcG9zaXRpb25lZCBlbGVtZW50cy4KQEAgLTEwMzgsNyArMTA1NCw3IEBAIHN0YXRpYyBpbmxp
bmUgdW5zaWduZWQgZmluZEZpcnN0VHJhaWxpbmcKICAgICByZXR1cm4gZmlyc3RTcGFjZTsKIH0K
IAotaW5saW5lIEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6aGFuZGxlVHJhaWxpbmdTcGFjZXMo
QmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBCaWRpQ29udGV4dCogY3VycmVudENvbnRl
eHQpCitpbmxpbmUgQmlkaVJ1biogQ29tcGxleExpbmVMYXlvdXQ6OmhhbmRsZVRyYWlsaW5nU3Bh
Y2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRD
b250ZXh0KQogewogICAgIGlmICghYmlkaVJ1bnMucnVuQ291bnQoKQogICAgICAgICB8fCAhYmlk
aVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5yZW5kZXJlcigpLnN0eWxlKCkuYnJlYWtPbmx5QWZ0
ZXJXaGl0ZVNwYWNlKCkKQEAgLTEwODksNyArMTEwNSw3IEBAIGlubGluZSBCaWRpUnVuKiBSZW5k
ZXJCbG9ja0Zsb3c6OmhhbmRsZVQKICAgICByZXR1cm4gdHJhaWxpbmdTcGFjZVJ1bjsKIH0KIAot
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9h
dGluZ09iamVjdCYgZmxvYXRpbmdPYmplY3QpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0OjphcHBl
bmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QmIGZsb2F0aW5nT2JqZWN0
KQogewogICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdGluZ09iamVj
dC5vcmlnaW5hdGluZ0xpbmUoKSk7CiAgICAgQVNTRVJUKGxhc3RSb290Qm94KCkpOwpAQCAtMTE4
NCw3ICsxMjAwLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlSdW5zRm9yUwog
fQogCiAvLyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBmb3IgYWxsIG9mIHRo
ZSB0ZXh0IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVpciBwb3NpdGlvbi4K
LVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlS
dW5zKHVuc2lnbmVkIGJpZGlMZXZlbCwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBj
b25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9z
aXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNl
UnVuLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQorUm9vdElubGluZUJveCog
Q29tcGxleExpbmVMYXlvdXQ6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyh1bnNpZ25lZCBi
aWRpTGV2ZWwsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGVuZCwgTGluZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZl
cnRpY2FsUG9zaXRpb25DYWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1
cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKIHsKICAgICBpZiAoIWJpZGlSdW5zLnJ1bkNvdW50
KCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTIxNiw3ICsxMjMyLDcgQEAgUm9vdElu
bGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaQogICAgIC8vIGNvbnRhaW5zIHJldmVy
c2VkIHRleHQgb3Igbm90LiBJZiB3ZSB3b3VsZG4ndCBkbyB0aGF0IGVkaXRpbmcgYW5kIHRodXMK
ICAgICAvLyB0ZXh0IHNlbGVjdGlvbiBpbiBSVEwgYm94ZXMgd291bGQgbm90IHdvcmsgYXMgZXhw
ZWN0ZWQuCiAgICAgaWYgKGlzU1ZHUm9vdElubGluZUJveCkgewotICAgICAgICBBU1NFUlRfV0lU
SF9TRUNVUklUWV9JTVBMSUNBVElPTihpc1NWR1RleHQoKSk7CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04obV9mbG93LmlzU1ZHVGV4dCgpKTsKICAgICAg
ICAgZG93bmNhc3Q8U1ZHUm9vdElubGluZUJveD4oKmxpbmVCb3gpLmNvbXB1dGVQZXJDaGFyYWN0
ZXJMYXlvdXRJbmZvcm1hdGlvbigpOwogICAgIH0KICAgICAKQEAgLTEyNTMsNyArMTI2OSw3IEBA
IHN0YXRpYyB2b2lkIHJlcGFpbnREaXJ0eUZsb2F0cyhMaW5lTGF5b3UKICAgICB9CiB9CiAKLXZv
aWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUsIGJvb2wgaGFzSW5saW5lQ2hpbGQpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0
OjpsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGJvb2wg
aGFzSW5saW5lQ2hpbGQpCiB7CiAgICAgLy8gV2Ugd2FudCB0byBza2lwIGFoZWFkIHRvIHRoZSBm
aXJzdCBkaXJ0eSBsaW5lCiAgICAgSW5saW5lQmlkaVJlc29sdmVyIHJlc29sdmVyOwpAQCAtMTI2
OCwyMSArMTI4NCwyMSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0
CiAgICAgLy8gRklYTUU6IFRoaXMgd291bGQgbWFrZSBtb3JlIHNlbnNlIG91dHNpZGUgb2YgdGhp
cyBmdW5jdGlvbiwgYnV0IHNpbmNlCiAgICAgLy8gZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbiBjYW4g
Y2hhbmdlIHRoZSBmdWxsTGF5b3V0IGZsYWcgd2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUuIEZhaWx1
cmUgdG8gY2FsbAogICAgIC8vIGRldGVybWluZVN0YXJ0UG9zaXRpb24gZmlyc3Qgd2lsbCBicmVh
ayBmYXN0L3JlcGFpbnQvbGluZS1mbG93LXdpdGgtZmxvYXRzLTkuaHRtbC4KLSAgICBpZiAobGF5
b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkgJiYgaGFzSW5saW5lQ2hpbGQgJiYgIXNlbGZOZWVkc0xh
eW91dCgpKSB7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7IC8vIE1hcmsg
YXMgbmVlZGluZyBhIGZ1bGwgbGF5b3V0IHRvIGZvcmNlIHVzIHRvIHJlcGFpbnQuCi0gICAgICAg
IGlmICghdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5uZWVkc0Z1bGxSZXBhaW50
KCkgJiYgaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSAmJiBoYXNSZXBhaW50TGF5b3V0UmVjdHMoKSkg
eworICAgIGlmIChsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAmJiBoYXNJbmxpbmVDaGlsZCAm
JiAhbV9mbG93LnNlbGZOZWVkc0xheW91dCgpKSB7CisgICAgICAgIG1fZmxvdy5zZXROZWVkc0xh
eW91dChNYXJrT25seVRoaXMpOyAvLyBNYXJrIGFzIG5lZWRpbmcgYSBmdWxsIGxheW91dCB0byBm
b3JjZSB1cyB0byByZXBhaW50LgorICAgICAgICBpZiAoIWxheW91dENvbnRleHQoKS5uZWVkc0Z1
bGxSZXBhaW50KCkgJiYgbV9mbG93Lmhhc1NlbGZQYWludGluZ0xheWVyKCkgJiYgbV9mbG93Lmhh
c1JlcGFpbnRMYXlvdXRSZWN0cygpKSB7CiAgICAgICAgICAgICAvLyBCZWNhdXNlIHdlIHdhaXRl
ZCB1bnRpbCB3ZSB3ZXJlIGFscmVhZHkgaW5zaWRlIGxheW91dCB0byBkaXNjb3ZlcgogICAgICAg
ICAgICAgLy8gdGhhdCB0aGUgYmxvY2sgcmVhbGx5IG5lZWRlZCBhIGZ1bGwgbGF5b3V0LCB3ZSBt
aXNzZWQgb3VyIGNoYW5jZSB0byByZXBhaW50IHRoZSBsYXllcgotICAgICAgICAgICAgLy8gYmVm
b3JlIGxheW91dCBzdGFydGVkLiAgTHVja2lseSB0aGUgbGF5ZXIgaGFzIGNhY2hlZCB0aGUgcmVw
YWludCByZWN0IGZvciBpdHMgb3JpZ2luYWwKKyAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQg
c3RhcnRlZC4gTHVja2lseSB0aGUgbGF5ZXIgaGFzIGNhY2hlZCB0aGUgcmVwYWludCByZWN0IGZv
ciBpdHMgb3JpZ2luYWwKICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFuZCBzaXplLCBhbmQgc28g
d2UgY2FuIHVzZSB0aGF0IHRvIG1ha2UgYSByZXBhaW50IGhhcHBlbiBub3cuCi0gICAgICAgICAg
ICByZXBhaW50VXNpbmdDb250YWluZXIoY29udGFpbmVyRm9yUmVwYWludCgpLCByZXBhaW50TGF5
b3V0UmVjdHMoKS5tX3JlcGFpbnRSZWN0KTsKKyAgICAgICAgICAgIG1fZmxvdy5yZXBhaW50VXNp
bmdDb250YWluZXIobV9mbG93LmNvbnRhaW5lckZvclJlcGFpbnQoKSwgbV9mbG93LnJlcGFpbnRM
YXlvdXRSZWN0cygpLm1fcmVwYWludFJlY3QpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYg
KGNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLnNldExh
c3RGbG9hdChtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpLmdldCgpKTsKKyAgICBpZiAo
bV9mbG93LmNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIGxheW91dFN0YXRlLmZsb2F0TGlzdCgp
LnNldExhc3RGbG9hdChtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCktPnNldCgpLmxhc3QoKS5nZXQo
KSk7CiAKLSAgICAvLyBXZSBhbHNvIGZpbmQgdGhlIGZpcnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJh
Y3QgdGhlc2UgbGluZXMuICBXZSB3aWxsIGFkZCB0aGVtIGJhY2sKKyAgICAvLyBXZSBhbHNvIGZp
bmQgdGhlIGZpcnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJhY3QgdGhlc2UgbGluZXMuIFdlIHdpbGwg
YWRkIHRoZW0gYmFjawogICAgIC8vIGlmIHdlIGRldGVybWluZSB0aGF0IHdlJ3JlIGFibGUgdG8g
c3luY2hyb25pemUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBkaXJ0eSBsaW5lcy4KICAgICBJbmxp
bmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKICAgICBCaWRpU3RhdHVzIGNsZWFuTGluZUJpZGlT
dGF0dXM7CkBAIC0xMjkxLDcgKzEzMDcsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0
UnVuc0FuZEZsb2F0CiAKICAgICBpZiAoc3RhcnRMaW5lKSB7CiAgICAgICAgIGlmICghbGF5b3V0
U3RhdGUudXNlc1JlcGFpbnRCb3VuZHMoKSkKLSAgICAgICAgICAgIGxheW91dFN0YXRlLnNldFJl
cGFpbnRSYW5nZShsb2dpY2FsSGVpZ2h0KCkpOworICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0
UmVwYWludFJhbmdlKG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkpOwogICAgICAgICBkZWxldGVMaW5l
UmFuZ2UobGF5b3V0U3RhdGUsIHN0YXJ0TGluZSk7CiAgICAgfQogCkBAIC0xMzA2LDcgKzEzMjIs
NyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAgICAgICAgICAg
ICBpZiAobGFzdE9iamVjdC0+aXNCUigpKSB7CiAgICAgICAgICAgICAgICAgQ2xlYXIgY2xlYXIg
PSBsYXN0T2JqZWN0LT5zdHlsZSgpLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgaWYgKGNsZWFy
ICE9IENsZWFyOjpOb25lKQotICAgICAgICAgICAgICAgICAgICBjbGVhckZsb2F0cyhjbGVhcik7
CisgICAgICAgICAgICAgICAgICAgIG1fZmxvdy5jbGVhckZsb2F0cyhjbGVhcik7CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzE3LDI1ICsxMzMzLDI1IEBAIHZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXQKIH0KIAogLy8gQmVmb3JlIHJlc3RhcnRp
bmcgdGhlIGxheW91dCBsb29wIHdpdGggYSBuZXcgbG9naWNhbEhlaWdodCwgcmVtb3ZlIGFsbCBm
bG9hdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCByZXNldCB0aGUgcmVzb2x2ZXIuCi1pbmxpbmUgY29u
c3QgSW5saW5lSXRlcmF0b3ImIFJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91dFJ1bnNBbmRG
bG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBuZXdM
b2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUs
IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25zdCBJbmxpbmVJdGVyYXRvciYgb2xk
RW5kKQoraW5saW5lIGNvbnN0IElubGluZUl0ZXJhdG9yJiBDb21wbGV4TGluZUxheW91dDo6cmVz
dGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdo
dCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9h
dEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgb2xkRW5kKQogewotICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0JlbG93
KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQpOwotICAgIHNldExv
Z2ljYWxIZWlnaHQobmV3TG9naWNhbEhlaWdodCk7CisgICAgbV9mbG93LnJlbW92ZUZsb2F0aW5n
T2JqZWN0c0JlbG93KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQp
OworICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KG5ld0xvZ2ljYWxIZWlnaHQpOwogICAgIHJl
c29sdmVyLnNldFBvc2l0aW9uSWdub3JpbmdOZXN0ZWRJc29sYXRlcyhvbGRFbmQpOwogICAgIHJl
dHVybiBvbGRFbmQ7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxv
YXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0
IEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzKQordm9pZCBDb21wbGV4TGluZUxheW91dDo6bGF5b3V0UnVuc0FuZEZsb2F0
c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBC
aWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lcykKIHsKICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGVUb1VzZSA9IHN0eWxl
KCk7Ci0gICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4
dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5s
YXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOworICAgIGJvb2wgcGFnaW5hdGVkID0gbGF5b3V0
Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgbGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkt
PmlzUGFnaW5hdGVkKCk7CiAgICAgTGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUmIGxpbmVX
aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlID0gcmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdT
dGF0ZSgpOwogICAgIElubGluZUl0ZXJhdG9yIGVuZCA9IHJlc29sdmVyLnBvc2l0aW9uKCk7CiAg
ICAgYm9vbCBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsKICAg
ICBSZW5kZXJUZXh0SW5mbyByZW5kZXJUZXh0SW5mbzsKICAgICBWZXJ0aWNhbFBvc2l0aW9uQ2Fj
aGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwogCi0gICAgTGluZUJyZWFrZXIgbGluZUJyZWFrZXIo
KnRoaXMpOworICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKG1fZmxvdyk7CiAKICAgICB3aGls
ZSAoIWVuZC5hdEVuZCgpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBJcyB0aGlzIGNoZWNrIG5lY2Vz
c2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvciBjYW4gaXQgYmUgbW92ZWQgdG8gdGhl
IGVuZD8KQEAgLTEzNTUsMTEgKzEzNzEsMTEgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91
dFJ1bnNBbmRGbG9hdAogCiAgICAgICAgIGNvbnN0IElubGluZUl0ZXJhdG9yIG9sZEVuZCA9IGVu
ZDsKICAgICAgICAgYm9vbCBpc05ld1VCQVBhcmFncmFwaCA9IGxheW91dFN0YXRlLmxpbmVJbmZv
KCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCk7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lID0gKGNvbnRhaW5zRmxvYXRzKCkpID8gbV9mbG9hdGlu
Z09iamVjdHMtPnNldCgpLmxhc3QoKS5nZXQoKSA6IG51bGxwdHI7CisgICAgICAgIEZsb2F0aW5n
T2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lID0gKG1fZmxvdy5jb250YWluc0Zsb2F0
cygpKSA/IG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKS0+c2V0KCkubGFzdCgpLmdldCgpIDogbnVs
bHB0cjsKIAogICAgICAgICBXb3JkTWVhc3VyZW1lbnRzIHdvcmRNZWFzdXJlbWVudHM7CiAgICAg
ICAgIGVuZCA9IGxpbmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRl
LmxpbmVJbmZvKCksIHJlbmRlclRleHRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBj
b25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgd29yZE1lYXN1cmVtZW50cyk7Ci0gICAgICAgIGNh
Y2hlUHJpb3JDaGFyYWN0ZXJzSWZOZWVkZWQocmVuZGVyVGV4dEluZm8ubGluZUJyZWFrSXRlcmF0
b3IpOworICAgICAgICBtX2Zsb3cuY2FjaGVQcmlvckNoYXJhY3RlcnNJZk5lZWRlZChyZW5kZXJU
ZXh0SW5mby5saW5lQnJlYWtJdGVyYXRvcik7CiAgICAgICAgIHJlbmRlclRleHRJbmZvLmxpbmVC
cmVha0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7CiAgICAgICAgIGlmIChyZXNvbHZlci5w
b3NpdGlvbigpLmF0RW5kKCkpIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3Qg
YmUgY3JlYXRpbmcgYW55IHJ1bnMgaW4gbmV4dExpbmVCcmVhayB0byBiZWdpbiB3aXRoIQpAQCAt
MTQwMiw3ICsxNDE4LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9h
dAogICAgICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSBmaWd1cmUgb3V0IHdoZXJlIGJv
cmRlci9wYWRkaW5nL21hcmdpbiBzaG91bGQgYmUgYXBwbGllZCBmb3IKICAgICAgICAgICAgIC8v
IGlubGluZSBmbG93IGJveGVzLgogCi0gICAgICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxI
ZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2lj
YWxIZWlnaHQgPSBtX2Zsb3cubG9naWNhbEhlaWdodCgpOwogICAgICAgICAgICAgUm9vdElubGlu
ZUJveCogbGluZUJveCA9IGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhyZXNvbHZlci5zdGF0
dXMoKS5jb250ZXh0LT5sZXZlbCgpLCBiaWRpUnVucywgZW5kLCBsYXlvdXRTdGF0ZS5saW5lSW5m
bygpLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHRyYWlsaW5nU3BhY2VSdW4sIHdvcmRNZWFzdXJl
bWVudHMpOwogCiAgICAgICAgICAgICBiaWRpUnVucy5jbGVhcigpOwpAQCAtMTQxOSwyMiArMTQz
NSwyMiBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAgICAgICAg
ICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2luSW5mbygpLnNldEF0QmVmb3JlU2lkZU9mQmxvY2so
ZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkKLSAgICAgICAgICAgICAg
ICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBhZGp1c3RtZW50
LCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAg
ICAgICAgICAgICAgICAgIG1fZmxvdy5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxp
bmVCb3gsIGFkanVzdG1lbnQsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVu
dGVkRmxvdygpKTsKICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudCkgewogICAgICAgICAg
ICAgICAgICAgICBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCA9IGxheW91dFN0YXRl
LmxpbmVJbmZvKCkuaXNGaXJzdExpbmUoKSA/IEluZGVudFRleHQgOiBEb05vdEluZGVudFRleHQ7
Ci0gICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgb2xkTGluZVdpZHRoID0gYXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0LCBzaG91bGRJbmRlbnRUZXh0KTsK
KyAgICAgICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMaW5lV2lkdGggPSBtX2Zsb3cuYXZh
aWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0LCBzaG91bGRJbmRlbnRU
ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+YWRqdXN0QmxvY2tEaXJlY3Rpb25Q
b3NpdGlvbihhZGp1c3RtZW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW91dFN0YXRl
LnVzZXNSZXBhaW50Qm91bmRzKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0
ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxpbmVCb3gpOwogCi0gICAgICAgICAgICAgICAg
ICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKG9sZExvZ2ljYWxIZWlnaHQgKyBh
ZGp1c3RtZW50LCBzaG91bGRJbmRlbnRUZXh0KSAhPSBvbGRMaW5lV2lkdGgpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKG1fZmxvdy5hdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKG9sZExv
Z2ljYWxIZWlnaHQgKyBhZGp1c3RtZW50LCBzaG91bGRJbmRlbnRUZXh0KSAhPSBvbGRMaW5lV2lk
dGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZGVsZXRlIHRoaXMg
bGluZSwgcmVtb3ZlIGFsbCBmbG9hdHMgdGhhdCBnb3QgYWRkZWQsIGFuZCBsZXQgbGluZSBsYXlv
dXQgcmUtcnVuLgogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+ZGVsZXRlTGluZSgp
OwogICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gcmVzdGFydExheW91dFJ1bnNBbmRGbG9h
dHNJblJhbmdlKG9sZExvZ2ljYWxIZWlnaHQsIG9sZExvZ2ljYWxIZWlnaHQgKyBhZGp1c3RtZW50
LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCByZXNvbHZlciwgb2xkRW5kKTsKICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAg
ICAgICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5saW5lQm90dG9tV2l0aExl
YWRpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KGxp
bmVCb3gtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKQEAgLTE0
NDUsMTUgKzE0NjEsMTUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9h
dAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5lQnJlYWtl
ci5wb3NpdGlvbmVkT2JqZWN0cygpLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc2V0U3RhdGlj
UG9zaXRpb25zKCp0aGlzLCAqbGluZUJyZWFrZXIucG9zaXRpb25lZE9iamVjdHMoKVtpXSwgRG9O
b3RJbmRlbnRUZXh0KTsKKyAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Zsb3csICps
aW5lQnJlYWtlci5wb3NpdGlvbmVkT2JqZWN0cygpW2ldLCBEb05vdEluZGVudFRleHQpOwogCiAg
ICAgICAgIGlmICghbGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0VtcHR5KCkpIHsKICAgICAgICAg
ICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0Rmlyc3RMaW5lKGZhbHNlKTsKLSAgICAgICAg
ICAgIGNsZWFyRmxvYXRzKGxpbmVCcmVha2VyLmNsZWFyKCkpOworICAgICAgICAgICAgbV9mbG93
LmNsZWFyRmxvYXRzKGxpbmVCcmVha2VyLmNsZWFyKCkpOwogICAgICAgICB9CiAKLSAgICAgICAg
aWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgIGNv
bnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmpl
Y3RzLT5zZXQoKTsKKyAgICAgICAgaWYgKG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKSAmJiBsYXN0
Um9vdEJveCgpKSB7CisgICAgICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCktPnNldCgpOwogICAgICAgICAg
ICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7CiAgICAgICAgICAgICBhdXRv
IGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwogICAgICAgICAgICAgaWYgKGF1dG8qIGxh
c3RGbG9hdCA9IGxheW91dFN0YXRlLmZsb2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7CkBAIC0xNDgw
LDcgKzE0OTYsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAg
ICAgLy8gSW4gY2FzZSB3ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSBsaW5lIHBvc2l0aW9ucyBkdXJp
bmcgdGhpcyBsYXlvdXQgdG8gYXZvaWQgd2lkb3dzCiAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGln
bm9yZSB0aGUgcG9zc2liaWxpdHkgb2YgaGF2aW5nIGEgbmV3IHdpZG93cyBzaXR1YXRpb24uCiAg
ICAgLy8gT3RoZXJ3aXNlLCB3ZSByaXNrIGxlYXZpbmcgZW1wdHkgY29udGFpbmVycyB3aGljaCBp
cyBhZ2FpbnN0IHRoZSBibG9jayBmcmFnbWVudGF0aW9uIHByaW5jaXBsZXMuCi0gICAgaWYgKHBh
Z2luYXRlZCAmJiAhc3R5bGUoKS5oYXNBdXRvV2lkb3dzKCkgJiYgIWRpZEJyZWFrQXRMaW5lVG9B
dm9pZFdpZG93KCkpIHsKKyAgICBpZiAocGFnaW5hdGVkICYmICFzdHlsZSgpLmhhc0F1dG9XaWRv
d3MoKSAmJiAhbV9mbG93LmRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCkpIHsKICAgICAgICAg
Ly8gQ2hlY2sgdGhlIGxpbmUgYm94ZXMgdG8gbWFrZSBzdXJlIHdlIGRpZG4ndCBjcmVhdGUgdW5h
Y2NlcHRhYmxlIHdpZG93cy4KICAgICAgICAgLy8gSG93ZXZlciwgd2UnbGwgcHJpb3JpdGl6ZSBv
cnBoYW5zIC0gc28gbm90aGluZyB3ZSBkbyBoZXJlIHNob3VsZCBjcmVhdGUKICAgICAgICAgLy8g
YSBuZXcgb3JwaGFuLgpAQCAtMTUzMiwxNCArMTU0OCwxNCBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAgICAgICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gt
PnByZXZSb290Qm94KCk7CiAKICAgICAgICAgICAgIC8vIFdlIG5vdyB3YW50IHRvIGJyZWFrIGF0
IHRoaXMgbGluZS4gUmVtZW1iZXIgZm9yIG5leHQgbGF5b3V0IGFuZCB0cmlnZ2VyIHJlbGF5b3V0
LgotICAgICAgICAgICAgc2V0QnJlYWtBdExpbmVUb0F2b2lkV2lkb3cobGluZUNvdW50KGxpbmVC
b3gpKTsKLSAgICAgICAgICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGxhc3RSb290Qm94
KCktPmxpbmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94LT5saW5lQm90dG9tV2l0aExlYWRp
bmcoKSwgbGluZUJveCk7CisgICAgICAgICAgICBtX2Zsb3cuc2V0QnJlYWtBdExpbmVUb0F2b2lk
V2lkb3cobV9mbG93LmxpbmVDb3VudChsaW5lQm94KSk7CisgICAgICAgICAgICBtX2Zsb3cubWFy
a0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UobGFzdFJvb3RCb3goKS0+bGluZUJvdHRvbVdpdGhMZWFk
aW5nKCksIGxpbmVCb3gtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94KTsKICAgICAg
ICAgfQogICAgIH0KLSAgICBjbGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CisgICAg
bV9mbG93LmNsZWFyRGlkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3coKTsKIH0KIAotdm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OnJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNsZWFu
TGluZSwgTGF5b3V0VW5pdCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKQordm9pZCBDb21w
bGV4TGluZUxheW91dDo6cmVhdHRhY2hDbGVhbkxpbmVGbG9hdHMoUm9vdElubGluZUJveCYgY2xl
YW5MaW5lLCBMYXlvdXRVbml0IGRlbHRhLCBib29sIGlzRmlyc3RDbGVhbkxpbmUpCiB7CiAgICAg
YXV0byogY2xlYW5MaW5lRmxvYXRzID0gY2xlYW5MaW5lLmZsb2F0c1B0cigpOwogICAgIGlmICgh
Y2xlYW5MaW5lRmxvYXRzKQpAQCAtMTU0OCw3ICsxNTY0LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OnJlYXR0YWNoQ2xlYW5MaW5lRgogICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAqY2xl
YW5MaW5lRmxvYXRzKSB7CiAgICAgICAgIGlmICghZmxvYXRpbmdCb3gpCiAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgYXV0byogZmxvYXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGluZ09i
amVjdCgqZmxvYXRpbmdCb3gpOworICAgICAgICBhdXRvKiBmbG9hdGluZ09iamVjdCA9IG1fZmxv
dy5pbnNlcnRGbG9hdGluZ09iamVjdCgqZmxvYXRpbmdCb3gpOwogICAgICAgICBpZiAoaXNGaXJz
dENsZWFuTGluZSAmJiBmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpIHsKICAgICAg
ICAgICAgIC8vIEZsb2F0IGJveCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaW5lIGFueW1vcmUu
CiAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihjbGVhbkxpbmUu
cHJldlJvb3RCb3goKSA9PSBmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwpAQCAt
MTU1NywyNSArMTU3MywyNSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVhdHRhY2hDbGVhbkxp
bmVGCiAgICAgICAgIH0KICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04o
IWZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7CiAgICAgICAgIGZsb2F0aW5nT2Jq
ZWN0LT5zZXRPcmlnaW5hdGluZ0xpbmUoY2xlYW5MaW5lKTsKLSAgICAgICAgc2V0TG9naWNhbEhl
aWdodChsb2dpY2FsVG9wRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSAtIG1hcmdpbkJlZm9yZUZvckNo
aWxkKCpmbG9hdGluZ0JveCkgKyBkZWx0YSk7Ci0gICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7
CisgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KG1fZmxvdy5sb2dpY2FsVG9wRm9yQ2hp
bGQoKmZsb2F0aW5nQm94KSAtIG1fZmxvdy5tYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdC
b3gpICsgZGVsdGEpOworICAgICAgICBtX2Zsb3cucG9zaXRpb25OZXdGbG9hdHMoKTsKICAgICB9
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK3ZvaWQgQ29tcGxleExpbmVMYXlvdXQ6OmxpbmtUb0Vu
ZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogewogICAgIGF1dG8q
IGZpcnN0Q2xlYW5MaW5lID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwogICAgIGlmIChmaXJzdENs
ZWFuTGluZSkgewogICAgICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkgewot
ICAgICAgICAgICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29u
dGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQo
KS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOworICAgICAgICAgICAgYm9vbCBwYWdpbmF0
ZWQgPSBsYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiBsYXlvdXRDb250ZXh0KCkubGF5
b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKICAgICAgICAgICAgIC8vIEF0dGFjaCBhbGwgdGhl
IHJlbWFpbmluZyBsaW5lcywgYW5kIHRoZW4gYWRqdXN0IHRoZWlyIHktcG9zaXRpb25zIGFzIG5l
ZWRlZC4KLSAgICAgICAgICAgIExheW91dFVuaXQgZGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBs
YXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNhbFRvcCgpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBk
ZWx0YSA9IG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRMaW5lTG9naWNh
bFRvcCgpOwogICAgICAgICAgICAgZm9yIChhdXRvKiBsaW5lID0gZmlyc3RDbGVhbkxpbmU7IGxp
bmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7CiAgICAgICAgICAgICAgICAgbGluZS0+
YXR0YWNoTGluZSgpOwogICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKICAgICAgICAg
ICAgICAgICAgICAgZGVsdGEgLT0gbGluZS0+cGFnaW5hdGlvblN0cnV0KCk7CiAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGFk
anVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZSwgZGVsdGEsIG92ZXJmbG93c0ZyYWdt
ZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKKyAgICAgICAgICAgICAgICAgICAg
bV9mbG93LmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZSwgZGVsdGEsIG92ZXJm
bG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKTsKICAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7CiAgICAgICAgICAgICAgICAgICAg
IGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZSwgZGVsdGEpOwpAQCAt
MTU4NSwzMCArMTYwMSwzMCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGlua1RvRW5kTGluZUlm
TmVlCiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShsaW5lKTsKICAg
ICAgICAgICAgICAgICByZWF0dGFjaENsZWFuTGluZUZsb2F0cygqbGluZSwgZGVsdGEsIGxpbmUg
PT0gZmlyc3RDbGVhbkxpbmUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0TG9naWNh
bEhlaWdodChsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSk7CisgICAgICAg
ICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0
aExlYWRpbmcoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBEZWxldGUgYWxs
IHRoZSByZW1haW5pbmcgbGluZXMuCiAgICAgICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0
U3RhdGUsIGxheW91dFN0YXRlLmVuZExpbmUoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCi0g
ICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIChsYXlvdXRTdGF0ZS5jaGVja0ZvckZsb2F0c0Zy
b21MYXN0TGluZSgpIHx8IHBvc2l0aW9uTmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsK
KyAgICBpZiAobV9mbG93LmZsb2F0aW5nT2JqZWN0cygpICYmIChsYXlvdXRTdGF0ZS5jaGVja0Zv
ckZsb2F0c0Zyb21MYXN0TGluZSgpIHx8IG1fZmxvdy5wb3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBs
YXN0Um9vdEJveCgpKSB7CiAgICAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGZsb2F0IG9uIHRo
ZSBsYXN0IGxpbmUsIGl0IG1pZ2h0IG5vdCBiZSBwb3NpdGlvbmVkIHVwIHRvIG5vdy4KICAgICAg
ICAgLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgYWRkaW5nIGluIHRoZSBib3R0b20gYm9y
ZGVyL3BhZGRpbmcsIG9yIHRoZSBmbG9hdCB3aWxsCiAgICAgICAgIC8vIGluY2x1ZGUgdGhlIHBh
ZGRpbmcgaW5jb3JyZWN0bHkuIC1kd2gKICAgICAgICAgaWYgKGxheW91dFN0YXRlLmNoZWNrRm9y
RmxvYXRzRnJvbUxhc3RMaW5lKCkpIHsKICAgICAgICAgICAgIExheW91dFVuaXQgYm90dG9tVmlz
dWFsT3ZlcmZsb3cgPSBsYXN0Um9vdEJveCgpLT5sb2dpY2FsQm90dG9tVmlzdWFsT3ZlcmZsb3co
KTsKICAgICAgICAgICAgIExheW91dFVuaXQgYm90dG9tTGF5b3V0T3ZlcmZsb3cgPSBsYXN0Um9v
dEJveCgpLT5sb2dpY2FsQm90dG9tTGF5b3V0T3ZlcmZsb3coKTsKLSAgICAgICAgICAgIGF1dG8g
bmV3TGluZUJveCA9IHN0ZDo6bWFrZV91bmlxdWU8VHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94
PigqdGhpcyk7CisgICAgICAgICAgICBhdXRvIG5ld0xpbmVCb3ggPSBzdGQ6Om1ha2VfdW5pcXVl
PFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveD4obV9mbG93KTsKICAgICAgICAgICAgIGF1dG8g
dHJhaWxpbmdGbG9hdHNMaW5lQm94ID0gbmV3TGluZUJveC5nZXQoKTsKICAgICAgICAgICAgIG1f
bGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGTW92ZShuZXdMaW5lQm94KSk7CiAgICAgICAgICAg
ICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldENvbnN0cnVjdGVkKCk7CiAgICAgICAgICAgICBH
bHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94RGF0YU1hcDsKICAgICAgICAg
ICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7Ci0gICAgICAg
ICAgICBMYXlvdXRVbml0IGJsb2NrTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsKKyAg
ICAgICAgICAgIExheW91dFVuaXQgYmxvY2tMb2dpY2FsSGVpZ2h0ID0gbV9mbG93LmxvZ2ljYWxI
ZWlnaHQoKTsKICAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+YWxpZ25Cb3hlc0lu
QmxvY2tEaXJlY3Rpb24oYmxvY2tMb2dpY2FsSGVpZ2h0LCB0ZXh0Qm94RGF0YU1hcCwgdmVydGlj
YWxQb3NpdGlvbkNhY2hlKTsKICAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0
TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhibG9ja0xvZ2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhl
aWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xvZ2ljYWxIZWlnaHQpOwotICAgICAgICAg
ICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRQYWdpbmF0ZWRMaW5lV2lkdGgoYXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yQ29udGVudChibG9ja0xvZ2ljYWxIZWlnaHQpKTsKKyAgICAgICAgICAg
IHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0UGFnaW5hdGVkTGluZVdpZHRoKG1fZmxvdy5hdmFp
bGFibGVMb2dpY2FsV2lkdGhGb3JDb250ZW50KGJsb2NrTG9naWNhbEhlaWdodCkpOwogICAgICAg
ICAgICAgTGF5b3V0UmVjdCBsb2dpY2FsTGF5b3V0T3ZlcmZsb3coMF9sdSwgYmxvY2tMb2dpY2Fs
SGVpZ2h0LCAxX2x1LCBib3R0b21MYXlvdXRPdmVyZmxvdyAtIGJsb2NrTG9naWNhbEhlaWdodCk7
CiAgICAgICAgICAgICBMYXlvdXRSZWN0IGxvZ2ljYWxWaXN1YWxPdmVyZmxvdygwX2x1LCBibG9j
a0xvZ2ljYWxIZWlnaHQsIDFfbHUsIGJvdHRvbVZpc3VhbE92ZXJmbG93IC0gYmxvY2tMb2dpY2Fs
SGVpZ2h0KTsKICAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0T3ZlcmZsb3dG
cm9tTG9naWNhbFJlY3RzKGxvZ2ljYWxMYXlvdXRPdmVyZmxvdywgbG9naWNhbFZpc3VhbE92ZXJm
bG93LCB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPmxpbmVUb3AoKSwgdHJhaWxpbmdGbG9hdHNMaW5l
Qm94LT5saW5lQm90dG9tKCkpOwpAQCAtMTYxNiw3ICsxNjMyLDcgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmxpbmtUb0VuZExpbmVJZk5lZQogICAgICAgICAgICAgICAgIHVwZGF0ZUZyYWdtZW50
Rm9yTGluZSh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gpOwogICAgICAgICB9CiAKLSAgICAgICAgY29u
c3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVj
dHMtPnNldCgpOworICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmpl
Y3RTZXQgPSBtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCktPnNldCgpOwogICAgICAgICBhdXRvIGl0
ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGlu
Z09iamVjdFNldC5lbmQoKTsKICAgICAgICAgaWYgKGF1dG8qIGxhc3RGbG9hdCA9IGxheW91dFN0
YXRlLmZsb2F0TGlzdCgpLmxhc3RGbG9hdCgpKSB7CkBAIC0xNjMxLDIzICsxNjQ3LDIzIEBAIHZv
aWQgUmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWUKICAgICB9CiB9CiAKLXZvaWQg
UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm9vbCByZWxheW91dENoaWxkcmVuLCBM
YXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxC
b3R0b20pCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0OjpsYXlvdXRMaW5lQm94ZXMoYm9vbCByZWxh
eW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYg
cmVwYWludExvZ2ljYWxCb3R0b20pCiB7Ci0gICAgQVNTRVJUKCFtX3NpbXBsZUxpbmVMYXlvdXQp
OworICAgIEFTU0VSVCghbV9mbG93LnNpbXBsZUxpbmVMYXlvdXQoKSk7CiAKLSAgICBzZXRMb2dp
Y2FsSGVpZ2h0KGJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKSk7CisgICAgbV9mbG93LnNldExvZ2lj
YWxIZWlnaHQobV9mbG93LmJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKSk7CiAgICAgCiAgICAgLy8g
TGF5IG91dCBvdXIgaHlwb3RoZXRpY2FsIGdyaWQgbGluZSBhcyB0aG91Z2ggaXQgb2NjdXJzIGF0
IHRoZSB0b3Agb2YgdGhlIGJsb2NrLgotICAgIGlmICh2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0
Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRl
eHQoKS5sYXlvdXRTdGF0ZSgpLT5saW5lR3JpZCgpID09IHRoaXMpCi0gICAgICAgIGxheW91dExp
bmVHcmlkQm94KCk7CisgICAgaWYgKGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIGxh
eW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5saW5lR3JpZCgpID09ICZtX2Zsb3cpCisgICAg
ICAgIG1fZmxvdy5sYXlvdXRMaW5lR3JpZEJveCgpOwogCi0gICAgUmVuZGVyRnJhZ21lbnRlZEZs
b3cqIGZyYWdtZW50ZWRGbG93ID0gZW5jbG9zaW5nRnJhZ21lbnRlZEZsb3coKTsKKyAgICBSZW5k
ZXJGcmFnbWVudGVkRmxvdyogZnJhZ21lbnRlZEZsb3cgPSBtX2Zsb3cuZW5jbG9zaW5nRnJhZ21l
bnRlZEZsb3coKTsKICAgICBib29sIGNsZWFyTGluZXNGb3JQYWdpbmF0aW9uID0gZmlyc3RSb290
Qm94KCkgJiYgZnJhZ21lbnRlZEZsb3cgJiYgIWZyYWdtZW50ZWRGbG93LT5oYXNGcmFnbWVudHMo
KTsKIAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIgbGluZSBi
b3hlcy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQotICAgIGJvb2wg
aXNGdWxsTGF5b3V0ID0gIWZpcnN0Um9vdEJveCgpIHx8IHNlbGZOZWVkc0xheW91dCgpIHx8IHJl
bGF5b3V0Q2hpbGRyZW4gfHwgY2xlYXJMaW5lc0ZvclBhZ2luYXRpb247Ci0gICAgTGluZUxheW91
dFN0YXRlIGxheW91dFN0YXRlKCp0aGlzLCBpc0Z1bGxMYXlvdXQsIHJlcGFpbnRMb2dpY2FsVG9w
LCByZXBhaW50TG9naWNhbEJvdHRvbSwgZnJhZ21lbnRlZEZsb3cpOworICAgIGJvb2wgaXNGdWxs
TGF5b3V0ID0gIWZpcnN0Um9vdEJveCgpIHx8IG1fZmxvdy5zZWxmTmVlZHNMYXlvdXQoKSB8fCBy
ZWxheW91dENoaWxkcmVuIHx8IGNsZWFyTGluZXNGb3JQYWdpbmF0aW9uOworICAgIExpbmVMYXlv
dXRTdGF0ZSBsYXlvdXRTdGF0ZShtX2Zsb3csIGlzRnVsbExheW91dCwgcmVwYWludExvZ2ljYWxU
b3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tLCBmcmFnbWVudGVkRmxvdyk7CiAKICAgICBpZiAoaXNG
dWxsTGF5b3V0KQogICAgICAgICBsaW5lQm94ZXMoKS5kZWxldGVMaW5lQm94ZXMoKTsKQEAgLTE2
NTUsMTcgKzE2NzEsMTggQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhi
bwogICAgIC8vIFRleHQgdHJ1bmNhdGlvbiBraWNrcyBpbiBpbiB0d28gY2FzZXM6CiAgICAgLy8g
ICAgIDEpIElmIHlvdXIgb3ZlcmZsb3cgaXNuJ3QgdmlzaWJsZSBhbmQgeW91ciB0ZXh0LW92ZXJm
bG93LW1vZGUgaXNuJ3QgY2xpcC4KICAgICAvLyAgICAgMikgSWYgeW91J3JlIGFuIGFub255bW91
cyBibG9jayB3aXRoIGEgYmxvY2sgcGFyZW50IHRoYXQgc2F0aXNmaWVzICMxLgotICAgIC8vIEZJ
WE1FOiBDU1MzIHNheXMgdGhhdCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjbGlwcGVkIG11c3QgYWxz
byBrbm93IGhvdyB0byB0cnVuY2F0ZS4gIFRoaXMgaXMgaW5zYW5lbHkKKyAgICAvLyBGSVhNRTog
Q1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY2xpcHBlZCBtdXN0IGFsc28ga25v
dyBob3cgdG8gdHJ1bmNhdGUuIFRoaXMgaXMgaW5zYW5lbHkKICAgICAvLyBkaWZmaWN1bHQgdG8g
ZmlndXJlIG91dCBpbiBnZW5lcmFsIChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2YgZG9pbmcg
bGF5b3V0KSwgc28gd2Ugb25seSBoYW5kbGUgdGhlCiAgICAgLy8gc2ltcGxlIGNhc2Ugb2YgYW4g
YW5vbnltb3VzIGJsb2NrIHRydW5jYXRpbmcgd2hlbiBpdCdzIHBhcmVudCBpcyBjbGlwcGVkLgot
ICAgIGJvb2wgaGFzVGV4dE92ZXJmbG93ID0gKHN0eWxlKCkudGV4dE92ZXJmbG93KCkgPT0gVGV4
dE92ZXJmbG93OjpFbGxpcHNpcyAmJiBoYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgfHwgKGlz
QW5vbnltb3VzQmxvY2soKSAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygp
ICYmIHBhcmVudCgpLT5zdHlsZSgpLnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxvdzo6RWxs
aXBzaXMgJiYgcGFyZW50KCktPmhhc092ZXJmbG93Q2xpcCgpKTsKKyAgICBhdXRvKiBwYXJlbnQg
PSBtX2Zsb3cucGFyZW50KCk7CisgICAgYm9vbCBoYXNUZXh0T3ZlcmZsb3cgPSAoc3R5bGUoKS50
ZXh0T3ZlcmZsb3coKSA9PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIG1fZmxvdy5oYXNPdmVy
Zmxvd0NsaXAoKSkKKyAgICAgICAgfHwgKG1fZmxvdy5pc0Fub255bW91c0Jsb2NrKCkgJiYgcGFy
ZW50ICYmIHBhcmVudC0+aXNSZW5kZXJCbG9jaygpICYmIHBhcmVudC0+c3R5bGUoKS50ZXh0T3Zl
cmZsb3coKSA9PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIHBhcmVudC0+aGFzT3ZlcmZsb3dD
bGlwKCkpOwogCiAgICAgLy8gV2FsayBhbGwgdGhlIGxpbmVzIGFuZCBkZWxldGUgb3VyIGVsbGlw
c2lzIGxpbmUgYm94ZXMgaWYgdGhleSBleGlzdC4KICAgICBpZiAoaGFzVGV4dE92ZXJmbG93KQot
ICAgICAgICAgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKKyAgICAgICAgZGVsZXRlRWxsaXBz
aXNMaW5lQm94ZXMoKTsKIAotICAgIGlmIChmaXJzdENoaWxkKCkpIHsKKyAgICBpZiAobV9mbG93
LmZpcnN0Q2hpbGQoKSkgewogICAgICAgICAvLyBJbiBmdWxsIGxheW91dCBtb2RlLCBjbGVhciB0
aGUgbGluZSBib3hlcyBvZiBjaGlsZHJlbiB1cGZyb250LiBPdGhlcndpc2UsCiAgICAgICAgIC8v
IHNpYmxpbmdzIGNhbiBydW4gaW50byBzdGFsZSByb290IGxpbmVib3hlcyBkdXJpbmcgbGF5b3V0
LiBUaGVuIGxheW91dAogICAgICAgICAvLyB0aGUgcmVwbGFjZWQgZWxlbWVudHMgbGF0ZXIuIElu
IHBhcnRpYWwgbGF5b3V0IG1vZGUsIGxpbmUgYm94ZXMgYXJlIG5vdApAQCAtMTY3Myw3ICsxNjkw
LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhibwogICAgICAgICAv
LyBlbGVtZW50cyBhdCB0aGUgc2FtZSB0aW1lLgogICAgICAgICBib29sIGhhc0lubGluZUNoaWxk
ID0gZmFsc2U7CiAgICAgICAgIFZlY3RvcjxSZW5kZXJCb3gqPiByZXBsYWNlZENoaWxkcmVuOwot
ICAgICAgICBmb3IgKElubGluZVdhbGtlciB3YWxrZXIoKnRoaXMpOyAhd2Fsa2VyLmF0RW5kKCk7
IHdhbGtlci5hZHZhbmNlKCkpIHsKKyAgICAgICAgZm9yIChJbmxpbmVXYWxrZXIgd2Fsa2VyKG1f
Zmxvdyk7ICF3YWxrZXIuYXRFbmQoKTsgd2Fsa2VyLmFkdmFuY2UoKSkgewogICAgICAgICAgICAg
UmVuZGVyT2JqZWN0JiBvID0gKndhbGtlci5jdXJyZW50KCk7CiAKICAgICAgICAgICAgIGlmICgh
aGFzSW5saW5lQ2hpbGQgJiYgby5pc0lubGluZSgpKQpAQCAtMTY5OCw4ICsxNzE1LDggQEAgdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhibwogICAgICAgICAgICAgICAgICAg
ICBpZiAoaXNGdWxsTGF5b3V0ICYmIGlzPFJlbmRlclJ1YnlSdW4+KGJveCkpIHsKICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHJlc2V0cyB0aGUgb3ZlcmhhbmdpbmcgbWFy
Z2lucyB0aGF0IHdlIHNldCBkdXJpbmcgbGluZSBsYXlvdXQgKHNlZSBjb21wdXRlSW5saW5lRGly
ZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZp
bmQgYSBtb3JlIHN1aXRhYmxlIHBsYWNlIGZvciB0aGlzLgotICAgICAgICAgICAgICAgICAgICAg
ICAgc2V0TWFyZ2luU3RhcnRGb3JDaGlsZChib3gsIDApOwotICAgICAgICAgICAgICAgICAgICAg
ICAgc2V0TWFyZ2luRW5kRm9yQ2hpbGQoYm94LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fZmxvdy5zZXRNYXJnaW5TdGFydEZvckNoaWxkKGJveCwgMCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBtX2Zsb3cuc2V0TWFyZ2luRW5kRm9yQ2hpbGQoYm94LCAwKTsKICAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBib3guZGlydHlMaW5lQm94ZXMoaXNGdWxs
TGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbExheW91dCkKQEAgLTE3MTcs
NyArMTczNCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAg
ICAgICAgfQogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVwbGFjZWRDaGlsZHJl
bi5zaXplKCk7IGkrKykKLSAgICAgICAgICAgICByZXBsYWNlZENoaWxkcmVuW2ldLT5sYXlvdXRJ
Zk5lZWRlZCgpOworICAgICAgICAgICAgcmVwbGFjZWRDaGlsZHJlbltpXS0+bGF5b3V0SWZOZWVk
ZWQoKTsKIAogICAgICAgICBsYXlvdXRSdW5zQW5kRmxvYXRzKGxheW91dFN0YXRlLCBoYXNJbmxp
bmVDaGlsZCk7CiAgICAgfQpAQCAtMTcyNSw3ICsxNzQyLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmxheW91dExpbmVCb3hlcyhibwogICAgIC8vIEV4cGFuZCB0aGUgbGFzdCBsaW5lIHRvIGFj
Y29tbW9kYXRlIFJ1YnkgYW5kIGVtcGhhc2lzIG1hcmtzLgogICAgIGludCBsYXN0TGluZUFubm90
YXRpb25zQWRqdXN0bWVudCA9IDA7CiAgICAgaWYgKGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAg
TGF5b3V0VW5pdCBsb3dlc3RBbGxvd2VkUG9zaXRpb24gPSBzdGQ6Om1heChsYXN0Um9vdEJveCgp
LT5saW5lQm90dG9tKCksIGxvZ2ljYWxIZWlnaHQoKSArIHBhZGRpbmdBZnRlcigpKTsKKyAgICAg
ICAgTGF5b3V0VW5pdCBsb3dlc3RBbGxvd2VkUG9zaXRpb24gPSBzdGQ6Om1heChsYXN0Um9vdEJv
eCgpLT5saW5lQm90dG9tKCksIG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCkgKyBtX2Zsb3cucGFkZGlu
Z0FmdGVyKCkpOwogICAgICAgICBpZiAoIXN0eWxlKCkuaXNGbGlwcGVkTGluZXNXcml0aW5nTW9k
ZSgpKQogICAgICAgICAgICAgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQgPSBsYXN0Um9v
dEJveCgpLT5jb21wdXRlVW5kZXJBbm5vdGF0aW9uQWRqdXN0bWVudChsb3dlc3RBbGxvd2VkUG9z
aXRpb24pOwogICAgICAgICBlbHNlCkBAIC0xNzM2LDE5ICsxNzUzLDE5IEBAIHZvaWQgUmVuZGVy
QmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm8KICAgICAvLyBkZXRlcm1pbmluZyB0aGUgY29y
cmVjdCBjb2xsYXBzZWQgYm90dG9tIG1hcmdpbiBpbmZvcm1hdGlvbi4gVGhpcyBjb2xsYXBzZSBp
cyBvbmx5IG5lY2Vzc2FyeQogICAgIC8vIGlmIG91ciBsYXN0IGNoaWxkIHdhcyBhbiBhbm9ueW1v
dXMgaW5saW5lIGJsb2NrIHRoYXQgbWlnaHQgbmVlZCB0byBwcm9wYWdhdGUgbWFyZ2luIGluZm9y
bWF0aW9uIG91dCB0bwogICAgIC8vIHVzLgotICAgIExheW91dFVuaXQgYWZ0ZXJFZGdlID0gYm9y
ZGVyQW5kUGFkZGluZ0FmdGVyKCkgKyBzY3JvbGxiYXJMb2dpY2FsSGVpZ2h0KCkgKyBsYXN0TGlu
ZUFubm90YXRpb25zQWRqdXN0bWVudDsKLSAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWln
aHQoKSArIGFmdGVyRWRnZSk7CisgICAgTGF5b3V0VW5pdCBhZnRlckVkZ2UgPSBtX2Zsb3cuYm9y
ZGVyQW5kUGFkZGluZ0FmdGVyKCkgKyBtX2Zsb3cuc2Nyb2xsYmFyTG9naWNhbEhlaWdodCgpICsg
bGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQ7CisgICAgbV9mbG93LnNldExvZ2ljYWxIZWln
aHQobV9mbG93LmxvZ2ljYWxIZWlnaHQoKSArIGFmdGVyRWRnZSk7CiAKLSAgICBpZiAoIWZpcnN0
Um9vdEJveCgpICYmIGhhc0xpbmVJZkVtcHR5KCkpCi0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQo
bG9naWNhbEhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCBpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0aWNhbExpbmUsIFBvc2l0aW9uT2ZJbnRlcmlvckxp
bmVCb3hlcykpOworICAgIGlmICghZmlyc3RSb290Qm94KCkgJiYgbV9mbG93Lmhhc0xpbmVJZkVt
cHR5KCkpCisgICAgICAgIG1fZmxvdy5zZXRMb2dpY2FsSGVpZ2h0KG1fZmxvdy5sb2dpY2FsSGVp
Z2h0KCkgKyBtX2Zsb3cubGluZUhlaWdodCh0cnVlLCBtX2Zsb3cuaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJp
b3JMaW5lQm94ZXMpKTsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNw
aWxsIG91dCBvZiBvdXIgYmxvY2suICBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5l
ZWQgdG8KKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbnkgbGluZXMgdGhhdCBzcGlsbCBvdXQgb2Yg
b3VyIGJsb2NrLiBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQgdG8KICAgICAv
LyB0cnVuY2F0ZSB0ZXh0LgogICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCiAgICAgICAgIGNoZWNr
TGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNr
RmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRlckJveCYgZmxv
YXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0LAor
dm9pZCBDb21wbGV4TGluZUxheW91dDo6Y2hlY2tGbG9hdEluQ2xlYW5MaW5lKFJvb3RJbmxpbmVC
b3gmIGNsZWFuTGluZSwgUmVuZGVyQm94JiBmbG9hdEJveE9uQ2xlYW5MaW5lLCBGbG9hdFdpdGhS
ZWN0JiBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QsCiAgICAgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9h
dCwgYm9vbCYgZGlydGllZEJ5RmxvYXQpCiB7CiAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1Q
TElDQVRJT04oIWZsb2F0Qm94T25DbGVhbkxpbmUuc3R5bGUoKS5kZWxldGlvbkhhc0JlZ3VuKCkp
OwpAQCAtMTc2NiwxOSArMTc4MywxOSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tGbG9h
dEluQ2xlYW5MCiAgICAgaWYgKG9yaWdpbmFsRmxvYXRSZWN0LnNpemUoKSA9PSBuZXdTaXplICYm
IChmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuc3R5bGVUeXBlKCkgIT0gUHNldWRvSWQ6OkZp
cnN0TGV0dGVyIHx8ICFmbG9hdEJveE9uQ2xlYW5MaW5lLnN0eWxlKCkuaW5pdGlhbExldHRlckRy
b3AoKSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIExheW91dFVuaXQgZmxvYXRUb3AgPSBpc0hv
cml6b250YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9hdFJlY3QueSgpIDogb3JpZ2luYWxG
bG9hdFJlY3QueCgpOwotICAgIExheW91dFVuaXQgZmxvYXRIZWlnaHQgPSBpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpID8gc3RkOjptYXgob3JpZ2luYWxGbG9hdFJlY3QuaGVpZ2h0KCksIG5ld1Np
emUuaGVpZ2h0KCkpCisgICAgTGF5b3V0VW5pdCBmbG9hdFRvcCA9IG1fZmxvdy5pc0hvcml6b250
YWxXcml0aW5nTW9kZSgpID8gb3JpZ2luYWxGbG9hdFJlY3QueSgpIDogb3JpZ2luYWxGbG9hdFJl
Y3QueCgpOworICAgIExheW91dFVuaXQgZmxvYXRIZWlnaHQgPSBtX2Zsb3cuaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSA/IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LmhlaWdodCgpLCBuZXdT
aXplLmhlaWdodCgpKQogICAgICAgICA6IHN0ZDo6bWF4KG9yaWdpbmFsRmxvYXRSZWN0LndpZHRo
KCksIG5ld1NpemUud2lkdGgoKSk7CiAgICAgZmxvYXRIZWlnaHQgPSBzdGQ6Om1pbihmbG9hdEhl
aWdodCwgTGF5b3V0VW5pdDo6bWF4KCkgLSBmbG9hdFRvcCk7CiAgICAgY2xlYW5MaW5lLm1hcmtE
aXJ0eSgpOwotICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5lQm90
dG9tV2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7Cisg
ICAgbV9mbG93Lm1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGNsZWFuTGluZS5saW5lQm90dG9t
V2l0aExlYWRpbmcoKSwgZmxvYXRUb3AgKyBmbG9hdEhlaWdodCwgJmNsZWFuTGluZSk7CiAgICAg
TGF5b3V0UmVjdCBuZXdGbG9hdFJlY3QgPSBvcmlnaW5hbEZsb2F0UmVjdDsKICAgICBuZXdGbG9h
dFJlY3Quc2V0U2l6ZShuZXdTaXplKTsKICAgICBtYXRjaGluZ0Zsb2F0V2l0aFJlY3QuYWRqdXN0
UmVjdChuZXdGbG9hdFJlY3QpOwogICAgIGRpcnRpZWRCeUZsb2F0ID0gdHJ1ZTsKIH0KIAotUm9v
dElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVM
YXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCitS
b290SW5saW5lQm94KiBDb21wbGV4TGluZUxheW91dDo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihM
aW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVy
KQogewogICAgIFJvb3RJbmxpbmVCb3gqIGN1cnJlbnRMaW5lID0gbnVsbHB0cjsKICAgICBSb290
SW5saW5lQm94KiBsYXN0TGluZSA9IG51bGxwdHI7CkBAIC0xNzg4LDcgKzE4MDUsNyBAQCBSb290
SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluCiAgICAgYm9vbCBkaXJ0aWVkQnlG
bG9hdCA9IGZhbHNlOwogICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpIHsKICAg
ICAgICAgLy8gUGFnaW5hdGUgYWxsIG9mIHRoZSBjbGVhbiBsaW5lcy4KLSAgICAgICAgYm9vbCBw
YWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRl
KCkgJiYgdmlldygpLmZyYW1lVmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5p
c1BhZ2luYXRlZCgpOworICAgICAgICBib29sIHBhZ2luYXRlZCA9IGxheW91dENvbnRleHQoKS5s
YXlvdXRTdGF0ZSgpICYmIGxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRl
ZCgpOwogICAgICAgICBMYXlvdXRVbml0IHBhZ2luYXRpb25EZWx0YTsKICAgICAgICAgYXV0byBm
bG9hdHNJdGVyYXRvciA9IGZsb2F0cy5iZWdpbigpOwogICAgICAgICBhdXRvIGVuZCA9IGZsb2F0
cy5lbmQoKTsKQEAgLTE4MDAsMTAgKzE4MTcsMTAgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxv
Y2tGbG93OjpkZXRlcm1pbgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwYWdp
bmF0aW9uRGVsdGEgLT0gY3VycmVudExpbmUtPnBhZ2luYXRpb25TdHJ1dCgpOwogICAgICAgICAg
ICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgYWRqdXN0TGlu
ZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyZW50TGluZSwgcGFnaW5hdGlvbkRlbHRhLCBvdmVy
Zmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSk7CisgICAgICAgICAg
ICAgICAgbV9mbG93LmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24oY3VycmVudExpbmUs
IHBhZ2luYXRpb25EZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50
ZWRGbG93KCkpOwogICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uRGVsdGEpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgfHwgIWZsb2F0cy5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBEbyBiZXR0ZXIgZXZlbnR1YWxs
eS4gIEZvciBub3cgaWYgd2UgZXZlciBzaGlmdCBiZWNhdXNlIG9mIHBhZ2luYXRpb24gYW5kIGZs
b2F0cyBhcmUgcHJlc2VudCBqdXN0IGdvIHRvIGEgZnVsbCBsYXlvdXQuCisgICAgICAgICAgICAg
ICAgICAgIGlmIChtX2Zsb3cuY29udGFpbnNGbG9hdHMoKSB8fCAhZmxvYXRzLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IERvIGJldHRlciBldmVudHVhbGx5
LiBGb3Igbm93IGlmIHdlIGV2ZXIgc2hpZnQgYmVjYXVzZSBvZiBwYWdpbmF0aW9uIGFuZCBmbG9h
dHMgYXJlIHByZXNlbnQganVzdCBnbyB0byBhIGZ1bGwgbGF5b3V0LgogICAgICAgICAgICAgICAg
ICAgICAgICAgbGF5b3V0U3RhdGUubWFya0ZvckZ1bGxMYXlvdXQoKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xODczLDcgKzE4OTAs
NyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluCiAgICAgfQogCiAg
ICAgaWYgKCFmbG9hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgc2F2ZWRMb2dp
Y2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICBMYXlvdXRVbml0IHNhdmVkTG9n
aWNhbEhlaWdodCA9IG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCk7CiAgICAgICAgIC8vIFJlc3RvcmUg
ZmxvYXRzIGZyb20gY2xlYW4gbGluZXMuCiAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBm
aXJzdFJvb3RCb3goKTsKICAgICAgICAgd2hpbGUgKGxpbmUgIT0gY3VycmVudExpbmUpIHsKQEAg
LTE4ODEsMzkgKzE4OTgsMzkgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRl
cm1pbgogICAgICAgICAgICAgICAgIGZvciAoYXV0byYgZmxvYXRpbmdCb3ggOiAqY2xlYW5MaW5l
RmxvYXRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZmxvYXRpbmdCb3gpCiAgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byogZmxv
YXRpbmdPYmplY3QgPSBpbnNlcnRGbG9hdGluZ09iamVjdCgqZmxvYXRpbmdCb3gpOworICAgICAg
ICAgICAgICAgICAgICBhdXRvKiBmbG9hdGluZ09iamVjdCA9IG1fZmxvdy5pbnNlcnRGbG9hdGlu
Z09iamVjdCgqZmxvYXRpbmdCb3gpOwogICAgICAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9T
RUNVUklUWV9JTVBMSUNBVElPTighZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsK
ICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldE9yaWdpbmF0aW5nTGluZSgq
bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEZv
ckNoaWxkKCpmbG9hdGluZ0JveCkgLSBtYXJnaW5CZWZvcmVGb3JDaGlsZCgqZmxvYXRpbmdCb3gp
KTsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKKyAgICAgICAgICAg
ICAgICAgICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQobV9mbG93LmxvZ2ljYWxUb3BGb3JDaGls
ZCgqZmxvYXRpbmdCb3gpIC0gbV9mbG93Lm1hcmdpbkJlZm9yZUZvckNoaWxkKCpmbG9hdGluZ0Jv
eCkpOworICAgICAgICAgICAgICAgICAgICBtX2Zsb3cucG9zaXRpb25OZXdGbG9hdHMoKTsKICAg
ICAgICAgICAgICAgICAgICAgZmxvYXRzLnNldExhc3RDbGVhbkZsb2F0KCpmbG9hdGluZ0JveCk7
CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGluZSA9IGxp
bmUtPm5leHRSb290Qm94KCk7CiAgICAgICAgIH0KLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChz
YXZlZExvZ2ljYWxIZWlnaHQpOworICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbEhlaWdodChzYXZl
ZExvZ2ljYWxIZWlnaHQpOwogICAgIH0KIAogICAgIGxheW91dFN0YXRlLmxpbmVJbmZvKCkuc2V0
Rmlyc3RMaW5lKCFsYXN0TGluZSk7CiAgICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRQcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkoIWxhc3RMaW5lIHx8IGxhc3RMaW5lLT5lbmRzV2l0aEJyZWFr
KCkpOwogCiAgICAgaWYgKGxhc3RMaW5lKSB7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobGFz
dExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3Ig
aXRlciA9IElubGluZUl0ZXJhdG9yKHRoaXMsIGxhc3RMaW5lLT5saW5lQnJlYWtPYmooKSwgbGFz
dExpbmUtPmxpbmVCcmVha1BvcygpKTsKKyAgICAgICAgbV9mbG93LnNldExvZ2ljYWxIZWlnaHQo
bGFzdExpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKKyAgICAgICAgSW5saW5lSXRlcmF0
b3IgaXRlciA9IElubGluZUl0ZXJhdG9yKCZtX2Zsb3csIGxhc3RMaW5lLT5saW5lQnJlYWtPYmoo
KSwgbGFzdExpbmUtPmxpbmVCcmVha1BvcygpKTsKICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRp
b24oaXRlciwgbnVtYmVyT2ZJc29sYXRlQW5jZXN0b3JzKGl0ZXIpKTsKICAgICAgICAgcmVzb2x2
ZXIuc2V0U3RhdHVzKGxhc3RMaW5lLT5saW5lQnJlYWtCaWRpU3RhdHVzKCkpOwogICAgIH0gZWxz
ZSB7CiAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGUoKS5kaXJlY3Rpb24o
KTsKICAgICAgICAgaWYgKHN0eWxlKCkudW5pY29kZUJpZGkoKSA9PSBQbGFpbnRleHQpCi0gICAg
ICAgICAgICBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShkaXJlY3Rpb24sIElubGluZUl0ZXJhdG9y
KHRoaXMsIGJpZGlGaXJzdFNraXBwaW5nRW1wdHlJbmxpbmVzKCp0aGlzKSwgMCkpOworICAgICAg
ICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGlyZWN0aW9uLCBJbmxpbmVJdGVyYXRvcigm
bV9mbG93LCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Zsb3cpLCAwKSk7CiAgICAg
ICAgIHJlc29sdmVyLnNldFN0YXR1cyhCaWRpU3RhdHVzKGRpcmVjdGlvbiwgaXNPdmVycmlkZShz
dHlsZSgpLnVuaWNvZGVCaWRpKCkpKSk7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJ
bmxpbmVJdGVyYXRvcih0aGlzLCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcygqdGhpcywg
JnJlc29sdmVyKSwgMCk7CisgICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVy
YXRvcigmbV9mbG93LCBiaWRpRmlyc3RTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Zsb3csICZyZXNv
bHZlciksIDApOwogICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihpdGVyLCBudW1iZXJPZklz
b2xhdGVBbmNlc3RvcnMoaXRlcikpOwogICAgIH0KICAgICByZXR1cm4gY3VycmVudExpbmU7CiB9
CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0
U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQm94KiBzdGFydExpbmUsIElubGluZUl0ZXJh
dG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cykKK3Zv
aWQgQ29tcGxleExpbmVMYXlvdXQ6OmRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSwgSW5saW5lSXRlcmF0b3Im
IGNsZWFuTGluZVN0YXJ0LCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKQogewogICAg
IGF1dG8gaXRlcmF0b3JGb3JGaXJzdERpcnR5RmxvYXQgPSBbXShMaW5lTGF5b3V0U3RhdGU6OkZs
b2F0TGlzdCYgZmxvYXRzKSB7CiAgICAgICAgIGF1dG8gbGFzdENsZWFuRmxvYXQgPSBmbG9hdHMu
bGFzdENsZWFuRmxvYXQoKTsKQEAgLTE5NTYsNyArMTk3Myw3IEBAIHZvaWQgUmVuZGVyQmxvY2tG
bG93OjpkZXRlcm1pbmVFbmRQb3NpdGkKICAgICAvLyBBdCB0aGlzIHBvaW50LCB8bGFzdHwgaXMg
dGhlIGZpcnN0IGxpbmUgaW4gYSBydW4gb2YgY2xlYW4gbGluZXMgdGhhdCBlbmRzIHdpdGggdGhl
IGxhc3QgbGluZQogICAgIC8vIGluIHRoZSBibG9jay4KICAgICBSb290SW5saW5lQm94KiBwcmV2
aW91c0xpbmUgPSBsYXN0TGluZS0+cHJldlJvb3RCb3goKTsKLSAgICBjbGVhbkxpbmVTdGFydCA9
IElubGluZUl0ZXJhdG9yKHRoaXMsIHByZXZpb3VzTGluZS0+bGluZUJyZWFrT2JqKCksIHByZXZp
b3VzTGluZS0+bGluZUJyZWFrUG9zKCkpOworICAgIGNsZWFuTGluZVN0YXJ0ID0gSW5saW5lSXRl
cmF0b3IoJm1fZmxvdywgcHJldmlvdXNMaW5lLT5saW5lQnJlYWtPYmooKSwgcHJldmlvdXNMaW5l
LT5saW5lQnJlYWtQb3MoKSk7CiAgICAgY2xlYW5MaW5lQmlkaVN0YXR1cyA9IHByZXZpb3VzTGlu
ZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpOwogICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVMb2dp
Y2FsVG9wKHByZXZpb3VzTGluZS0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOwogCkBAIC0xOTY3
LDExICsxOTg0LDExIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVFbmRQb3NpdGkK
ICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lKGxhc3RMaW5lKTsKIH0KIAotYm9vbCBSZW5kZXJC
bG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlKQorYm9vbCBDb21wbGV4TGluZUxheW91dDo6Y2hlY2tQYWdpbmF0aW9u
QW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCiB7Ci0gICAg
TGF5b3V0VW5pdCBsaW5lRGVsdGEgPSBsb2dpY2FsSGVpZ2h0KCkgLSBsYXlvdXRTdGF0ZS5lbmRM
aW5lTG9naWNhbFRvcCgpOworICAgIExheW91dFVuaXQgbGluZURlbHRhID0gbV9mbG93LmxvZ2lj
YWxIZWlnaHQoKSAtIGxheW91dFN0YXRlLmVuZExpbmVMb2dpY2FsVG9wKCk7CiAKLSAgICBib29s
IHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3Rh
dGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkt
PmlzUGFnaW5hdGVkKCk7CisgICAgYm9vbCBwYWdpbmF0ZWQgPSBsYXlvdXRDb250ZXh0KCkubGF5
b3V0U3RhdGUoKSAmJiBsYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0ZWQo
KTsKICAgICBpZiAocGFnaW5hdGVkICYmIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpIHsK
ICAgICAgICAgLy8gQ2hlY2sgYWxsIGxpbmVzIGZyb20gaGVyZSB0byB0aGUgZW5kLCBhbmQgc2Vl
IGlmIHRoZSBoeXBvdGhldGljYWwgbmV3IHBvc2l0aW9uIGZvciB0aGUgbGluZXMgd2lsbCByZXN1
bHQKICAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGguCkBAIC0x
OTgyLDcgKzE5OTksNyBAQCBib29sIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdpbmF0aW9uQW5k
CiAgICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRQYWdpbmF0aW9uU3RydXQgPSBsaW5lQm94
LT5wYWdpbmF0aW9uU3RydXQoKTsKICAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdt
ZW50OwogICAgICAgICAgICAgICAgIGxpbmVEZWx0YSAtPSBvbGRQYWdpbmF0aW9uU3RydXQ7Ci0g
ICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBs
aW5lRGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygp
KTsKKyAgICAgICAgICAgICAgICBtX2Zsb3cuYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlv
bihsaW5lQm94LCBsaW5lRGVsdGEsIG92ZXJmbG93c0ZyYWdtZW50LCBsYXlvdXRTdGF0ZS5mcmFn
bWVudGVkRmxvdygpKTsKICAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRQYWdpbmF0aW9uU3Ry
dXQob2xkUGFnaW5hdGlvblN0cnV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChs
aW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChsaW5lQm94LCBsaW5lRGVsdGEsIGxheW91
dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpKQpAQCAtMTk5MCwxMSArMjAwNywxMSBAQCBib29sIFJl
bmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdpbmF0aW9uQW5kCiAgICAgICAgIH0KICAgICB9CiAgICAg
Ci0gICAgaWYgKCFsaW5lRGVsdGEgfHwgIW1fZmxvYXRpbmdPYmplY3RzKQorICAgIGlmICghbGlu
ZURlbHRhIHx8ICFtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCkpCiAgICAgICAgIHJldHVybiB0cnVl
OwogICAgIAogICAgIC8vIFNlZSBpZiBhbnkgZmxvYXRzIGVuZCBpbiB0aGUgcmFuZ2UgYWxvbmcg
d2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGluZXMgdmVydGljYWxseS4KLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxUb3AgPSBzdGQ6Om1pbihsb2dpY2FsSGVpZ2h0KCksIGxheW91dFN0YXRlLmVu
ZExpbmVMb2dpY2FsVG9wKCkpOworICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IHN0ZDo6bWlu
KG1fZmxvdy5sb2dpY2FsSGVpZ2h0KCksIGxheW91dFN0YXRlLmVuZExpbmVMb2dpY2FsVG9wKCkp
OwogCiAgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7
CiAgICAgd2hpbGUgKFJvb3RJbmxpbmVCb3gqIG5leHRMaW5lID0gbGFzdExpbmUtPm5leHRSb290
Qm94KCkpCkBAIC0yMDAyLDMwICsyMDE5LDMwIEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93OjpjaGVj
a1BhZ2luYXRpb25BbmQKIAogICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSA9IGxhc3RMaW5l
LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSArIGFic29sdXRlVmFsdWUobGluZURlbHRhKTsKIAot
ICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRp
bmdPYmplY3RzLT5zZXQoKTsKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdP
YmplY3RTZXQgPSBtX2Zsb3cuZmxvYXRpbmdPYmplY3RzKCktPnNldCgpOwogICAgIGF1dG8gZW5k
ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CiAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdP
YmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIGNvbnN0IGF1dG8m
IGZsb2F0aW5nT2JqZWN0ID0gKml0LT5nZXQoKTsKLSAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b21G
b3JGbG9hdChmbG9hdGluZ09iamVjdCkgPj0gbG9naWNhbFRvcCAmJiBsb2dpY2FsQm90dG9tRm9y
RmxvYXQoZmxvYXRpbmdPYmplY3QpIDwgbG9naWNhbEJvdHRvbSkKKyAgICAgICAgaWYgKG1fZmxv
dy5sb2dpY2FsQm90dG9tRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpID49IGxvZ2ljYWxUb3AgJiYg
bV9mbG93LmxvZ2ljYWxCb3R0b21Gb3JGbG9hdChmbG9hdGluZ09iamVjdCkgPCBsb2dpY2FsQm90
dG9tKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiB0cnVl
OwogfQogCi1ib29sIFJlbmRlckJsb2NrRmxvdzo6bGluZVdpZHRoRm9yUGFnaW5hdGVkTGluZUNo
YW5nZWQoUm9vdElubGluZUJveCogcm9vdEJveCwgTGF5b3V0VW5pdCBsaW5lRGVsdGEsIFJlbmRl
ckZyYWdtZW50ZWRGbG93KiBmcmFnbWVudGVkRmxvdykgY29uc3QKK2Jvb2wgQ29tcGxleExpbmVM
YXlvdXQ6OmxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVCb3gqIHJv
b3RCb3gsIExheW91dFVuaXQgbGluZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyogZnJhZ21l
bnRlZEZsb3cpIGNvbnN0CiB7CiAgICAgaWYgKCFmcmFnbWVudGVkRmxvdykKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGN1cnJlbnRGcmFnbWVu
dCA9IGZyYWdtZW50QXRCbG9ja09mZnNldChyb290Qm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSAr
IGxpbmVEZWx0YSk7CisgICAgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGN1cnJlbnRGcmFnbWVu
dCA9IG1fZmxvdy5mcmFnbWVudEF0QmxvY2tPZmZzZXQocm9vdEJveC0+bGluZVRvcFdpdGhMZWFk
aW5nKCkgKyBsaW5lRGVsdGEpOwogICAgIC8vIEp1c3QgYmFpbCBpZiB0aGUgZnJhZ21lbnQgZGlk
bid0IGNoYW5nZS4KICAgICBpZiAocm9vdEJveC0+Y29udGFpbmluZ0ZyYWdtZW50KCkgPT0gY3Vy
cmVudEZyYWdtZW50KQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHJvb3RCb3gt
PnBhZ2luYXRlZExpbmVXaWR0aCgpICE9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQo
Y3VycmVudEZyYWdtZW50KTsKKyAgICByZXR1cm4gcm9vdEJveC0+cGFnaW5hdGVkTGluZVdpZHRo
KCkgIT0gbV9mbG93LmF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQoY3VycmVudEZyYWdt
ZW50KTsKIH0KIAotYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNoZWRFbmRMaW5lKExpbmVMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVu
ZExpbmVTdGF0dXMpCitib29sIENvbXBsZXhMaW5lTGF5b3V0OjptYXRjaGVkRW5kTGluZShMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29s
dmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVz
JiBlbmRMaW5lU3RhdHVzKQogewogICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpID09IGVuZExp
bmVTdGFydCkgewogICAgICAgICBpZiAocmVzb2x2ZXIuc3RhdHVzKCkgIT0gZW5kTGluZVN0YXR1
cykKQEAgLTIwNjEsNDQgKzIwNzgsMjkgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNoZWRF
bmRMaW5lKExpbgogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBSZW5kZXJCbG9jazo6Z2Vu
ZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCit2
b2lkIENvbXBsZXhMaW5lTGF5b3V0OjphZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpCiB7
Ci0gICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkgPT0gdGhpcyk7Ci0KLSAgICBJbmxpbmVJ
dGVyYXRvciBpdCh0aGlzLCBpbmxpbmVPYmosIDApOwotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQg
cGFzcyBjb3JyZWN0IHZhbHVlIGZvciBXaGl0ZXNwYWNlUG9zaXRpb24uCi0gICAgd2hpbGUgKCFp
dC5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXQpKQotICAgICAgICBpdC5pbmNyZW1lbnQo
KTsKLQotICAgIHJldHVybiAhaXQuYXRFbmQoKTsKLX0KKyAgICBBU1NFUlQoIW1fZmxvdy5zaW1w
bGVMaW5lTGF5b3V0KCkpOwogCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6YWRkT3ZlcmZsb3dGcm9t
SW5saW5lQ2hpbGRyZW4oKQotewotICAgIGlmIChhdXRvIGxheW91dCA9IHNpbXBsZUxpbmVMYXlv
dXQoKSkgewotICAgICAgICBBU1NFUlQoIWhhc092ZXJmbG93Q2xpcCgpKTsKLSAgICAgICAgU2lt
cGxlTGluZUxheW91dDo6Y29sbGVjdEZsb3dPdmVyZmxvdygqdGhpcywgKmxheW91dCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgTGF5b3V0VW5pdCBlbmRQYWRkaW5nID0gaGFzT3ZlcmZs
b3dDbGlwKCkgPyBwYWRkaW5nRW5kKCkgOiAwX2x1OworICAgIExheW91dFVuaXQgZW5kUGFkZGlu
ZyA9IG1fZmxvdy5oYXNPdmVyZmxvd0NsaXAoKSA/IG1fZmxvdy5wYWRkaW5nRW5kKCkgOiAwX2x1
OwogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGZpbmQgYW5vdGhlciB3YXkgdG8gZG8gdGhpcywgc2lu
Y2Ugc2Nyb2xsYmFycyBjb3VsZCBzaG93IHdoZW4gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvLgotICAg
IGlmIChoYXNPdmVyZmxvd0NsaXAoKSAmJiAhZW5kUGFkZGluZyAmJiBlbGVtZW50KCkgJiYgZWxl
bWVudCgpLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQoKSAmJiBzdHlsZSgpLmlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24oKSkKKyAgICBpZiAobV9mbG93Lmhhc092ZXJmbG93Q2xpcCgpICYmICFlbmRQYWRk
aW5nICYmIG1fZmxvdy5lbGVtZW50KCkgJiYgbV9mbG93LmVsZW1lbnQoKS0+aXNSb290RWRpdGFi
bGVFbGVtZW50KCkgJiYgc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCiAgICAgICAg
IGVuZFBhZGRpbmcgPSAxOwogICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9v
dEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICBhZGRM
YXlvdXRPdmVyZmxvdyhjdXJyLT5wYWRkZWRMYXlvdXRPdmVyZmxvd1JlY3QoZW5kUGFkZGluZykp
OwotICAgICAgICBSZW5kZXJGcmFnbWVudENvbnRhaW5lciogZnJhZ21lbnQgPSBlbmNsb3NpbmdG
cmFnbWVudGVkRmxvdygpID8gY3Vyci0+Y29udGFpbmluZ0ZyYWdtZW50KCkgOiBudWxscHRyOwor
ICAgICAgICBtX2Zsb3cuYWRkTGF5b3V0T3ZlcmZsb3coY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZs
b3dSZWN0KGVuZFBhZGRpbmcpKTsKKyAgICAgICAgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqIGZy
YWdtZW50ID0gbV9mbG93LmVuY2xvc2luZ0ZyYWdtZW50ZWRGbG93KCkgPyBjdXJyLT5jb250YWlu
aW5nRnJhZ21lbnQoKSA6IG51bGxwdHI7CiAgICAgICAgIGlmIChmcmFnbWVudCkKLSAgICAgICAg
ICAgIGZyYWdtZW50LT5hZGRMYXlvdXRPdmVyZmxvd0ZvckJveCh0aGlzLCBjdXJyLT5wYWRkZWRM
YXlvdXRPdmVyZmxvd1JlY3QoZW5kUGFkZGluZykpOwotICAgICAgICBpZiAoIWhhc092ZXJmbG93
Q2xpcCgpKSB7CisgICAgICAgICAgICBmcmFnbWVudC0+YWRkTGF5b3V0T3ZlcmZsb3dGb3JCb3go
Jm1fZmxvdywgY3Vyci0+cGFkZGVkTGF5b3V0T3ZlcmZsb3dSZWN0KGVuZFBhZGRpbmcpKTsKKyAg
ICAgICAgaWYgKCFtX2Zsb3cuaGFzT3ZlcmZsb3dDbGlwKCkpIHsKICAgICAgICAgICAgIExheW91
dFJlY3QgY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QgPSBjdXJyLT52aXN1YWxPdmVyZmxvd1JlY3Qo
Y3Vyci0+bGluZVRvcCgpLCBjdXJyLT5saW5lQm90dG9tKCkpOwotICAgICAgICAgICAgYWRkVmlz
dWFsT3ZlcmZsb3coY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QpOworICAgICAgICAgICAgbV9mbG93
LmFkZFZpc3VhbE92ZXJmbG93KGNoaWxkVmlzdWFsT3ZlcmZsb3dSZWN0KTsKICAgICAgICAgICAg
IGlmIChmcmFnbWVudCkKLSAgICAgICAgICAgICAgICBmcmFnbWVudC0+YWRkVmlzdWFsT3ZlcmZs
b3dGb3JCb3godGhpcywgY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3QpOworICAgICAgICAgICAgICAg
IGZyYWdtZW50LT5hZGRWaXN1YWxPdmVyZmxvd0ZvckJveCgmbV9mbG93LCBjaGlsZFZpc3VhbE92
ZXJmbG93UmVjdCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2tGbG93
OjpkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpCit2b2lkIENvbXBsZXhMaW5lTGF5b3V0OjpkZWxl
dGVFbGxpcHNpc0xpbmVCb3hlcygpCiB7CiAgICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBz
dHlsZSgpLnRleHRBbGlnbigpOwogICAgIGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCk7CkBAIC0yMTA4LDggKzIxMTAsOCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6
ZGVsZXRlRWxsaXBzaXNMaW5lCiAgICAgICAgICAgICBjdXJyLT5jbGVhclRydW5jYXRpb24oKTsK
IAogICAgICAgICAgICAgLy8gU2hpZnQgdGhlIGxpbmUgYmFjayB3aGVyZSBpdCBiZWxvbmdzIGlm
IHdlIGNhbm5vdCBhY2NvbW9kYXRlIGFuIGVsbGlwc2lzLgotICAgICAgICAgICAgZmxvYXQgbG9n
aWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91
bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9
IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBEb05vdEluZGVudFRl
eHQpIC0gbG9naWNhbExlZnQ7CisgICAgICAgICAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IG1fZmxv
dy5sb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91bGRJbmRlbnRU
ZXh0KTsKKyAgICAgICAgICAgIGZsb2F0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA9IG1fZmxvdy5s
b2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgRG9Ob3RJbmRlbnRUZXh0
KSAtIGxvZ2ljYWxMZWZ0OwogICAgICAgICAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBj
dXJyLT5sb2dpY2FsV2lkdGgoKTsKICAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFs
aWdubWVudCh0ZXh0QWxpZ24sIGN1cnIsIDAsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0
aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCAwKTsKIApAQCAtMjEyMiwxOCArMjEyNCwxOCBAQCB2
b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBzaXNMaW5lCiAgICAgfQogfQogCi12b2lk
IFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpCit2b2lkIENvbXBs
ZXhMaW5lTGF5b3V0OjpjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCkKIHsKICAgICAvLyBEZXRl
cm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNpcyB1c2luZyB0aGUgY3VycmVudCBmb250Lgog
ICAgIC8vIEZJWE1FOiBDU1MzIHNheXMgdGhpcyBpcyBjb25maWd1cmFibGUsIGFsc28gbmVlZCB0
byB1c2UgMHgwMDJFIChGVUxMIFNUT1ApIGlmIGhvcml6b250YWwgZWxsaXBzaXMgaXMgIm5vdCBy
ZW5kZXJhYmxlIgogICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUoKS5mb250Q2Fz
Y2FkZSgpOwogICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxBdG9tU3RyaW5nPiBlbGxpcHNpc1N0
cigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxKTsKLSAgICBjb25zdCBGb250Q2FzY2FkZSYgZmlyc3RM
aW5lRm9udCA9IGZpcnN0TGluZVN0eWxlKCkuZm9udENhc2NhZGUoKTsKLSAgICBmbG9hdCBmaXJz
dExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53aWR0aChjb25zdHJ1Y3RUZXh0UnVu
KCZob3Jpem9udGFsRWxsaXBzaXMsIDEsIGZpcnN0TGluZVN0eWxlKCkpKTsKLSAgICBmbG9hdCBl
bGxpcHNpc1dpZHRoID0gKGZvbnQgPT0gZmlyc3RMaW5lRm9udCkgPyBmaXJzdExpbmVFbGxpcHNp
c1dpZHRoIDogZm9udC53aWR0aChjb25zdHJ1Y3RUZXh0UnVuKCZob3Jpem9udGFsRWxsaXBzaXMs
IDEsIHN0eWxlKCkpKTsKKyAgICBjb25zdCBGb250Q2FzY2FkZSYgZmlyc3RMaW5lRm9udCA9IG1f
Zmxvdy5maXJzdExpbmVTdHlsZSgpLmZvbnRDYXNjYWRlKCk7CisgICAgZmxvYXQgZmlyc3RMaW5l
RWxsaXBzaXNXaWR0aCA9IGZpcnN0TGluZUZvbnQud2lkdGgobV9mbG93LmNvbnN0cnVjdFRleHRS
dW4oJmhvcml6b250YWxFbGxpcHNpcywgMSwgbV9mbG93LmZpcnN0TGluZVN0eWxlKCkpKTsKKyAg
ICBmbG9hdCBlbGxpcHNpc1dpZHRoID0gKGZvbnQgPT0gZmlyc3RMaW5lRm9udCkgPyBmaXJzdExp
bmVFbGxpcHNpc1dpZHRoIDogZm9udC53aWR0aChtX2Zsb3cuY29uc3RydWN0VGV4dFJ1bigmaG9y
aXpvbnRhbEVsbGlwc2lzLCAxLCBzdHlsZSgpKSk7CiAKICAgICAvLyBGb3IgTFRSIHRleHQgdHJ1
bmNhdGlvbiwgd2Ugd2FudCB0byBnZXQgdGhlIHJpZ2h0IGVkZ2Ugb2Ygb3VyIHBhZGRpbmcgYm94
LCBhbmQgdGhlbiB3ZSB3YW50IHRvIHNlZQotICAgIC8vIGlmIHRoZSByaWdodCBlZGdlIG9mIGEg
bGluZSBib3ggZXhjZWVkcyB0aGF0LiAgRm9yIFJUTCwgd2UgdXNlIHRoZSBsZWZ0IGVkZ2Ugb2Yg
dGhlIHBhZGRpbmcgYm94IGFuZAorICAgIC8vIGlmIHRoZSByaWdodCBlZGdlIG9mIGEgbGluZSBi
b3ggZXhjZWVkcyB0aGF0LiBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcGFk
ZGluZyBib3ggYW5kCiAgICAgLy8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbGluZSBib3gg
dG8gc2VlIGlmIGl0IGlzIGxlc3MKICAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxiYXIgZm9yIG92
ZXJmbG93IGJsb2Nrcywgd2hpY2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRlbnRXaWR0aCgp
IgogICAgIGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7CkBAIC0y
MTQxLDEyICsyMTQzLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0xpbmVzRm9yVGV4
dE8KICAgICBib29sIGZpcnN0TGluZSA9IHRydWU7CiAgICAgZm9yIChSb290SW5saW5lQm94KiBj
dXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7
CiAgICAgICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0gZmlyc3RMaW5lID8g
SW5kZW50VGV4dCA6IERvTm90SW5kZW50VGV4dDsKLSAgICAgICAgTGF5b3V0VW5pdCBibG9ja1Jp
Z2h0RWRnZSA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGluZVRvcCgpLCBzaG91
bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBibG9ja0xlZnRFZGdlID0gbG9naWNh
bExlZnRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7Cisg
ICAgICAgIExheW91dFVuaXQgYmxvY2tSaWdodEVkZ2UgPSBtX2Zsb3cubG9naWNhbFJpZ2h0T2Zm
c2V0Rm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOworICAgICAgICBM
YXlvdXRVbml0IGJsb2NrTGVmdEVkZ2UgPSBtX2Zsb3cubG9naWNhbExlZnRPZmZzZXRGb3JMaW5l
KGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5kZW50VGV4dCk7CiAgICAgICAgIExheW91dFVuaXQg
bGluZUJveEVkZ2UgeyBsdHIgPyBjdXJyLT54KCkgKyBjdXJyLT5sb2dpY2FsV2lkdGgoKSA6IGN1
cnItPngoKSB9OwogICAgICAgICBpZiAoKGx0ciAmJiBsaW5lQm94RWRnZSA+IGJsb2NrUmlnaHRF
ZGdlKSB8fCAoIWx0ciAmJiBsaW5lQm94RWRnZSA8IGJsb2NrTGVmdEVkZ2UpKSB7Ci0gICAgICAg
ICAgICAvLyBUaGlzIGxpbmUgc3BpbGxzIG91dCBvZiBvdXIgYm94IGluIHRoZSBhcHByb3ByaWF0
ZSBkaXJlY3Rpb24uICBOb3cgd2UgbmVlZCB0byBzZWUgaWYgdGhlIGxpbmUKLSAgICAgICAgICAg
IC8vIGNhbiBiZSB0cnVuY2F0ZWQuICBJbiBvcmRlciBmb3IgdHJ1bmNhdGlvbiB0byBiZSBwb3Nz
aWJsZSwgdGhlIGxpbmUgbXVzdCBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgdG8KKyAgICAgICAgICAg
IC8vIFRoaXMgbGluZSBzcGlsbHMgb3V0IG9mIG91ciBib3ggaW4gdGhlIGFwcHJvcHJpYXRlIGRp
cmVjdGlvbi4gTm93IHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBsaW5lCisgICAgICAgICAgICAvLyBj
YW4gYmUgdHJ1bmNhdGVkLiBJbiBvcmRlciBmb3IgdHJ1bmNhdGlvbiB0byBiZSBwb3NzaWJsZSwg
dGhlIGxpbmUgbXVzdCBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgdG8KICAgICAgICAgICAgIC8vIGFj
Y29tbW9kYXRlIG91ciB0cnVuY2F0aW9uIHN0cmluZywgYW5kIG5vIHJlcGxhY2VkIGVsZW1lbnRz
IChpbWFnZXMsIHRhYmxlcykgY2FuIG92ZXJsYXAgdGhlIGVsbGlwc2lzCiAgICAgICAgICAgICAv
LyBzcGFjZS4KICAgICAgICAgICAgIExheW91dFVuaXQgd2lkdGggeyBmaXJzdExpbmUgPyBmaXJz
dExpbmVFbGxpcHNpc1dpZHRoIDogZWxsaXBzaXNXaWR0aCB9OwpAQCAtMjE1NSw3ICsyMTU3LDcg
QEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrTGluZXNGb3JUZXh0TwogICAgICAgICAgICAg
ICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gY3Vyci0+cGxhY2VFbGxpcHNpcyhlbGxpcHNp
c1N0ciwgbHRyLCBibG9ja0xlZnRFZGdlLCBibG9ja1JpZ2h0RWRnZSwgd2lkdGgpOwogCiAgICAg
ICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSAwOyAvLyBXZSBhcmUgb25seSBpbnRlcmVz
dGVkIGluIHRoZSBkZWx0YSBmcm9tIHRoZSBiYXNlIHBvc2l0aW9uLgotICAgICAgICAgICAgICAg
IGZsb2F0IHRydW5jYXRlZFdpZHRoID0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShjdXJy
LT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOworICAgICAgICAgICAgICAgIGZsb2F0IHRy
dW5jYXRlZFdpZHRoID0gbV9mbG93LmF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUoY3Vyci0+
bGluZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKICAgICAgICAgICAgICAgICB1cGRhdGVMb2dp
Y2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4dEFsaWduLCBjdXJyLCBudWxscHRyLCBsb2dpY2FsTGVm
dCwgdG90YWxMb2dpY2FsV2lkdGgsIHRydW5jYXRlZFdpZHRoLCAwKTsKICAgICAgICAgICAgICAg
ICBpZiAobHRyKQogICAgICAgICAgICAgICAgICAgICBjdXJyLT5hZGp1c3RMb2dpY2FsUG9zaXRp
b24obG9naWNhbExlZnQsIDApOwpAQCAtMjE2Nyw5ICsyMTY5LDkgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmNoZWNrTGluZXNGb3JUZXh0TwogICAgIH0KIH0KIAotYm9vbCBSZW5kZXJCbG9ja0Zs
b3c6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoY29uc3QgRmxvYXRpbmdPYmplY3QmIG5ld0Zsb2F0
LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxp
bmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRoKQorYm9vbCBDb21wbGV4TGluZUxheW91dDo6cG9zaXRp
b25OZXdGbG9hdE9uTGluZShjb25zdCBGbG9hdGluZ09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5n
T2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYgbGluZUluZm8sIExp
bmVXaWR0aCYgd2lkdGgpCiB7Ci0gICAgaWYgKCFwb3NpdGlvbk5ld0Zsb2F0cygpKQorICAgIGlm
ICghbV9mbG93LnBvc2l0aW9uTmV3RmxvYXRzKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAog
ICAgIHdpZHRoLnNocmlua0F2YWlsYWJsZVdpZHRoRm9yTmV3RmxvYXRJZk5lZWRlZChuZXdGbG9h
dCk7CkBAIC0yMTgwLDEzICsyMTgyLDEzIEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlv
bk5ld0Zsb2F0T24KICAgICBpZiAoIW5ld0Zsb2F0LnBhZ2luYXRpb25TdHJ1dCgpIHx8ICFsaW5l
SW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSB8fCAhbGluZUluZm8uaXNFbXB0eSgpKQog
ICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9h
dGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBjb25zdCBGbG9h
dGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb3cuZmxvYXRpbmdPYmplY3Rz
KCktPnNldCgpOwogICAgIEFTU0VSVChmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCkgPT0g
Jm5ld0Zsb2F0KTsKIAotICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2FsVG9wID0gbG9naWNhbFRv
cEZvckZsb2F0KG5ld0Zsb2F0KTsKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFRvcCA9IG1f
Zmxvdy5sb2dpY2FsVG9wRm9yRmxvYXQobmV3RmxvYXQpOwogICAgIExheW91dFVuaXQgcGFnaW5h
dGlvblN0cnV0ID0gbmV3RmxvYXQucGFnaW5hdGlvblN0cnV0KCk7CiAKLSAgICBpZiAoZmxvYXRM
b2dpY2FsVG9wIC0gcGFnaW5hdGlvblN0cnV0ICE9IGxvZ2ljYWxIZWlnaHQoKSArIGxpbmVJbmZv
LmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpCisgICAgaWYgKGZsb2F0TG9naWNhbFRvcCAtIHBhZ2lu
YXRpb25TdHJ1dCAhPSBtX2Zsb3cubG9naWNhbEhlaWdodCgpICsgbGluZUluZm8uZmxvYXRQYWdp
bmF0aW9uU3RydXQoKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBhdXRvIGl0ID0gZmxv
YXRpbmdPYmplY3RTZXQuZW5kKCk7CkBAIC0yMTk3LDEyICsyMTk5LDEyIEBAIGJvb2wgUmVuZGVy
QmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zsb2F0T24KICAgICAgICAgYXV0byYgZmxvYXRpbmdPYmpl
Y3QgPSAqaXQtPmdldCgpOwogICAgICAgICBpZiAoJmZsb2F0aW5nT2JqZWN0ID09IGxhc3RGbG9h
dEZyb21QcmV2aW91c0xpbmUpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGxvZ2lj
YWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCkgPT0gbG9naWNhbEhlaWdodCgpICsgbGluZUlu
Zm8uZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkgeworICAgICAgICBpZiAobV9mbG93LmxvZ2ljYWxU
b3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCkgPT0gbV9mbG93LmxvZ2ljYWxIZWlnaHQoKSArIGxp
bmVJbmZvLmZsb2F0UGFnaW5hdGlvblN0cnV0KCkpIHsKICAgICAgICAgICAgIGZsb2F0aW5nT2Jq
ZWN0LnNldFBhZ2luYXRpb25TdHJ1dChwYWdpbmF0aW9uU3RydXQgKyBmbG9hdGluZ09iamVjdC5w
YWdpbmF0aW9uU3RydXQoKSk7CiAgICAgICAgICAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gZmxv
YXRpbmdPYmplY3QucmVuZGVyZXIoKTsKLSAgICAgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGls
ZChmbG9hdEJveCwgbG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94KSArIG1hcmdpbkJlZm9yZUZv
ckNoaWxkKGZsb2F0Qm94KSArIHBhZ2luYXRpb25TdHJ1dCk7CisgICAgICAgICAgICBtX2Zsb3cu
c2V0TG9naWNhbFRvcEZvckNoaWxkKGZsb2F0Qm94LCBtX2Zsb3cubG9naWNhbFRvcEZvckNoaWxk
KGZsb2F0Qm94KSArIG1fZmxvdy5tYXJnaW5CZWZvcmVGb3JDaGlsZChmbG9hdEJveCkgKyBwYWdp
bmF0aW9uU3RydXQpOwogCi0gICAgICAgICAgICBpZiAodXBkYXRlRnJhZ21lbnRSYW5nZUZvckJv
eENoaWxkKGZsb2F0Qm94KSkKKyAgICAgICAgICAgIGlmIChtX2Zsb3cudXBkYXRlRnJhZ21lbnRS
YW5nZUZvckJveENoaWxkKGZsb2F0Qm94KSkKICAgICAgICAgICAgICAgICBmbG9hdEJveC5zZXRO
ZWVkc0xheW91dChNYXJrT25seVRoaXMpOwogICAgICAgICAgICAgZWxzZSBpZiAoaXM8UmVuZGVy
QmxvY2s+KGZsb2F0Qm94KSkKICAgICAgICAgICAgICAgICBkb3duY2FzdDxSZW5kZXJCbG9jaz4o
ZmxvYXRCb3gpLnNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsKQEAgLTIyMTAsMTAg
KzIyMTIsMTAgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbgogCiAg
ICAgICAgICAgICAvLyBTYXZlIHRoZSBvbGQgbG9naWNhbCB0b3AgYmVmb3JlIGNhbGxpbmcgcmVt
b3ZlUGxhY2VkT2JqZWN0IHdoaWNoIHdpbGwgc2V0CiAgICAgICAgICAgICAvLyBpc1BsYWNlZCB0
byBmYWxzZS4gT3RoZXJ3aXNlIGl0IHdpbGwgdHJpZ2dlciBhbiBhc3NlcnQgaW4gbG9naWNhbFRv
cEZvckZsb2F0LgotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNh
bFRvcEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KTsKLSAgICAgICAgICAgIG1fZmxvYXRpbmdPYmpl
Y3RzLT5yZW1vdmVQbGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsKLSAgICAgICAgICAgIHNl
dExvZ2ljYWxUb3BGb3JGbG9hdChmbG9hdGluZ09iamVjdCwgb2xkTG9naWNhbFRvcCArIHBhZ2lu
YXRpb25TdHJ1dCk7Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+YWRkUGxhY2VkT2Jq
ZWN0KCZmbG9hdGluZ09iamVjdCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxU
b3AgPSBtX2Zsb3cubG9naWNhbFRvcEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KTsKKyAgICAgICAg
ICAgIG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKS0+cmVtb3ZlUGxhY2VkT2JqZWN0KCZmbG9hdGlu
Z09iamVjdCk7CisgICAgICAgICAgICBtX2Zsb3cuc2V0TG9naWNhbFRvcEZvckZsb2F0KGZsb2F0
aW5nT2JqZWN0LCBvbGRMb2dpY2FsVG9wICsgcGFnaW5hdGlvblN0cnV0KTsKKyAgICAgICAgICAg
IG1fZmxvdy5mbG9hdGluZ09iamVjdHMoKS0+YWRkUGxhY2VkT2JqZWN0KCZmbG9hdGluZ09iamVj
dCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyMjMsNyArMjIyNSw3IEBAIGJvb2wgUmVuZGVy
QmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zsb2F0T24KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotTGF5
b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUoTGF5b3V0
VW5pdCBwb3NpdGlvbiwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQpCitMYXlvdXRV
bml0IENvbXBsZXhMaW5lTGF5b3V0OjpzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91dFVu
aXQgcG9zaXRpb24sIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KQogewogICAgIFRl
eHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKICAgICBib29sIHNo
b3VsZEFwcGx5SW5kZW50VGV4dCA9IGZhbHNlOwpAQCAtMjI0NiwzMCArMjI0OCwzMCBAQCBMYXlv
dXRVbml0IFJlbmRlckJsb2NrRmxvdzo6c3RhcnRBbGlnbmVkCiAgICAgLy8gaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDUyMgogICAgIC8vIFRoaXMgcXVpcmsgaXMg
Zm9yIGxlZ2FjeSBjb250ZW50IHRoYXQgZG9lc24ndCB3b3JrIHByb3Blcmx5IHdpdGggdGhlIGNl
bnRlciBwb3NpdGlvbmluZyBzY2hlbWUKICAgICAvLyBiZWluZyBob25vcmVkIChlLmcuLCBlcHVi
cykuCi0gICAgaWYgKHNob3VsZEFwcGx5SW5kZW50VGV4dCB8fCBzZXR0aW5ncygpLnVzZUxlZ2Fj
eVRleHRBbGlnblBvc2l0aW9uZWRFbGVtZW50QmVoYXZpb3IoKSkgLy8gRklYTUU6IEhhbmRsZSBU
ZXh0QWxpZ25Nb2RlOjpFbmQgaGVyZQotICAgICAgICByZXR1cm4gc3RhcnRPZmZzZXRGb3JMaW5l
KHBvc2l0aW9uLCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICBpZiAoc2hvdWxkQXBwbHlJbmRlbnRU
ZXh0IHx8IG1fZmxvdy5zZXR0aW5ncygpLnVzZUxlZ2FjeVRleHRBbGlnblBvc2l0aW9uZWRFbGVt
ZW50QmVoYXZpb3IoKSkgLy8gRklYTUU6IEhhbmRsZSBUZXh0QWxpZ25Nb2RlOjpFbmQgaGVyZQor
ICAgICAgICByZXR1cm4gbV9mbG93LnN0YXJ0T2Zmc2V0Rm9yTGluZShwb3NpdGlvbiwgc2hvdWxk
SW5kZW50VGV4dCk7CiAKICAgICAvLyB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQoKSBo
YW5kbGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIHNvIG5vIG5lZWQgdG8gY29uc2lkZXIg
aXQgaGVyZQogICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gMDsKLSAgICBmbG9hdCBsb2dp
Y2FsTGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShsb2dpY2FsSGVpZ2h0KCksIERvTm90
SW5kZW50VGV4dCk7Ci0gICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbG9naWNhbFJp
Z2h0T2Zmc2V0Rm9yTGluZShsb2dpY2FsSGVpZ2h0KCksIERvTm90SW5kZW50VGV4dCkgLSBsb2dp
Y2FsTGVmdDsKKyAgICBmbG9hdCBsb2dpY2FsTGVmdCA9IG1fZmxvdy5sb2dpY2FsTGVmdE9mZnNl
dEZvckxpbmUobV9mbG93LmxvZ2ljYWxIZWlnaHQoKSwgRG9Ob3RJbmRlbnRUZXh0KTsKKyAgICBm
bG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBtX2Zsb3cubG9naWNhbFJpZ2h0T2Zmc2V0Rm9y
TGluZShtX2Zsb3cubG9naWNhbEhlaWdodCgpLCBEb05vdEluZGVudFRleHQpIC0gbG9naWNhbExl
ZnQ7CiAKICAgICAvLyBGSVhNRTogQnVnIDEyOTMxMTogV2UgbmVlZCB0byBwYXNzIGEgdmFsaWQg
Um9vdElubGluZUJveCBoZXJlLCBjb25zaWRlcmluZyB0aGUgYmlkaSBsZXZlbCB1c2VkIHRvIGNv
bnN0cnVjdCB0aGUgbGluZS4KICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JBbGlnbm1lbnQodGV4
dEFsaWduLCAwLCAwLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgMCk7CiAKICAgICBpZiAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpKQotICAgICAgICByZXR1cm4gTGF5b3V0VW5pdChsb2dpY2FsV2lkdGgoKSAtIGxvZ2ljYWxM
ZWZ0KTsKKyAgICAgICAgcmV0dXJuIExheW91dFVuaXQobV9mbG93LmxvZ2ljYWxXaWR0aCgpIC0g
bG9naWNhbExlZnQpOwogICAgIHJldHVybiBMYXlvdXRVbml0KGxvZ2ljYWxMZWZ0KTsKIH0KIAot
dm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290SW5saW5lQm94
KiBsaW5lQm94KSBjb25zdAordm9pZCBDb21wbGV4TGluZUxheW91dDo6dXBkYXRlRnJhZ21lbnRG
b3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gpIGNvbnN0CiB7CiAgICAgQVNTRVJUKGxpbmVC
b3gpOwogCi0gICAgaWYgKCFoYXNGcmFnbWVudFJhbmdlSW5GcmFnbWVudGVkRmxvdygpKQorICAg
IGlmICghbV9mbG93Lmhhc0ZyYWdtZW50UmFuZ2VJbkZyYWdtZW50ZWRGbG93KCkpCiAgICAgICAg
IGxpbmVCb3gtPmNsZWFyQ29udGFpbmluZ0ZyYWdtZW50KCk7CiAgICAgZWxzZSB7Ci0gICAgICAg
IGlmIChhdXRvIGNvbnRhaW5pbmdGcmFnbWVudCA9IGZyYWdtZW50QXRCbG9ja09mZnNldChsaW5l
Qm94LT5saW5lVG9wV2l0aExlYWRpbmcoKSkpCisgICAgICAgIGlmIChhdXRvIGNvbnRhaW5pbmdG
cmFnbWVudCA9IG1fZmxvdy5mcmFnbWVudEF0QmxvY2tPZmZzZXQobGluZUJveC0+bGluZVRvcFdp
dGhMZWFkaW5nKCkpKQogICAgICAgICAgICAgbGluZUJveC0+c2V0Q29udGFpbmluZ0ZyYWdtZW50
KCpjb250YWluaW5nRnJhZ21lbnQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBsaW5lQm94
LT5jbGVhckNvbnRhaW5pbmdGcmFnbWVudCgpOwpAQCAtMjI4Niw0ICsyMjg4LDE1IEBAIHZvaWQg
UmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVGcmFnbWVudEZvckwKICAgICAgICAgbGluZUJveC0+c2V0
SXNGaXJzdEFmdGVyUGFnZUJyZWFrKHRydWUpOwogfQogCitjb25zdCBSZW5kZXJTdHlsZSYgQ29t
cGxleExpbmVMYXlvdXQ6OnN0eWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mbG93LnN0eWxl
KCk7Cit9CisKK2NvbnN0IEZyYW1lVmlld0xheW91dENvbnRleHQmIENvbXBsZXhMaW5lTGF5b3V0
OjpsYXlvdXRDb250ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mbG93LnZpZXcoKS5mcmFt
ZVZpZXcoKS5sYXlvdXRDb250ZXh0KCk7Cit9CisKKwogfQpJbmRleDogU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0NvbXBsZXhMaW5lTGF5b3V0LmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIklu
bGluZUZsb3dCb3guaCIKKyNpbmNsdWRlICJMaW5lV2lkdGguaCIKKyNpbmNsdWRlICJSZW5kZXJM
aW5lQm94TGlzdC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCisjaW5jbHVk
ZSAiVHJhaWxpbmdPYmplY3RzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlk
aUNvbnRleHQ7CitjbGFzcyBGbG9hdGluZ09iamVjdDsKK2NsYXNzIEZsb2F0V2l0aFJlY3Q7Citj
bGFzcyBGcmFtZVZpZXdMYXlvdXRDb250ZXh0OworY2xhc3MgSW5saW5lQm94OworY2xhc3MgSW5s
aW5lSXRlcmF0b3I7CitjbGFzcyBMaW5lSW5mbzsKK2NsYXNzIExpbmVMYXlvdXRTdGF0ZTsKK2Ns
YXNzIFJlbmRlckJsb2NrRmxvdzsKK2NsYXNzIFJlbmRlck9iamVjdDsKK2NsYXNzIFJlbmRlclJ1
YnlSdW47CitjbGFzcyBSb290SW5saW5lQm94OworY2xhc3MgVmVydGljYWxQb3NpdGlvbkNhY2hl
Oworc3RydWN0IEJpZGlTdGF0dXM7CitzdHJ1Y3QgV29yZE1lYXN1cmVtZW50OworCit0ZW1wbGF0
ZSA8Y2xhc3MgUnVuPiBjbGFzcyBCaWRpUnVuTGlzdDsKK3R5cGVkZWYgVmVjdG9yPFdvcmRNZWFz
dXJlbWVudCwgNjQ+IFdvcmRNZWFzdXJlbWVudHM7CisKK2NsYXNzIENvbXBsZXhMaW5lTGF5b3V0
IHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBDb21wbGV4TGlu
ZUxheW91dChSZW5kZXJCbG9ja0Zsb3cmKTsKKyAgICB+Q29tcGxleExpbmVMYXlvdXQoKTsKKwor
ICAgIFJlbmRlckxpbmVCb3hMaXN0JiBsaW5lQm94ZXMoKSB7IHJldHVybiBtX2xpbmVCb3hlczsg
fQorICAgIGNvbnN0IFJlbmRlckxpbmVCb3hMaXN0JiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVy
biBtX2xpbmVCb3hlczsgfQorCisgICAgUm9vdElubGluZUJveCogZmlyc3RSb290Qm94KCkgY29u
c3QgeyByZXR1cm4gZG93bmNhc3Q8Um9vdElubGluZUJveD4obV9saW5lQm94ZXMuZmlyc3RMaW5l
Qm94KCkpOyB9CisgICAgUm9vdElubGluZUJveCogbGFzdFJvb3RCb3goKSBjb25zdCB7IHJldHVy
biBkb3duY2FzdDxSb290SW5saW5lQm94PihtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpKTsgfQor
CisgICAgdm9pZCBsYXlvdXRMaW5lQm94ZXMoYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRV
bml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxCb3R0b20p
OworCisgICAgTGF5b3V0VW5pdCBzdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQg
cG9zaXRpb24sIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KTsKKyAgICBSb290SW5s
aW5lQm94KiBjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgTGluZUlu
Zm8mKTsKKyAgICBib29sIHBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoY29uc3QgRmxvYXRpbmdPYmpl
Y3QmIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
TGluZUluZm8mLCBMaW5lV2lkdGgmKTsKKyAgICB2b2lkIGFkZE92ZXJmbG93RnJvbUlubGluZUNo
aWxkcmVuKCk7CisKKyAgICBzdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5M
aXN0PEJpZGlSdW4+KiwgaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QmLCBJbmxpbmVC
aWRpUmVzb2x2ZXImKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Um9vdElubGlu
ZUJveD4gY3JlYXRlUm9vdElubGluZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFu
ZEFwcGVuZFJvb3RJbmxpbmVCb3goKTsKKyAgICBzdGF0aWMgSW5saW5lQm94KiBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wg
aXNPbmx5UnVuID0gZmFsc2UpOworICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhS
ZW5kZXJPYmplY3QqLCBjb25zdCBMaW5lSW5mbyYsIElubGluZUJveCopOworICAgIFRleHRBbGln
bk1vZGUgdGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3Q7
CisgICAgdm9pZCBzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiwgUmVuZGVyUnVieVJ1biYs
IFJlbmRlck9iamVjdCogcHJldmlvdXNPYmplY3QsIGNvbnN0IExpbmVJbmZvJik7CisgICAgdm9p
ZCB1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChSZW5kZXJSdWJ5UnVuJiwgQmlkaVJ1biYsIGNv
bnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25l
ZCYgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBm
bG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIHNpemVfdCYpOworICAgIHZvaWQgY29tcHV0ZUV4
cGFuc2lvbkZvckp1c3RpZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWls
aW5nU3BhY2VSdW4sIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1
bml0aWVzLCB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3RhbExv
Z2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIHVwZGF0
ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudChjb25zdCBUZXh0QWxpZ25Nb2RlJiwgY29uc3QgUm9v
dElubGluZUJveCosIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVm
dCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRo
LCBpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7CisgICAgdm9pZCBjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgY29uc3QgTGluZUluZm8m
LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFj
aGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRp
b25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKKyAgICBCaWRpUnVuKiBjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiwgY29uc3QgTGluZUlu
Zm8mLCBUZXh0QWxpZ25Nb2RlLCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiBhdmFpbGFibGVM
b2dpY2FsV2lkdGgsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVu
LCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25DYWNo
ZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKKyAgICB2b2lkIHJlbW92ZUlubGluZUJveChCaWRpUnVu
JiwgY29uc3QgUm9vdElubGluZUJveCYpIGNvbnN0OworICAgIHZvaWQgY29tcHV0ZUJsb2NrRGly
ZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgQmlkaVJ1biogZmlyc3RSdW4s
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGlj
YWxQb3NpdGlvbkNhY2hlJik7CisgICAgaW5saW5lIEJpZGlSdW4qIGhhbmRsZVRyYWlsaW5nU3Bh
Y2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRD
b250ZXh0KTsKKyAgICB2b2lkIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9hdGlu
Z09iamVjdCYpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVu
cyh1bnNpZ25lZCBiaWRpTGV2ZWwsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUm
LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJik7CisgICAgdm9p
ZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hp
bGQpOworICAgIGlubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYgcmVzdGFydExheW91dFJ1bnNB
bmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBu
ZXdMb2dpY2FsSGVpZ2h0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgSW5saW5lQmlkaVJlc29sdmVyJiwgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBvbGRFbmQpOwor
ICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5s
aW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBj
b25zdCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2
ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgdm9pZCByZWF0dGFjaENsZWFuTGluZUZsb2F0cyhSb290
SW5saW5lQm94JiBjbGVhbkxpbmUsIExheW91dFVuaXQgZGVsdGEsIGJvb2wgaXNGaXJzdENsZWFu
TGluZSk7CisgICAgdm9pZCBsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJik7
CisgICAgdm9pZCBjaGVja0Zsb2F0SW5DbGVhbkxpbmUoUm9vdElubGluZUJveCYgY2xlYW5MaW5l
LCBSZW5kZXJCb3gmIGZsb2F0Qm94T25DbGVhbkxpbmUsIEZsb2F0V2l0aFJlY3QmIG1hdGNoaW5n
RmxvYXRXaXRoUmVjdCwgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5
RmxvYXQpOworICAgIFJvb3RJbmxpbmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxh
eW91dFN0YXRlJiwgSW5saW5lQmlkaVJlc29sdmVyJik7CisgICAgdm9pZCBkZXRlcm1pbmVFbmRQ
b3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmLCBSb290SW5saW5lQm94KiBzdGFydExpbmUsIElubGlu
ZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1
cyk7CisgICAgYm9vbCBjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91
dFN0YXRlJik7CisgICAgYm9vbCBsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChSb290
SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVyRnJhZ21lbnRl
ZEZsb3cqKSBjb25zdDsKKyAgICBib29sIG1hdGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYs
IGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5l
U3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMpOworICAgIHZvaWQgZGVsZXRl
RWxsaXBzaXNMaW5lQm94ZXMoKTsKKyAgICB2b2lkIGNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3co
KTsKKyAgICB2b2lkIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290SW5saW5lQm94KikgY29uc3Q7
CisKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdDsKKyAgICBjb25zdCBGcmFt
ZVZpZXdMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0KCkgY29uc3Q7CisKKyAgICBSZW5kZXJC
bG9ja0Zsb3cmIG1fZmxvdzsKKyAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsKK307
CisKK307CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAko
cmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJh
dG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzNyw3ICs1MzcsNyBAQCBwdWJsaWM6CiAgICAgICAg
ICAgICBhZGRQbGFjZWhvbGRlclJ1bkZvcklzb2xhdGVkSW5saW5lKHJlc29sdmVyLCBvYmosIHBv
cywgcm9vdCk7CiAgICAgICAgIH0KICAgICAgICAgbV9oYXZlQWRkZWRGYWtlUnVuRm9yUm9vdElz
b2xhdGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZFJ1bnNGb3JPYmpl
Y3QobnVsbHB0ciwgcG9zLCBlbmQsIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICBDb21wbGV4TGlu
ZUxheW91dDo6YXBwZW5kUnVuc0Zvck9iamVjdChudWxscHRyLCBwb3MsIGVuZCwgb2JqLCByZXNv
bHZlcik7CiAgICAgfQogCiBwcml2YXRlOgpAQCAtNTU5LDcgKzU1OSw3IEBAIGlubGluZSB2b2lk
IElubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnUKICAgICAgICAgICAgIGlmIChpc29sYXRlVHJh
Y2tlci5pbklzb2xhdGUoKSkKICAgICAgICAgICAgICAgICBpc29sYXRlVHJhY2tlci5hZGRGYWtl
UnVuSWZOZWNlc3NhcnkoKm9iaiwgc3RhcnQsIG9iai0+bGVuZ3RoKCksICptX3Nvci5yb290KCks
ICp0aGlzKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBSZW5kZXJCbG9ja0Zs
b3c6OmFwcGVuZFJ1bnNGb3JPYmplY3QoJm1fcnVucywgc3RhcnQsIG9iai0+bGVuZ3RoKCksICpv
YmosICp0aGlzKTsKKyAgICAgICAgICAgICAgICBDb21wbGV4TGluZUxheW91dDo6YXBwZW5kUnVu
c0Zvck9iamVjdCgmbV9ydW5zLCBzdGFydCwgb2JqLT5sZW5ndGgoKSwgKm9iaiwgKnRoaXMpOwog
ICAgICAgICAgICAgLy8gRklYTUU6IHN0YXJ0L29iaiBzaG91bGQgYmUgYW4gSW5saW5lSXRlcmF0
b3IgaW5zdGVhZCBvZiB0d28gc2VwYXJhdGUgdmFyaWFibGVzLgogICAgICAgICAgICAgc3RhcnQg
PSAwOwogICAgICAgICAgICAgb2JqID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcygqbV9z
b3Iucm9vdCgpLCBvYmosICZpc29sYXRlVHJhY2tlcik7CkBAIC01NzUsNyArNTc1LDcgQEAgaW5s
aW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBlbmRSdQogICAgICAgICAgICAgaWYgKGlz
b2xhdGVUcmFja2VyLmluSXNvbGF0ZSgpKQogICAgICAgICAgICAgICAgIGlzb2xhdGVUcmFja2Vy
LmFkZEZha2VSdW5JZk5lY2Vzc2FyeSgqb2JqLCBzdGFydCwgb2JqLT5sZW5ndGgoKSwgKm1fc29y
LnJvb3QoKSwgKnRoaXMpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFJlbmRl
ckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdCgmbV9ydW5zLCBzdGFydCwgZW5kLCAqb2Jq
LCAqdGhpcyk7CisgICAgICAgICAgICAgICAgQ29tcGxleExpbmVMYXlvdXQ6OmFwcGVuZFJ1bnNG
b3JPYmplY3QoJm1fcnVucywgc3RhcnQsIGVuZCwgKm9iaiwgKnRoaXMpOwogICAgICAgICB9CiAK
ICAgICAgICAgbV9lb3IuaW5jcmVtZW50KCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2suaAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTExMyw4ICsxMTMsNiBAQCBwdWJs
aWM6CiAgICAgYm9vbCBoYXNNYXJnaW5CZWZvcmVRdWlyayhjb25zdCBSZW5kZXJCb3gmIGNoaWxk
KSBjb25zdDsKICAgICBib29sIGhhc01hcmdpbkFmdGVyUXVpcmsoY29uc3QgUmVuZGVyQm94JiBj
aGlsZCkgY29uc3Q7CiAKLSAgICBib29sIGdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxk
KFJlbmRlck9iamVjdCopOwotCiAgICAgdm9pZCBtYXJrUG9zaXRpb25lZE9iamVjdHNGb3JMYXlv
dXQoKTsKICAgICB2b2lkIG1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpIG92ZXJy
aWRlOwogICAgIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxv
dy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
Rmxvdy5jcHAJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9ja0Zsb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5j
bHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCiAKKyNpbmNsdWRl
ICJDb21wbGV4TGluZUxheW91dC5oIgogI2luY2x1ZGUgIkVkaXRvci5oIgogI2luY2x1ZGUgIkZs
b2F0aW5nT2JqZWN0cy5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkBAIC0xMTAsNiArMTExLDcgQEAg
UmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3coRWxlbWVudAogICAgICwgbV93aWR0aEZv
clRleHRBdXRvc2l6aW5nKC0xKQogICAgICwgbV9saW5lQ291bnRGb3JUZXh0QXV0b3NpemluZyhO
T1RfU0VUKQogI2VuZGlmCisgICAgLCBtX2NvbXBsZXhMaW5lTGF5b3V0KCp0aGlzKQogewogICAg
IHNldENoaWxkcmVuSW5saW5lKHRydWUpOwogfQpAQCAtMTIwLDYgKzEyMiw3IEBAIFJlbmRlckJs
b2NrRmxvdzo6UmVuZGVyQmxvY2tGbG93KERvY3VtZW4KICAgICAsIG1fd2lkdGhGb3JUZXh0QXV0
b3NpemluZygtMSkKICAgICAsIG1fbGluZUNvdW50Rm9yVGV4dEF1dG9zaXppbmcoTk9UX1NFVCkK
ICNlbmRpZgorICAgICwgbV9jb21wbGV4TGluZUxheW91dCgqdGhpcykKIHsKICAgICBzZXRDaGls
ZHJlbklubGluZSh0cnVlKTsKIH0KQEAgLTE1MSw3ICsxNTQsNyBAQCB2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6d2lsbEJlRGVzdHJveWVkKCkKICAgICAgICAgICAgIHBhcmVudCgpLT5kaXJ0eUxpbmVz
RnJvbUNoYW5nZWRDaGlsZCgqdGhpcyk7CiAgICAgfQogCi0gICAgbV9saW5lQm94ZXMuZGVsZXRl
TGluZUJveGVzKCk7CisgICAgbGluZUJveGVzKCkuZGVsZXRlTGluZUJveGVzKCk7CiAKICAgICBi
bG9ja1dpbGxCZURlc3Ryb3llZCgpOwogCkBAIC02NzQsNyArNjc3LDcgQEAgdm9pZCBSZW5kZXJC
bG9ja0Zsb3c6OmxheW91dElubGluZUNoaWxkcgogICAgIH0KIAogICAgIG1fc2ltcGxlTGluZUxh
eW91dCA9IG51bGxwdHI7Ci0gICAgbGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJl
cGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNhbEJvdHRvbSk7CisgICAgY29tcGxleExpbmVM
YXlvdXQoKS5sYXlvdXRMaW5lQm94ZXMocmVsYXlvdXRDaGlsZHJlbiwgcmVwYWludExvZ2ljYWxU
b3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKIH0KIAogdm9pZCBSZW5kZXJCbG9ja0Zsb3c6Omxh
eW91dEJsb2NrQ2hpbGQoUmVuZGVyQm94JiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywg
TGF5b3V0VW5pdCYgcHJldmlvdXNGbG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZs
b2F0TG9naWNhbEJvdHRvbSkKQEAgLTg5Niw3ICs4OTksNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6YWRqdXN0RmxvYXRpbmdCbG9jCiB2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlU3RhdGlj
SW5saW5lUG9zaXRpb25Gb3JDaGlsZChSZW5kZXJCb3gmIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2lj
YWxUb3AsIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0KQogewogICAgIGlmIChjaGls
ZC5zdHlsZSgpLmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpKQotICAgICAgICBzZXRTdGF0
aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wLCBzdGFydEFsaWduZWRP
ZmZzZXRGb3JMaW5lKGxvZ2ljYWxUb3AsIHNob3VsZEluZGVudFRleHQpKTsKKyAgICAgICAgc2V0
U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcCwgY29tcGxleExp
bmVMYXlvdXQoKS5zdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKGxvZ2ljYWxUb3AsIHNob3VsZElu
ZGVudFRleHQpKTsKICAgICBlbHNlCiAgICAgICAgIHNldFN0YXRpY0lubGluZVBvc2l0aW9uRm9y
Q2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3AsIHN0YXJ0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2FsVG9w
KSk7CiB9CkBAIC0yMDY0LDEwICsyMDY3LDEwIEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxl
dGVMaW5lcygpCiAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVhckxpbmVCb3hUcmVlUG9p
bnRlcnMoKTsKIAogICAgIGlmIChtX3NpbXBsZUxpbmVMYXlvdXQpIHsKLSAgICAgICAgQVNTRVJU
KCFtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKSk7CisgICAgICAgIEFTU0VSVCghbGluZUJveGVz
KCkuZmlyc3RMaW5lQm94KCkpOwogICAgICAgICBtX3NpbXBsZUxpbmVMYXlvdXQgPSBudWxscHRy
OwogICAgIH0gZWxzZQotICAgICAgICBtX2xpbmVCb3hlcy5kZWxldGVMaW5lQm94VHJlZSgpOwor
ICAgICAgICBsaW5lQm94ZXMoKS5kZWxldGVMaW5lQm94VHJlZSgpOwogCiAgICAgUmVuZGVyQmxv
Y2s6OmRlbGV0ZUxpbmVzKCk7CiB9CkBAIC0yOTA0LDcgKzI5MDcsMTggQEAgYm9vbCBSZW5kZXJC
bG9ja0Zsb3c6OmhpdFRlc3RJbmxpbmVDaGlsZAogICAgIGlmIChhdXRvIHNpbXBsZUxpbmVMYXlv
dXQgPSB0aGlzLT5zaW1wbGVMaW5lTGF5b3V0KCkpCiAgICAgICAgIHJldHVybiBTaW1wbGVMaW5l
TGF5b3V0OjpoaXRUZXN0RmxvdygqdGhpcywgKnNpbXBsZUxpbmVMYXlvdXQsIHJlcXVlc3QsIHJl
c3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lciwgYWNjdW11bGF0ZWRPZmZzZXQsIGhpdFRlc3RBY3Rp
b24pOwogCi0gICAgcmV0dXJuIG1fbGluZUJveGVzLmhpdFRlc3QodGhpcywgcmVxdWVzdCwgcmVz
dWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgaGl0VGVzdEFjdGlv
bik7CisgICAgcmV0dXJuIGxpbmVCb3hlcygpLmhpdFRlc3QodGhpcywgcmVxdWVzdCwgcmVzdWx0
LCBsb2NhdGlvbkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgaGl0VGVzdEFjdGlvbik7
Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJl
bigpCit7CisgICAgaWYgKGF1dG8gc2ltcGxlTGluZUxheW91dCA9IHRoaXMtPnNpbXBsZUxpbmVM
YXlvdXQoKSkgeworICAgICAgICBBU1NFUlQoIWhhc092ZXJmbG93Q2xpcCgpKTsKKyAgICAgICAg
U2ltcGxlTGluZUxheW91dDo6Y29sbGVjdEZsb3dPdmVyZmxvdygqdGhpcywgKnNpbXBsZUxpbmVM
YXlvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29tcGxleExpbmVMYXlvdXQo
KS5hZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpOwogfQogCiB2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6YWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwg
TGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0CkBAIC0zNDg2LDcgKzM1MDAsNyBAQCB2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6cGFpbnRJbmxpbmVDaGlsZHJlCiAgICAgICAgIFNpbXBsZUxpbmVMYXlvdXQ6
OnBhaW50RmxvdygqdGhpcywgKnNpbXBsZUxpbmVMYXlvdXQsIHBhaW50SW5mbywgcGFpbnRPZmZz
ZXQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fbGluZUJveGVzLnBhaW50KHRoaXMs
IHBhaW50SW5mbywgcGFpbnRPZmZzZXQpOworICAgIGxpbmVCb3hlcygpLnBhaW50KHRoaXMsIHBh
aW50SW5mbywgcGFpbnRPZmZzZXQpOwogfQogCiBib29sIFJlbmRlckJsb2NrRmxvdzo6cmVsYXlv
dXRGb3JQYWdpbmF0aW9uKCkKQEAgLTM1ODEsNyArMzU5NSw3IEBAIHZvaWQgUmVuZGVyQmxvY2tG
bG93OjpsYXlvdXRTaW1wbGVMaW5lcygKICAgICB9CiAgICAgZm9yIChhdXRvJiByZW5kZXJlciA6
IGNoaWxkcmVuT2ZUeXBlPFJlbmRlck9iamVjdD4oKnRoaXMpKQogICAgICAgICByZW5kZXJlci5j
bGVhck5lZWRzTGF5b3V0KCk7Ci0gICAgQVNTRVJUKCFtX2xpbmVCb3hlcy5maXJzdExpbmVCb3go
KSk7CisgICAgQVNTRVJUKCFsaW5lQm94ZXMoKS5maXJzdExpbmVCb3goKSk7CiAgICAgTGF5b3V0
VW5pdCBsaW5lTGF5b3V0SGVpZ2h0ID0gU2ltcGxlTGluZUxheW91dDo6Y29tcHV0ZUZsb3dIZWln
aHQoKnRoaXMsICptX3NpbXBsZUxpbmVMYXlvdXQpOwogICAgIExheW91dFVuaXQgbGluZUxheW91
dFRvcCA9IGJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKTsKICAgICByZXBhaW50TG9naWNhbFRvcCA9
IGxpbmVMYXlvdXRUb3A7CkBAIC0zNjI3LDE0ICszNjQxLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2tG
bG93OjplbnN1cmVMaW5lQm94ZXMoKQogICAgIExheW91dFVuaXQgcmVwYWludExvZ2ljYWxCb3R0
b207CiAgICAgaWYgKGlzUGFnaW5hdGVkKSB7CiAgICAgICAgIFBhZ2luYXRlZExheW91dFN0YXRl
TWFpbnRhaW5lciBzdGF0ZSgqdGhpcyk7Ci0gICAgICAgIGxheW91dExpbmVCb3hlcyhyZWxheW91
dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20pOworICAg
ICAgICBjb21wbGV4TGluZUxheW91dCgpLmxheW91dExpbmVCb3hlcyhyZWxheW91dENoaWxkcmVu
LCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20pOwogICAgICAgICAvLyBU
aGlzIG1hdGNoZXMgcmVsYXlvdXRUb0F2b2lkV2lkb3dzLgogICAgICAgICBpZiAoc2hvdWxkQnJl
YWtBdExpbmVUb0F2b2lkV2lkb3coKSkKLSAgICAgICAgICAgIGxheW91dExpbmVCb3hlcyhyZWxh
eW91dENoaWxkcmVuLCByZXBhaW50TG9naWNhbFRvcCwgcmVwYWludExvZ2ljYWxCb3R0b20pOwor
ICAgICAgICAgICAgY29tcGxleExpbmVMYXlvdXQoKS5sYXlvdXRMaW5lQm94ZXMocmVsYXlvdXRD
aGlsZHJlbiwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKICAgICAg
ICAgLy8gRklYTUU6IFRoaXMgaXMgbmVlZGVkIGFzIGxvbmcgYXMgc2ltcGxlIGFuZCBub3JtYWwg
bGluZSBsYXlvdXQgcHJvZHVjZSBkaWZmZXJlbnQgbGluZSBicmVha2luZ3MuCiAgICAgICAgIHJl
cGFpbnQoKTsKICAgICB9IGVsc2UKLSAgICAgICAgbGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hp
bGRyZW4sIHJlcGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNhbEJvdHRvbSk7CisgICAgICAg
IGNvbXBsZXhMaW5lTGF5b3V0KCkubGF5b3V0TGluZUJveGVzKHJlbGF5b3V0Q2hpbGRyZW4sIHJl
cGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNhbEJvdHRvbSk7CiAKICAgICB1cGRhdGVMb2dp
Y2FsSGVpZ2h0KCk7CiAgICAgQVNTRVJUKGRpZE5lZWRMYXlvdXQgfHwgbG9naWNhbEhlaWdodCgp
ID09IG9sZEhlaWdodCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxv
Y2tGbG93LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrRmxvdy5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tGbG93LmgJKHdvcmtpbmcgY29weSkKQEAgLTIyLDYgKzIyLDcgQEAKIAogI3By
YWdtYSBvbmNlCiAKKyNpbmNsdWRlICJDb21wbGV4TGluZUxheW91dC5oIgogI2luY2x1ZGUgIkZs
b2F0aW5nT2JqZWN0cy5oIgogI2luY2x1ZGUgIkxpbmVXaWR0aC5oIgogI2luY2x1ZGUgIlJlbmRl
ckJsb2NrLmgiCkBAIC0zMiwxNyArMzMsMTAgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1j
bGFzcyBGbG9hdFdpdGhSZWN0OwogY2xhc3MgTGluZUJyZWFrZXI7Ci1jbGFzcyBMaW5lSW5mbzsK
IGNsYXNzIFJlbmRlck11bHRpQ29sdW1uRmxvdzsKIGNsYXNzIFJlbmRlclJ1YnlSdW47CiAKLXN0
cnVjdCBXb3JkTWVhc3VyZW1lbnQ7Ci0KLXRlbXBsYXRlIDxjbGFzcyBSdW4+IGNsYXNzIEJpZGlS
dW5MaXN0OwotdHlwZWRlZiBWZWN0b3I8V29yZE1lYXN1cmVtZW50LCA2ND4gV29yZE1lYXN1cmVt
ZW50czsKLQogI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCiBlbnVtIExpbmVDb3VudCB7CiAg
ICAgTk9UX1NFVCA9IDAsIE5PX0xJTkUgPSAxLCBPTkVfTElORSA9IDIsIE1VTFRJX0xJTkUgPSAz
CkBAIC0zMzIsMTEgKzMyNiwxMSBAQCBwdWJsaWM6CiAKICAgICBMYXlvdXRQb2ludCBmbGlwRmxv
YXRGb3JXcml0aW5nTW9kZUZvckNoaWxkKGNvbnN0IEZsb2F0aW5nT2JqZWN0JiwgY29uc3QgTGF5
b3V0UG9pbnQmKSBjb25zdDsKIAotICAgIFJlbmRlckxpbmVCb3hMaXN0JiBsaW5lQm94ZXMoKSB7
IHJldHVybiBtX2xpbmVCb3hlczsgfQotICAgIGNvbnN0IFJlbmRlckxpbmVCb3hMaXN0JiBsaW5l
Qm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlczsgfQorICAgIFJlbmRlckxpbmVCb3hM
aXN0JiBsaW5lQm94ZXMoKSB7IHJldHVybiBtX2NvbXBsZXhMaW5lTGF5b3V0LmxpbmVCb3hlcygp
OyB9CisgICAgY29uc3QgUmVuZGVyTGluZUJveExpc3QmIGxpbmVCb3hlcygpIGNvbnN0IHsgcmV0
dXJuIG1fY29tcGxleExpbmVMYXlvdXQubGluZUJveGVzKCk7IH0KIAotICAgIFJvb3RJbmxpbmVC
b3gqIGZpcnN0Um9vdEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PFJvb3RJbmxpbmVCb3g+
KG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpKTsgfQotICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RS
b290Qm94KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8Um9vdElubGluZUJveD4obV9saW5lQm94
ZXMubGFzdExpbmVCb3goKSk7IH0KKyAgICBSb290SW5saW5lQm94KiBmaXJzdFJvb3RCb3goKSBj
b25zdCB7IHJldHVybiBtX2NvbXBsZXhMaW5lTGF5b3V0LmZpcnN0Um9vdEJveCgpOyB9CisgICAg
Um9vdElubGluZUJveCogbGFzdFJvb3RCb3goKSBjb25zdCB7IHJldHVybiBtX2NvbXBsZXhMaW5l
TGF5b3V0Lmxhc3RSb290Qm94KCk7IH0KIAogICAgIGJvb2wgaGFzTGluZXMoKSBjb25zdDsKICAg
ICB2b2lkIGludmFsaWRhdGVMaW5lTGF5b3V0UGF0aCgpIGZpbmFsOwpAQCAtNDg0LDggKzQ3OCw4
IEBAIHByaXZhdGU6CiAgICAgLy8gQ2FsbGVkIGZyb20gbGluZVdpZHRoLCB0byBwb3NpdGlvbiB0
aGUgZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCiAgICAgLy8gUmV0dXJucyB0cnVlIGlm
IGFuZCBvbmx5IGlmIGl0IGhhcyBwb3NpdGlvbmVkIGFueSBmbG9hdHMuCiAgICAgYm9vbCBwb3Np
dGlvbk5ld0Zsb2F0cygpOwotCiAgICAgdm9pZCBjbGVhckZsb2F0cyhDbGVhcik7CisgICAgRmxv
YXRpbmdPYmplY3RzKiBmbG9hdGluZ09iamVjdHMoKSB7IHJldHVybiBtX2Zsb2F0aW5nT2JqZWN0
cy5nZXQoKTsgfQogCiAgICAgTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHRGbG9hdE9mZnNldEZvckxp
bmUoTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBMYXlvdXRVbml0IGZpeGVkT2Zmc2V0LCBMYXlvdXRV
bml0IGxvZ2ljYWxIZWlnaHQpIGNvbnN0IG92ZXJyaWRlOwogICAgIExheW91dFVuaXQgbG9naWNh
bExlZnRGbG9hdE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBMYXlvdXRVbml0
IGZpeGVkT2Zmc2V0LCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIGNvbnN0IG92ZXJyaWRlOwpA
QCAtNTIzLDYzICs1MTcsMTcgQEAgcHJpdmF0ZToKICAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRp
b25Gb3JQb2ludFdpdGhJbmxpbmVDaGlsZHJlbihjb25zdCBMYXlvdXRQb2ludCYgcG9pbnRJbkxv
Z2ljYWxDb250ZW50cywgY29uc3QgUmVuZGVyRnJhZ21lbnRDb250YWluZXIqKSBvdmVycmlkZTsK
ICAgICB2b2lkIGFkZEZvY3VzUmluZ1JlY3RzRm9ySW5saW5lQ2hpbGRyZW4oVmVjdG9yPExheW91
dFJlY3Q+JiByZWN0cywgY29uc3QgTGF5b3V0UG9pbnQmIGFkZGl0aW9uYWxPZmZzZXQsIGNvbnN0
IFJlbmRlckxheWVyTW9kZWxPYmplY3QqKSBvdmVycmlkZTsKIAotLy8gRklYTUUtQkxPQ0tGTE9X
OiBUaGVzZSBtZXRob2RzIGhhdmUgaW1wbGVtZW50YXRpb25zIGluCi0vLyBSZW5kZXJCbG9ja0xp
bmVMYXlvdXQuIFRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBwcm9wZXIgaGVhZGVyIG9uY2Ug
dGhlCi0vLyBsaW5lIGxheW91dCBjb2RlIGlzIHNlcGFyYXRlZCBmcm9tIFJlbmRlckJsb2NrIGFu
ZCBSZW5kZXJCbG9ja0Zsb3cuCi0vLyBTVEFSVCBNRVRIT0RTIERFRklORUQgSU4gUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0CiBwdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVj
dChCaWRpUnVuTGlzdDxCaWRpUnVuPiosIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0
JiwgSW5saW5lQmlkaVJlc29sdmVyJik7Ci0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBw
ZW5kUm9vdElubGluZUJveCgpOworICAgIENvbXBsZXhMaW5lTGF5b3V0JiBjb21wbGV4TGluZUxh
eW91dCgpIHsgcmV0dXJuIG1fY29tcGxleExpbmVMYXlvdXQ7IH0KIAotICAgIExheW91dFVuaXQg
c3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IHBvc2l0aW9uLCBJbmRlbnRUZXh0
T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCk7Ci0gICAgdmlydHVhbCBUZXh0QWxpZ25Nb2RlIHRleHRB
bGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJlYWspIGNvbnN0OworICAgIHZpcnR1
YWwgT3B0aW9uYWw8VGV4dEFsaWduTW9kZT4gb3ZlcnJpZGVUZXh0QWxpZ25tZW50Rm9yTGluZShi
b29sIC8qIGVuZHNXaXRoU29mdEJyZWFrICovKSBjb25zdCB7IHJldHVybiB7IH07IH0KICAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0SW5saW5lRGlyZWN0aW9uTGluZUJvdW5kcyhpbnQgLyogZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCAqLywgZmxvYXQmIC8qIGxvZ2ljYWxMZWZ0ICovLCBmbG9hdCYg
LyogbG9naWNhbFdpZHRoICovKSBjb25zdCB7IH0KLSAgICBSb290SW5saW5lQm94KiBjb25zdHJ1
Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgTGluZUluZm8mKTsKIAotcHJpdmF0
ZTogICAgICAgIAotICAgIHZvaWQgYWRqdXN0SW50cmluc2ljTG9naWNhbFdpZHRoc0ZvckNvbHVt
bnMoTGF5b3V0VW5pdCYgbWluTG9naWNhbFdpZHRoLCBMYXlvdXRVbml0JiBtYXhMb2dpY2FsV2lk
dGgpIGNvbnN0OwotCi0gICAgdm9pZCBsYXlvdXRMaW5lQm94ZXMoYm9vbCByZWxheW91dENoaWxk
cmVuLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExv
Z2ljYWxCb3R0b20pOworcHJpdmF0ZToKICAgICB2b2lkIGxheW91dFNpbXBsZUxpbmVzKGJvb2wg
cmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVu
aXQmIHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKIAotICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRy
PFJvb3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsgLy8gU3ViY2xhc3NlZCBieSBS
ZW5kZXJTVkdUZXh0LgotICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJP
YmplY3QqLCBjb25zdCBMaW5lSW5mbyYsIElubGluZUJveCogY2hpbGRCb3gpOwotICAgIHZvaWQg
c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biosIFJlbmRlclJ1YnlSdW4mLCBSZW5kZXJPYmpl
Y3QqLCBjb25zdCBMaW5lSW5mbyYpOwotICAgIHZvaWQgY29tcHV0ZUlubGluZURpcmVjdGlvblBv
c2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwgQmlkaVJ1biog
Zmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwgR2x5
cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBX
b3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCB1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChS
ZW5kZXJSdWJ5UnVuJiwgQmlkaVJ1biYsIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBh
bnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25lZCYgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwg
ZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIHNp
emVfdCYgZXhwYW5zaW9uSW5kZXgpOwotICAgIHZvaWQgY29tcHV0ZUV4cGFuc2lvbkZvckp1c3Rp
ZmllZFRleHQoQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGNv
bnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25l
ZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCwgZmxv
YXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICBCaWRpUnVuKiBjb21wdXRlSW5saW5lRGly
ZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiwgY29uc3QgTGluZUluZm8m
LCBUZXh0QWxpZ25Nb2RlLCBmbG9hdCYgbG9naWNhbExlZnQsCi0gICAgICAgIGZsb2F0JiBhdmFp
bGFibGVMb2dpY2FsV2lkdGgsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1Nw
YWNlUnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAs
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKLSAgICB2b2lkIGNv
bXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlS
dW4qLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25D
YWNoZSYpOwotICAgIEJpZGlSdW4qIGhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJp
ZGlSdW4+JiwgQmlkaUNvbnRleHQqKTsKLSAgICB2b2lkIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9M
YXN0TGluZShGbG9hdGluZ09iamVjdCYpOwotICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgbGF5
b3V0SW5saW5lQ2hpbGRyZW4oKQotICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUxpbmVCb3hlc0Zy
b21CaWRpUnVucyh1bnNpZ25lZCBiaWRpTGV2ZWwsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUm
LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9p
ZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hp
bGQpOwotICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiByZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0
c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2lj
YWxIZWlnaHQsICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5s
aW5lQmlkaVJlc29sdmVyJiwgIGNvbnN0IElubGluZUl0ZXJhdG9yJik7Ci0gICAgdm9pZCBsYXlv
dXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2
ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0
dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExp
bmVzKTsKLSAgICB2b2lkIHJlYXR0YWNoQ2xlYW5MaW5lRmxvYXRzKFJvb3RJbmxpbmVCb3gmIGNs
ZWFuTGluZSwgTGF5b3V0VW5pdCBkZWx0YSwgYm9vbCBpc0ZpcnN0Q2xlYW5MaW5lKTsKLSAgICB2
b2lkIGxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmKTsKLSAgICB2b2lkIGNo
ZWNrRmxvYXRJbkNsZWFuTGluZShSb290SW5saW5lQm94JiBjbGVhbkxpbmUsIFJlbmRlckJveCYg
ZmxvYXRCb3hPbkNsZWFuTGluZSwgRmxvYXRXaXRoUmVjdCYgbWF0Y2hpbmdGbG9hdFdpdGhSZWN0
LAotICAgICAgICBib29sJiBlbmNvdW50ZXJlZE5ld0Zsb2F0LCBib29sJiBkaXJ0aWVkQnlGbG9h
dCk7Ci0gICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0
U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKLSAgICB2b2lkIGRldGVybWluZUVuZFBvc2l0
aW9uKExpbmVMYXlvdXRTdGF0ZSYsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0Qm94LCBJbmxpbmVJdGVy
YXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpOwot
ICAgIGJvb2wgY2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0
ZSYpOwotICAgIGJvb2wgbWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiwgY29uc3QgSW5s
aW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29u
c3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cyk7Ci0gICAgdm9pZCBkZWxldGVFbGxpcHNpc0xp
bmVCb3hlcygpOwotICAgIHZvaWQgY2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOwotICAgIC8v
IFBvc2l0aW9ucyBuZXcgZmxvYXRzIGFuZCBhbHNvIGFkanVzdCBhbGwgZmxvYXRzIGVuY291bnRl
cmVkIG9uIHRoZSBsaW5lIGlmIGFueSBvZiB0aGVtCi0gICAgLy8gaGF2ZSB0byBtb3ZlIHRvIHRo
ZSBuZXh0IHBhZ2UvY29sdW1uLgotICAgIGJvb2wgcG9zaXRpb25OZXdGbG9hdE9uTGluZShjb25z
dCBGbG9hdGluZ09iamVjdCYgbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCBMaW5lSW5mbyYsIExpbmVXaWR0aCYpOwotICAgIC8vIFRoaXMgZnVuY3Rp
b24gaXMgY2FsbGVkIHRvIHRlc3QgYSBsaW5lIGJveCB0aGF0IGhhcyBtb3ZlZCBpbiB0aGUgYmxv
Y2sgZGlyZWN0aW9uIHRvIHNlZSBpZiBpdCBoYXMgZW5kZWQgdXAgaW4gYSBuZXcKLSAgICAvLyBw
YWdlL2NvbHVtbiB0aGF0IGhhcyBhIGRpZmZlcmVudCBhdmFpbGFibGUgbGluZSB3aWR0aCB0aGFu
IHRoZSBvbGQgb25lLiBVc2VkIHRvIGtub3cgd2hlbiB5b3UgaGF2ZSB0byBkaXJ0eSBhCi0gICAg
Ly8gbGluZSwgaS5lLiwgdGhhdCBpdCBjYW4ndCBiZSByZS11c2VkLgotICAgIGJvb2wgbGluZVdp
ZHRoRm9yUGFnaW5hdGVkTGluZUNoYW5nZWQoUm9vdElubGluZUJveCosIExheW91dFVuaXQgbGlu
ZURlbHRhLCBSZW5kZXJGcmFnbWVudGVkRmxvdyopIGNvbnN0OwotICAgIHZvaWQgdXBkYXRlTG9n
aWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IFRleHRBbGlnbk1vZGUmLCBjb25zdCBSb290SW5s
aW5lQm94KiwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCBm
bG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGlu
dCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKLS8vIEVORCBNRVRIT0RTIERFRklORUQgSU4g
UmVuZGVyQmxvY2tMaW5lTGF5b3V0Ci0KKyAgICB2b2lkIGFkanVzdEludHJpbnNpY0xvZ2ljYWxX
aWR0aHNGb3JDb2x1bW5zKExheW91dFVuaXQmIG1pbkxvZ2ljYWxXaWR0aCwgTGF5b3V0VW5pdCYg
bWF4TG9naWNhbFdpZHRoKSBjb25zdDsKICAgICB2b2lkIGNvbXB1dGVJbmxpbmVQcmVmZXJyZWRM
b2dpY2FsV2lkdGhzKExheW91dFVuaXQmIG1pbkxvZ2ljYWxXaWR0aCwgTGF5b3V0VW5pdCYgbWF4
TG9naWNhbFdpZHRoKSBjb25zdDsKLQogICAgIHZvaWQgYWRqdXN0SW5pdGlhbExldHRlclBvc2l0
aW9uKFJlbmRlckJveCYgY2hpbGRCb3gsIExheW91dFVuaXQmIGxvZ2ljYWxUb3BPZmZzZXQsIExh
eW91dFVuaXQmIG1hcmdpbkJlZm9yZU9mZnNldCk7CiAKICNpZiBFTkFCTEUoVEVYVF9BVVRPU0la
SU5HKQpAQCAtNTg4LDEyICs1MzYsOSBAQCBwcml2YXRlOiAgICAgICAgCiAjZW5kaWYKICAgICB2
b2lkIHNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlKSBmaW5hbDsKIAotICAgIHZvaWQg
cmVtb3ZlSW5saW5lQm94KEJpZGlSdW4mLCBjb25zdCBSb290SW5saW5lQm94JikgY29uc3Q7Ci0K
IHB1YmxpYzoKICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFRoZXNlIGNhbiBiZSBtYWRlIHByb3Rl
Y3RlZCBhZ2FpbiBvbmNlIGFsbCBjYWxsZXJzIGhhdmUgYmVlbiBtb3ZlZCBoZXJlLgogICAgIHZv
aWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihSb290SW5saW5lQm94KiwgTGF5b3V0
VW5pdCYgZGVsdGFPZmZzZXQsIGJvb2wmIG92ZXJmbG93c0ZyYWdtZW50LCBSZW5kZXJGcmFnbWVu
dGVkRmxvdyopOyAvLyBDb21wdXRlcyBhIGRlbHRhT2Zmc2V0IHZhbHVlIHRoYXQgcHV0IGEgbGlu
ZSBhdCB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UgaWYgaXQgZG9lc24ndCBmaXQgb24gdGhlIGN1
cnJlbnQgcGFnZS4KLSAgICB2b2lkIHVwZGF0ZUZyYWdtZW50Rm9yTGluZShSb290SW5saW5lQm94
KikgY29uc3Q7CiAKICAgICAvLyBQYWdpbmF0aW9uIHJvdXRpbmVzLgogICAgIGJvb2wgcmVsYXlv
dXRGb3JQYWdpbmF0aW9uKCk7CkBAIC02MTYsMTEgKzU2MSwxNCBAQCBwdWJsaWM6CiBwcm90ZWN0
ZWQ6CiAgICAgc3RkOjp1bmlxdWVfcHRyPEZsb2F0aW5nT2JqZWN0cz4gbV9mbG9hdGluZ09iamVj
dHM7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhPiBtX3JhcmVC
bG9ja0Zsb3dEYXRhOwotICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOworCisgICAg
Ly8gRklYTUU6IE9ubHkgb25lIG9mIHRoZXNlIHNob3VsZCBiZSBuZWVkZWQgYXQgYW55IGdpdmVu
IHRpbWUuCisgICAgQ29tcGxleExpbmVMYXlvdXQgbV9jb21wbGV4TGluZUxheW91dDsKICAgICBz
dGQ6OnVuaXF1ZV9wdHI8U2ltcGxlTGluZUxheW91dDo6TGF5b3V0PiBtX3NpbXBsZUxpbmVMYXlv
dXQ7CiAKICAgICBmcmllbmQgY2xhc3MgTGluZUJyZWFrZXI7CiAgICAgZnJpZW5kIGNsYXNzIExp
bmVXaWR0aDsgLy8gTmVlZHMgdG8ga25vdyBGbG9hdGluZ09iamVjdAorICAgIGZyaWVuZCBjbGFz
cyBDb21wbGV4TGluZUxheW91dDsKIH07CiAKIGlubGluZSBjb25zdCBTaW1wbGVMaW5lTGF5b3V0
OjpMYXlvdXQqIFJlbmRlckJsb2NrRmxvdzo6c2ltcGxlTGluZUxheW91dCgpIGNvbnN0CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0
LmNwcAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHAJKG5vbmV4aXN0ZW50KQpAQCAtMSwyMjg5ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqIENv
cHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAx
MSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDEzIENo
YW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgot
ICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLQotI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKLSNpbmNsdWRlICJCaWRpUmVzb2x2
ZXIuaCIKLSNpbmNsdWRlICJCcmVha2luZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ09i
amVjdHMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCi0jaW5jbHVkZSAiSW5saW5l
RWxlbWVudEJveC5oIgotI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiSW5s
aW5lVGV4dEJveC5oIgotI2luY2x1ZGUgIklubGluZVRleHRCb3hTdHlsZS5oIgotI2luY2x1ZGUg
IkxpbmVMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJSZW5k
ZXJCbG9ja0Zsb3cuaCIKLSNpbmNsdWRlICJSZW5kZXJGcmFnbWVudENvbnRhaW5lci5oIgotI2lu
Y2x1ZGUgIlJlbmRlckZyYWdtZW50ZWRGbG93LmgiCi0jaW5jbHVkZSAiUmVuZGVyTGF5b3V0U3Rh
dGUuaCIKLSNpbmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKLSNpbmNsdWRlICJSZW5kZXJSdWJ5
QmFzZS5oIgotI2luY2x1ZGUgIlJlbmRlclJ1YnlUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyVmll
dy5oIgotI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVCb3guaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5o
IgotI2luY2x1ZGUgIlNpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJUcmFp
bGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3guaCIKLSNpbmNsdWRlICJWZXJ0aWNhbFBvc2l0aW9uQ2Fj
aGUuaCIKLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotc3RhdGljIHZvaWQgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYg
ZGlyLCBJbmxpbmVJdGVyYXRvciBpdGVyKQotewotICAgIHdoaWxlICghaXRlci5hdEVuZCgpKSB7
Ci0gICAgICAgIGlmIChpdGVyLmF0UGFyYWdyYXBoU2VwYXJhdG9yKCkpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIGlmIChVQ2hhciBjdXJyZW50ID0gaXRlci5jdXJyZW50KCkpIHsKLSAg
ICAgICAgICAgIFVDaGFyRGlyZWN0aW9uIGNoYXJEaXJlY3Rpb24gPSB1X2NoYXJEaXJlY3Rpb24o
Y3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoY2hhckRpcmVjdGlvbiA9PSBVX0xFRlRfVE9fUklH
SFQpIHsKLSAgICAgICAgICAgICAgICBkaXIgPSBUZXh0RGlyZWN0aW9uOjpMVFI7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYXJEaXJl
Y3Rpb24gPT0gVV9SSUdIVF9UT19MRUZUIHx8IGNoYXJEaXJlY3Rpb24gPT0gVV9SSUdIVF9UT19M
RUZUX0FSQUJJQykgewotICAgICAgICAgICAgICAgIGRpciA9IFRleHREaXJlY3Rpb246OlJUTDsK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgaXRlci5pbmNyZW1lbnQoKTsKLSAgICB9Ci19Ci0KLWlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8
QmlkaVJ1bj4gY3JlYXRlUnVuKGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0JiBvYmos
IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCi17Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91
bmlxdWU8QmlkaVJ1bj4oc3RhcnQsIGVuZCwgb2JqLCByZXNvbHZlci5jb250ZXh0KCksIHJlc29s
dmVyLmRpcigpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZFJ1bnNGb3JPYmpl
Y3QoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4qIHJ1bnMsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVy
T2JqZWN0JiBvYmosIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCi17Ci0gICAgaWYgKHN0
YXJ0ID4gZW5kIHx8IHNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JPYmplY3Qob2JqKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgTGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUmIGxpbmVXaGl0
ZXNwYWNlQ29sbGFwc2luZ1N0YXRlID0gcmVzb2x2ZXIud2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0
ZSgpOwotICAgIGJvb2wgaGF2ZU5leHRUcmFuc2l0aW9uID0gKGxpbmVXaGl0ZXNwYWNlQ29sbGFw
c2luZ1N0YXRlLmN1cnJlbnRUcmFuc2l0aW9uKCkgPCBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdT
dGF0ZS5udW1UcmFuc2l0aW9ucygpKTsKLSAgICBJbmxpbmVJdGVyYXRvciBuZXh0VHJhbnNpdGlv
bjsKLSAgICBpZiAoaGF2ZU5leHRUcmFuc2l0aW9uKQotICAgICAgICBuZXh0VHJhbnNpdGlvbiA9
IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLnRyYW5zaXRpb25zKClbbGluZVdoaXRlc3Bh
Y2VDb2xsYXBzaW5nU3RhdGUuY3VycmVudFRyYW5zaXRpb24oKV07Ci0gICAgaWYgKGxpbmVXaGl0
ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLmJldHdlZW5UcmFuc2l0aW9ucygpKSB7Ci0gICAgICAgIGlm
ICghaGF2ZU5leHRUcmFuc2l0aW9uIHx8ICgmb2JqICE9IG5leHRUcmFuc2l0aW9uLnJlbmRlcmVy
KCkpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IHN0YXJ0
IHBvaW50LiBTdG9wIGlnbm9yaW5nIG9iamVjdHMgYW5kCi0gICAgICAgIC8vIGFkanVzdCBvdXIg
c3RhcnQuCi0gICAgICAgIHN0YXJ0ID0gbmV4dFRyYW5zaXRpb24ub2Zmc2V0KCk7Ci0gICAgICAg
IGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlLmluY3JlbWVudEN1cnJlbnRUcmFuc2l0aW9u
KCk7Ci0gICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgYXBwZW5kUnVuc0Zv
ck9iamVjdChydW5zLCBzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghaGF2ZU5leHRUcmFu
c2l0aW9uIHx8ICgmb2JqICE9IG5leHRUcmFuc2l0aW9uLnJlbmRlcmVyKCkpKSB7Ci0gICAgICAg
ICAgICBpZiAocnVucykKLSAgICAgICAgICAgICAgICBydW5zLT5hcHBlbmRSdW4oY3JlYXRlUnVu
KHN0YXJ0LCBlbmQsIG9iaiwgcmVzb2x2ZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotCi0gICAgICAgIC8vIEFuIGVuZCB0cmFuc2l0aW9uIGhhcyBiZWVuIGVuY291bnRlcmVk
IHdpdGhpbiBvdXIgb2JqZWN0LiBXZSBuZWVkIHRvIGFwcGVuZCBhIHJ1biB3aXRoIG91ciBlbmRw
b2ludC4KLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4obmV4dFRyYW5zaXRpb24ub2Zmc2V0
KCkgKyAxKSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0
YXRlLmluY3JlbWVudEN1cnJlbnRUcmFuc2l0aW9uKCk7Ci0gICAgICAgICAgICAvLyBUaGUgZW5k
IG9mIHRoZSBsaW5lIGlzIGJlZm9yZSB0aGUgb2JqZWN0IHdlJ3JlIGluc3BlY3RpbmcuIFNraXAg
ZXZlcnl0aGluZyBhbmQgcmV0dXJuCi0gICAgICAgICAgICBpZiAobmV4dFRyYW5zaXRpb24ucmVm
ZXJzVG9FbmRPZlByZXZpb3VzTm9kZSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSkg
PiBzdGFydCAmJiBydW5zKQotICAgICAgICAgICAgICAgIHJ1bnMtPmFwcGVuZFJ1bihjcmVhdGVS
dW4oc3RhcnQsIG5leHRUcmFuc2l0aW9uLm9mZnNldCgpICsgMSwgb2JqLCByZXNvbHZlcikpOwot
ICAgICAgICAgICAgYXBwZW5kUnVuc0Zvck9iamVjdChydW5zLCBuZXh0VHJhbnNpdGlvbi5vZmZz
ZXQoKSArIDEsIGVuZCwgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAocnVucykK
LSAgICAgICAgICAgIHJ1bnMtPmFwcGVuZFJ1bihjcmVhdGVSdW4oc3RhcnQsIGVuZCwgb2JqLCBy
ZXNvbHZlcikpOwotICAgIH0KLX0KLQotc3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVCb3g+IFJl
bmRlckJsb2NrRmxvdzo6Y3JlYXRlUm9vdElubGluZUJveCgpCi17Ci0gICAgcmV0dXJuIHN0ZDo6
bWFrZV91bmlxdWU8Um9vdElubGluZUJveD4oKnRoaXMpOwotfQotCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goKQotewotICAgIGF1
dG8gbmV3Um9vdEJveCA9IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsKLSAgICBSb290SW5saW5lQm94
KiByb290Qm94ID0gbmV3Um9vdEJveC5nZXQoKTsKLSAgICBtX2xpbmVCb3hlcy5hcHBlbmRMaW5l
Qm94KFdURk1vdmUobmV3Um9vdEJveCkpOwotCi0gICAgaWYgKFVOTElLRUxZKEFYT2JqZWN0Q2Fj
aGU6OmFjY2Vzc2liaWxpdHlFbmFibGVkKCkpICYmIGZpcnN0Um9vdEJveCgpID09IHJvb3RCb3gp
IHsKLSAgICAgICAgaWYgKEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gZG9jdW1lbnQoKS5leGlzdGlu
Z0FYT2JqZWN0Q2FjaGUoKSkKLSAgICAgICAgICAgIGNhY2hlLT5kZWZlclJlY29tcHV0ZUlzSWdu
b3JlZChlbGVtZW50KCkpOwotICAgIH0KLQotICAgIHJldHVybiByb290Qm94OwotfQotCi1zdGF0
aWMgaW5saW5lIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciwgYm9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNl
KQotewotICAgIGlmIChpc1Jvb3RMaW5lQm94KQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVu
ZGVyQmxvY2tGbG93PigqcmVuZGVyZXIpLmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goKTsK
LQotICAgIGlmIChpczxSZW5kZXJUZXh0PigqcmVuZGVyZXIpKQotICAgICAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKS5jcmVhdGVJbmxpbmVUZXh0Qm94KCk7Ci0KLSAg
ICBpZiAoaXM8UmVuZGVyQm94PigqcmVuZGVyZXIpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlz
IGlzIHRlcnJpYmxlLiBUaGlzIGJyYW5jaCByZXR1cm5zIGFuICpvd25lZCogcG9pbnRlciEKLSAg
ICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlckJveD4oKnJlbmRlcmVyKS5jcmVhdGVJbmxpbmVC
b3goKS5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgaWYgKGlzPFJlbmRlckxpbmVCcmVhaz4oKnJl
bmRlcmVyKSkgewotICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyB0ZXJyaWJsZS4gVGhpcyBicmFu
Y2ggcmV0dXJucyBhbiAqb3duZWQqIHBvaW50ZXIhCi0gICAgICAgIGF1dG8gaW5saW5lQm94ID0g
ZG93bmNhc3Q8UmVuZGVyTGluZUJyZWFrPigqcmVuZGVyZXIpLmNyZWF0ZUlubGluZUJveCgpLnJl
bGVhc2UoKTsKLSAgICAgICAgLy8gV2Ugb25seSB0cmVhdCBhIGJveCBhcyB0ZXh0IGZvciBhIDxi
cj4gaWYgd2UgYXJlIG9uIGEgbGluZSBieSBvdXJzZWxmIG9yIGluIHN0cmljdCBtb2RlCi0gICAg
ICAgIC8vIChOb3RlIHRoZSB1c2Ugb2Ygc3RyaWN0IG1vZGUuIEluICJhbG1vc3Qgc3RyaWN0IiBt
b2RlLCB3ZSBkb24ndCB0cmVhdCB0aGUgYm94IGZvciA8YnI+IGFzIHRleHQuKQotICAgICAgICBp
bmxpbmVCb3gtPnNldEJlaGF2ZXNMaWtlVGV4dChpc09ubHlSdW4gfHwgcmVuZGVyZXItPmRvY3Vt
ZW50KCkuaW5Ob1F1aXJrc01vZGUoKSB8fCByZW5kZXJlci0+aXNMaW5lQnJlYWtPcHBvcnR1bml0
eSgpKTsKLSAgICAgICAgcmV0dXJuIGlubGluZUJveDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqcmVuZGVyZXIpLmNyZWF0ZUFuZEFwcGVuZElubGluZUZsb3dC
b3goKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpcnR5TGluZUJveGVzRm9yUmVuZGVyZXIo
UmVuZGVyT2JqZWN0JiByZW5kZXJlciwgYm9vbCBmdWxsTGF5b3V0KQotewotICAgIGlmIChpczxS
ZW5kZXJUZXh0PihyZW5kZXJlcikpIHsKLSAgICAgICAgUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCA9
IGRvd25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKTsKLSAgICAgICAgdXBkYXRlQ291bnRlcklm
TmVlZGVkKHJlbmRlclRleHQpOwotICAgICAgICByZW5kZXJUZXh0LmRpcnR5TGluZUJveGVzKGZ1
bGxMYXlvdXQpOwotICAgIH0gZWxzZSBpZiAoaXM8UmVuZGVyTGluZUJyZWFrPihyZW5kZXJlcikp
Ci0gICAgICAgIGRvd25jYXN0PFJlbmRlckxpbmVCcmVhaz4ocmVuZGVyZXIpLmRpcnR5TGluZUJv
eGVzKGZ1bGxMYXlvdXQpOwotICAgIGVsc2UKLSAgICAgICAgZG93bmNhc3Q8UmVuZGVySW5saW5l
PihyZW5kZXJlcikuZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7Ci19Ci0KLXN0YXRpYyBib29s
IHBhcmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXh0KElubGluZUZsb3dCb3gqIHBhcmVudEJveCkK
LXsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChwYXJlbnRCb3gtPmlzQ29uc3RydWN0ZWQoKSB8fCBw
YXJlbnRCb3gtPm5leHRPbkxpbmUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICBwYXJlbnRCb3ggPSBwYXJlbnRCb3gtPnBhcmVudCgpOwotICAgIH0gd2hpbGUgKHBhcmVudEJv
eCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1JbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9ja0Zs
b3c6OmNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgTGluZUluZm8mIGxp
bmVJbmZvLCBJbmxpbmVCb3gqIGNoaWxkQm94KQotewotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFu
IHVuY29uc3RydWN0ZWQgbGluZSBib3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwotICAg
IC8vIHRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpbmUuCi0gICAgdW5zaWduZWQgbGluZURlcHRoID0g
MTsKLSAgICBJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3ggPSBudWxscHRyOwotICAgIElubGluZUZs
b3dCb3gqIHJlc3VsdCA9IG51bGxwdHI7Ci0gICAgYm9vbCBoYXNEZWZhdWx0TGluZUJveENvbnRh
aW4gPSBzdHlsZSgpLmxpbmVCb3hDb250YWluKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5l
Qm94Q29udGFpbigpOwotICAgIGRvIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1Q
TElDQVRJT04oaXM8UmVuZGVySW5saW5lPigqb2JqKSB8fCBvYmogPT0gdGhpcyk7Ci0KLSAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gb2JqICE9IHRoaXMgPyBkb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KG9iaikgOiBudWxscHRyOwotCi0gICAgICAgIC8vIEdldCB0aGUgbGFzdCBib3gg
d2UgbWFkZSBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LgotICAgICAgICBwYXJlbnRCb3ggPSBpbmxp
bmVGbG93ID8gaW5saW5lRmxvdy0+bGFzdExpbmVCb3goKSA6IGRvd25jYXN0PFJlbmRlckJsb2Nr
Rmxvdz4oKm9iaikubGFzdFJvb3RCb3goKTsKLQotICAgICAgICAvLyBJZiB0aGlzIGJveCBvciBp
dHMgYW5jZXN0b3IgaXMgY29uc3RydWN0ZWQgdGhlbiBpdCBpcyBmcm9tIGEgcHJldmlvdXMgbGlu
ZSwgYW5kIHdlIG5lZWQKLSAgICAgICAgLy8gdG8gbWFrZSBhIG5ldyBib3ggZm9yIG91ciBsaW5l
LiAgSWYgdGhpcyBib3ggb3IgaXRzIGFuY2VzdG9yIGlzIHVuY29uc3RydWN0ZWQgYnV0IGl0IGhh
cwotICAgICAgICAvLyBzb21ldGhpbmcgZm9sbG93aW5nIGl0IG9uIHRoZSBsaW5lLCB0aGVuIHdl
IGtub3cgd2UgaGF2ZSB0byBtYWtlIGEgbmV3IGJveAotICAgICAgICAvLyBhcyB3ZWxsLiAgSW4g
dGhpcyBzaXR1YXRpb24gb3VyIGlubGluZSBoYXMgYWN0dWFsbHkgYmVlbiBzcGxpdCBpbiB0d28g
b24KLSAgICAgICAgLy8gdGhlIHNhbWUgbGluZSAodGhpcyBjYW4gaGFwcGVuIHdpdGggdmVyeSBm
YW5jeSBsYW5ndWFnZSBtaXh0dXJlcykuCi0gICAgICAgIGJvb2wgY29uc3RydWN0ZWROZXdCb3gg
PSBmYWxzZTsKLSAgICAgICAgYm9vbCBhbGxvd2VkVG9Db25zdHJ1Y3ROZXdCb3ggPSAhaGFzRGVm
YXVsdExpbmVCb3hDb250YWluIHx8ICFpbmxpbmVGbG93IHx8IGlubGluZUZsb3ctPmFsd2F5c0Ny
ZWF0ZUxpbmVCb3hlcygpOwotICAgICAgICBib29sIGNhblVzZUV4aXN0aW5nUGFyZW50Qm94ID0g
cGFyZW50Qm94ICYmICFwYXJlbnRJc0NvbnN0cnVjdGVkT3JIYXZlTmV4dChwYXJlbnRCb3gpOwot
ICAgICAgICBpZiAoYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ICYmICFjYW5Vc2VFeGlzdGluZ1Bh
cmVudEJveCkgewotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIGEgbmV3IGJveCBmb3Ig
dGhpcyByZW5kZXIgb2JqZWN0LiAgT25jZQotICAgICAgICAgICAgLy8gbWFkZSwgd2UgbmVlZCB0
byBwbGFjZSBpdCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAgICBJ
bmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKG9iaiwgb2JqID09
IHRoaXMpOwotICAgICAgICAgICAgcGFyZW50Qm94ID0gZG93bmNhc3Q8SW5saW5lRmxvd0JveD4o
bmV3Qm94KTsKLSAgICAgICAgICAgIHBhcmVudEJveC0+c2V0SXNGaXJzdExpbmUobGluZUluZm8u
aXNGaXJzdExpbmUoKSk7Ci0gICAgICAgICAgICBwYXJlbnRCb3gtPnNldElzSG9yaXpvbnRhbChp
c0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKLSAgICAgICAgICAgIGlmICghaGFzRGVmYXVsdExp
bmVCb3hDb250YWluKQotICAgICAgICAgICAgICAgIHBhcmVudEJveC0+Y2xlYXJEZXNjZW5kYW50
c0hhdmVTYW1lTGluZUhlaWdodEFuZEJhc2VsaW5lKCk7Ci0gICAgICAgICAgICBjb25zdHJ1Y3Rl
ZE5ld0JveCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uc3RydWN0ZWROZXdC
b3ggfHwgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKLSAgICAgICAgICAgIGlmICghcmVzdWx0
KQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudEJveDsKLQotICAgICAgICAgICAgLy8g
SWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2NrIGl0c2VsZiwgdGhlbiB8Ym94fCByZXByZXNlbnRzIHRo
ZSByb290Ci0gICAgICAgICAgICAvLyBpbmxpbmUgYm94IGZvciB0aGUgbGluZSwgYW5kIGl0IGRv
ZXNuJ3QgaGF2ZSB0byBiZSBhcHBlbmRlZCB0byBhbnkgcGFyZW50Ci0gICAgICAgICAgICAvLyBp
bmxpbmUuCi0gICAgICAgICAgICBpZiAoY2hpbGRCb3gpCi0gICAgICAgICAgICAgICAgcGFyZW50
Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gpOwotCi0gICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGVk
TmV3Qm94IHx8IG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAg
ICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdl
J3ZlIGV4Y2VlZGVkIG91ciBsaW5lIGRlcHRoLCB0aGVuIGp1bXAgc3RyYWlnaHQgdG8gdGhlIHJv
b3QgYW5kIHNraXAgYWxsIHRoZSByZW1haW5pbmcKLSAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGlu
bGluZSBmbG93cy4KLSAgICAgICAgb2JqID0gKCsrbGluZURlcHRoID49IGNNYXhMaW5lRGVwdGgp
ID8gdGhpcyA6IG9iai0+cGFyZW50KCk7Ci0KLSAgICB9IHdoaWxlICh0cnVlKTsKLQotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+IHN0YXRp
YyBpbmxpbmUgYm9vbCBlbmRzV2l0aEhUTUxTcGFjZXMoY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hh
cmFjdGVycywgdW5zaWduZWQgcG9zaXRpb24sIHVuc2lnbmVkIGVuZCkKLXsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSBwb3NpdGlvbjsgaSA8IGVuZDsgKytpKSB7Ci0gICAgICAgIGlmICghaXNIVE1M
U3BhY2UoY2hhcmFjdGVyc1tpXSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFjaGVkRW5kT2ZUZXh0UmVuZGVy
ZXIoY29uc3QgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zKQotewotICAgIEJpZGlSdW4q
IHJ1biA9IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKTsKLSAgICBpZiAoIXJ1bikKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKCFpczxSZW5kZXJUZXh0PihydW4tPnJlbmRlcmVyKCkp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYXV0byYgdGV4dCA9IGRvd25jYXN0PFJlbmRl
clRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkudGV4dCgpOwotICAgIHVuc2lnbmVkIHBvc2l0aW9uID0g
cnVuLT5zdG9wKCk7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLSAgICBp
ZiAodGV4dC5pczhCaXQoKSkKLSAgICAgICAgcmV0dXJuIGVuZHNXaXRoSFRNTFNwYWNlcyh0ZXh0
LmNoYXJhY3RlcnM4KCksIHBvc2l0aW9uLCBsZW5ndGgpOwotICAgIHJldHVybiBlbmRzV2l0aEhU
TUxTcGFjZXModGV4dC5jaGFyYWN0ZXJzMTYoKSwgcG9zaXRpb24sIGxlbmd0aCk7Ci19Ci0KLVJv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxC
aWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKLXsKLSAgICBBU1NF
UlQoYmlkaVJ1bnMuZmlyc3RSdW4oKSk7Ci0KLSAgICBib29sIHJvb3RIYXNTZWxlY3RlZENoaWxk
cmVuID0gZmFsc2U7Ci0gICAgSW5saW5lRmxvd0JveCogcGFyZW50Qm94ID0gMDsKLSAgICBpbnQg
cnVuQ291bnQgPSBiaWRpUnVucy5ydW5Db3VudCgpIC0gbGluZUluZm8ucnVuc0Zyb21MZWFkaW5n
V2hpdGVzcGFjZSgpOwotICAgIAotICAgIGZvciAoQmlkaVJ1biogciA9IGJpZGlSdW5zLmZpcnN0
UnVuKCk7IHI7IHIgPSByLT5uZXh0KCkpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgYm94IGZvciBv
dXIgb2JqZWN0LgotICAgICAgICBib29sIGlzT25seVJ1biA9IChydW5Db3VudCA9PSAxKTsKLSAg
ICAgICAgaWYgKHJ1bkNvdW50ID09IDIgJiYgIXItPnJlbmRlcmVyKCkuaXNMaXN0TWFya2VyKCkp
Ci0gICAgICAgICAgICBpc09ubHlSdW4gPSAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpID8gYmlkaVJ1bnMubGFzdFJ1bigpIDogYmlkaVJ1bnMuZmlyc3RSdW4oKSktPnJlbmRlcmVy
KCkuaXNMaXN0TWFya2VyKCk7Ci0KLSAgICAgICAgaWYgKGxpbmVJbmZvLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIElubGluZUJveCogYm94ID0gY3JlYXRlSW5s
aW5lQm94Rm9yUmVuZGVyZXIoJnItPnJlbmRlcmVyKCksIGZhbHNlLCBpc09ubHlSdW4pOwotICAg
ICAgICByLT5zZXRCb3goYm94KTsKLQotICAgICAgICBpZiAoIXJvb3RIYXNTZWxlY3RlZENoaWxk
cmVuICYmIGJveC0+cmVuZGVyZXIoKS5zZWxlY3Rpb25TdGF0ZSgpICE9IFJlbmRlck9iamVjdDo6
U2VsZWN0aW9uTm9uZSkKLSAgICAgICAgICAgIHJvb3RIYXNTZWxlY3RlZENoaWxkcmVuID0gdHJ1
ZTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9y
IGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxpbmcsCi0gICAgICAgIC8vIHRoZW4gd2Ug
bmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBl
bmNsb3NlIHRoZQotICAgICAgICAvLyBydW4ncyBpbmxpbmUgYm94LiBTZWdtZW50cyBjYW4gb25s
eSBiZSBzaWJsaW5ncyBhdCB0aGUgcm9vdCBsZXZlbCwgYXMKLSAgICAgICAgLy8gdGhleSBhcmUg
cG9zaXRpb25lZCBzZXBhcmF0ZWx5LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCAmcGFyZW50
Qm94LT5yZW5kZXJlcigpICE9IHItPnJlbmRlcmVyKCkucGFyZW50KCkpIHsKLSAgICAgICAgICAg
IC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJv
cHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50
VG9Vc2UgPSByLT5yZW5kZXJlcigpLnBhcmVudCgpOwotICAgICAgICAgICAgcGFyZW50Qm94ID0g
Y3JlYXRlTGluZUJveGVzKHBhcmVudFRvVXNlLCBsaW5lSW5mbywgYm94KTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUu
Ci0gICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgYm9vbCB2aXN1YWxseU9yZGVyZWQgPSByLT5yZW5kZXJlcigpLnN0eWxlKCkucnRsT3Jk
ZXJpbmcoKSA9PSBPcmRlcjo6VmlzdWFsOwotICAgICAgICBib3gtPnNldEJpZGlMZXZlbChyLT5s
ZXZlbCgpKTsKLQotICAgICAgICBpZiAoaXM8SW5saW5lVGV4dEJveD4oKmJveCkpIHsKLSAgICAg
ICAgICAgIGF1dG8mIHRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqYm94KTsKLSAg
ICAgICAgICAgIHRleHRCb3guc2V0U3RhcnQoci0+bV9zdGFydCk7Ci0gICAgICAgICAgICB0ZXh0
Qm94LnNldExlbihyLT5tX3N0b3AgLSByLT5tX3N0YXJ0KTsKLSAgICAgICAgICAgIHRleHRCb3gu
c2V0RGlyT3ZlcnJpZGUoci0+ZGlyT3ZlcnJpZGUodmlzdWFsbHlPcmRlcmVkKSk7Ci0gICAgICAg
ICAgICBpZiAoci0+bV9oYXNIeXBoZW4pCi0gICAgICAgICAgICAgICAgdGV4dEJveC5zZXRIYXNI
eXBoZW4odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBzaG91bGQgaGF2ZSBh
IHJvb3QgaW5saW5lIGJveC4gIEl0IHNob3VsZCBiZSB1bmNvbnN0cnVjdGVkIGFuZAotICAgIC8v
IGJlIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiBvZiBvdXIgbGluZSBsaXN0LgotICAgIEFTU0VSVChs
YXN0Um9vdEJveCgpICYmICFsYXN0Um9vdEJveCgpLT5pc0NvbnN0cnVjdGVkKCkpOwotCi0gICAg
Ly8gU2V0IHRoZSBtX3NlbGVjdGVkQ2hpbGRyZW4gZmxhZyBvbiB0aGUgcm9vdCBpbmxpbmUgYm94
IGlmIG9uZSBvZiB0aGUgbGVhZiBpbmxpbmUgYm94Ci0gICAgLy8gZnJvbSB0aGUgYmlkaSBydW5z
IHdhbGsgYWJvdmUgaGFzIGEgc2VsZWN0aW9uIHN0YXRlLgotICAgIGlmIChyb290SGFzU2VsZWN0
ZWRDaGlsZHJlbikKLSAgICAgICAgbGFzdFJvb3RCb3goKS0+cm9vdCgpLnNldEhhc1NlbGVjdGVk
Q2hpbGRyZW4odHJ1ZSk7Ci0KLSAgICAvLyBTZXQgYml0cyBvbiBvdXIgaW5saW5lIGZsb3cgYm94
ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCBzaWRlcyBzaG91bGQKLSAgICAvLyBwYWludCBib3JkZXJz
L21hcmdpbnMvcGFkZGluZy4gIFRoaXMga25vd2xlZGdlIHdpbGwgdWx0aW1hdGVseSBiZSB1c2Vk
IHdoZW4KLSAgICAvLyB3ZSBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgcG9zaXRpb25zIGFuZCB3
aWR0aHMgb2YgYWxsIHRoZSBpbmxpbmUgYm94ZXMgb24KLSAgICAvLyB0aGUgbGluZS4KLSAgICBi
b29sIGlzTG9naWNhbGx5TGFzdFJ1bldyYXBwZWQgPSBiaWRpUnVucy5sb2dpY2FsbHlMYXN0UnVu
KCktPnJlbmRlcmVyKCkuaXNUZXh0KCkgPyAhcmVhY2hlZEVuZE9mVGV4dFJlbmRlcmVyKGJpZGlS
dW5zKSA6ICFpczxSZW5kZXJJbmxpbmU+KGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVu
ZGVyZXIoKSk7Ci0gICAgbGFzdFJvb3RCb3goKS0+ZGV0ZXJtaW5lU3BhY2luZ0ZvckZsb3dCb3hl
cyhsaW5lSW5mby5pc0xhc3RMaW5lKCksIGlzTG9naWNhbGx5TGFzdFJ1bldyYXBwZWQsICZiaWRp
UnVucy5sb2dpY2FsbHlMYXN0UnVuKCktPnJlbmRlcmVyKCkpOwotCi0gICAgLy8gTm93IG1hcmsg
dGhlIGxpbmUgYm94ZXMgYXMgYmVpbmcgY29uc3RydWN0ZWQuCi0gICAgbGFzdFJvb3RCb3goKS0+
c2V0Q29uc3RydWN0ZWQoKTsKLQotICAgIC8vIFJldHVybiB0aGUgbGFzdCBsaW5lLgotICAgIHJl
dHVybiBsYXN0Um9vdEJveCgpOwotfQotCi1UZXh0QWxpZ25Nb2RlIFJlbmRlckJsb2NrRmxvdzo6
dGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3QKLXsKLSAg
ICBUZXh0QWxpZ25Nb2RlIGFsaWdubWVudCA9IHN0eWxlKCkudGV4dEFsaWduKCk7Ci0jaWYgRU5B
QkxFKENTUzNfVEVYVCkKLSAgICBUZXh0SnVzdGlmeSB0ZXh0SnVzdGlmeSA9IHN0eWxlKCkudGV4
dEp1c3RpZnkoKTsKLSAgICBpZiAoYWxpZ25tZW50ID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkg
JiYgdGV4dEp1c3RpZnkgPT0gVGV4dEp1c3RpZnk6Ok5vbmUpCi0gICAgICAgIHJldHVybiBzdHls
ZSgpLmRpcmVjdGlvbigpID09IFRleHREaXJlY3Rpb246OkxUUiA/IFRleHRBbGlnbk1vZGU6Okxl
ZnQgOiBUZXh0QWxpZ25Nb2RlOjpSaWdodDsKLSNlbmRpZgotCi0gICAgaWYgKGVuZHNXaXRoU29m
dEJyZWFrKQotICAgICAgICByZXR1cm4gYWxpZ25tZW50OwotCi0jaWYgIUVOQUJMRShDU1MzX1RF
WFQpCi0gICAgcmV0dXJuIChhbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSkgPyBU
ZXh0QWxpZ25Nb2RlOjpTdGFydCA6IGFsaWdubWVudDsKLSNlbHNlCi0gICAgaWYgKGFsaWdubWVu
dCAhPSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KQotICAgICAgICByZXR1cm4gYWxpZ25tZW50Owot
Ci0gICAgVGV4dEFsaWduTGFzdCBhbGlnbm1lbnRMYXN0ID0gc3R5bGUoKS50ZXh0QWxpZ25MYXN0
KCk7Ci0gICAgc3dpdGNoIChhbGlnbm1lbnRMYXN0KSB7Ci0gICAgY2FzZSBUZXh0QWxpZ25MYXN0
OjpTdGFydDoKLSAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OlN0YXJ0OwotICAgIGNhc2Ug
VGV4dEFsaWduTGFzdDo6RW5kOgotICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6RW5kOwot
ICAgIGNhc2UgVGV4dEFsaWduTGFzdDo6TGVmdDoKLSAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1v
ZGU6OkxlZnQ7Ci0gICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpSaWdodDoKLSAgICAgICAgcmV0dXJu
IFRleHRBbGlnbk1vZGU6OlJpZ2h0OwotICAgIGNhc2UgVGV4dEFsaWduTGFzdDo6Q2VudGVyOgot
ICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6Q2VudGVyOwotICAgIGNhc2UgVGV4dEFsaWdu
TGFzdDo6SnVzdGlmeToKLSAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7Ci0g
ICAgY2FzZSBUZXh0QWxpZ25MYXN0OjpBdXRvOgotICAgICAgICBpZiAodGV4dEp1c3RpZnkgPT0g
VGV4dEp1c3RpZnk6OkRpc3RyaWJ1dGUpCi0gICAgICAgICAgICByZXR1cm4gVGV4dEFsaWduTW9k
ZTo6SnVzdGlmeTsKLSAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OlN0YXJ0OwotICAgIH0K
LSAgICByZXR1cm4gYWxpZ25tZW50OwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZUxv
Z2ljYWxXaWR0aEZvckxlZnRBbGlnbmVkQmxvY2soYm9vbCBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiB0
b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoKQotewotICAgIC8v
IFRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIHNob3VsZCBkZXRlcm1pbmUgd2hhdCBoYXBwZW5z
IHdpdGggd2lkZSBsaW5lcy4KLSAgICAvLyBJbiBwYXJ0aWN1bGFyIHdpdGggUlRMIGJsb2Nrcywg
d2lkZSBsaW5lcyBzaG91bGQgc3RpbGwgc3BpbGwgb3V0IHRvIHRoZSBsZWZ0LgotICAgIGlmIChp
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgIGlmICh0b3RhbExvZ2ljYWxXaWR0aCA+
IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAmJiB0cmFpbGluZ1NwYWNlUnVuKQotICAgICAgICAgICAg
dHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPnNldExvZ2ljYWxXaWR0aChzdGQ6Om1heDxmbG9hdD4o
MCwgdHJhaWxpbmdTcGFjZVJ1bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpIC0gdG90YWxMb2dpY2Fs
V2lkdGggKyBhdmFpbGFibGVMb2dpY2FsV2lkdGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKQotICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5i
b3goKS0+c2V0TG9naWNhbFdpZHRoKDApOwotICAgIGVsc2UgaWYgKHRvdGFsTG9naWNhbFdpZHRo
ID4gYXZhaWxhYmxlTG9naWNhbFdpZHRoKQotICAgICAgICBsb2dpY2FsTGVmdCAtPSAodG90YWxM
b2dpY2FsV2lkdGggLSBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotfQotCi1zdGF0aWMgdm9pZCB1
cGRhdGVMb2dpY2FsV2lkdGhGb3JSaWdodEFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGZsb2F0JiBsb2dpY2FsTGVmdCwg
ZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpCi17
Ci0gICAgLy8gV2lkZSBsaW5lcyBzcGlsbCBvdXQgb2YgdGhlIGJsb2NrIGJhc2VkIG9mZiBkaXJl
Y3Rpb24uCi0gICAgLy8gU28gZXZlbiBpZiB0ZXh0LWFsaWduIGlzIHJpZ2h0LCBpZiBkaXJlY3Rp
b24gaXMgTFRSLCB3aWRlIGxpbmVzIHNob3VsZCBvdmVyZmxvdyBvdXQgb2YgdGhlIHJpZ2h0Ci0g
ICAgLy8gc2lkZSBvZiB0aGUgYmxvY2suCi0gICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24p
IHsKLSAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2VSdW4pIHsKLSAgICAgICAgICAgIHRvdGFsTG9n
aWNhbFdpZHRoIC09IHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKTsKLSAg
ICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoMCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgbG9naWNhbExlZnQgKz0gc3RkOjptYXgoMC5mLCBhdmFpbGFibGVM
b2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBpZiAodG90YWxMb2dpY2FsV2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGggJiYg
dHJhaWxpbmdTcGFjZVJ1bikgewotICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+c2V0
TG9naWNhbFdpZHRoKHN0ZDo6bWF4PGZsb2F0PigwLCB0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+
bG9naWNhbFdpZHRoKCkgLSB0b3RhbExvZ2ljYWxXaWR0aCArIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCkpOwotICAgICAgICB0b3RhbExvZ2ljYWxXaWR0aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5ib3go
KS0+bG9naWNhbFdpZHRoKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGxvZ2ljYWxMZWZ0ICs9IGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRoOwotfQotCi1zdGF0aWMgdm9p
ZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JDZW50ZXJBbGlnbmVkQmxvY2soYm9vbCBpc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBmbG9hdCYgbG9naWNhbExl
ZnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRo
KQotewotICAgIGZsb2F0IHRyYWlsaW5nU3BhY2VXaWR0aCA9IDA7Ci0gICAgaWYgKHRyYWlsaW5n
U3BhY2VSdW4pIHsKLSAgICAgICAgdG90YWxMb2dpY2FsV2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1
bi0+Ym94KCktPmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICB0cmFpbGluZ1NwYWNlV2lkdGggPSBz
dGQ6Om1pbih0cmFpbGluZ1NwYWNlUnVuLT5ib3goKS0+bG9naWNhbFdpZHRoKCksIChhdmFpbGFi
bGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCArIDEpIC8gMik7Ci0gICAgICAgIHRy
YWlsaW5nU3BhY2VSdW4tPmJveCgpLT5zZXRMb2dpY2FsV2lkdGgoc3RkOjptYXg8ZmxvYXQ+KDAs
IHRyYWlsaW5nU3BhY2VXaWR0aCkpOwotICAgIH0KLSAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVj
dGlvbikKLSAgICAgICAgbG9naWNhbExlZnQgKz0gc3RkOjptYXg8ZmxvYXQ+KChhdmFpbGFibGVM
b2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgLyAyLCAwKTsKLSAgICBlbHNlCi0gICAg
ICAgIGxvZ2ljYWxMZWZ0ICs9IHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxhYmxlTG9naWNhbFdp
ZHRoID8gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdpZHRoKSA6IChhdmFp
bGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgLyAyIC0gdHJhaWxpbmdTcGFj
ZVdpZHRoOwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4o
QmlkaVJ1biogcnVuLCBSZW5kZXJSdWJ5UnVuJiByZW5kZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2
aW91c09iamVjdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIGZsb2F0IHN0YXJ0
T3Zlcmhhbmc7Ci0gICAgZmxvYXQgZW5kT3Zlcmhhbmc7Ci0gICAgUmVuZGVyT2JqZWN0KiBuZXh0
T2JqZWN0ID0gMDsKLSAgICBmb3IgKEJpZGlSdW4qIHJ1bldpdGhOZXh0T2JqZWN0ID0gcnVuLT5u
ZXh0KCk7IHJ1bldpdGhOZXh0T2JqZWN0OyBydW5XaXRoTmV4dE9iamVjdCA9IHJ1bldpdGhOZXh0
T2JqZWN0LT5uZXh0KCkpIHsKLSAgICAgICAgaWYgKCFydW5XaXRoTmV4dE9iamVjdC0+cmVuZGVy
ZXIoKS5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhcnVuV2l0aE5leHRPYmplY3QtPmJveCgp
LT5pc0xpbmVCcmVhaygpKSB7Ci0gICAgICAgICAgICBuZXh0T2JqZWN0ID0gJnJ1bldpdGhOZXh0
T2JqZWN0LT5yZW5kZXJlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmVuZGVyZXIuZ2V0T3ZlcmhhbmcobGluZUluZm8uaXNGaXJzdExpbmUoKSwgcmVuZGVy
ZXIuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBwcmV2aW91c09iamVjdCA6IG5l
eHRPYmplY3QsIHJlbmRlcmVyLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gbmV4
dE9iamVjdCA6IHByZXZpb3VzT2JqZWN0LCBzdGFydE92ZXJoYW5nLCBlbmRPdmVyaGFuZyk7Ci0g
ICAgc2V0TWFyZ2luU3RhcnRGb3JDaGlsZChyZW5kZXJlciwgTGF5b3V0VW5pdCgtc3RhcnRPdmVy
aGFuZykpOwotICAgIHNldE1hcmdpbkVuZEZvckNoaWxkKHJlbmRlcmVyLCBMYXlvdXRVbml0KC1l
bmRPdmVyaGFuZykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0TG9naWNhbFdpZHRoRm9y
VGV4dFJ1bihSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBydW4sIFJlbmRlclRleHQm
IHJlbmRlcmVyLCBmbG9hdCB4UG9zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sCi0gICAgR2x5
cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50cyYgd29y
ZE1lYXN1cmVtZW50cykKLXsKLSAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBmYWxsYmFja0ZvbnRz
OwotICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVyZmxvdzsKLQotICAgIGNvbnN0IEZvbnRDYXNj
YWRlJiBmb250ID0gbGluZVN0eWxlKCpyZW5kZXJlci5wYXJlbnQoKSwgbGluZUluZm8pLmZvbnRD
YXNjYWRlKCk7Ci0gICAgLy8gQWx3YXlzIGNvbXB1dGUgZ2x5cGggb3ZlcmZsb3cgaWYgdGhlIGJs
b2NrJ3MgbGluZS1ib3gtY29udGFpbiB2YWx1ZSBpcyAiZ2x5cGhzIi4KLSAgICBpZiAobGluZUJv
eC0+Zml0c1RvR2x5cGhzKCkpIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3Qgc3RpY2sgb3V0IG9m
IHRoZSByb290IGxpbmUncyBmb250IGJveCwgdGhlbiBkb24ndCBib3RoZXIgY29tcHV0aW5nIG91
ciBnbHlwaCBvdmVyZmxvdy4gVGhpcyBvcHRpbWl6YXRpb24KLSAgICAgICAgLy8gd2lsbCBrZWVw
IHVzIGZyb20gY29tcHV0aW5nIGdseXBoIGJvdW5kcyBpbiBuZWFybHkgYWxsIGNhc2VzLgotICAg
ICAgICBib29sIGluY2x1ZGVSb290TGluZSA9IGxpbmVCb3gtPmluY2x1ZGVzUm9vdExpbmVCb3hG
b250T3JMZWFkaW5nKCk7Ci0gICAgICAgIGludCBiYXNlbGluZVNoaWZ0ID0gbGluZUJveC0+dmVy
dGljYWxQb3NpdGlvbkZvckJveChydW4tPmJveCgpLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUpOwot
ICAgICAgICBpbnQgcm9vdERlc2NlbnQgPSBpbmNsdWRlUm9vdExpbmUgPyBmb250LmZvbnRNZXRy
aWNzKCkuZGVzY2VudCgpIDogMDsKLSAgICAgICAgaW50IHJvb3RBc2NlbnQgPSBpbmNsdWRlUm9v
dExpbmUgPyBmb250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgOiAwOwotICAgICAgICBpbnQgYm94
QXNjZW50ID0gZm9udC5mb250TWV0cmljcygpLmFzY2VudCgpIC0gYmFzZWxpbmVTaGlmdDsKLSAg
ICAgICAgaW50IGJveERlc2NlbnQgPSBmb250LmZvbnRNZXRyaWNzKCkuZGVzY2VudCgpICsgYmFz
ZWxpbmVTaGlmdDsKLSAgICAgICAgaWYgKGJveEFzY2VudCA+IHJvb3REZXNjZW50IHx8ICBib3hE
ZXNjZW50ID4gcm9vdEFzY2VudCkKLSAgICAgICAgICAgIGdseXBoT3ZlcmZsb3cuY29tcHV0ZUJv
dW5kcyA9IHRydWU7IAotICAgIH0KLSAgICAKLSAgICBMYXlvdXRVbml0IGh5cGhlbldpZHRoOwot
ICAgIGlmIChkb3duY2FzdDxJbmxpbmVUZXh0Qm94PigqcnVuLT5ib3goKSkuaGFzSHlwaGVuKCkp
Ci0gICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRoKHJlbmRlcmVyLCBmb250
LCAmZmFsbGJhY2tGb250cyk7Ci0KLSAgICBmbG9hdCBtZWFzdXJlZFdpZHRoID0gMDsKLQotICAg
IGJvb2wga2VybmluZ0lzRW5hYmxlZCA9IGZvbnQuZW5hYmxlS2VybmluZygpOwotICAgIGJvb2wg
Y2FuVXNlU2ltcGxlRm9udENvZGVQYXRoID0gcmVuZGVyZXIuY2FuVXNlU2ltcGxlRm9udENvZGVQ
YXRoKCk7Ci0gICAgCi0gICAgLy8gU2luY2Ugd2UgZG9uJ3QgY2FjaGUgZ2x5cGggb3ZlcmZsb3dz
LCB3ZSBuZWVkIHRvIHJlLW1lYXN1cmUgdGhlIHJ1biBpZgotICAgIC8vIHRoZSBzdHlsZSBpcyBs
aW5lYm94LWNvbnRhaW46IGdseXBoLgotICAgIGlmICghbGluZUJveC0+Zml0c1RvR2x5cGhzKCkg
JiYgY2FuVXNlU2ltcGxlRm9udENvZGVQYXRoKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxhc3RFbmRP
ZmZzZXQgPSBydW4tPm1fc3RhcnQ7Ci0gICAgICAgIGJvb2wgYXRGaXJzdFdvcmRNZWFzdXJlbWVu
dCA9IHRydWU7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gd29yZE1lYXN1cmVt
ZW50cy5zaXplKCk7IGkgPCBzaXplICYmIGxhc3RFbmRPZmZzZXQgPCBydW4tPm1fc3RvcDsgKytp
KSB7Ci0gICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRN
ZWFzdXJlbWVudHNbaV07Ci0gICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LndpZHRoIDw9
IDAgfHwgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID09IHdvcmRNZWFzdXJlbWVudC5lbmRP
ZmZzZXQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAod29yZE1l
YXN1cmVtZW50LnJlbmRlcmVyICE9ICZyZW5kZXJlciB8fCB3b3JkTWVhc3VyZW1lbnQuc3RhcnRP
ZmZzZXQgIT0gbGFzdEVuZE9mZnNldCB8fCB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID4gcnVu
LT5tX3N0b3ApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGxhc3RF
bmRPZmZzZXQgPSB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0OwotICAgICAgICAgICAgaWYgKGtl
cm5pbmdJc0VuYWJsZWQgJiYgbGFzdEVuZE9mZnNldCA9PSBydW4tPm1fc3RvcCkgewotICAgICAg
ICAgICAgICAgIGludCB3b3JkTGVuZ3RoID0gbGFzdEVuZE9mZnNldCAtIHdvcmRNZWFzdXJlbWVu
dC5zdGFydE9mZnNldDsKLSAgICAgICAgICAgICAgICBHbHlwaE92ZXJmbG93IG92ZXJmbG93Owot
ICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0gcmVuZGVyZXIud2lkdGgod29yZE1lYXN1
cmVtZW50LnN0YXJ0T2Zmc2V0LCB3b3JkTGVuZ3RoLCB4UG9zICsgbWVhc3VyZWRXaWR0aCwgbGlu
ZUluZm8uaXNGaXJzdExpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgJndvcmRNZWFzdXJlbWVu
dC5mYWxsYmFja0ZvbnRzLCAmb3ZlcmZsb3cpOwotICAgICAgICAgICAgICAgIFVDaGFyIGMgPSBy
ZW5kZXJlci5jaGFyYWN0ZXJBdCh3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQpOwotICAgICAg
ICAgICAgICAgIC8vIHJlbmRlcmVyLndpZHRoKCkgb21pdHMgd29yZC1zcGFjaW5nIHZhbHVlIGZv
ciBsZWFkaW5nIHdoaXRlc3BhY2UsIHNvIGxldCdzIGp1c3QgYWRkIGl0IGJhY2sgaGVyZS4KLSAg
ICAgICAgICAgICAgICBpZiAoIWF0Rmlyc3RXb3JkTWVhc3VyZW1lbnQgJiYgRm9udENhc2NhZGU6
OnRyZWF0QXNTcGFjZShjKSkKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCArPSBy
ZW5kZXJlci5zdHlsZSgpLmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKTsKLSAgICAgICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggKz0gd29yZE1lYXN1cmVtZW50
LndpZHRoOwotICAgICAgICAgICAgYXRGaXJzdFdvcmRNZWFzdXJlbWVudCA9IGZhbHNlOwotCi0g
ICAgICAgICAgICBpZiAoIXdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+Ojpjb25zdF9pdGVyYXRvciBl
bmQgPSB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5lbmQoKTsKLSAgICAgICAgICAgICAg
ICBmb3IgKEhhc2hTZXQ8Y29uc3QgRm9udCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHdvcmRNZWFz
dXJlbWVudC5mYWxsYmFja0ZvbnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAg
ICAgICAgICAgICAgZmFsbGJhY2tGb250cy5hZGQoKml0KTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICBpZiAobWVhc3VyZWRXaWR0aCAmJiBsYXN0RW5kT2Zmc2V0ICE9IHJ1bi0+
bV9zdG9wKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBjYWNoZWQg
ZGF0YSwgd2UnbGwgbWVhc3VyZSB0aGUgcnVuIGFnYWluLgotICAgICAgICAgICAgbWVhc3VyZWRX
aWR0aCA9IDA7Ci0gICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBpZiAoIW1lYXN1cmVkV2lkdGgpCi0gICAgICAgIG1lYXN1cmVkV2lkdGgg
PSByZW5kZXJlci53aWR0aChydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9wIC0gcnVuLT5tX3N0YXJ0
LCB4UG9zLCBsaW5lSW5mby5pc0ZpcnN0TGluZSgpLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3Zl
cmZsb3cpOwotCi0gICAgcnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKG1lYXN1cmVkV2lkdGgg
KyBoeXBoZW5XaWR0aCk7Ci0gICAgaWYgKCFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkgewotICAg
ICAgICBBU1NFUlQocnVuLT5ib3goKS0+YmVoYXZlc0xpa2VUZXh0KCkpOwotICAgICAgICBHbHlw
aE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcDo6aXRlcmF0b3IgaXQgPSB0ZXh0Qm94RGF0YU1h
cC5hZGQoZG93bmNhc3Q8SW5saW5lVGV4dEJveD4ocnVuLT5ib3goKSksIHN0ZDo6bWFrZV9wYWly
KFZlY3Rvcjxjb25zdCBGb250Kj4oKSwgR2x5cGhPdmVyZmxvdygpKSkuaXRlcmF0b3I7Ci0gICAg
ICAgIEFTU0VSVChpdC0+dmFsdWUuZmlyc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgaXQtPnZhbHVl
LmZpcnN0ID0gY29weVRvVmVjdG9yKGZhbGxiYWNrRm9udHMpOwotICAgICAgICBydW4tPmJveCgp
LT5wYXJlbnQoKS0+Y2xlYXJEZXNjZW5kYW50c0hhdmVTYW1lTGluZUhlaWdodEFuZEJhc2VsaW5l
KCk7Ci0gICAgfQotCi0gICAgLy8gSW5jbHVkZSB0ZXh0IGRlY29yYXRpb24gdmlzdWFsIG92ZXJm
bG93IGFzIHBhcnQgb2YgdGhlIGdseXBoIG92ZXJmbG93LgotICAgIGlmICghcmVuZGVyZXIuc3R5
bGUoKS50ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCgpLmlzRW1wdHkoKSkKLSAgICAgICAgZ2x5cGhP
dmVyZmxvdy5leHRlbmRUbyh2aXN1YWxPdmVyZmxvd0ZvckRlY29yYXRpb25zKHJ1bi0+Ym94KCkt
PmxpbmVTdHlsZSgpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihydW4tPmJveCgpKSkpOwotCi0g
ICAgaWYgKCFnbHlwaE92ZXJmbG93LmlzRW1wdHkoKSkgewotICAgICAgICBBU1NFUlQocnVuLT5i
b3goKS0+YmVoYXZlc0xpa2VUZXh0KCkpOwotICAgICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcDo6aXRlcmF0b3IgaXQgPSB0ZXh0Qm94RGF0YU1hcC5hZGQoZG93bmNhc3Q8SW5s
aW5lVGV4dEJveD4ocnVuLT5ib3goKSksIHN0ZDo6bWFrZV9wYWlyKFZlY3Rvcjxjb25zdCBGb250
Kj4oKSwgR2x5cGhPdmVyZmxvdygpKSkuaXRlcmF0b3I7Ci0gICAgICAgIGl0LT52YWx1ZS5zZWNv
bmQgPSBnbHlwaE92ZXJmbG93OwotICAgICAgICBydW4tPmJveCgpLT5jbGVhcktub3duVG9IYXZl
Tm9PdmVyZmxvdygpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVJ1
YnlGb3JKdXN0aWZpZWRUZXh0KFJlbmRlclJ1YnlSdW4mIHJ1YnlSdW4sIEJpZGlSdW4mIHIsIGNv
bnN0IFZlY3Rvcjx1bnNpZ25lZCwgMTY+JiBleHBhbnNpb25PcHBvcnR1bml0aWVzLCB1bnNpZ25l
ZCYgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQmIHRvdGFsTG9naWNhbFdpZHRoLCBm
bG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIHNpemVfdCYgaSkKLXsKLSAgICBpZiAoIXJ1YnlS
dW4ucnVieUJhc2UoKSB8fCAhcnVieVJ1bi5ydWJ5QmFzZSgpLT5maXJzdFJvb3RCb3goKSB8fCBy
dWJ5UnVuLnJ1YnlCYXNlKCktPmZpcnN0Um9vdEJveCgpLT5uZXh0Um9vdEJveCgpIHx8ICFyLnJl
bmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgYXV0byYgcnVieUJhc2UgPSAqcnVieVJ1bi5ydWJ5QmFzZSgpOwotICAgIGF1dG8mIHJv
b3RCb3ggPSAqcnVieUJhc2UuZmlyc3RSb290Qm94KCk7Ci0KLSAgICBmbG9hdCB0b3RhbEV4cGFu
c2lvbiA9IDA7Ci0gICAgdW5zaWduZWQgdG90YWxPcHBvcnR1bml0aWVzSW5SdW4gPSAwOwotICAg
IGZvciAoYXV0byogbGVhZkNoaWxkID0gcm9vdEJveC5maXJzdExlYWZDaGlsZCgpOyBsZWFmQ2hp
bGQ7IGxlYWZDaGlsZCA9IGxlYWZDaGlsZC0+bmV4dExlYWZDaGlsZCgpKSB7Ci0gICAgICAgIGlm
ICghbGVhZkNoaWxkLT5pc0lubGluZVRleHRCb3goKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgIHVuc2lnbmVkIG9wcG9ydHVuaXRpZXNJblJ1biA9IGV4cGFuc2lvbk9wcG9ydHVu
aXRpZXNbaSsrXTsKLSAgICAgICAgQVNTRVJUKG9wcG9ydHVuaXRpZXNJblJ1biA8PSBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50KTsKLSAgICAgICAgYXV0byBleHBhbnNpb24gPSAoYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpICogb3Bwb3J0dW5pdGllc0luUnVuIC8g
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsKLSAgICAgICAgdG90YWxFeHBhbnNpb24gKz0gZXhw
YW5zaW9uOwotICAgICAgICB0b3RhbE9wcG9ydHVuaXRpZXNJblJ1biArPSBvcHBvcnR1bml0aWVz
SW5SdW47Ci0gICAgfQotCi0gICAgQVNTRVJUKCFydWJ5UnVuLmhhc092ZXJyaWRlQ29udGVudExv
Z2ljYWxXaWR0aCgpKTsKLSAgICBmbG9hdCBuZXdCYXNlV2lkdGggPSBydWJ5UnVuLmxvZ2ljYWxX
aWR0aCgpICsgdG90YWxFeHBhbnNpb24gKyBtYXJnaW5TdGFydEZvckNoaWxkKHJ1YnlSdW4pICsg
bWFyZ2luRW5kRm9yQ2hpbGQocnVieVJ1bik7Ci0gICAgZmxvYXQgbmV3UnVieVJ1bldpZHRoID0g
cnVieVJ1bi5sb2dpY2FsV2lkdGgoKSArIHRvdGFsRXhwYW5zaW9uOwotICAgIHJ1YnlCYXNlLnNl
dEluaXRpYWxPZmZzZXQoKG5ld1J1YnlSdW5XaWR0aCAtIG5ld0Jhc2VXaWR0aCkgLyAyKTsKLSAg
ICBydWJ5UnVuLnNldE92ZXJyaWRlQ29udGVudExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KG5ld1J1
YnlSdW5XaWR0aCkpOwotICAgIHJ1YnlSdW4uc2V0TmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsK
LSAgICByb290Qm94Lm1hcmtEaXJ0eSgpOwotICAgIGlmIChSZW5kZXJSdWJ5VGV4dCogcnVieVRl
eHQgPSBydWJ5UnVuLnJ1YnlUZXh0KCkpIHsKLSAgICAgICAgaWYgKFJvb3RJbmxpbmVCb3gqIHRl
eHRSb290Qm94ID0gcnVieVRleHQtPmZpcnN0Um9vdEJveCgpKQotICAgICAgICAgICAgdGV4dFJv
b3RCb3gtPm1hcmtEaXJ0eSgpOwotICAgIH0KLSAgICBydWJ5UnVuLmxheW91dEJsb2NrKHRydWUp
OwotICAgIHJ1YnlSdW4uY2xlYXJPdmVycmlkZUNvbnRlbnRMb2dpY2FsV2lkdGgoKTsKLSAgICBy
LmJveCgpLT5zZXRFeHBhbnNpb24obmV3UnVieVJ1bldpZHRoIC0gci5ib3goKS0+bG9naWNhbFdp
ZHRoKCkpOwotCi0gICAgdG90YWxMb2dpY2FsV2lkdGggKz0gdG90YWxFeHBhbnNpb247Ci0gICAg
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCAtPSB0b3RhbE9wcG9ydHVuaXRpZXNJblJ1bjsKLX0K
LQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVFeHBhbnNpb25Gb3JKdXN0aWZpZWRUZXh0
KEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBjb25zdCBWZWN0
b3I8dW5zaWduZWQsIDE2PiYgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcywgdW5zaWduZWQgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0IGF2YWls
YWJsZUxvZ2ljYWxXaWR0aCkKLXsKLSAgICBpZiAoIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQg
fHwgYXZhaWxhYmxlTG9naWNhbFdpZHRoIDw9IHRvdGFsTG9naWNhbFdpZHRoKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgZm9yIChCaWRpUnVuKiBydW4gPSBmaXJz
dFJ1bjsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgewotICAgICAgICBpZiAoIXJ1bi0+Ym94KCkg
fHwgcnVuID09IHRyYWlsaW5nU3BhY2VSdW4pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgCi0gICAgICAgIGlmIChpczxSZW5kZXJUZXh0PihydW4tPnJlbmRlcmVyKCkpKSB7Ci0gICAg
ICAgICAgICB1bnNpZ25lZCBvcHBvcnR1bml0aWVzSW5SdW4gPSBleHBhbnNpb25PcHBvcnR1bml0
aWVzW2krK107Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFTU0VSVChvcHBvcnR1bml0aWVz
SW5SdW4gPD0gZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIE9ubHkganVzdGlmeSB0ZXh0IGlmIHdoaXRlc3BhY2UgaXMgY29sbGFwc2VkLgot
ICAgICAgICAgICAgaWYgKHJ1bi0+cmVuZGVyZXIoKS5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFj
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgSW5saW5lVGV4dEJveCYgdGV4dEJveCA9IGRvd25jYXN0
PElubGluZVRleHRCb3g+KCpydW4tPmJveCgpKTsKLSAgICAgICAgICAgICAgICBmbG9hdCBleHBh
bnNpb24gPSAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpICogb3Bw
b3J0dW5pdGllc0luUnVuIC8gZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsKLSAgICAgICAgICAg
ICAgICB0ZXh0Qm94LnNldEV4cGFuc2lvbihleHBhbnNpb24pOwotICAgICAgICAgICAgICAgIHRv
dGFsTG9naWNhbFdpZHRoICs9IGV4cGFuc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgLT0gb3Bwb3J0dW5pdGllc0luUnVuOwotICAgICAg
ICB9IGVsc2UgaWYgKGlzPFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSkpCi0gICAgICAg
ICAgICB1cGRhdGVSdWJ5Rm9ySnVzdGlmaWVkVGV4dChkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihy
dW4tPnJlbmRlcmVyKCkpLCAqcnVuLCBleHBhbnNpb25PcHBvcnR1bml0aWVzLCBleHBhbnNpb25P
cHBvcnR1bml0eUNvdW50LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRo
LCBpKTsKLQotICAgICAgICBpZiAoIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpCi0gICAgICAg
ICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVMb2dp
Y2FsV2lkdGhGb3JBbGlnbm1lbnQoY29uc3QgVGV4dEFsaWduTW9kZSYgdGV4dEFsaWduLCBjb25z
dCBSb290SW5saW5lQm94KiByb290SW5saW5lQm94LCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVu
LCBmbG9hdCYgbG9naWNhbExlZnQsIGZsb2F0JiB0b3RhbExvZ2ljYWxXaWR0aCwgZmxvYXQmIGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aCwgaW50IGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpCi17Ci0g
ICAgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb247Ci0gICAgaWYgKHJvb3RJbmxpbmVCb3ggJiYgc3R5
bGUoKS51bmljb2RlQmlkaSgpID09IFBsYWludGV4dCkKLSAgICAgICAgZGlyZWN0aW9uID0gcm9v
dElubGluZUJveC0+ZGlyZWN0aW9uKCk7Ci0gICAgZWxzZQotICAgICAgICBkaXJlY3Rpb24gPSBz
dHlsZSgpLmRpcmVjdGlvbigpOwotCi0gICAgLy8gQXJtZWQgd2l0aCB0aGUgdG90YWwgd2lkdGgg
b2YgdGhlIGxpbmUgKHdpdGhvdXQganVzdGlmaWNhdGlvbiksCi0gICAgLy8gd2Ugbm93IGV4YW1p
bmUgb3VyIHRleHQtYWxpZ24gcHJvcGVydHkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRv
IHBvc2l0aW9uIHRoZQotICAgIC8vIG9iamVjdHMgaG9yaXpvbnRhbGx5LiBUaGUgdG90YWwgd2lk
dGggb2YgdGhlIGxpbmUgY2FuIGJlIGluY3JlYXNlZCBpZiB3ZSBlbmQgdXAKLSAgICAvLyBqdXN0
aWZ5aW5nIHRleHQuCi0gICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKLSAgICBjYXNlIFRleHRBbGln
bk1vZGU6OkxlZnQ6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgotICAgICAg
ICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JMZWZ0QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dp
Y2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgVGV4dEFsaWduTW9kZTo6UmlnaHQ6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRS
aWdodDoKLSAgICAgICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yUmlnaHRBbGlnbmVkQmxvY2soc3R5
bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxM
ZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI6Ci0gICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpXZWJLaXRDZW50ZXI6Ci0gICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckNlbnRl
ckFsaWduZWRCbG9jayhzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSwgdHJhaWxpbmdT
cGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2Fs
V2lkdGgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk6
Ci0gICAgICAgIGFkanVzdElubGluZURpcmVjdGlvbkxpbmVCb3VuZHMoZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCwgbG9naWNhbExlZnQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAg
IGlmIChleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KSB7Ci0gICAgICAgICAgICBpZiAodHJhaWxp
bmdTcGFjZVJ1bikgewotICAgICAgICAgICAgICAgIHRvdGFsTG9naWNhbFdpZHRoIC09IHRyYWls
aW5nU3BhY2VSdW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKTsKLSAgICAgICAgICAgICAgICB0cmFp
bGluZ1NwYWNlUnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKDApOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRkFMTFRIUk9VR0g7Ci0gICAg
Y2FzZSBUZXh0QWxpZ25Nb2RlOjpTdGFydDoKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBUZXh0
RGlyZWN0aW9uOjpMVFIpCi0gICAgICAgICAgICB1cGRhdGVMb2dpY2FsV2lkdGhGb3JMZWZ0QWxp
Z25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNl
UnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvclJpZ2h0
QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpLCB0cmFpbGluZ1Nw
YWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2FsV2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6RW5kOgotICAg
ICAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rpb246OkxUUikKLSAgICAgICAgICAgIHVw
ZGF0ZUxvZ2ljYWxXaWR0aEZvclJpZ2h0QWxpZ25lZEJsb2NrKHN0eWxlKCkuaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbigpLCB0cmFpbGluZ1NwYWNlUnVuLCBsb2dpY2FsTGVmdCwgdG90YWxMb2dpY2Fs
V2lkdGgsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckxlZnRBbGlnbmVkQmxvY2soc3R5bGUoKS5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCksIHRyYWlsaW5nU3BhY2VSdW4sIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2lj
YWxXaWR0aCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQot
fQotCi1zdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKFJlbmRlckJsb2Nr
RmxvdyYgYmxvY2ssIGZsb2F0JiBsaW5lTG9naWNhbExlZnQsIGZsb2F0JiBsaW5lTG9naWNhbFJp
Z2h0LCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBib29sIGZpcnN0TGluZSwKLSAgICBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCwgTGF5b3V0VW5pdCBib3hMb2dpY2FsSGVp
Z2h0KQotewotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5taW5MaW5l
SGVpZ2h0Rm9yUmVwbGFjZWRSZW5kZXJlcihmaXJzdExpbmUsIGJveExvZ2ljYWxIZWlnaHQpOwot
ICAgIGxpbmVMb2dpY2FsTGVmdCA9IGJsb2NrLmxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShibG9j
ay5sb2dpY2FsSGVpZ2h0KCksIHNob3VsZEluZGVudFRleHQsIGxpbmVMb2dpY2FsSGVpZ2h0KTsK
LSAgICBsaW5lTG9naWNhbFJpZ2h0ID0gYmxvY2subG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShi
bG9jay5sb2dpY2FsSGVpZ2h0KCksIHNob3VsZEluZGVudFRleHQsIGxpbmVMb2dpY2FsSGVpZ2h0
KTsKLSAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxv
Z2ljYWxMZWZ0OwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1
biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hl
LCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAgIFRleHRBbGlnbk1v
ZGUgdGV4dEFsaWduID0gdGV4dEFsaWdubWVudEZvckxpbmUoIXJlYWNoZWRFbmQgJiYgIWxpbmVC
b3gtPmVuZHNXaXRoQnJlYWsoKSk7Ci0gICAgCi0gICAgLy8gQ1NTIDIuMTogIidUZXh0LWluZGVu
dCcgb25seSBhZmZlY3RzIGEgbGluZSBpZiBpdCBpcyB0aGUgZmlyc3QgZm9ybWF0dGVkIGxpbmUg
b2YgYW4gZWxlbWVudC4gRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIG9mIGFuIGFub255bW91
cyBibG9jayAKLSAgICAvLyBib3ggaXMgb25seSBhZmZlY3RlZCBpZiBpdCBpcyB0aGUgZmlyc3Qg
Y2hpbGQgb2YgaXRzIHBhcmVudCBlbGVtZW50LiIKLSAgICAvLyBDU1MzICJ0ZXh0LWluZGVudCIs
ICItd2Via2l0LWVhY2gtbGluZSIgYWZmZWN0cyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYmxvY2sg
Y29udGFpbmVyIGFzIHdlbGwgYXMgZWFjaCBsaW5lIGFmdGVyIGEgZm9yY2VkIGxpbmUgYnJlYWss
Ci0gICAgLy8gYnV0IGRvZXMgbm90IGFmZmVjdCBsaW5lcyBhZnRlciBhIHNvZnQgd3JhcCBicmVh
ay4KLSAgICBib29sIGlzRmlyc3RMaW5lID0gbGluZUluZm8uaXNGaXJzdExpbmUoKSAmJiAhKGlz
QW5vbnltb3VzQmxvY2soKSAmJiBwYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IHRoaXMpOwotICAg
IGJvb2wgaXNBZnRlckhhcmRMaW5lQnJlYWsgPSBsaW5lQm94LT5wcmV2Um9vdEJveCgpICYmIGxp
bmVCb3gtPnByZXZSb290Qm94KCktPmVuZHNXaXRoQnJlYWsoKTsKLSAgICBJbmRlbnRUZXh0T3JO
b3Qgc2hvdWxkSW5kZW50VGV4dCA9IHJlcXVpcmVzSW5kZW50KGlzRmlyc3RMaW5lLCBpc0FmdGVy
SGFyZExpbmVCcmVhaywgc3R5bGUoKSk7Ci0gICAgZmxvYXQgbGluZUxvZ2ljYWxMZWZ0OwotICAg
IGZsb2F0IGxpbmVMb2dpY2FsUmlnaHQ7Ci0gICAgZmxvYXQgYXZhaWxhYmxlTG9naWNhbFdpZHRo
OwotICAgIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoKnRoaXMsIGxpbmVMb2dpY2FsTGVm
dCwgbGluZUxvZ2ljYWxSaWdodCwgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBpc0ZpcnN0TGluZSwg
c2hvdWxkSW5kZW50VGV4dCwgMCk7Ci0gICAgYm9vbCBuZWVkc1dvcmRTcGFjaW5nOwotCi0gICAg
aWYgKGZpcnN0UnVuICYmIGZpcnN0UnVuLT5yZW5kZXJlcigpLmlzUmVwbGFjZWQoKSkgewotICAg
ICAgICBSZW5kZXJCb3gmIHJlbmRlckJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oZmlyc3RSdW4t
PnJlbmRlcmVyKCkpOwotICAgICAgICB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25zKCp0aGlz
LCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQsIGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCwgaXNGaXJzdExpbmUsIHNob3VsZEluZGVudFRleHQsIHJlbmRlckJveC5sb2dpY2FsSGVpZ2h0
KCkpOwotICAgIH0KLQotICAgIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdt
ZW50KGxpbmVCb3gsIGxpbmVJbmZvLCB0ZXh0QWxpZ24sIGxpbmVMb2dpY2FsTGVmdCwgYXZhaWxh
YmxlTG9naWNhbFdpZHRoLCBmaXJzdFJ1biwgdHJhaWxpbmdTcGFjZVJ1biwgdGV4dEJveERhdGFN
YXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgd29yZE1lYXN1cmVtZW50cyk7Ci0gICAgLy8gVGhl
IHdpZHRocyBvZiBhbGwgcnVucyBhcmUgbm93IGtub3duLiBXZSBjYW4gbm93IHBsYWNlIGV2ZXJ5
IGlubGluZSBib3ggKGFuZAotICAgIC8vIGNvbXB1dGUgYWNjdXJhdGUgd2lkdGhzIGZvciB0aGUg
aW5saW5lIGZsb3cgYm94ZXMpLgotICAgIG5lZWRzV29yZFNwYWNpbmcgPSBmYWxzZTsKLSAgICBs
aW5lQm94LT5wbGFjZUJveGVzSW5JbmxpbmVEaXJlY3Rpb24obGluZUxvZ2ljYWxMZWZ0LCBuZWVk
c1dvcmRTcGFjaW5nKTsKLX0KLQotc3RhdGljIGlubGluZSBFeHBhbnNpb25CZWhhdmlvciBleHBh
bnNpb25CZWhhdmlvckZvcklubGluZVRleHRCb3goUmVuZGVyQmxvY2tGbG93JiBibG9jaywgSW5s
aW5lVGV4dEJveCYgdGV4dEJveCwgQmlkaVJ1biogcHJldmlvdXNSdW4sIEJpZGlSdW4qIG5leHRS
dW4sIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduLCBib29sIGlzQWZ0ZXJFeHBhbnNpb24pCi17Ci0g
ICAgLy8gVGF0ZWNodXlva28gaXMgbW9kZWxlZCBhcyB0aGUgT2JqZWN0IFJlcGxhY2VtZW50IENo
YXJhY3RlciAoVStGRkZDKSwgd2hpY2ggY2FuIG5ldmVyIGhhdmUgZXhwYW5zaW9uIG9wcG9ydHVu
aXRpZXMgaW5zaWRlIG5vciBpbnRyaW5zaWNhbGx5IGFkamFjZW50IHRvIGl0LgotICAgIGlmICh0
ZXh0Qm94LnJlbmRlcmVyKCkuc3R5bGUoKS50ZXh0Q29tYmluZSgpID09IFRleHRDb21iaW5lOjpI
b3Jpem9udGFsKQotICAgICAgICByZXR1cm4gRm9yYmlkTGVhZGluZ0V4cGFuc2lvbiB8IEZvcmJp
ZFRyYWlsaW5nRXhwYW5zaW9uOwotCi0gICAgRXhwYW5zaW9uQmVoYXZpb3IgcmVzdWx0ID0gMDsK
LSAgICBib29sIHNldExlYWRpbmdFeHBhbnNpb24gPSBmYWxzZTsKLSAgICBib29sIHNldFRyYWls
aW5nRXhwYW5zaW9uID0gZmFsc2U7Ci0gICAgaWYgKHRleHRBbGlnbiA9PSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5KSB7Ci0gICAgICAgIC8vIElmIHRoZSBuZXh0IGJveCBpcyBydWJ5LCBhbmQgd2Un
cmUganVzdGlmeWluZywgYW5kIHRoZSBmaXJzdCBib3ggaW4gdGhlIHJ1YnkgYmFzZSBoYXMgYSBs
ZWFkaW5nIGV4cGFuc2lvbiwgYW5kIHdlIGFyZSBhIHRleHQgYm94LCB0aGVuIGZvcmNlIGEgdHJh
aWxpbmcgZXhwYW5zaW9uLgotICAgICAgICBpZiAobmV4dFJ1biAmJiBpczxSZW5kZXJSdWJ5UnVu
PihuZXh0UnVuLT5yZW5kZXJlcigpKSAmJiBkb3duY2FzdDxSZW5kZXJSdWJ5UnVuPihuZXh0UnVu
LT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpICYmIG5leHRSdW4tPnJlbmRlcmVyKCkuc3R5bGUoKS5j
b2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgYXV0byYgcnVieUJhc2UgPSAqZG93
bmNhc3Q8UmVuZGVyUnVieVJ1bj4obmV4dFJ1bi0+cmVuZGVyZXIoKSkucnVieUJhc2UoKTsKLSAg
ICAgICAgICAgIGlmIChydWJ5QmFzZS5maXJzdFJvb3RCb3goKSAmJiAhcnVieUJhc2UuZmlyc3RS
b290Qm94KCktPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXV0byogbGVh
ZkNoaWxkID0gcnVieUJhc2UuZmlyc3RSb290Qm94KCktPmZpcnN0TGVhZkNoaWxkKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGlzPElubGluZVRleHRCb3g+KCpsZWFmQ2hpbGQpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBsZWFkaW5nRXhwYW5zaW9uT3Bw
b3J0dW5pdHkgZG9lc24ndCBhY3R1YWxseSB3b3JrIGJlY2F1c2UgaXQgZG9lc24ndCBwZXJmb3Jt
IHRoZSBVQkEKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGb250Q2FzY2FkZTo6bGVhZGlu
Z0V4cGFuc2lvbk9wcG9ydHVuaXR5KGRvd25jYXN0PFJlbmRlclRleHQ+KGxlYWZDaGlsZC0+cmVu
ZGVyZXIoKSkuc3RyaW5nVmlldygpLCBsZWFmQ2hpbGQtPmRpcmVjdGlvbigpKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNldFRyYWlsaW5nRXhwYW5zaW9uID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gRm9yY2VUcmFpbGluZ0V4cGFuc2lvbjsK
LSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBTYW1lIHRo
aW5nLCBleGNlcHQgaWYgd2UncmUgZm9sbG93aW5nIGEgcnVieQotICAgICAgICBpZiAocHJldmlv
dXNSdW4gJiYgaXM8UmVuZGVyUnVieVJ1bj4ocHJldmlvdXNSdW4tPnJlbmRlcmVyKCkpICYmIGRv
d25jYXN0PFJlbmRlclJ1YnlSdW4+KHByZXZpb3VzUnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgp
ICYmIHByZXZpb3VzUnVuLT5yZW5kZXJlcigpLnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkp
IHsKLSAgICAgICAgICAgIGF1dG8mIHJ1YnlCYXNlID0gKmRvd25jYXN0PFJlbmRlclJ1YnlSdW4+
KHByZXZpb3VzUnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpOwotICAgICAgICAgICAgaWYgKHJ1
YnlCYXNlLmZpcnN0Um9vdEJveCgpICYmICFydWJ5QmFzZS5maXJzdFJvb3RCb3goKS0+bmV4dFJv
b3RCb3goKSkgewotICAgICAgICAgICAgICAgIGlmIChhdXRvKiBsZWFmQ2hpbGQgPSBydWJ5QmFz
ZS5maXJzdFJvb3RCb3goKS0+bGFzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChpczxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gRklYTUU6IFRoaXMgbGVhZGluZ0V4cGFuc2lvbk9wcG9ydHVuaXR5IGRvZXNuJ3Qg
YWN0dWFsbHkgd29yayBiZWNhdXNlIGl0IGRvZXNuJ3QgcGVyZm9ybSB0aGUgVUJBCi0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoRm9udENhc2NhZGU6OnRyYWlsaW5nRXhwYW5zaW9uT3Bwb3J0
dW5pdHkoZG93bmNhc3Q8UmVuZGVyVGV4dD4obGVhZkNoaWxkLT5yZW5kZXJlcigpKS5zdHJpbmdW
aWV3KCksIGxlYWZDaGlsZC0+ZGlyZWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0TGVhZGluZ0V4cGFuc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0IHw9IEZvcmNlTGVhZGluZ0V4cGFuc2lvbjsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSdyZSB0aGUgZmlyc3QgYm94IGlu
c2lkZSBhIHJ1YnkgYmFzZSwgZm9yYmlkIGEgbGVhZGluZyBleHBhbnNpb24sIGFuZCB2aWNlLXZl
cnNhCi0gICAgICAgIGlmIChpczxSZW5kZXJSdWJ5QmFzZT4oYmxvY2spKSB7Ci0gICAgICAgICAg
ICBSZW5kZXJSdWJ5QmFzZSYgcnVieUJhc2UgPSBkb3duY2FzdDxSZW5kZXJSdWJ5QmFzZT4oYmxv
Y2spOwotICAgICAgICAgICAgaWYgKCZ0ZXh0Qm94ID09IHJ1YnlCYXNlLmZpcnN0Um9vdEJveCgp
LT5maXJzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0TGVhZGluZ0V4cGFuc2lv
biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZvcmJpZExlYWRpbmdFeHBhbnNp
b247Ci0gICAgICAgICAgICB9IGlmICgmdGV4dEJveCA9PSBydWJ5QmFzZS5maXJzdFJvb3RCb3go
KS0+bGFzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0VHJhaWxpbmdFeHBhbnNp
b24gPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGb3JiaWRUcmFpbGluZ0V4cGFu
c2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXNldExlYWRp
bmdFeHBhbnNpb24pCi0gICAgICAgIHJlc3VsdCB8PSBpc0FmdGVyRXhwYW5zaW9uID8gRm9yYmlk
TGVhZGluZ0V4cGFuc2lvbiA6IEFsbG93TGVhZGluZ0V4cGFuc2lvbjsKLSAgICBpZiAoIXNldFRy
YWlsaW5nRXhwYW5zaW9uKQotICAgICAgICByZXN1bHQgfD0gQWxsb3dUcmFpbGluZ0V4cGFuc2lv
bjsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXBwbHlFeHBh
bnNpb25CZWhhdmlvcihJbmxpbmVUZXh0Qm94JiB0ZXh0Qm94LCBFeHBhbnNpb25CZWhhdmlvciBl
eHBhbnNpb25CZWhhdmlvcikKLXsKLSAgICBzd2l0Y2ggKGV4cGFuc2lvbkJlaGF2aW9yICYgTGVh
ZGluZ0V4cGFuc2lvbk1hc2spIHsKLSAgICBjYXNlIEZvcmNlTGVhZGluZ0V4cGFuc2lvbjoKLSAg
ICAgICAgdGV4dEJveC5zZXRGb3JjZUxlYWRpbmdFeHBhbnNpb24oKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBGb3JiaWRMZWFkaW5nRXhwYW5zaW9uOgotICAgICAgICB0ZXh0Qm94LnNldENh
bkhhdmVMZWFkaW5nRXhwYW5zaW9uKGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBB
bGxvd0xlYWRpbmdFeHBhbnNpb246Ci0gICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZUxlYWRpbmdF
eHBhbnNpb24odHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoIChl
eHBhbnNpb25CZWhhdmlvciAmIFRyYWlsaW5nRXhwYW5zaW9uTWFzaykgewotICAgIGNhc2UgRm9y
Y2VUcmFpbGluZ0V4cGFuc2lvbjoKLSAgICAgICAgdGV4dEJveC5zZXRGb3JjZVRyYWlsaW5nRXhw
YW5zaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRm9yYmlkVHJhaWxpbmdFeHBhbnNp
b246Ci0gICAgICAgIHRleHRCb3guc2V0Q2FuSGF2ZVRyYWlsaW5nRXhwYW5zaW9uKGZhbHNlKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBbGxvd1RyYWlsaW5nRXhwYW5zaW9uOgotICAgICAg
ICB0ZXh0Qm94LnNldENhbkhhdmVUcmFpbGluZ0V4cGFuc2lvbih0cnVlKTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
IGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2wgaW5saW5lQW5jZXN0b3JIYXNTdGFydEJv
cmRlclBhZGRpbmdPck1hcmdpbihjb25zdCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBJ
bmxpbmVCb3gmIGJveCkKLXsKLSAgICBib29sIGlzTFRSID0gYmxvY2suc3R5bGUoKS5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCk7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50Qm94ID0gYm94LnBhcmVu
dCgpOyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+cGFyZW50KCkpIHsKLSAg
ICAgICAgaWYgKChpc0xUUiAmJiBjdXJyZW50Qm94LT5tYXJnaW5Cb3JkZXJQYWRkaW5nTG9naWNh
bExlZnQoKSA+IDApCi0gICAgICAgICAgICB8fCAoIWlzTFRSICYmIGN1cnJlbnRCb3gtPm1hcmdp
bkJvcmRlclBhZGRpbmdMb2dpY2FsUmlnaHQoKSA+IDApKQotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaW5saW5lQW5j
ZXN0b3JIYXNFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4oY29uc3QgUmVuZGVyQmxvY2tGbG93JiBi
bG9jaywgY29uc3QgSW5saW5lQm94JiBib3gpCi17Ci0gICAgYm9vbCBpc0xUUiA9IGJsb2NrLnN0
eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgIGZvciAoYXV0byogY3VycmVudEJv
eCA9IGJveC5wYXJlbnQoKTsgY3VycmVudEJveDsgY3VycmVudEJveCA9IGN1cnJlbnRCb3gtPnBh
cmVudCgpKSB7Ci0gICAgICAgIGlmICgoaXNMVFIgJiYgY3VycmVudEJveC0+bWFyZ2luQm9yZGVy
UGFkZGluZ0xvZ2ljYWxSaWdodCgpID4gMCkKLSAgICAgICAgICAgIHx8ICghaXNMVFIgJiYgY3Vy
cmVudEJveC0+bWFyZ2luQm9yZGVyUGFkZGluZ0xvZ2ljYWxMZWZ0KCkgPiAwKSkKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0gICAgCi1zdGF0
aWMgYm9vbCBpc0xhc3RJbkZsb3dSdW4oQmlkaVJ1biYgcnVuVG9DaGVjaykKLXsKLSAgICBmb3Ig
KGF1dG8qIHJ1biA9IHJ1blRvQ2hlY2submV4dCgpOyBydW47IHJ1biA9IHJ1bi0+bmV4dCgpKSB7
Ci0gICAgICAgIGlmICghcnVuLT5ib3goKSB8fCBydW4tPnJlbmRlcmVyKCkuaXNPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkgfHwgcnVuLT5ib3goKS0+aXNMaW5lQnJlYWsoKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwot
fQotICAgIAotQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9u
UG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5m
byYgbGluZUluZm8sIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduLCBmbG9hdCYgbG9naWNhbExlZnQs
IAotICAgIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIEJpZGlSdW4qIGZpcnN0UnVuLCBC
aWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01h
cCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlv
bkNhY2hlLAotICAgIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCi17Ci0gICAg
Ym9vbCBuZWVkc1dvcmRTcGFjaW5nID0gZmFsc2U7Ci0gICAgYm9vbCBjYW5IYW5nUHVuY3R1YXRp
b25BdFN0YXJ0ID0gc3R5bGUoKS5oYW5naW5nUHVuY3R1YXRpb24oKS5jb250YWlucyhIYW5naW5n
UHVuY3R1YXRpb246OkZpcnN0KTsKLSAgICBib29sIGNhbkhhbmdQdW5jdHVhdGlvbkF0RW5kID0g
c3R5bGUoKS5oYW5naW5nUHVuY3R1YXRpb24oKS5jb250YWlucyhIYW5naW5nUHVuY3R1YXRpb246
Okxhc3QpOwotICAgIGJvb2wgaXNMVFIgPSBzdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KTsKLSAgICBmbG9hdCB0b3RhbExvZ2ljYWxXaWR0aCA9IGxpbmVCb3gtPmdldEZsb3dTcGFjaW5n
TG9naWNhbFdpZHRoKCk7Ci0gICAgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9
IDA7Ci0gICAgYm9vbCBpc0FmdGVyRXhwYW5zaW9uID0gaXM8UmVuZGVyUnVieUJhc2U+KCp0aGlz
KSA/IGRvd25jYXN0PFJlbmRlclJ1YnlCYXNlPigqdGhpcykuaXNBZnRlckV4cGFuc2lvbigpIDog
dHJ1ZTsKLSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiBleHBhbnNpb25PcHBvcnR1bml0aWVzOwot
Ci0gICAgQmlkaVJ1biogcnVuID0gZmlyc3RSdW47Ci0gICAgQmlkaVJ1biogcHJldmlvdXNSdW4g
PSBudWxscHRyOwotICAgIGZvciAoOyBydW47IHJ1biA9IHJ1bi0+bmV4dCgpKSB7Ci0gICAgICAg
IGF1dG8gY29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMgPSBbJmV4cGFuc2lvbk9wcG9ydHVu
aXRpZXMsICZleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LCB0ZXh0QWxpZ24sICZpc0FmdGVyRXhw
YW5zaW9uXSAoUmVuZGVyQmxvY2tGbG93JiBibG9jaywKLSAgICAgICAgICAgIElubGluZVRleHRC
b3gmIHRleHRCb3gsIEJpZGlSdW4qIHByZXZpb3VzUnVuLCBCaWRpUnVuKiBuZXh0UnVuLCBjb25z
dCBTdHJpbmdWaWV3JiBzdHJpbmdWaWV3LCBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKLSAgICAg
ICAgewotICAgICAgICAgICAgaWYgKHN0cmluZ1ZpZXcuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gRW1wdHkgcnVucyBzaG91bGQgc3RpbGwgcHJvZHVjZSBhbiBlbnRyeSBpbiBleHBh
bnNpb25PcHBvcnR1bml0aWVzIGxpc3Qgc28gdGhhdCB0aGUgbnVtYmVyIG9mIGl0ZW1zIG1hdGNo
ZXMgdGhlIG51bWJlciBvZiBydW5zLgotICAgICAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9ydHVu
aXRpZXMuYXBwZW5kKDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9yID0gZXhwYW5z
aW9uQmVoYXZpb3JGb3JJbmxpbmVUZXh0Qm94KGJsb2NrLCB0ZXh0Qm94LCBwcmV2aW91c1J1biwg
bmV4dFJ1biwgdGV4dEFsaWduLCBpc0FmdGVyRXhwYW5zaW9uKTsKLSAgICAgICAgICAgIGFwcGx5
RXhwYW5zaW9uQmVoYXZpb3IodGV4dEJveCwgZXhwYW5zaW9uQmVoYXZpb3IpOwotICAgICAgICAg
ICAgdW5zaWduZWQgb3Bwb3J0dW5pdGllc0luUnVuOwotICAgICAgICAgICAgc3RkOjp0aWUob3Bw
b3J0dW5pdGllc0luUnVuLCBpc0FmdGVyRXhwYW5zaW9uKSA9IEZvbnRDYXNjYWRlOjpleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50KHN0cmluZ1ZpZXcsIGRpcmVjdGlvbiwgZXhwYW5zaW9uQmVoYXZp
b3IpOwotICAgICAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5hcHBlbmQob3Bwb3J0dW5p
dGllc0luUnVuKTsKLSAgICAgICAgICAgIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgKz0gb3Bw
b3J0dW5pdGllc0luUnVuOwotICAgICAgICB9OwotICAgICAgICBpZiAoIXJ1bi0+Ym94KCkgfHwg
cnVuLT5yZW5kZXJlcigpLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpIHx8IHJ1bi0+Ym94KCktPmlz
TGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVj
dHMgYXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCi0gICAgICAgICAg
ICAgICAgICAgICAgLy8gY29ycmVjdCBzdGF0aWMgeCBwb3NpdGlvbi4gIFRoZXkgaGF2ZSBubyBl
ZmZlY3Qgb24gdGhlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbWlsYXJseSwg
bGluZSBicmVhayBib3hlcyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguCi0gICAgICAgIH0K
LSAgICAgICAgaWYgKGlzPFJlbmRlclRleHQ+KHJ1bi0+cmVuZGVyZXIoKSkpIHsKLSAgICAgICAg
ICAgIGF1dG8mIHJlbmRlclRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PihydW4tPnJlbmRlcmVy
KCkpOwotICAgICAgICAgICAgYXV0byYgdGV4dEJveCA9IGRvd25jYXN0PElubGluZVRleHRCb3g+
KCpydW4tPmJveCgpKTsKLSAgICAgICAgICAgIGlmIChjYW5IYW5nUHVuY3R1YXRpb25BdFN0YXJ0
ICYmIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgJiYgKGlzTFRSIHx8IGlzTGFzdEluRmxvd1J1bigq
cnVuKSkKLSAgICAgICAgICAgICAgICAmJiAhaW5saW5lQW5jZXN0b3JIYXNTdGFydEJvcmRlclBh
ZGRpbmdPck1hcmdpbigqdGhpcywgKnJ1bi0+Ym94KCkpKSB7Ci0gICAgICAgICAgICAgICAgZmxv
YXQgaGFuZ1N0YXJ0V2lkdGggPSByZW5kZXJUZXh0LmhhbmdhYmxlUHVuY3R1YXRpb25TdGFydFdp
ZHRoKHJ1bi0+bV9zdGFydCk7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRo
ICs9IGhhbmdTdGFydFdpZHRoOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZSgpLmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgbG9naWNhbExlZnQgLT0gaGFu
Z1N0YXJ0V2lkdGg7Ci0gICAgICAgICAgICAgICAgY2FuSGFuZ1B1bmN0dWF0aW9uQXRTdGFydCA9
IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2Fu
SGFuZ1B1bmN0dWF0aW9uQXRFbmQgJiYgbGluZUluZm8uaXNMYXN0TGluZSgpICYmIHJ1bi0+bV9z
dG9wID4gMCAmJiAoIWlzTFRSIHx8IGlzTGFzdEluRmxvd1J1bigqcnVuKSkKLSAgICAgICAgICAg
ICAgICAmJiAhaW5saW5lQW5jZXN0b3JIYXNFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4oKnRoaXMs
ICpydW4tPmJveCgpKSkgewotICAgICAgICAgICAgICAgIGZsb2F0IGhhbmdFbmRXaWR0aCA9IHJl
bmRlclRleHQuaGFuZ2FibGVQdW5jdHVhdGlvbkVuZFdpZHRoKHJ1bi0+bV9zdG9wIC0gMSk7Ci0g
ICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRoICs9IGhhbmdFbmRXaWR0aDsKLSAg
ICAgICAgICAgICAgICBpZiAoIXN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAg
ICAgICAgICAgICAgICAgICBsb2dpY2FsTGVmdCAtPSBoYW5nRW5kV2lkdGg7Ci0gICAgICAgICAg
ICAgICAgY2FuSGFuZ1B1bmN0dWF0aW9uQXRFbmQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRleHRBbGlnbiA9PSBUZXh0QWxpZ25Nb2RlOjpK
dXN0aWZ5ICYmIHJ1biAhPSB0cmFpbGluZ1NwYWNlUnVuKQotICAgICAgICAgICAgICAgIGNvbXB1
dGVFeHBhbnNpb25PcHBvcnR1bml0aWVzKCp0aGlzLCB0ZXh0Qm94LCBwcmV2aW91c1J1biwgcnVu
LT5uZXh0KCksIHJlbmRlclRleHQuc3RyaW5nVmlldyhydW4tPm1fc3RhcnQsIHJ1bi0+bV9zdG9w
KSwgcnVuLT5ib3goKS0+ZGlyZWN0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAodW5zaWduZWQg
bGVuZ3RoID0gcmVuZGVyVGV4dC50ZXh0KCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoIXJ1bi0+bV9zdGFydCAmJiBuZWVkc1dvcmRTcGFjaW5nICYmIGlzU3BhY2VPck5ld2xpbmUo
cmVuZGVyVGV4dC5jaGFyYWN0ZXJBdChydW4tPm1fc3RhcnQpKSkKLSAgICAgICAgICAgICAgICAg
ICAgdG90YWxMb2dpY2FsV2lkdGggKz0gbGluZVN0eWxlKCpyZW5kZXJUZXh0LnBhcmVudCgpLCBs
aW5lSW5mbykuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpOwotICAgICAgICAgICAgICAgIC8v
IHJ1bi0+bV9zdGFydCA9PSBydW4tPm1fc3RvcCBzaG91bGQgb25seSBiZSB0cnVlIGlmZiB0aGUg
cnVuIGlzIGEgcmVwbGFjZWQgcnVuIGZvciBiaWRpOiBpc29sYXRlLgotICAgICAgICAgICAgICAg
IEFTU0VSVChydW4tPm1fc3RvcCA+IDAgfHwgcnVuLT5tX3N0YXJ0ID09IHJ1bi0+bV9zdG9wKTsK
LSAgICAgICAgICAgICAgICBuZWVkc1dvcmRTcGFjaW5nID0gcnVuLT5tX3N0b3AgPT0gbGVuZ3Ro
ICYmICFpc1NwYWNlT3JOZXdsaW5lKHJlbmRlclRleHQuY2hhcmFjdGVyQXQocnVuLT5tX3N0b3Ag
LSAxKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldExvZ2ljYWxXaWR0aEZvclRl
eHRSdW4obGluZUJveCwgcnVuLCByZW5kZXJUZXh0LCB0b3RhbExvZ2ljYWxXaWR0aCwgbGluZUlu
Zm8sIHRleHRCb3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHdvcmRNZWFzdXJlbWVu
dHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FuSGFuZ1B1bmN0dWF0aW9uQXRT
dGFydCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBlbmNvdW50ZXJlZEp1c3RpZmllZFJ1Ynkg
PSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpczxSZW5kZXJSdWJ5UnVuPihydW4tPnJlbmRlcmVy
KCkpICYmIHRleHRBbGlnbiA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmIHJ1biAhPSB0cmFp
bGluZ1NwYWNlUnVuICYmIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KHJ1bi0+cmVuZGVyZXIoKSku
cnVieUJhc2UoKSkgewotICAgICAgICAgICAgICAgIGF1dG8qIHJ1YnlCYXNlID0gZG93bmNhc3Q8
UmVuZGVyUnVieVJ1bj4ocnVuLT5yZW5kZXJlcigpKS5ydWJ5QmFzZSgpOwotICAgICAgICAgICAg
ICAgIGlmIChydWJ5QmFzZS0+Zmlyc3RSb290Qm94KCkgJiYgIXJ1YnlCYXNlLT5maXJzdFJvb3RC
b3goKS0+bmV4dFJvb3RCb3goKSAmJiBydW4tPnJlbmRlcmVyKCkuc3R5bGUoKS5jb2xsYXBzZVdo
aXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICBydWJ5QmFzZS0+c2V0SXNBZnRlckV4
cGFuc2lvbihpc0FmdGVyRXhwYW5zaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRv
KiBsZWFmQ2hpbGQgPSBydWJ5QmFzZS0+Zmlyc3RSb290Qm94KCktPmZpcnN0TGVhZkNoaWxkKCk7
IGxlYWZDaGlsZDsgbGVhZkNoaWxkID0gbGVhZkNoaWxkLT5uZXh0TGVhZkNoaWxkKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICghaXM8SW5saW5lVGV4dEJveD4oKmxlYWZDaGlsZCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBlbmNvdW50ZXJlZEp1c3RpZmllZFJ1YnkgPSB0cnVlOwotICAgICAgICAgICAgICAg
ICAgICAgICAgY29tcHV0ZUV4cGFuc2lvbk9wcG9ydHVuaXRpZXMoKnJ1YnlCYXNlLCBkb3duY2Fz
dDxJbmxpbmVUZXh0Qm94PigqbGVhZkNoaWxkKSwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBkb3duY2FzdDxSZW5kZXJUZXh0PihsZWFmQ2hpbGQtPnJlbmRl
cmVyKCkpLnN0cmluZ1ZpZXcoKSwgbGVhZkNoaWxkLT5kaXJlY3Rpb24oKSk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGlmICghZW5jb3VudGVyZWRKdXN0aWZpZWRSdWJ5KQotICAgICAgICAgICAgICAgIGlzQWZ0
ZXJFeHBhbnNpb24gPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCFpczxSZW5kZXJJbmxpbmU+
KHJ1bi0+cmVuZGVyZXIoKSkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiByZW5kZXJCb3ggPSBk
b3duY2FzdDxSZW5kZXJCb3g+KHJ1bi0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICAgICAgaWYg
KGlzPFJlbmRlclJ1YnlSdW4+KHJlbmRlckJveCkpCi0gICAgICAgICAgICAgICAgICAgIHNldE1h
cmdpbnNGb3JSdWJ5UnVuKHJ1biwgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4ocmVuZGVyQm94KSwg
cHJldmlvdXNSdW4gPyAmcHJldmlvdXNSdW4tPnJlbmRlcmVyKCkgOiBudWxscHRyLCBsaW5lSW5m
byk7Ci0gICAgICAgICAgICAgICAgcnVuLT5ib3goKS0+c2V0TG9naWNhbFdpZHRoKGxvZ2ljYWxX
aWR0aEZvckNoaWxkKHJlbmRlckJveCkpOwotICAgICAgICAgICAgICAgIHRvdGFsTG9naWNhbFdp
ZHRoICs9IG1hcmdpblN0YXJ0Rm9yQ2hpbGQocmVuZGVyQm94KSArIG1hcmdpbkVuZEZvckNoaWxk
KHJlbmRlckJveCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0b3RhbExv
Z2ljYWxXaWR0aCArPSBydW4tPmJveCgpLT5sb2dpY2FsV2lkdGgoKTsKLSAgICAgICAgcHJldmlv
dXNSdW4gPSBydW47Ci0gICAgfQotCi0gICAgaWYgKGlzQWZ0ZXJFeHBhbnNpb24gJiYgIWV4cGFu
c2lvbk9wcG9ydHVuaXRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBzZWUgPHdl
YmtpdC5vcmcvYi8xMzkzOTMjYzExPgotICAgICAgICBpbnQgbGFzdFZhbGlkRXhwYW5zaW9uT3Bw
b3J0dW5pdGllc0luZGV4ID0gZXhwYW5zaW9uT3Bwb3J0dW5pdGllcy5zaXplKCkgLSAxOwotICAg
ICAgICB3aGlsZSAobGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0luZGV4ID49IDAgJiYg
IWV4cGFuc2lvbk9wcG9ydHVuaXRpZXMuYXQobGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGll
c0luZGV4KSkKLSAgICAgICAgICAgIC0tbGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0lu
ZGV4OwotICAgICAgICBpZiAobGFzdFZhbGlkRXhwYW5zaW9uT3Bwb3J0dW5pdGllc0luZGV4ID49
IDApIHsKLSAgICAgICAgICAgIEFTU0VSVChleHBhbnNpb25PcHBvcnR1bml0aWVzLmF0KGxhc3RW
YWxpZEV4cGFuc2lvbk9wcG9ydHVuaXRpZXNJbmRleCkpOwotICAgICAgICAgICAgZXhwYW5zaW9u
T3Bwb3J0dW5pdGllcy5hdChsYXN0VmFsaWRFeHBhbnNpb25PcHBvcnR1bml0aWVzSW5kZXgpLS07
Ci0gICAgICAgICAgICBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LS07Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBpZiAoaXM8UmVuZGVyUnVieUJhc2U+KCp0aGlzKSAmJiAhZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudCkKLSAgICAgICAgdGV4dEFsaWduID0gVGV4dEFsaWduTW9kZTo6Q2VudGVy
OwotCi0gICAgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KHRleHRBbGlnbiwgbGluZUJv
eCwgdHJhaWxpbmdTcGFjZVJ1biwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdpZHRoLCBhdmFp
bGFibGVMb2dpY2FsV2lkdGgsIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwotCi0gICAgY29t
cHV0ZUV4cGFuc2lvbkZvckp1c3RpZmllZFRleHQoZmlyc3RSdW4sIHRyYWlsaW5nU3BhY2VSdW4s
IGV4cGFuc2lvbk9wcG9ydHVuaXRpZXMsIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQsIHRvdGFs
TG9naWNhbFdpZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgpOwotCi0gICAgcmV0dXJuIHJ1bjsK
LX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlbW92ZUlubGluZUJveChCaWRpUnVuJiBydW4s
IGNvbnN0IFJvb3RJbmxpbmVCb3gmIHJvb3RMaW5lQm94KSBjb25zdAotewotICAgIGF1dG8qIGlu
bGluZUJveCA9IHJ1bi5ib3goKTsKLSNpZiAhQVNTRVJUX0RJU0FCTEVECi0gICAgYXV0byogaW5s
aW5lUGFyZW50ID0gaW5saW5lQm94LT5wYXJlbnQoKTsKLSAgICB3aGlsZSAoaW5saW5lUGFyZW50
ICYmIGlubGluZVBhcmVudCAhPSAmcm9vdExpbmVCb3gpIHsKLSAgICAgICAgQVNTRVJUKCFpbmxp
bmVQYXJlbnQtPmlzRGlydHkoKSk7Ci0gICAgICAgIGlubGluZVBhcmVudCA9IGlubGluZVBhcmVu
dC0+cGFyZW50KCk7Ci0gICAgfQotICAgIEFTU0VSVCghcm9vdExpbmVCb3guaXNEaXJ0eSgpKTsK
LSNlbmRpZgotICAgIGF1dG8qIHBhcmVudCA9IGlubGluZUJveC0+cGFyZW50KCk7Ci0gICAgaW5s
aW5lQm94LT5yZW1vdmVGcm9tUGFyZW50KCk7Ci0KLSAgICBhdXRvJiByZW5kZXJlciA9IHJ1bi5y
ZW5kZXJlcigpOwotICAgIGlmIChpczxSZW5kZXJUZXh0PihyZW5kZXJlcikpCi0gICAgICAgIGRv
d25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKS5yZW1vdmVUZXh0Qm94KGRvd25jYXN0PElubGlu
ZVRleHRCb3g+KCppbmxpbmVCb3gpKTsKLSAgICBkZWxldGUgaW5saW5lQm94OwotICAgIHJ1bi5z
ZXRCb3gobnVsbHB0cik7Ci0gICAgLy8gcmVtb3ZlRnJvbVBhcmVudCgpIHVubmVjZXNzYXJpbHkg
ZGlydGllcyB0aGUgYW5jZXN0b3Igc3VidHJlZS4KLSAgICBhdXRvKiBhbmNlc3RvciA9IHBhcmVu
dDsKLSAgICB3aGlsZSAoYW5jZXN0b3IpIHsKLSAgICAgICAgYW5jZXN0b3ItPm1hcmtEaXJ0eShm
YWxzZSk7Ci0gICAgICAgIGlmIChhbmNlc3RvciA9PSAmcm9vdExpbmVCb3gpCi0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci0+cGFyZW50KCk7Ci0gICAgfQot
fQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25z
Rm9yTGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBmaXJzdFJ1biwgR2x5cGhP
dmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkKLXsKLSAgICBzZXRMb2dpY2FsSGVpZ2h0
KGxpbmVCb3gtPmFsaWduQm94ZXNJbkJsb2NrRGlyZWN0aW9uKGxvZ2ljYWxIZWlnaHQoKSwgdGV4
dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkpOwotCi0gICAgLy8gTm93IG1ha2Ug
c3VyZSB3ZSBwbGFjZSByZXBsYWNlZCByZW5kZXIgb2JqZWN0cyBjb3JyZWN0bHkuCi0gICAgZm9y
IChhdXRvKiBydW4gPSBmaXJzdFJ1bjsgcnVuOyBydW4gPSBydW4tPm5leHQoKSkgewotICAgICAg
ICBBU1NFUlQocnVuLT5ib3goKSk7Ci0gICAgICAgIGlmICghcnVuLT5ib3goKSkKLSAgICAgICAg
ICAgIGNvbnRpbnVlOyAvLyBTa2lwIHJ1bnMgd2l0aCBubyBsaW5lIGJveGVzLgotCi0gICAgICAg
IC8vIEFsaWduIHBvc2l0aW9uZWQgYm94ZXMgd2l0aCB0aGUgdG9wIG9mIHRoZSBsaW5lIGJveC4g
IFRoaXMgaXMKLSAgICAgICAgLy8gYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gb2YgYW4gYXBw
cm9wcmlhdGUgeSBwb3NpdGlvbi4KLSAgICAgICAgYXV0byYgcmVuZGVyZXIgPSBydW4tPnJlbmRl
cmVyKCk7Ci0gICAgICAgIGlmIChyZW5kZXJlci5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAg
ICAgICAgICAgIHJ1bi0+Ym94KCktPnNldExvZ2ljYWxUb3AobG9naWNhbEhlaWdodCgpKTsKLQot
ICAgICAgICAvLyBQb3NpdGlvbiBpcyB1c2VkIHRvIHByb3Blcmx5IHBvc2l0aW9uIGJvdGggcmVw
bGFjZWQgZWxlbWVudHMgYW5kCi0gICAgICAgIC8vIHRvIHVwZGF0ZSB0aGUgc3RhdGljIG5vcm1h
bCBmbG93IHgveSBvZiBwb3NpdGlvbmVkIGVsZW1lbnRzLgotICAgICAgICBib29sIGlubGluZUJv
eElzUmVkdW5kYW50ID0gZmFsc2U7Ci0gICAgICAgIGlmIChpczxSZW5kZXJUZXh0PihyZW5kZXJl
cikpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZVRleHRCb3ggPSBkb3duY2FzdDxJbmxpbmVU
ZXh0Qm94PigqcnVuLT5ib3goKSk7Ci0gICAgICAgICAgICBkb3duY2FzdDxSZW5kZXJUZXh0Pihy
ZW5kZXJlcikucG9zaXRpb25MaW5lQm94KGlubGluZVRleHRCb3gpOwotICAgICAgICAgICAgaW5s
aW5lQm94SXNSZWR1bmRhbnQgPSAhaW5saW5lVGV4dEJveC5oYXNUZXh0Q29udGVudCgpOwotICAg
ICAgICB9IGVsc2UgaWYgKGlzPFJlbmRlckJveD4ocmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBk
b3duY2FzdDxSZW5kZXJCb3g+KHJlbmRlcmVyKS5wb3NpdGlvbkxpbmVCb3goZG93bmNhc3Q8SW5s
aW5lRWxlbWVudEJveD4oKnJ1bi0+Ym94KCkpKTsKLSAgICAgICAgICAgIGlubGluZUJveElzUmVk
dW5kYW50ID0gcmVuZGVyZXIuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAoaXM8UmVuZGVyTGluZUJyZWFrPihyZW5kZXJlcikpCi0gICAgICAgICAgICBkb3duY2Fz
dDxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKS5yZXBsYWNlSW5saW5lQm94V3JhcHBlcihkb3du
Y2FzdDxJbmxpbmVFbGVtZW50Qm94PigqcnVuLT5ib3goKSkpOwotICAgICAgICAvLyBDaGVjayBp
ZiB3ZSBuZWVkIHRvIGtlZXAgdGhpcyBib3ggb24gdGhlIGxpbmUgYXQgYWxsLgotICAgICAgICBp
ZiAoaW5saW5lQm94SXNSZWR1bmRhbnQpCi0gICAgICAgICAgICByZW1vdmVJbmxpbmVCb3goKnJ1
biwgKmxpbmVCb3gpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzQ29sbGFwc2li
bGVTcGFjZShVQ2hhciBjaGFyYWN0ZXIsIGNvbnN0IFJlbmRlclRleHQmIHJlbmRlcmVyKQotewot
ICAgIGlmIChjaGFyYWN0ZXIgPT0gJyAnIHx8IGNoYXJhY3RlciA9PSAnXHQnIHx8IGNoYXJhY3Rl
ciA9PSBzb2Z0SHlwaGVuKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoY2hhcmFjdGVy
ID09ICdcbicpCi0gICAgICAgIHJldHVybiAhcmVuZGVyZXIuc3R5bGUoKS5wcmVzZXJ2ZU5ld2xp
bmUoKTsKLSAgICBpZiAoY2hhcmFjdGVyID09IG5vQnJlYWtTcGFjZSkKLSAgICAgICAgcmV0dXJu
IHJlbmRlcmVyLnN0eWxlKCkubmJzcE1vZGUoKSA9PSBOQlNQTW9kZTo6U3BhY2U7Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4KLXN0YXRp
YyBpbmxpbmUgdW5zaWduZWQgZmluZEZpcnN0VHJhaWxpbmdTcGFjZShjb25zdCBSZW5kZXJUZXh0
JiBsYXN0VGV4dCwgY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVycywgdW5zaWduZWQgc3Rh
cnQsIHVuc2lnbmVkIHN0b3ApCi17Ci0gICAgdW5zaWduZWQgZmlyc3RTcGFjZSA9IHN0b3A7Ci0g
ICAgd2hpbGUgKGZpcnN0U3BhY2UgPiBzdGFydCkgewotICAgICAgICBVQ2hhciBjdXJyZW50ID0g
Y2hhcmFjdGVyc1tmaXJzdFNwYWNlIC0gMV07Ci0gICAgICAgIGlmICghaXNDb2xsYXBzaWJsZVNw
YWNlKGN1cnJlbnQsIGxhc3RUZXh0KSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBmaXJz
dFNwYWNlLS07Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpcnN0U3BhY2U7Ci19Ci0KLWlubGluZSBC
aWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiBiaWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRDb250ZXh0KQotewotICAg
IGlmICghYmlkaVJ1bnMucnVuQ291bnQoKQotICAgICAgICB8fCAhYmlkaVJ1bnMubG9naWNhbGx5
TGFzdFJ1bigpLT5yZW5kZXJlcigpLnN0eWxlKCkuYnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkK
LSAgICAgICAgfHwgIWJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+cmVuZGVyZXIoKS5zdHls
ZSgpLmF1dG9XcmFwKCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biA9IGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKTsKLSAgICBjb25z
dCBSZW5kZXJPYmplY3QmIGxhc3RPYmplY3QgPSB0cmFpbGluZ1NwYWNlUnVuLT5yZW5kZXJlcigp
OwotICAgIGlmICghaXM8UmVuZGVyVGV4dD4obGFzdE9iamVjdCkpCi0gICAgICAgIHJldHVybiBu
dWxscHRyOwotCi0gICAgY29uc3QgUmVuZGVyVGV4dCYgbGFzdFRleHQgPSBkb3duY2FzdDxSZW5k
ZXJUZXh0PihsYXN0T2JqZWN0KTsKLSAgICB1bnNpZ25lZCBmaXJzdFNwYWNlOwotICAgIGlmIChs
YXN0VGV4dC50ZXh0KCkuaXM4Qml0KCkpCi0gICAgICAgIGZpcnN0U3BhY2UgPSBmaW5kRmlyc3RU
cmFpbGluZ1NwYWNlKGxhc3RUZXh0LCBsYXN0VGV4dC50ZXh0KCkuY2hhcmFjdGVyczgoKSwgdHJh
aWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSwgdHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpKTsKLSAgICBl
bHNlCi0gICAgICAgIGZpcnN0U3BhY2UgPSBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGxhc3RUZXh0
LCBsYXN0VGV4dC50ZXh0KCkuY2hhcmFjdGVyczE2KCksIHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0
KCksIHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSk7Ci0KLSAgICBpZiAoZmlyc3RTcGFjZSA9PSB0
cmFpbGluZ1NwYWNlUnVuLT5zdG9wKCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAg
VGV4dERpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdHlsZSgpLmRpcmVjdGlvbigpOwotICAgIGJvb2wg
c2hvdWxkUmVvcmRlciA9IHRyYWlsaW5nU3BhY2VSdW4gIT0gKGRpcmVjdGlvbiA9PSBUZXh0RGly
ZWN0aW9uOjpMVFIgPyBiaWRpUnVucy5sYXN0UnVuKCkgOiBiaWRpUnVucy5maXJzdFJ1bigpKTsK
LSAgICBpZiAoZmlyc3RTcGFjZSAhPSB0cmFpbGluZ1NwYWNlUnVuLT5zdGFydCgpKSB7Ci0gICAg
ICAgIEJpZGlDb250ZXh0KiBiYXNlQ29udGV4dCA9IGN1cnJlbnRDb250ZXh0OwotICAgICAgICB3
aGlsZSAoQmlkaUNvbnRleHQqIHBhcmVudCA9IGJhc2VDb250ZXh0LT5wYXJlbnQoKSkKLSAgICAg
ICAgICAgIGJhc2VDb250ZXh0ID0gcGFyZW50OwotCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxC
aWRpUnVuPiBuZXdUcmFpbGluZ1J1biA9IHN0ZDo6bWFrZV91bmlxdWU8QmlkaVJ1bj4oZmlyc3RT
cGFjZSwgdHJhaWxpbmdTcGFjZVJ1bi0+bV9zdG9wLCB0cmFpbGluZ1NwYWNlUnVuLT5yZW5kZXJl
cigpLCBiYXNlQ29udGV4dCwgVV9PVEhFUl9ORVVUUkFMKTsKLSAgICAgICAgdHJhaWxpbmdTcGFj
ZVJ1bi0+bV9zdG9wID0gZmlyc3RTcGFjZTsKLSAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IG5l
d1RyYWlsaW5nUnVuLmdldCgpOwotICAgICAgICBpZiAoZGlyZWN0aW9uID09IFRleHREaXJlY3Rp
b246OkxUUikKLSAgICAgICAgICAgIGJpZGlSdW5zLmFwcGVuZFJ1bihXVEZNb3ZlKG5ld1RyYWls
aW5nUnVuKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJpZGlSdW5zLnByZXBlbmRSdW4o
V1RGTW92ZShuZXdUcmFpbGluZ1J1bikpOwotICAgICAgICByZXR1cm4gdHJhaWxpbmdTcGFjZVJ1
bjsKLSAgICB9Ci0gICAgaWYgKCFzaG91bGRSZW9yZGVyKQotICAgICAgICByZXR1cm4gdHJhaWxp
bmdTcGFjZVJ1bjsKLQotICAgIGlmIChkaXJlY3Rpb24gPT0gVGV4dERpcmVjdGlvbjo6TFRSKSB7
Ci0gICAgICAgIGJpZGlSdW5zLm1vdmVSdW5Ub0VuZCh0cmFpbGluZ1NwYWNlUnVuKTsKLSAgICAg
ICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
YmlkaVJ1bnMubW92ZVJ1blRvQmVnaW5uaW5nKHRyYWlsaW5nU3BhY2VSdW4pOwotICAgICAgICB0
cmFpbGluZ1NwYWNlUnVuLT5tX2xldmVsID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYWlsaW5n
U3BhY2VSdW47Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRGbG9hdGluZ09iamVj
dFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QmIGZsb2F0aW5nT2JqZWN0KQotewotICAgIEFTU0VS
VF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCFmbG9hdGluZ09iamVjdC5vcmlnaW5hdGluZ0xp
bmUoKSk7Ci0gICAgQVNTRVJUKGxhc3RSb290Qm94KCkpOwotICAgIGZsb2F0aW5nT2JqZWN0LnNl
dE9yaWdpbmF0aW5nTGluZSgqbGFzdFJvb3RCb3goKSk7Ci0gICAgbGFzdFJvb3RCb3goKS0+YXBw
ZW5kRmxvYXQoZmxvYXRpbmdPYmplY3QucmVuZGVyZXIoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
dm9pZCBub3RpZnlSZXNvbHZlclRvUmVzdW1lSW5Jc29sYXRlKElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIFJlbmRlck9iamVjdCogcm9vdCwgUmVuZGVyT2JqZWN0KiBzdGFydE9iamVjdCkK
LXsKLSAgICBpZiAocm9vdCAhPSBzdGFydE9iamVjdCkgewotICAgICAgICBSZW5kZXJPYmplY3Qq
IHBhcmVudCA9IHN0YXJ0T2JqZWN0LT5wYXJlbnQoKTsKLSAgICAgICAgbm90aWZ5UmVzb2x2ZXJU
b1Jlc3VtZUluSXNvbGF0ZShyZXNvbHZlciwgcm9vdCwgcGFyZW50KTsKLSAgICAgICAgbm90aWZ5
T2JzZXJ2ZXJFbnRlcmVkT2JqZWN0KCZyZXNvbHZlciwgc3RhcnRPYmplY3QpOwotICAgIH0KLX0K
LQotc3RhdGljIGlubGluZSB2b2lkIHNldFVwUmVzb2x2ZXJUb1Jlc3VtZUluSXNvbGF0ZShJbmxp
bmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29sdmVy
LCBCaWRpUnVuJiBpc29sYXRlZFJ1biwgUmVuZGVyT2JqZWN0KiByb290LCBSZW5kZXJPYmplY3Qq
IHN0YXJ0T2JqZWN0KQotewotICAgIC8vIFNldCB1cCBtX3doaXRlc3BhY2VDb2xsYXBzaW5nU3Rh
dGUKLSAgICByZXNvbHZlci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCkgPSB0b3BSZXNvbHZl
ci53aGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlKCk7Ci0gICAgcmVzb2x2ZXIud2hpdGVzcGFjZUNv
bGxhcHNpbmdTdGF0ZSgpLnNldEN1cnJlbnRUcmFuc2l0aW9uKHRvcFJlc29sdmVyLndoaXRlc3Bh
Y2VDb2xsYXBzaW5nVHJhbnNpdGlvbkZvcklzb2xhdGVkUnVuKGlzb2xhdGVkUnVuKSk7Ci0KLSAg
ICAvLyBTZXQgdXAgbV9uZXN0ZWRJc29sYXRlQ291bnQKLSAgICBub3RpZnlSZXNvbHZlclRvUmVz
dW1lSW5Jc29sYXRlKHJlc29sdmVyLCByb290LCBzdGFydE9iamVjdCk7Ci19Ci0KLS8vIEZJWE1F
OiBCaWRpUmVzb2x2ZXIgc2hvdWxkIGhhdmUgdGhpcyBsb2dpYy4KLXN0YXRpYyBpbmxpbmUgdm9p
ZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvclNlZ21lbnQoSW5saW5lQmlkaVJlc29sdmVyJiB0b3BSZXNv
bHZlciwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgZW5kT2ZSdW5zLCBWaXN1YWxEaXJlY3Rpb25PdmVycmlkZSBvdmVycmlkZSwgYm9vbCBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkpCi17Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBwYXNzIGEg
QmlkaVJ1bkxpc3QgaW50byBjcmVhdGVCaWRpUnVuc0ZvckxpbmUgaW5zdGVhZAotICAgIC8vIG9m
IHRoZSByZXNvbHZlciBvd25pbmcgdGhlIHJ1bnMuCi0gICAgQVNTRVJUKCZ0b3BSZXNvbHZlci5y
dW5zKCkgPT0gJmJpZGlSdW5zKTsKLSAgICBBU1NFUlQodG9wUmVzb2x2ZXIucG9zaXRpb24oKSAh
PSBlbmRPZlJ1bnMpOwotICAgIFJlbmRlck9iamVjdCogY3VycmVudFJvb3QgPSB0b3BSZXNvbHZl
ci5wb3NpdGlvbigpLnJvb3QoKTsKLSAgICB0b3BSZXNvbHZlci5jcmVhdGVCaWRpUnVuc0Zvckxp
bmUoZW5kT2ZSdW5zLCBvdmVycmlkZSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKLQotICAg
IHdoaWxlICghdG9wUmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IC8vIEl0IGRvZXMgbm90IG1hdHRlciB3aGljaCBvcmRlciB3ZSByZXNvbHZlIHRoZSBydW5zIGFz
IGxvbmcgYXMgd2UgcmVzb2x2ZSB0aGVtIGFsbC4KLSAgICAgICAgYXV0byBpc29sYXRlZFJ1biA9
IFdURk1vdmUodG9wUmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkubGFzdCgpKTsKLSAgICAgICAgdG9w
UmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkucmVtb3ZlTGFzdCgpOwotICAgICAgICBjdXJyZW50Um9v
dCA9ICZpc29sYXRlZFJ1bi5yb290OwotCi0gICAgICAgIFJlbmRlck9iamVjdCYgc3RhcnRPYmpl
Y3QgPSBpc29sYXRlZFJ1bi5vYmplY3Q7Ci0KLSAgICAgICAgLy8gT25seSBpbmxpbmVzIG1ha2Ug
c2Vuc2Ugd2l0aCB1bmljb2RlLWJpZGk6IGlzb2xhdGUgKGJsb2NrcyBhcmUgYWxyZWFkeSBpc29s
YXRlZCkuCi0gICAgICAgIC8vIEZJWE1FOiBCZWNhdXNlIGVudGVySXNvbGF0ZSBpcyBub3QgcGFz
c2VkIGEgUmVuZGVyT2JqZWN0LCB3ZSBoYXZlIHRvIGNyYXdsIHVwIHRoZQotICAgICAgICAvLyB0
cmVlIHRvIHNlZSB3aGljaCBwYXJlbnQgaW5saW5lIGlzIHRoZSBpc29sYXRlLiBXZSBjb3VsZCBj
aGFuZ2UgZW50ZXJJc29sYXRlCi0gICAgICAgIC8vIHRvIHRha2UgYSBSZW5kZXJPYmplY3QgYW5k
IGRvIHRoaXMgbG9naWMgdGhlcmUsIGJ1dCB0aGF0IHdvdWxkIGJlIGEgbGF5ZXJpbmcKLSAgICAg
ICAgLy8gdmlvbGF0aW9uIGZvciBCaWRpUmVzb2x2ZXIgKHdoaWNoIGtub3dzIG5vdGhpbmcgYWJv
dXQgUmVuZGVyT2JqZWN0KS4KLSAgICAgICAgUmVuZGVySW5saW5lKiBpc29sYXRlZElubGluZSA9
IGRvd25jYXN0PFJlbmRlcklubGluZT4oaGlnaGVzdENvbnRhaW5pbmdJc29sYXRlV2l0aGluUm9v
dChzdGFydE9iamVjdCwgY3VycmVudFJvb3QpKTsKLSAgICAgICAgQVNTRVJUKGlzb2xhdGVkSW5s
aW5lKTsKLQotICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXIgaXNvbGF0ZWRSZXNvbHZlcjsKLSAg
ICAgICAgRVVuaWNvZGVCaWRpIHVuaWNvZGVCaWRpID0gaXNvbGF0ZWRJbmxpbmUtPnN0eWxlKCku
dW5pY29kZUJpZGkoKTsKLSAgICAgICAgVGV4dERpcmVjdGlvbiBkaXJlY3Rpb247Ci0gICAgICAg
IGlmICh1bmljb2RlQmlkaSA9PSBQbGFpbnRleHQpCi0gICAgICAgICAgICBkZXRlcm1pbmVEaXJl
Y3Rpb25hbGl0eShkaXJlY3Rpb24sIElubGluZUl0ZXJhdG9yKGlzb2xhdGVkSW5saW5lLCAmaXNv
bGF0ZWRSdW4ub2JqZWN0LCAwKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQVNTRVJU
KHVuaWNvZGVCaWRpID09IElzb2xhdGUgfHwgdW5pY29kZUJpZGkgPT0gSXNvbGF0ZU92ZXJyaWRl
KTsKLSAgICAgICAgICAgIGRpcmVjdGlvbiA9IGlzb2xhdGVkSW5saW5lLT5zdHlsZSgpLmRpcmVj
dGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuc2V0U3RhdHVzKEJp
ZGlTdGF0dXMoZGlyZWN0aW9uLCBpc092ZXJyaWRlKHVuaWNvZGVCaWRpKSkpOwotCi0gICAgICAg
IHNldFVwUmVzb2x2ZXJUb1Jlc3VtZUluSXNvbGF0ZShpc29sYXRlZFJlc29sdmVyLCB0b3BSZXNv
bHZlciwgaXNvbGF0ZWRSdW4ucnVuVG9SZXBsYWNlLCBpc29sYXRlZElubGluZSwgJnN0YXJ0T2Jq
ZWN0KTsKLQotICAgICAgICAvLyBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaXMgdGhlIGJlZ2lubmlu
ZyBvZiB0aGUgZmlyc3QgcnVuIHdpdGhpbiB0aGUgaXNvbGF0ZSB0aGF0IHdhcyBpZGVudGlmaWVk
Ci0gICAgICAgIC8vIGR1cmluZyB0aGUgZWFybGllciBjYWxsIHRvIGNyZWF0ZUJpZGlSdW5zRm9y
TGluZS4gVGhpcyBjYW4gYmUgYnV0IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUKLSAgICAgICAgLy8g
Zmlyc3QgcnVuIHdpdGhpbiB0aGUgaXNvbGF0ZS4KLSAgICAgICAgSW5saW5lSXRlcmF0b3IgaXRl
ciA9IElubGluZUl0ZXJhdG9yKGlzb2xhdGVkSW5saW5lLCAmc3RhcnRPYmplY3QsIGlzb2xhdGVk
UnVuLnBvc2l0aW9uKTsKLSAgICAgICAgaXNvbGF0ZWRSZXNvbHZlci5zZXRQb3NpdGlvbklnbm9y
aW5nTmVzdGVkSXNvbGF0ZXMoaXRlcik7Ci0KLSAgICAgICAgLy8gV2Ugc3RvcCBhdCB0aGUgbmV4
dCBlbmQgb2YgbGluZTsgd2UgbWF5IHJlLWVudGVyIHRoaXMgaXNvbGF0ZSBpbiB0aGUgbmV4dCBj
YWxsIHRvIGNvbnN0cnVjdEJpZGlSdW5zKCkuCi0gICAgICAgIC8vIEZJWE1FOiBXaGF0IHNob3Vs
ZCBlbmQgYW5kIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSBiZT8KLSAgICAgICAgLy8gcm5pd2Eg
c2F5cyBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgaXMganVzdCBhIFdpbklFIGhhY2sgYW5kIGNv
dWxkIGFsd2F5cyBiZSBmYWxzZSBoZXJlPwotICAgICAgICBpc29sYXRlZFJlc29sdmVyLmNyZWF0
ZUJpZGlSdW5zRm9yTGluZShlbmRPZlJ1bnMsIE5vVmlzdWFsT3ZlcnJpZGUsIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIHRo
ZSBydW5zIGZyb20gdGhlIHJlc29sdmVyLgotICAgICAgICAvLyBXZSdyZSBub3QgZ3VhcmFudGVl
ZCB0byBnZXQgYW55IEJpZGlSdW5zIGluIHRoZSBwcmV2aW91cyBzdGVwLiBJZiB3ZSBkb24ndCwg
d2UgYWxsb3cgdGhlIHBsYWNlaG9sZGVyCi0gICAgICAgIC8vIGl0c2VsZiB0byBiZSB0dXJuZWQg
aW50byBhbiBJbmxpbmVCb3guIFdlIGNhbid0IHJlbW92ZSBpdCBoZXJlIHdpdGhvdXQgcG90ZW50
aWFsbHkgbG9zaW5nIHRyYWNrIG9mCi0gICAgICAgIC8vIHRoZSBsb2dpY2FsbHkgbGFzdCBydW4u
Ci0gICAgICAgIGlmIChpc29sYXRlZFJlc29sdmVyLnJ1bnMoKS5ydW5Db3VudCgpKQotICAgICAg
ICAgICAgYmlkaVJ1bnMucmVwbGFjZVJ1bldpdGhSdW5zKCZpc29sYXRlZFJ1bi5ydW5Ub1JlcGxh
Y2UsIGlzb2xhdGVkUmVzb2x2ZXIucnVucygpKTsKLQotICAgICAgICAvLyBJZiB3ZSBlbmNvdW50
ZXJlZCBhbnkgbmVzdGVkIGlzb2xhdGUgcnVucywganVzdCBtb3ZlIHRoZW0KLSAgICAgICAgLy8g
dG8gdGhlIHRvcCByZXNvbHZlcidzIGxpc3QgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCi0gICAgICAg
IHdoaWxlICghaXNvbGF0ZWRSZXNvbHZlci5pc29sYXRlZFJ1bnMoKS5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgICAgIGF1dG8gcnVuV2l0aENvbnRleHQgPSBXVEZNb3ZlKGlzb2xhdGVkUmVzb2x2ZXIu
aXNvbGF0ZWRSdW5zKCkubGFzdCgpKTsKLSAgICAgICAgICAgIGlzb2xhdGVkUmVzb2x2ZXIuaXNv
bGF0ZWRSdW5zKCkucmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgdG9wUmVzb2x2ZXIuc2V0V2hp
dGVzcGFjZUNvbGxhcHNpbmdUcmFuc2l0aW9uRm9ySXNvbGF0ZWRSdW4ocnVuV2l0aENvbnRleHQu
cnVuVG9SZXBsYWNlLCBpc29sYXRlZFJlc29sdmVyLndoaXRlc3BhY2VDb2xsYXBzaW5nVHJhbnNp
dGlvbkZvcklzb2xhdGVkUnVuKHJ1bldpdGhDb250ZXh0LnJ1blRvUmVwbGFjZSkpOwotICAgICAg
ICAgICAgdG9wUmVzb2x2ZXIuaXNvbGF0ZWRSdW5zKCkuYXBwZW5kKFdURk1vdmUocnVuV2l0aENv
bnRleHQpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBjb25zdHJ1
Y3RzIGxpbmUgYm94ZXMgZm9yIGFsbCBvZiB0aGUgdGV4dCBydW5zIGluIHRoZSByZXNvbHZlciBh
bmQgY29tcHV0ZXMgdGhlaXIgcG9zaXRpb24uCi1Sb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zs
b3c6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyh1bnNpZ25lZCBiaWRpTGV2ZWwsIEJpZGlS
dW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGlu
ZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25D
YWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1l
YXN1cmVtZW50cykKLXsKLSAgICBpZiAoIWJpZGlSdW5zLnJ1bkNvdW50KCkpCi0gICAgICAgIHJl
dHVybiBudWxscHRyOwotCi0gICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIG9ubHkgZG9uZSB3aGVu
IHdlIGhhZCBydW5zPwotICAgIGxpbmVJbmZvLnNldExhc3RMaW5lKCFlbmQucmVuZGVyZXIoKSk7
Ci0KLSAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY29uc3RydWN0TGluZShiaWRpUnVucywg
bGluZUluZm8pOwotICAgIGlmICghbGluZUJveCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0K
LSAgICBsaW5lQm94LT5zZXRCaWRpTGV2ZWwoYmlkaUxldmVsKTsKLSAgICBsaW5lQm94LT5zZXRF
bmRzV2l0aEJyZWFrKGxpbmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKTsKLSAgICAK
LSAgICBib29sIGlzU1ZHUm9vdElubGluZUJveCA9IGlzPFNWR1Jvb3RJbmxpbmVCb3g+KCpsaW5l
Qm94KTsKLSAgICAKLSAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94
RGF0YU1hcDsKLSAgICAKLSAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1
bnMgaG9yaXpvbnRhbGx5LgotICAgIGlmICghaXNTVkdSb290SW5saW5lQm94KQotICAgICAgICBj
b21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBsaW5lSW5mbywg
YmlkaVJ1bnMuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCksIHRleHRC
b3hEYXRhTWFwLCB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIHdvcmRNZWFzdXJlbWVudHMpOwotICAg
IAotICAgIC8vIE5vdyBwb3NpdGlvbiBvdXIgdGV4dCBydW5zIHZlcnRpY2FsbHkuCi0gICAgY29t
cHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBiaWRpUnVucy5maXJz
dFJ1bigpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNhY2hlKTsKLSAgICAKLSAg
ICAvLyBTVkcgdGV4dCBsYXlvdXQgY29kZSBjb21wdXRlcyB2ZXJ0aWNhbCAmIGhvcml6b250YWwg
cG9zaXRpb25zIG9uIGl0cyBvd24uCi0gICAgLy8gTm90ZSB0aGF0IHdlIHN0aWxsIG5lZWQgdG8g
ZXhlY3V0ZSBjb21wdXRlVmVydGljYWxQb3NpdGlvbnNGb3JMaW5lKCkgYXMKLSAgICAvLyBpdCBj
YWxscyBJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkxpbmVCb3goKSwgd2hpY2ggdHJhY2tzIHdoZXRo
ZXIgdGhlIGJveAotICAgIC8vIGNvbnRhaW5zIHJldmVyc2VkIHRleHQgb3Igbm90LiBJZiB3ZSB3
b3VsZG4ndCBkbyB0aGF0IGVkaXRpbmcgYW5kIHRodXMKLSAgICAvLyB0ZXh0IHNlbGVjdGlvbiBp
biBSVEwgYm94ZXMgd291bGQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuCi0gICAgaWYgKGlzU1ZHUm9v
dElubGluZUJveCkgewotICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihp
c1NWR1RleHQoKSk7Ci0gICAgICAgIGRvd25jYXN0PFNWR1Jvb3RJbmxpbmVCb3g+KCpsaW5lQm94
KS5jb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gQ29tcHV0ZSBvdXIgb3ZlcmZsb3cgbm93LgotICAgIGxpbmVCb3gtPmNvbXB1dGVPdmVy
ZmxvdyhsaW5lQm94LT5saW5lVG9wKCksIGxpbmVCb3gtPmxpbmVCb3R0b20oKSwgdGV4dEJveERh
dGFNYXApOwotICAgIAotICAgIHJldHVybiBsaW5lQm94OwotfQotCi1zdGF0aWMgdm9pZCBkZWxl
dGVMaW5lUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCog
c3RhcnRMaW5lLCBSb290SW5saW5lQm94KiBzdG9wTGluZSA9IDApCi17Ci0gICAgUm9vdElubGlu
ZUJveCogYm94VG9EZWxldGUgPSBzdGFydExpbmU7Ci0gICAgd2hpbGUgKGJveFRvRGVsZXRlICYm
IGJveFRvRGVsZXRlICE9IHN0b3BMaW5lKSB7Ci0gICAgICAgIGxheW91dFN0YXRlLnVwZGF0ZVJl
cGFpbnRSYW5nZUZyb21Cb3goYm94VG9EZWxldGUpOwotICAgICAgICAvLyBOb3RlOiBkZWxldGVM
aW5lUmFuZ2UoZmlyc3RSb290Qm94KCkpIGlzIG5vdCBpZGVudGljYWwgdG8gZGVsZXRlTGluZUJv
eFRyZWUoKS4KLSAgICAgICAgLy8gZGVsZXRlTGluZUJveFRyZWUgdXNlcyBuZXh0TGluZUJveCgp
IGluc3RlYWQgb2YgbmV4dFJvb3RCb3goKSB3aGVuIHRyYXZlcnNpbmcuCi0gICAgICAgIFJvb3RJ
bmxpbmVCb3gqIG5leHQgPSBib3hUb0RlbGV0ZS0+bmV4dFJvb3RCb3goKTsKLSAgICAgICAgYm94
VG9EZWxldGUtPmRlbGV0ZUxpbmUoKTsKLSAgICAgICAgYm94VG9EZWxldGUgPSBuZXh0OwotICAg
IH0KLX0KLQotc3RhdGljIHZvaWQgcmVwYWludERpcnR5RmxvYXRzKExpbmVMYXlvdXRTdGF0ZTo6
RmxvYXRMaXN0JiBmbG9hdHMpCi17Ci0gICAgLy8gRmxvYXRzIHRoYXQgZGlkIG5vdCBoYXZlIGxh
eW91dCBkaWQgbm90IHJlcGFpbnQgd2hlbiB3ZSBsYWlkIHRoZW0gb3V0LiBUaGV5IHdvdWxkIGhh
dmUKLSAgICAvLyBwYWludGVkIGJ5IG5vdyBpZiB0aGV5IGhhZCBtb3ZlZCwgYnV0IGlmIHRoZXkg
c3RheWVkIGF0ICgwLCAwKSwgdGhleSBzdGlsbCBuZWVkIHRvIGJlCi0gICAgLy8gcGFpbnRlZC4K
LSAgICBmb3IgKGF1dG8mIGZsb2F0Qm94IDogZmxvYXRzKSB7Ci0gICAgICAgIGlmIChmbG9hdEJv
eC0+ZXZlckhhZExheW91dCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8m
IGJveCA9IGZsb2F0Qm94LT5yZW5kZXJlcigpOwotICAgICAgICBpZiAoIWJveC54KCkgJiYgIWJv
eC55KCkgJiYgYm94LmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAg
Ym94LnJlcGFpbnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRS
dW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGJvb2wgaGFzSW5saW5l
Q2hpbGQpCi17Ci0gICAgLy8gV2Ugd2FudCB0byBza2lwIGFoZWFkIHRvIHRoZSBmaXJzdCBkaXJ0
eSBsaW5lCi0gICAgSW5saW5lQmlkaVJlc29sdmVyIHJlc29sdmVyOwotICAgIFJvb3RJbmxpbmVC
b3gqIHN0YXJ0TGluZSA9IGRldGVybWluZVN0YXJ0UG9zaXRpb24obGF5b3V0U3RhdGUsIHJlc29s
dmVyKTsKLSAgICAKLSAgICB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyA9IDA7
Ci0gICAgaWYgKHN0YXJ0TGluZSkgewotICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmUg
PSBzdGFydExpbmUtPnByZXZSb290Qm94KCk7IGxpbmUgJiYgbGluZS0+aXNIeXBoZW5hdGVkKCk7
IGxpbmUgPSBsaW5lLT5wcmV2Um9vdEJveCgpKQotICAgICAgICAgICAgY29uc2VjdXRpdmVIeXBo
ZW5hdGVkTGluZXMrKzsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyB3b3VsZCBtYWtlIG1v
cmUgc2Vuc2Ugb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLCBidXQgc2luY2UKLSAgICAvLyBkZXRl
cm1pbmVTdGFydFBvc2l0aW9uIGNhbiBjaGFuZ2UgdGhlIGZ1bGxMYXlvdXQgZmxhZyB3ZSBoYXZl
IHRvIGRvIHRoaXMgaGVyZS4gRmFpbHVyZSB0byBjYWxsCi0gICAgLy8gZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbiBmaXJzdCB3aWxsIGJyZWFrIGZhc3QvcmVwYWludC9saW5lLWZsb3ctd2l0aC1mbG9h
dHMtOS5odG1sLgotICAgIGlmIChsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAmJiBoYXNJbmxp
bmVDaGlsZCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgc2V0TmVlZHNMYXlvdXQo
TWFya09ubHlUaGlzKTsgLy8gTWFyayBhcyBuZWVkaW5nIGEgZnVsbCBsYXlvdXQgdG8gZm9yY2Ug
dXMgdG8gcmVwYWludC4KLSAgICAgICAgaWYgKCF2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29u
dGV4dCgpLm5lZWRzRnVsbFJlcGFpbnQoKSAmJiBoYXNTZWxmUGFpbnRpbmdMYXllcigpICYmIGhh
c1JlcGFpbnRMYXlvdXRSZWN0cygpKSB7Ci0gICAgICAgICAgICAvLyBCZWNhdXNlIHdlIHdhaXRl
ZCB1bnRpbCB3ZSB3ZXJlIGFscmVhZHkgaW5zaWRlIGxheW91dCB0byBkaXNjb3ZlcgotICAgICAg
ICAgICAgLy8gdGhhdCB0aGUgYmxvY2sgcmVhbGx5IG5lZWRlZCBhIGZ1bGwgbGF5b3V0LCB3ZSBt
aXNzZWQgb3VyIGNoYW5jZSB0byByZXBhaW50IHRoZSBsYXllcgotICAgICAgICAgICAgLy8gYmVm
b3JlIGxheW91dCBzdGFydGVkLiAgTHVja2lseSB0aGUgbGF5ZXIgaGFzIGNhY2hlZCB0aGUgcmVw
YWludCByZWN0IGZvciBpdHMgb3JpZ2luYWwKLSAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFuZCBz
aXplLCBhbmQgc28gd2UgY2FuIHVzZSB0aGF0IHRvIG1ha2UgYSByZXBhaW50IGhhcHBlbiBub3cu
Ci0gICAgICAgICAgICByZXBhaW50VXNpbmdDb250YWluZXIoY29udGFpbmVyRm9yUmVwYWludCgp
LCByZXBhaW50TGF5b3V0UmVjdHMoKS5tX3JlcGFpbnRSZWN0KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGlmIChjb250YWluc0Zsb2F0cygpKQotICAgICAgICBsYXlvdXRTdGF0ZS5mbG9hdExp
c3QoKS5zZXRMYXN0RmxvYXQobV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmxhc3QoKS5nZXQoKSk7
Ci0KLSAgICAvLyBXZSBhbHNvIGZpbmQgdGhlIGZpcnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJhY3Qg
dGhlc2UgbGluZXMuICBXZSB3aWxsIGFkZCB0aGVtIGJhY2sKLSAgICAvLyBpZiB3ZSBkZXRlcm1p
bmUgdGhhdCB3ZSdyZSBhYmxlIHRvIHN5bmNocm9uaXplIGFmdGVyIGhhbmRsaW5nIGFsbCBvdXIg
ZGlydHkgbGluZXMuCi0gICAgSW5saW5lSXRlcmF0b3IgY2xlYW5MaW5lU3RhcnQ7Ci0gICAgQmlk
aVN0YXR1cyBjbGVhbkxpbmVCaWRpU3RhdHVzOwotICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxs
TGF5b3V0KCkgJiYgc3RhcnRMaW5lKQotICAgICAgICBkZXRlcm1pbmVFbmRQb3NpdGlvbihsYXlv
dXRTdGF0ZSwgc3RhcnRMaW5lLCBjbGVhbkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cyk7
Ci0KLSAgICBpZiAoc3RhcnRMaW5lKSB7Ci0gICAgICAgIGlmICghbGF5b3V0U3RhdGUudXNlc1Jl
cGFpbnRCb3VuZHMoKSkKLSAgICAgICAgICAgIGxheW91dFN0YXRlLnNldFJlcGFpbnRSYW5nZShs
b2dpY2FsSGVpZ2h0KCkpOwotICAgICAgICBkZWxldGVMaW5lUmFuZ2UobGF5b3V0U3RhdGUsIHN0
YXJ0TGluZSk7Ci0gICAgfQotCi0gICAgaWYgKCFsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSAm
JiBsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmVuZHNXaXRoQnJlYWsoKSkgewotICAg
ICAgICAvLyBJZiB0aGUgbGFzdCBsaW5lIGJlZm9yZSB0aGUgc3RhcnQgbGluZSBlbmRzIHdpdGgg
YSBsaW5lIGJyZWFrIHRoYXQgY2xlYXIgZmxvYXRzLAotICAgICAgICAvLyBhZGp1c3QgdGhlIGhl
aWdodCBhY2NvcmRpbmdseS4KLSAgICAgICAgLy8gQSBsaW5lIGJyZWFrIGNhbiBiZSBlaXRoZXIg
dGhlIGZpcnN0IG9yIHRoZSBsYXN0IG9iamVjdCBvbiBhIGxpbmUsIGRlcGVuZGluZyBvbiBpdHMg
ZGlyZWN0aW9uLgotICAgICAgICBpZiAoSW5saW5lQm94KiBsYXN0TGVhZkNoaWxkID0gbGFzdFJv
b3RCb3goKS0+bGFzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIGxh
c3RPYmplY3QgPSAmbGFzdExlYWZDaGlsZC0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIGlmICgh
bGFzdE9iamVjdC0+aXNCUigpKQotICAgICAgICAgICAgICAgIGxhc3RPYmplY3QgPSAmbGFzdFJv
b3RCb3goKS0+Zmlyc3RMZWFmQ2hpbGQoKS0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIGlmIChs
YXN0T2JqZWN0LT5pc0JSKCkpIHsKLSAgICAgICAgICAgICAgICBDbGVhciBjbGVhciA9IGxhc3RP
YmplY3QtPnN0eWxlKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xlYXIgIT0gQ2xl
YXI6Ok5vbmUpCi0gICAgICAgICAgICAgICAgICAgIGNsZWFyRmxvYXRzKGNsZWFyKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGxheW91dFJ1bnNBbmRGbG9hdHNJblJh
bmdlKGxheW91dFN0YXRlLCByZXNvbHZlciwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlT
dGF0dXMsIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKLSAgICBsaW5rVG9FbmRMaW5lSWZO
ZWVkZWQobGF5b3V0U3RhdGUpOwotICAgIHJlcGFpbnREaXJ0eUZsb2F0cyhsYXlvdXRTdGF0ZS5m
bG9hdExpc3QoKSk7Ci19Ci0KLS8vIEJlZm9yZSByZXN0YXJ0aW5nIHRoZSBsYXlvdXQgbG9vcCB3
aXRoIGEgbmV3IGxvZ2ljYWxIZWlnaHQsIHJlbW92ZSBhbGwgZmxvYXRzIHRoYXQgd2VyZSBhZGRl
ZCBhbmQgcmVzZXQgdGhlIHJlc29sdmVyLgotaW5saW5lIGNvbnN0IElubGluZUl0ZXJhdG9yJiBS
ZW5kZXJCbG9ja0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRV
bml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0
aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImIG9sZEVuZCkKLXsKLSAgICByZW1vdmVG
bG9hdGluZ09iamVjdHNCZWxvdyhsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBvbGRMb2dpY2Fs
SGVpZ2h0KTsKLSAgICBzZXRMb2dpY2FsSGVpZ2h0KG5ld0xvZ2ljYWxIZWlnaHQpOwotICAgIHJl
c29sdmVyLnNldFBvc2l0aW9uSWdub3JpbmdOZXN0ZWRJc29sYXRlcyhvbGRFbmQpOwotICAgIHJl
dHVybiBvbGRFbmQ7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxv
YXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0
IEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZVRvVXNlID0gc3R5
bGUoKTsKLSAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250
ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgp
LmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7Ci0gICAgTGluZVdoaXRlc3BhY2VDb2xsYXBz
aW5nU3RhdGUmIGxpbmVXaGl0ZXNwYWNlQ29sbGFwc2luZ1N0YXRlID0gcmVzb2x2ZXIud2hpdGVz
cGFjZUNvbGxhcHNpbmdTdGF0ZSgpOwotICAgIElubGluZUl0ZXJhdG9yIGVuZCA9IHJlc29sdmVy
LnBvc2l0aW9uKCk7Ci0gICAgYm9vbCBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGxheW91dFN0YXRl
LmVuZExpbmUoKTsKLSAgICBSZW5kZXJUZXh0SW5mbyByZW5kZXJUZXh0SW5mbzsKLSAgICBWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwotCi0gICAgTGluZUJyZWFr
ZXIgbGluZUJyZWFrZXIoKnRoaXMpOwotCi0gICAgd2hpbGUgKCFlbmQuYXRFbmQoKSkgewotICAg
ICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBuZWNlc3NhcnkgYmVmb3JlIHRoZSBmaXJzdCBp
dGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRvIHRoZSBlbmQ/Ci0gICAgICAgIGlmIChjaGVj
a0ZvckVuZExpbmVNYXRjaCkgewotICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZU1h
dGNoZWQobWF0Y2hlZEVuZExpbmUobGF5b3V0U3RhdGUsIHJlc29sdmVyLCBjbGVhbkxpbmVTdGFy
dCwgY2xlYW5MaW5lQmlkaVN0YXR1cykpOwotICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlLmVu
ZExpbmVNYXRjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihJ
bmxpbmVJdGVyYXRvcihyZXNvbHZlci5wb3NpdGlvbigpLnJvb3QoKSwgMCwgMCksIDApOwotICAg
ICAgICAgICAgICAgIGxheW91dFN0YXRlLm1hcmdpbkluZm8oKS5jbGVhck1hcmdpbigpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
bGluZVdoaXRlc3BhY2VDb2xsYXBzaW5nU3RhdGUucmVzZXQoKTsKLQotICAgICAgICBsYXlvdXRT
dGF0ZS5saW5lSW5mbygpLnNldEVtcHR5KHRydWUpOwotICAgICAgICBsYXlvdXRTdGF0ZS5saW5l
SW5mbygpLnJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGNvbnN0
IElubGluZUl0ZXJhdG9yIG9sZEVuZCA9IGVuZDsKLSAgICAgICAgYm9vbCBpc05ld1VCQVBhcmFn
cmFwaCA9IGxheW91dFN0YXRlLmxpbmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCk7
Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lID0gKGNv
bnRhaW5zRmxvYXRzKCkpID8gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmxhc3QoKS5nZXQoKSA6
IG51bGxwdHI7Ci0KLSAgICAgICAgV29yZE1lYXN1cmVtZW50cyB3b3JkTWVhc3VyZW1lbnRzOwot
ICAgICAgICBlbmQgPSBsaW5lQnJlYWtlci5uZXh0TGluZUJyZWFrKHJlc29sdmVyLCBsYXlvdXRT
dGF0ZS5saW5lSW5mbygpLCByZW5kZXJUZXh0SW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIHdvcmRNZWFzdXJlbWVudHMpOwotICAgICAg
ICBjYWNoZVByaW9yQ2hhcmFjdGVyc0lmTmVlZGVkKHJlbmRlclRleHRJbmZvLmxpbmVCcmVha0l0
ZXJhdG9yKTsKLSAgICAgICAgcmVuZGVyVGV4dEluZm8ubGluZUJyZWFrSXRlcmF0b3IucmVzZXRQ
cmlvckNvbnRleHQoKTsKLSAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkg
ewotICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBjcmVhdGluZyBhbnkgcnVu
cyBpbiBuZXh0TGluZUJyZWFrIHRvIGJlZ2luIHdpdGghCi0gICAgICAgICAgICAvLyBPbmNlIEJp
ZGlSdW5MaXN0IGlzIHNlcGFyYXRlZCBmcm9tIEJpZGlSZXNvbHZlciB0aGlzIHdpbGwgbm90IGJl
IG5lZWRlZC4KLSAgICAgICAgICAgIHJlc29sdmVyLnJ1bnMoKS5jbGVhcigpOwotICAgICAgICAg
ICAgcmVzb2x2ZXIubWFya0N1cnJlbnRSdW5FbXB0eSgpOyAvLyBGSVhNRTogVGhpcyBjYW4gcHJv
YmFibHkgYmUgcmVwbGFjZWQgYnkgYW4gQVNTRVJUIChvciBqdXN0IHJlbW92ZWQpLgotICAgICAg
ICAgICAgbGF5b3V0U3RhdGUuc2V0Q2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUodHJ1ZSk7Ci0g
ICAgICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihJbmxpbmVJdGVyYXRvcihyZXNvbHZlci5w
b3NpdGlvbigpLnJvb3QoKSwgMCwgMCksIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICBBU1NFUlQoZW5kICE9IHJlc29sdmVyLnBvc2l0aW9uKCkpOwotCi0gICAg
ICAgIC8vIFRoaXMgaXMgYSBzaG9ydC1jdXQgZm9yIGVtcHR5IGxpbmVzLgotICAgICAgICBpZiAo
bGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChsYXN0
Um9vdEJveCgpKQotICAgICAgICAgICAgICAgIGxhc3RSb290Qm94KCktPnNldExpbmVCcmVha0lu
Zm8oZW5kLnJlbmRlcmVyKCksIGVuZC5vZmZzZXQoKSwgcmVzb2x2ZXIuc3RhdHVzKCkpOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgVmlzdWFsRGlyZWN0aW9uT3ZlcnJpZGUgb3ZlcnJp
ZGUgPSAoc3R5bGVUb1VzZS5ydGxPcmRlcmluZygpID09IE9yZGVyOjpWaXN1YWwgPyAoc3R5bGVU
b1VzZS5kaXJlY3Rpb24oKSA9PSBUZXh0RGlyZWN0aW9uOjpMVFIgPyBWaXN1YWxMZWZ0VG9SaWdo
dE92ZXJyaWRlIDogVmlzdWFsUmlnaHRUb0xlZnRPdmVycmlkZSkgOiBOb1Zpc3VhbE92ZXJyaWRl
KTsKLQotICAgICAgICAgICAgaWYgKGlzTmV3VUJBUGFyYWdyYXBoICYmIHN0eWxlVG9Vc2UudW5p
Y29kZUJpZGkoKSA9PSBQbGFpbnRleHQgJiYgIXJlc29sdmVyLmNvbnRleHQoKS0+cGFyZW50KCkp
IHsKLSAgICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0eWxlVG9Vc2Uu
ZGlyZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoZGly
ZWN0aW9uLCByZXNvbHZlci5wb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5z
ZXRTdGF0dXMoQmlkaVN0YXR1cyhkaXJlY3Rpb24sIGlzT3ZlcnJpZGUoc3R5bGVUb1VzZS51bmlj
b2RlQmlkaSgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMg
b3duZXJzaGlwIGlzIHJldmVyc2VkLiBXZSBzaG91bGQgb3duIHRoZSBCaWRpUnVuTGlzdCBhbmQg
cGFzcyBpdCB0byBjcmVhdGVCaWRpUnVuc0ZvckxpbmUuCi0gICAgICAgICAgICBCaWRpUnVuTGlz
dDxCaWRpUnVuPiYgYmlkaVJ1bnMgPSByZXNvbHZlci5ydW5zKCk7Ci0gICAgICAgICAgICBjb25z
dHJ1Y3RCaWRpUnVuc0ZvclNlZ21lbnQocmVzb2x2ZXIsIGJpZGlSdW5zLCBlbmQsIG92ZXJyaWRl
LCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKTsKLSAg
ICAgICAgICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlvbigpID09IGVuZCk7Ci0KLSAgICAgICAg
ICAgIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4gPSAhbGF5b3V0U3RhdGUubGluZUluZm8oKS5w
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSA/IGhhbmRsZVRyYWlsaW5nU3BhY2VzKGJpZGlSdW5z
LCByZXNvbHZlci5jb250ZXh0KCkpIDogbnVsbHB0cjsKLQotICAgICAgICAgICAgaWYgKGJpZGlS
dW5zLnJ1bkNvdW50KCkgJiYgbGluZUJyZWFrZXIubGluZVdhc0h5cGhlbmF0ZWQoKSkgewotICAg
ICAgICAgICAgICAgIGJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+bV9oYXNIeXBoZW4gPSB0
cnVlOwotICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKys7Ci0gICAg
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cyA9IDA7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBydW5zIGhhdmUgYmVlbiBvcmRl
cmVkLCB3ZSBjcmVhdGUgdGhlIGxpbmUgYm94ZXMuCi0gICAgICAgICAgICAvLyBBdCB0aGUgc2Ft
ZSB0aW1lIHdlIGZpZ3VyZSBvdXQgd2hlcmUgYm9yZGVyL3BhZGRpbmcvbWFyZ2luIHNob3VsZCBi
ZSBhcHBsaWVkIGZvcgotICAgICAgICAgICAgLy8gaW5saW5lIGZsb3cgYm94ZXMuCi0KLSAgICAg
ICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsKLSAg
ICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmVCb3ggPSBjcmVhdGVMaW5lQm94ZXNGcm9tQmlk
aVJ1bnMocmVzb2x2ZXIuc3RhdHVzKCkuY29udGV4dC0+bGV2ZWwoKSwgYmlkaVJ1bnMsIGVuZCwg
bGF5b3V0U3RhdGUubGluZUluZm8oKSwgdmVydGljYWxQb3NpdGlvbkNhY2hlLCB0cmFpbGluZ1Nw
YWNlUnVuLCB3b3JkTWVhc3VyZW1lbnRzKTsKLQotICAgICAgICAgICAgYmlkaVJ1bnMuY2xlYXIo
KTsKLSAgICAgICAgICAgIHJlc29sdmVyLm1hcmtDdXJyZW50UnVuRW1wdHkoKTsgLy8gRklYTUU6
IFRoaXMgY2FuIHByb2JhYmx5IGJlIHJlcGxhY2VkIGJ5IGFuIEFTU0VSVCAob3IganVzdCByZW1v
dmVkKS4KLQotICAgICAgICAgICAgaWYgKGxpbmVCb3gpIHsKLSAgICAgICAgICAgICAgICBsaW5l
Qm94LT5zZXRMaW5lQnJlYWtJbmZvKGVuZC5yZW5kZXJlcigpLCBlbmQub2Zmc2V0KCksIHJlc29s
dmVyLnN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUudXNlc1JlcGFp
bnRCb3VuZHMoKSkKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWlu
dFJhbmdlRnJvbUJveChsaW5lQm94KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAg
ICBMYXlvdXRVbml0IGFkanVzdG1lbnQ7Ci0gICAgICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3NG
cmFnbWVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGxheW91
dFN0YXRlLm1hcmdpbkluZm8oKS5zZXRBdEJlZm9yZVNpZGVPZkJsb2NrKGZhbHNlKTsKLQotICAg
ICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIGFkanVzdExp
bmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgYWRqdXN0bWVudCwgb3ZlcmZsb3dzRnJh
Z21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOwotICAgICAgICAgICAgICAgIGlm
IChhZGp1c3RtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIEluZGVudFRleHRPck5vdCBzaG91
bGRJbmRlbnRUZXh0ID0gbGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0ZpcnN0TGluZSgpID8gSW5k
ZW50VGV4dCA6IERvTm90SW5kZW50VGV4dDsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0VW5p
dCBvbGRMaW5lV2lkdGggPSBhdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKG9sZExvZ2ljYWxI
ZWlnaHQsIHNob3VsZEluZGVudFRleHQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lQm94LT5h
ZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9uKGFkanVzdG1lbnQpOwotICAgICAgICAgICAgICAg
ICAgICBpZiAobGF5b3V0U3RhdGUudXNlc1JlcGFpbnRCb3VuZHMoKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZUJveCk7
Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUo
b2xkTG9naWNhbEhlaWdodCArIGFkanVzdG1lbnQsIHNob3VsZEluZGVudFRleHQpICE9IG9sZExp
bmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBkZWxldGUg
dGhpcyBsaW5lLCByZW1vdmUgYWxsIGZsb2F0cyB0aGF0IGdvdCBhZGRlZCwgYW5kIGxldCBsaW5l
IGxheW91dCByZS1ydW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQm94LT5kZWxldGVM
aW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSByZXN0YXJ0TGF5b3V0UnVuc0Fu
ZEZsb2F0c0luUmFuZ2Uob2xkTG9naWNhbEhlaWdodCwgb2xkTG9naWNhbEhlaWdodCArIGFkanVz
dG1lbnQsIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHJlc29sdmVyLCBvbGRFbmQpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3gtPmxpbmVCb3R0b21X
aXRoTGVhZGluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB1
cGRhdGVGcmFnbWVudEZvckxpbmUobGluZUJveCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5l
QnJlYWtlci5wb3NpdGlvbmVkT2JqZWN0cygpLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc2V0
U3RhdGljUG9zaXRpb25zKCp0aGlzLCAqbGluZUJyZWFrZXIucG9zaXRpb25lZE9iamVjdHMoKVtp
XSwgRG9Ob3RJbmRlbnRUZXh0KTsKLQotICAgICAgICBpZiAoIWxheW91dFN0YXRlLmxpbmVJbmZv
KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnNldEZp
cnN0TGluZShmYWxzZSk7Ci0gICAgICAgICAgICBjbGVhckZsb2F0cyhsaW5lQnJlYWtlci5jbGVh
cigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBsYXN0
Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgICAgICAgICBhdXRv
IGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKLSAgICAgICAgICAgIGF1dG8gZW5kID0g
ZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgICAgICAgICBpZiAoYXV0byogbGFzdEZsb2F0
ID0gbGF5b3V0U3RhdGUuZmxvYXRMaXN0KCkubGFzdEZsb2F0KCkpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvIGxhc3RGbG9hdEl0ZXJhdG9yID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZChsYXN0Rmxv
YXQpOwotICAgICAgICAgICAgICAgIEFTU0VSVChsYXN0RmxvYXRJdGVyYXRvciAhPSBlbmQpOwot
ICAgICAgICAgICAgICAgICsrbGFzdEZsb2F0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaXQg
PSBsYXN0RmxvYXRJdGVyYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBmbG9hdGluZ09iamVjdCA9
ICppdDsKLSAgICAgICAgICAgICAgICBhcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoKmZs
b2F0aW5nT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAvLyBJZiBhIGZsb2F0J3MgZ2VvbWV0cnkg
aGFzIGNoYW5nZWQsIGdpdmUgdXAgb24gc3luY2luZyB3aXRoIGNsZWFuIGxpbmVzLgotICAgICAg
ICAgICAgICAgIGF1dG8qIGZsb2F0V2l0aFJlY3QgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5m
bG9hdFdpdGhSZWN0KGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgICAg
ICBpZiAoIWZsb2F0V2l0aFJlY3QgfHwgZmxvYXRXaXRoUmVjdC0+cmVjdCgpICE9IGZsb2F0aW5n
T2JqZWN0LT5mcmFtZVJlY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tGb3JFbmRMaW5l
TWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxheW91dFN0YXRlLmZs
b2F0TGlzdCgpLnNldExhc3RGbG9hdCghZmxvYXRpbmdPYmplY3RTZXQuaXNFbXB0eSgpID8gZmxv
YXRpbmdPYmplY3RTZXQubGFzdCgpLmdldCgpIDogbnVsbHB0cik7Ci0gICAgICAgIH0KLQotICAg
ICAgICBsaW5lV2hpdGVzcGFjZUNvbGxhcHNpbmdTdGF0ZS5yZXNldCgpOwotICAgICAgICByZXNv
bHZlci5zZXRQb3NpdGlvbihlbmQsIG51bWJlck9mSXNvbGF0ZUFuY2VzdG9ycyhlbmQpKTsKLSAg
ICB9Ci0KLSAgICAvLyBJbiBjYXNlIHdlIGFscmVhZHkgYWRqdXN0ZWQgdGhlIGxpbmUgcG9zaXRp
b25zIGR1cmluZyB0aGlzIGxheW91dCB0byBhdm9pZCB3aWRvd3MKLSAgICAvLyB0aGVuIHdlIG5l
ZWQgdG8gaWdub3JlIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcgYSBuZXcgd2lkb3dzIHNpdHVh
dGlvbi4KLSAgICAvLyBPdGhlcndpc2UsIHdlIHJpc2sgbGVhdmluZyBlbXB0eSBjb250YWluZXJz
IHdoaWNoIGlzIGFnYWluc3QgdGhlIGJsb2NrIGZyYWdtZW50YXRpb24gcHJpbmNpcGxlcy4KLSAg
ICBpZiAocGFnaW5hdGVkICYmICFzdHlsZSgpLmhhc0F1dG9XaWRvd3MoKSAmJiAhZGlkQnJlYWtB
dExpbmVUb0F2b2lkV2lkb3coKSkgewotICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBib3hlcyB0
byBtYWtlIHN1cmUgd2UgZGlkbid0IGNyZWF0ZSB1bmFjY2VwdGFibGUgd2lkb3dzLgotICAgICAg
ICAvLyBIb3dldmVyLCB3ZSdsbCBwcmlvcml0aXplIG9ycGhhbnMgLSBzbyBub3RoaW5nIHdlIGRv
IGhlcmUgc2hvdWxkIGNyZWF0ZQotICAgICAgICAvLyBhIG5ldyBvcnBoYW4uCi0KLSAgICAgICAg
Um9vdElubGluZUJveCogbGluZUJveCA9IGxhc3RSb290Qm94KCk7Ci0KLSAgICAgICAgLy8gQ291
bnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBibG9jayBiYWNrd2FyZHMsIHRvIHNlZSBob3cgbWFueSBo
YW5naW5nCi0gICAgICAgIC8vIGxpbmVzIHdlIGhhdmUuCi0gICAgICAgIFJvb3RJbmxpbmVCb3gq
IGZpcnN0TGluZUluQmxvY2sgPSBmaXJzdFJvb3RCb3goKTsKLSAgICAgICAgaW50IG51bUxpbmVz
SGFuZ2luZyA9IDE7Ci0gICAgICAgIHdoaWxlIChsaW5lQm94ICYmIGxpbmVCb3ggIT0gZmlyc3RM
aW5lSW5CbG9jayAmJiAhbGluZUJveC0+aXNGaXJzdEFmdGVyUGFnZUJyZWFrKCkpIHsKLSAgICAg
ICAgICAgICsrbnVtTGluZXNIYW5naW5nOwotICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gt
PnByZXZSb290Qm94KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5v
IGJyZWFrcyBpbiB0aGUgYmxvY2ssIHdlIGRpZG4ndCBjcmVhdGUgYW55IHdpZG93cy4KLSAgICAg
ICAgaWYgKCFsaW5lQm94IHx8ICFsaW5lQm94LT5pc0ZpcnN0QWZ0ZXJQYWdlQnJlYWsoKSB8fCBs
aW5lQm94ID09IGZpcnN0TGluZUluQmxvY2spCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAg
ICAgaWYgKG51bUxpbmVzSGFuZ2luZyA8IHN0eWxlKCkud2lkb3dzKCkpIHsKLSAgICAgICAgICAg
IC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYSB3aWRvdy4gTm93IHdlIG5lZWQgdG8gd29yayBvdXQgaG93
IG1hbnkKLSAgICAgICAgICAgIC8vIGxpbmVzIHRoZXJlIGFyZSBvbiB0aGUgcHJldmlvdXMgcGFn
ZSwgYW5kIGhvdyBtYW55IHdlIG5lZWQKLSAgICAgICAgICAgIC8vIHRvIHN0ZWFsLgotICAgICAg
ICAgICAgaW50IG51bUxpbmVzTmVlZGVkID0gc3R5bGUoKS53aWRvd3MoKSAtIG51bUxpbmVzSGFu
Z2luZzsKLSAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGN1cnJlbnRGaXJzdExpbmVPZk5ld1Bh
Z2UgPSBsaW5lQm94OwotCi0gICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVz
IGluIHRoZSBwcmV2aW91cyBwYWdlLgotICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gtPnBy
ZXZSb290Qm94KCk7Ci0gICAgICAgICAgICBpbnQgbnVtTGluZXNJblByZXZpb3VzUGFnZSA9IDE7
Ci0gICAgICAgICAgICB3aGlsZSAobGluZUJveCAmJiBsaW5lQm94ICE9IGZpcnN0TGluZUluQmxv
Y2sgJiYgIWxpbmVCb3gtPmlzRmlyc3RBZnRlclBhZ2VCcmVhaygpKSB7Ci0gICAgICAgICAgICAg
ICAgKytudW1MaW5lc0luUHJldmlvdXNQYWdlOwotICAgICAgICAgICAgICAgIGxpbmVCb3ggPSBs
aW5lQm94LT5wcmV2Um9vdEJveCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJ
ZiB0aGVyZSB3YXMgYW4gZXhwbGljaXQgdmFsdWUgZm9yIG9ycGhhbnMsIHJlc3BlY3QgdGhhdC4g
SWYgbm90LCB3ZSBzdGlsbAotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGNyZWF0ZSBhIHNpdHVh
dGlvbiB3aGVyZSB3ZSBtYWtlIGFuIG9ycGhhbiBiaWdnZXIgdGhhbiB0aGUgaW5pdGlhbCB2YWx1
ZS4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBzZXR0aW5nIHdpZG93cyBpbXBsaWVz
IHdlIGFsc28gY2FyZSBhYm91dCBvcnBoYW5zLCBidXQgZ2l2ZW4KLSAgICAgICAgICAgIC8vIHRo
ZSBzcGVjaWZpY2F0aW9uIHNheXMgdGhlIGluaXRpYWwgb3JwaGFuIHZhbHVlIGlzIG5vbi16ZXJv
LCB0aGlzIGlzIG9rLiBUaGUKLSAgICAgICAgICAgIC8vIGF1dGhvciBpcyBhbHdheXMgZnJlZSB0
byBzZXQgb3JwaGFucyBleHBsaWNpdGx5IGFzIHdlbGwuCi0gICAgICAgICAgICBpbnQgb3JwaGFu
cyA9IHN0eWxlKCkuaGFzQXV0b09ycGhhbnMoKSA/IHN0eWxlKCkuaW5pdGlhbE9ycGhhbnMoKSA6
IHN0eWxlKCkub3JwaGFucygpOwotICAgICAgICAgICAgaW50IG51bUxpbmVzQXZhaWxhYmxlID0g
bnVtTGluZXNJblByZXZpb3VzUGFnZSAtIG9ycGhhbnM7Ci0gICAgICAgICAgICBpZiAobnVtTGlu
ZXNBdmFpbGFibGUgPD0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAg
IGludCBudW1MaW5lc1RvVGFrZSA9IHN0ZDo6bWluKG51bUxpbmVzQXZhaWxhYmxlLCBudW1MaW5l
c05lZWRlZCk7Ci0gICAgICAgICAgICAvLyBXaW5kIGJhY2sgZnJvbSBvdXIgZmlyc3Qgd2lkb3dl
ZCBsaW5lLgotICAgICAgICAgICAgbGluZUJveCA9IGN1cnJlbnRGaXJzdExpbmVPZk5ld1BhZ2U7
Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpbmVzVG9UYWtlOyArK2kpCi0g
ICAgICAgICAgICAgICAgbGluZUJveCA9IGxpbmVCb3gtPnByZXZSb290Qm94KCk7Ci0KLSAgICAg
ICAgICAgIC8vIFdlIG5vdyB3YW50IHRvIGJyZWFrIGF0IHRoaXMgbGluZS4gUmVtZW1iZXIgZm9y
IG5leHQgbGF5b3V0IGFuZCB0cmlnZ2VyIHJlbGF5b3V0LgotICAgICAgICAgICAgc2V0QnJlYWtB
dExpbmVUb0F2b2lkV2lkb3cobGluZUNvdW50KGxpbmVCb3gpKTsKLSAgICAgICAgICAgIG1hcmtM
aW5lc0RpcnR5SW5CbG9ja1JhbmdlKGxhc3RSb290Qm94KCktPmxpbmVCb3R0b21XaXRoTGVhZGlu
ZygpLCBsaW5lQm94LT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGluZUJveCk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgY2xlYXJEaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpOwotfQotCi12
b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVhdHRhY2hDbGVhbkxpbmVGbG9hdHMoUm9vdElubGluZUJv
eCYgY2xlYW5MaW5lLCBMYXlvdXRVbml0IGRlbHRhLCBib29sIGlzRmlyc3RDbGVhbkxpbmUpCi17
Ci0gICAgYXV0byogY2xlYW5MaW5lRmxvYXRzID0gY2xlYW5MaW5lLmZsb2F0c1B0cigpOwotICAg
IGlmICghY2xlYW5MaW5lRmxvYXRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKGF1dG8m
IGZsb2F0aW5nQm94IDogKmNsZWFuTGluZUZsb2F0cykgewotICAgICAgICBpZiAoIWZsb2F0aW5n
Qm94KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8qIGZsb2F0aW5nT2JqZWN0
ID0gaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmZsb2F0aW5nQm94KTsKLSAgICAgICAgaWYgKGlzRmly
c3RDbGVhbkxpbmUgJiYgZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKSB7Ci0gICAg
ICAgICAgICAvLyBGbG9hdCBib3ggZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbGluZSBhbnltb3Jl
LgotICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oY2xlYW5MaW5l
LnByZXZSb290Qm94KCkgPT0gZmxvYXRpbmdPYmplY3QtPm9yaWdpbmF0aW5nTGluZSgpKTsKLSAg
ICAgICAgICAgIGNsZWFuTGluZS5yZW1vdmVGbG9hdCgqZmxvYXRpbmdCb3gpOwotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1Q
TElDQVRJT04oIWZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7Ci0gICAgICAgIGZs
b2F0aW5nT2JqZWN0LT5zZXRPcmlnaW5hdGluZ0xpbmUoY2xlYW5MaW5lKTsKLSAgICAgICAgc2V0
TG9naWNhbEhlaWdodChsb2dpY2FsVG9wRm9yQ2hpbGQoKmZsb2F0aW5nQm94KSAtIG1hcmdpbkJl
Zm9yZUZvckNoaWxkKCpmbG9hdGluZ0JveCkgKyBkZWx0YSk7Ci0gICAgICAgIHBvc2l0aW9uTmV3
RmxvYXRzKCk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6bGlua1RvRW5kTGlu
ZUlmTmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCi17Ci0gICAgYXV0byogZmly
c3RDbGVhbkxpbmUgPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7Ci0gICAgaWYgKGZpcnN0Q2xlYW5M
aW5lKSB7Ci0gICAgICAgIGlmIChsYXlvdXRTdGF0ZS5lbmRMaW5lTWF0Y2hlZCgpKSB7Ci0gICAg
ICAgICAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0
KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxh
eW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7Ci0gICAgICAgICAgICAvLyBBdHRhY2ggYWxsIHRo
ZSByZW1haW5pbmcgbGluZXMsIGFuZCB0aGVuIGFkanVzdCB0aGVpciB5LXBvc2l0aW9ucyBhcyBu
ZWVkZWQuCi0gICAgICAgICAgICBMYXlvdXRVbml0IGRlbHRhID0gbG9naWNhbEhlaWdodCgpIC0g
bGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsKLSAgICAgICAgICAgIGZvciAoYXV0byog
bGluZSA9IGZpcnN0Q2xlYW5MaW5lOyBsaW5lOyBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkg
ewotICAgICAgICAgICAgICAgIGxpbmUtPmF0dGFjaExpbmUoKTsKLSAgICAgICAgICAgICAgICBp
ZiAocGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhIC09IGxpbmUtPnBhZ2lu
YXRpb25TdHJ1dCgpOwotICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50
OwotICAgICAgICAgICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxp
bmUsIGRlbHRhLCBvdmVyZmxvd3NGcmFnbWVudCwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3co
KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSkgewotICAg
ICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGxp
bmUsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbGluZS0+YWRqdXN0QmxvY2tEaXJlY3Rp
b25Qb3NpdGlvbihkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlm
IChsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKQotICAgICAgICAgICAgICAgICAgICB1cGRh
dGVGcmFnbWVudEZvckxpbmUobGluZSk7Ci0gICAgICAgICAgICAgICAgcmVhdHRhY2hDbGVhbkxp
bmVGbG9hdHMoKmxpbmUsIGRlbHRhLCBsaW5lID09IGZpcnN0Q2xlYW5MaW5lKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobGFzdFJvb3RCb3goKS0+bGluZUJv
dHRvbVdpdGhMZWFkaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRGVs
ZXRlIGFsbCB0aGUgcmVtYWluaW5nIGxpbmVzLgotICAgICAgICAgICAgZGVsZXRlTGluZVJhbmdl
KGxheW91dFN0YXRlLCBsYXlvdXRTdGF0ZS5lbmRMaW5lKCkpOwotICAgICAgICB9Ci0gICAgfQot
ICAgIAotICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAobGF5b3V0U3RhdGUuY2hlY2tGb3JG
bG9hdHNGcm9tTGFzdExpbmUoKSB8fCBwb3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBsYXN0Um9vdEJv
eCgpKSB7Ci0gICAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGZsb2F0IG9uIHRoZSBsYXN0IGxp
bmUsIGl0IG1pZ2h0IG5vdCBiZSBwb3NpdGlvbmVkIHVwIHRvIG5vdy4KLSAgICAgICAgLy8gVGhp
cyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgYWRkaW5nIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRp
bmcsIG9yIHRoZSBmbG9hdCB3aWxsCi0gICAgICAgIC8vIGluY2x1ZGUgdGhlIHBhZGRpbmcgaW5j
b3JyZWN0bHkuIC1kd2gKLSAgICAgICAgaWYgKGxheW91dFN0YXRlLmNoZWNrRm9yRmxvYXRzRnJv
bUxhc3RMaW5lKCkpIHsKLSAgICAgICAgICAgIExheW91dFVuaXQgYm90dG9tVmlzdWFsT3ZlcmZs
b3cgPSBsYXN0Um9vdEJveCgpLT5sb2dpY2FsQm90dG9tVmlzdWFsT3ZlcmZsb3coKTsKLSAgICAg
ICAgICAgIExheW91dFVuaXQgYm90dG9tTGF5b3V0T3ZlcmZsb3cgPSBsYXN0Um9vdEJveCgpLT5s
b2dpY2FsQm90dG9tTGF5b3V0T3ZlcmZsb3coKTsKLSAgICAgICAgICAgIGF1dG8gbmV3TGluZUJv
eCA9IHN0ZDo6bWFrZV91bmlxdWU8VHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94PigqdGhpcyk7
Ci0gICAgICAgICAgICBhdXRvIHRyYWlsaW5nRmxvYXRzTGluZUJveCA9IG5ld0xpbmVCb3guZ2V0
KCk7Ci0gICAgICAgICAgICBtX2xpbmVCb3hlcy5hcHBlbmRMaW5lQm94KFdURk1vdmUobmV3TGlu
ZUJveCkpOwotICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRDb25zdHJ1Y3Rl
ZCgpOwotICAgICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAgdGV4dEJv
eERhdGFNYXA7Ci0gICAgICAgICAgICBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUgdmVydGljYWxQb3Np
dGlvbkNhY2hlOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBibG9ja0xvZ2ljYWxIZWlnaHQgPSBs
b2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPmFsaWdu
Qm94ZXNJbkJsb2NrRGlyZWN0aW9uKGJsb2NrTG9naWNhbEhlaWdodCwgdGV4dEJveERhdGFNYXAs
IHZlcnRpY2FsUG9zaXRpb25DYWNoZSk7Ci0gICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVC
b3gtPnNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMoYmxvY2tMb2dpY2FsSGVpZ2h0LCBibG9ja0xv
Z2ljYWxIZWlnaHQsIGJsb2NrTG9naWNhbEhlaWdodCwgYmxvY2tMb2dpY2FsSGVpZ2h0KTsKLSAg
ICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0UGFnaW5hdGVkTGluZVdpZHRoKGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQoYmxvY2tMb2dpY2FsSGVpZ2h0KSk7Ci0gICAg
ICAgICAgICBMYXlvdXRSZWN0IGxvZ2ljYWxMYXlvdXRPdmVyZmxvdygwX2x1LCBibG9ja0xvZ2lj
YWxIZWlnaHQsIDFfbHUsIGJvdHRvbUxheW91dE92ZXJmbG93IC0gYmxvY2tMb2dpY2FsSGVpZ2h0
KTsKLSAgICAgICAgICAgIExheW91dFJlY3QgbG9naWNhbFZpc3VhbE92ZXJmbG93KDBfbHUsIGJs
b2NrTG9naWNhbEhlaWdodCwgMV9sdSwgYm90dG9tVmlzdWFsT3ZlcmZsb3cgLSBibG9ja0xvZ2lj
YWxIZWlnaHQpOwotICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRPdmVyZmxv
d0Zyb21Mb2dpY2FsUmVjdHMobG9naWNhbExheW91dE92ZXJmbG93LCBsb2dpY2FsVmlzdWFsT3Zl
cmZsb3csIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+bGluZVRvcCgpLCB0cmFpbGluZ0Zsb2F0c0xp
bmVCb3gtPmxpbmVCb3R0b20oKSk7Ci0gICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJhZ21l
bnRlZEZsb3coKSkKLSAgICAgICAgICAgICAgICB1cGRhdGVGcmFnbWVudEZvckxpbmUodHJhaWxp
bmdGbG9hdHNMaW5lQm94KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2Jq
ZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAg
ICAgICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7Ci0gICAgICAgIGF1dG8g
ZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgICAgIGlmIChhdXRvKiBsYXN0Rmxv
YXQgPSBsYXlvdXRTdGF0ZS5mbG9hdExpc3QoKS5sYXN0RmxvYXQoKSkgewotICAgICAgICAgICAg
YXV0byBsYXN0RmxvYXRJdGVyYXRvciA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQobGFzdEZsb2F0
KTsKLSAgICAgICAgICAgIEFTU0VSVChsYXN0RmxvYXRJdGVyYXRvciAhPSBlbmQpOwotICAgICAg
ICAgICAgKytsYXN0RmxvYXRJdGVyYXRvcjsKLSAgICAgICAgICAgIGl0ID0gbGFzdEZsb2F0SXRl
cmF0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAg
ICAgICAgIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZSgqKml0KTsKLSAgICAgICAgbGF5
b3V0U3RhdGUuZmxvYXRMaXN0KCkuc2V0TGFzdEZsb2F0KCFmbG9hdGluZ09iamVjdFNldC5pc0Vt
cHR5KCkgPyBmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCkgOiBudWxscHRyKTsKLSAgICB9
Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94ZXMoYm9vbCByZWxheW91
dENoaWxkcmVuLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVw
YWludExvZ2ljYWxCb3R0b20pCi17Ci0gICAgQVNTRVJUKCFtX3NpbXBsZUxpbmVMYXlvdXQpOwot
Ci0gICAgc2V0TG9naWNhbEhlaWdodChib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCkpOwotICAgIAot
ICAgIC8vIExheSBvdXQgb3VyIGh5cG90aGV0aWNhbCBncmlkIGxpbmUgYXMgdGhvdWdoIGl0IG9j
Y3VycyBhdCB0aGUgdG9wIG9mIHRoZSBibG9jay4KLSAgICBpZiAodmlldygpLmZyYW1lVmlldygp
LmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXcoKS5mcmFtZVZpZXcoKS5sYXlv
dXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKS0+bGluZUdyaWQoKSA9PSB0aGlzKQotICAgICAgICBs
YXlvdXRMaW5lR3JpZEJveCgpOwotCi0gICAgUmVuZGVyRnJhZ21lbnRlZEZsb3cqIGZyYWdtZW50
ZWRGbG93ID0gZW5jbG9zaW5nRnJhZ21lbnRlZEZsb3coKTsKLSAgICBib29sIGNsZWFyTGluZXNG
b3JQYWdpbmF0aW9uID0gZmlyc3RSb290Qm94KCkgJiYgZnJhZ21lbnRlZEZsb3cgJiYgIWZyYWdt
ZW50ZWRGbG93LT5oYXNGcmFnbWVudHMoKTsKLQotICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hv
dWxkIGNsZWFyIG91dCBvdXIgbGluZSBib3hlcy4KLSAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6
ZSBldmVudHVhbGx5IQotICAgIGJvb2wgaXNGdWxsTGF5b3V0ID0gIWZpcnN0Um9vdEJveCgpIHx8
IHNlbGZOZWVkc0xheW91dCgpIHx8IHJlbGF5b3V0Q2hpbGRyZW4gfHwgY2xlYXJMaW5lc0ZvclBh
Z2luYXRpb247Ci0gICAgTGluZUxheW91dFN0YXRlIGxheW91dFN0YXRlKCp0aGlzLCBpc0Z1bGxM
YXlvdXQsIHJlcGFpbnRMb2dpY2FsVG9wLCByZXBhaW50TG9naWNhbEJvdHRvbSwgZnJhZ21lbnRl
ZEZsb3cpOwotCi0gICAgaWYgKGlzRnVsbExheW91dCkKLSAgICAgICAgbGluZUJveGVzKCkuZGVs
ZXRlTGluZUJveGVzKCk7Ci0KLSAgICAvLyBUZXh0IHRydW5jYXRpb24ga2lja3MgaW4gaW4gdHdv
IGNhc2VzOgotICAgIC8vICAgICAxKSBJZiB5b3VyIG92ZXJmbG93IGlzbid0IHZpc2libGUgYW5k
IHlvdXIgdGV4dC1vdmVyZmxvdy1tb2RlIGlzbid0IGNsaXAuCi0gICAgLy8gICAgIDIpIElmIHlv
dSdyZSBhbiBhbm9ueW1vdXMgYmxvY2sgd2l0aCBhIGJsb2NrIHBhcmVudCB0aGF0IHNhdGlzZmll
cyAjMS4KLSAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhhdCBhcmUg
Y2xpcHBlZCBtdXN0IGFsc28ga25vdyBob3cgdG8gdHJ1bmNhdGUuICBUaGlzIGlzIGluc2FuZWx5
Ci0gICAgLy8gZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgaW4gZ2VuZXJhbCAoZXNwZWNpYWxseSBp
biB0aGUgbWlkZGxlIG9mIGRvaW5nIGxheW91dCksIHNvIHdlIG9ubHkgaGFuZGxlIHRoZQotICAg
IC8vIHNpbXBsZSBjYXNlIG9mIGFuIGFub255bW91cyBibG9jayB0cnVuY2F0aW5nIHdoZW4gaXQn
cyBwYXJlbnQgaXMgY2xpcHBlZC4KLSAgICBib29sIGhhc1RleHRPdmVyZmxvdyA9IChzdHlsZSgp
LnRleHRPdmVyZmxvdygpID09IFRleHRPdmVyZmxvdzo6RWxsaXBzaXMgJiYgaGFzT3ZlcmZsb3dD
bGlwKCkpCi0gICAgICAgIHx8IChpc0Fub255bW91c0Jsb2NrKCkgJiYgcGFyZW50KCkgJiYgcGFy
ZW50KCktPmlzUmVuZGVyQmxvY2soKSAmJiBwYXJlbnQoKS0+c3R5bGUoKS50ZXh0T3ZlcmZsb3co
KSA9PSBUZXh0T3ZlcmZsb3c6OkVsbGlwc2lzICYmIHBhcmVudCgpLT5oYXNPdmVyZmxvd0NsaXAo
KSk7Ci0KLSAgICAvLyBXYWxrIGFsbCB0aGUgbGluZXMgYW5kIGRlbGV0ZSBvdXIgZWxsaXBzaXMg
bGluZSBib3hlcyBpZiB0aGV5IGV4aXN0LgotICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCi0gICAg
ICAgICBkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpOwotCi0gICAgaWYgKGZpcnN0Q2hpbGQoKSkg
ewotICAgICAgICAvLyBJbiBmdWxsIGxheW91dCBtb2RlLCBjbGVhciB0aGUgbGluZSBib3hlcyBv
ZiBjaGlsZHJlbiB1cGZyb250LiBPdGhlcndpc2UsCi0gICAgICAgIC8vIHNpYmxpbmdzIGNhbiBy
dW4gaW50byBzdGFsZSByb290IGxpbmVib3hlcyBkdXJpbmcgbGF5b3V0LiBUaGVuIGxheW91dAot
ICAgICAgICAvLyB0aGUgcmVwbGFjZWQgZWxlbWVudHMgbGF0ZXIuIEluIHBhcnRpYWwgbGF5b3V0
IG1vZGUsIGxpbmUgYm94ZXMgYXJlIG5vdAotICAgICAgICAvLyBkZWxldGVkIGFuZCBvbmx5IGRp
cnRpZWQuIEluIHRoYXQgY2FzZSwgd2UgY2FuIGxheW91dCB0aGUgcmVwbGFjZWQKLSAgICAgICAg
Ly8gZWxlbWVudHMgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgYm9vbCBoYXNJbmxpbmVDaGls
ZCA9IGZhbHNlOwotICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj4gcmVwbGFjZWRDaGlsZHJlbjsK
LSAgICAgICAgZm9yIChJbmxpbmVXYWxrZXIgd2Fsa2VyKCp0aGlzKTsgIXdhbGtlci5hdEVuZCgp
OyB3YWxrZXIuYWR2YW5jZSgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QmIG8gPSAqd2Fs
a2VyLmN1cnJlbnQoKTsKLQotICAgICAgICAgICAgaWYgKCFoYXNJbmxpbmVDaGlsZCAmJiBvLmlz
SW5saW5lKCkpCi0gICAgICAgICAgICAgICAgaGFzSW5saW5lQ2hpbGQgPSB0cnVlOwotCi0gICAg
ICAgICAgICBpZiAoby5pc1JlcGxhY2VkKCkgfHwgby5pc0Zsb2F0aW5nKCkgfHwgby5pc091dE9m
Rmxvd1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgICAgIFJlbmRlckJveCYgYm94ID0gZG93
bmNhc3Q8UmVuZGVyQm94PihvKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxk
cmVuIHx8IGJveC5oYXNSZWxhdGl2ZURpbWVuc2lvbnMoKSkKLSAgICAgICAgICAgICAgICAgICAg
Ym94LnNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsKLQotICAgICAgICAgICAgICAg
IC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4gaXMgc2V0IGFuZCB0aGUgY2hpbGQgaGFzIHBlcmNlbnRh
Z2UgcGFkZGluZyBvciBhbiBlbWJlZGRlZCBjb250ZW50IGJveCwgd2UgYWxzbyBuZWVkIHRvIGlu
dmFsaWRhdGUgdGhlIGNoaWxkcyBwcmVmIHdpZHRocy4KLSAgICAgICAgICAgICAgICBpZiAocmVs
YXlvdXRDaGlsZHJlbiAmJiBib3gubmVlZHNQcmVmZXJyZWRXaWR0aHNSZWNhbGN1bGF0aW9uKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGJveC5zZXRQcmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHko
dHJ1ZSwgTWFya09ubHlUaGlzKTsKLQotICAgICAgICAgICAgICAgIGlmIChib3guaXNPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGJveC5jb250YWluaW5nQmxvY2so
KS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYg
KGJveC5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLmZsb2F0
TGlzdCgpLmFwcGVuZChGbG9hdFdpdGhSZWN0OjpjcmVhdGUoYm94KSk7Ci0gICAgICAgICAgICAg
ICAgZWxzZSBpZiAoaXNGdWxsTGF5b3V0IHx8IGJveC5uZWVkc0xheW91dCgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIC8vIFJlcGxhY2VkIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIGlm
IChpc0Z1bGxMYXlvdXQgJiYgaXM8UmVuZGVyUnVieVJ1bj4oYm94KSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgcmVzZXRzIHRoZSBvdmVyaGFuZ2luZyBtYXJnaW5z
IHRoYXQgd2Ugc2V0IGR1cmluZyBsaW5lIGxheW91dCAoc2VlIGNvbXB1dGVJbmxpbmVEaXJlY3Rp
b25Qb3NpdGlvbnNGb3JTZWdtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBh
IG1vcmUgc3VpdGFibGUgcGxhY2UgZm9yIHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBz
ZXRNYXJnaW5TdGFydEZvckNoaWxkKGJveCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBz
ZXRNYXJnaW5FbmRGb3JDaGlsZChib3gsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIGJveC5kaXJ0eUxpbmVCb3hlcyhpc0Z1bGxMYXlvdXQpOwotICAgICAg
ICAgICAgICAgICAgICBpZiAoaXNGdWxsTGF5b3V0KQotICAgICAgICAgICAgICAgICAgICAgICAg
cmVwbGFjZWRDaGlsZHJlbi5hcHBlbmQoJmJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgICAgIGJveC5sYXlvdXRJZk5lZWRlZCgpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoby5pc1RleHRPckxpbmVCcmVhaygpIHx8
IChpczxSZW5kZXJJbmxpbmU+KG8pICYmICF3YWxrZXIuYXRFbmRPZklubGluZSgpKSkgewotICAg
ICAgICAgICAgICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KG8pKQotICAgICAgICAgICAgICAgICAg
ICBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KG8pLnVwZGF0ZUFsd2F5c0NyZWF0ZUxpbmVCb3hlcyhs
YXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dFN0
YXRlLmlzRnVsbExheW91dCgpIHx8IG8uc2VsZk5lZWRzTGF5b3V0KCkpCi0gICAgICAgICAgICAg
ICAgICAgIGRpcnR5TGluZUJveGVzRm9yUmVuZGVyZXIobywgbGF5b3V0U3RhdGUuaXNGdWxsTGF5
b3V0KCkpOwotICAgICAgICAgICAgICAgIG8uY2xlYXJOZWVkc0xheW91dCgpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXBsYWNl
ZENoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgIHJlcGxhY2VkQ2hpbGRyZW5baV0t
PmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgbGF5b3V0UnVuc0FuZEZsb2F0cyhsYXlvdXRT
dGF0ZSwgaGFzSW5saW5lQ2hpbGQpOwotICAgIH0KLQotICAgIC8vIEV4cGFuZCB0aGUgbGFzdCBs
aW5lIHRvIGFjY29tbW9kYXRlIFJ1YnkgYW5kIGVtcGhhc2lzIG1hcmtzLgotICAgIGludCBsYXN0
TGluZUFubm90YXRpb25zQWRqdXN0bWVudCA9IDA7Ci0gICAgaWYgKGxhc3RSb290Qm94KCkpIHsK
LSAgICAgICAgTGF5b3V0VW5pdCBsb3dlc3RBbGxvd2VkUG9zaXRpb24gPSBzdGQ6Om1heChsYXN0
Um9vdEJveCgpLT5saW5lQm90dG9tKCksIGxvZ2ljYWxIZWlnaHQoKSArIHBhZGRpbmdBZnRlcigp
KTsKLSAgICAgICAgaWYgKCFzdHlsZSgpLmlzRmxpcHBlZExpbmVzV3JpdGluZ01vZGUoKSkKLSAg
ICAgICAgICAgIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gbGFzdFJvb3RCb3goKS0+
Y29tcHV0ZVVuZGVyQW5ub3RhdGlvbkFkanVzdG1lbnQobG93ZXN0QWxsb3dlZFBvc2l0aW9uKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFzdExpbmVBbm5vdGF0aW9uc0FkanVzdG1lbnQg
PSBsYXN0Um9vdEJveCgpLT5jb21wdXRlT3ZlckFubm90YXRpb25BZGp1c3RtZW50KGxvd2VzdEFs
bG93ZWRQb3NpdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcg
b2YgdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9w
YWRkaW5nIGFuZAotICAgIC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0
b20gbWFyZ2luIGluZm9ybWF0aW9uLiBUaGlzIGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNzYXJ5Ci0g
ICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sgdGhh
dCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24gb3V0IHRvCi0gICAg
Ly8gdXMuCi0gICAgTGF5b3V0VW5pdCBhZnRlckVkZ2UgPSBib3JkZXJBbmRQYWRkaW5nQWZ0ZXIo
KSArIHNjcm9sbGJhckxvZ2ljYWxIZWlnaHQoKSArIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3Rt
ZW50OwotICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJFZGdlKTsK
LQotICAgIGlmICghZmlyc3RSb290Qm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIGlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBIb3Jpem9udGFsTGluZSA6IFZlcnRpY2FsTGluZSwgUG9z
aXRpb25PZkludGVyaW9yTGluZUJveGVzKSk7Ci0KLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbnkg
bGluZXMgdGhhdCBzcGlsbCBvdXQgb2Ygb3VyIGJsb2NrLiAgSWYgd2UgZG8sIHRoZW4gd2Ugd2ls
bCBwb3NzaWJseSBuZWVkIHRvCi0gICAgLy8gdHJ1bmNhdGUgdGV4dC4KLSAgICBpZiAoaGFzVGV4
dE92ZXJmbG93KQotICAgICAgICBjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCk7Ci19Ci0KLXZv
aWQgUmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0SW5DbGVhbkxpbmUoUm9vdElubGluZUJveCYg
Y2xlYW5MaW5lLCBSZW5kZXJCb3gmIGZsb2F0Qm94T25DbGVhbkxpbmUsIEZsb2F0V2l0aFJlY3Qm
IG1hdGNoaW5nRmxvYXRXaXRoUmVjdCwKLSAgICBib29sJiBlbmNvdW50ZXJlZE5ld0Zsb2F0LCBi
b29sJiBkaXJ0aWVkQnlGbG9hdCkKLXsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNB
VElPTighZmxvYXRCb3hPbkNsZWFuTGluZS5zdHlsZSgpLmRlbGV0aW9uSGFzQmVndW4oKSk7Ci0g
ICAgaWYgKCZtYXRjaGluZ0Zsb2F0V2l0aFJlY3QucmVuZGVyZXIoKSAhPSAmZmxvYXRCb3hPbkNs
ZWFuTGluZSkgewotICAgICAgICBlbmNvdW50ZXJlZE5ld0Zsb2F0ID0gdHJ1ZTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBmbG9hdEJveE9uQ2xlYW5MaW5lLmxheW91dElmTmVlZGVkKCk7
Ci0gICAgTGF5b3V0UmVjdCBvcmlnaW5hbEZsb2F0UmVjdCA9IG1hdGNoaW5nRmxvYXRXaXRoUmVj
dC5yZWN0KCk7Ci0gICAgTGF5b3V0U2l6ZSBuZXdTaXplKAotICAgICAgICBmbG9hdEJveE9uQ2xl
YW5MaW5lLndpZHRoKCkgKyBmbG9hdEJveE9uQ2xlYW5MaW5lLmhvcml6b250YWxNYXJnaW5FeHRl
bnQoKSwKLSAgICAgICAgZmxvYXRCb3hPbkNsZWFuTGluZS5oZWlnaHQoKSArIGZsb2F0Qm94T25D
bGVhbkxpbmUudmVydGljYWxNYXJnaW5FeHRlbnQoKSk7Ci0gICAgCi0gICAgLy8gV2UgaGF2ZSB0
byByZXNldCB0aGUgY2FwLWhlaWdodCBhbGlnbm1lbnQgZG9uZSBieSB0aGUgZmlyc3QtbGV0dGVy
IGZsb2F0cyB3aGVuIGluaXRpYWwtbGV0dGVyIGlzIHNldCwgc28ganVzdCBhbHdheXMgdHJlYXQg
Zmlyc3QtbGV0dGVyIGZsb2F0cyBhcyBkaXJ0eS4KLSAgICBpZiAob3JpZ2luYWxGbG9hdFJlY3Qu
c2l6ZSgpID09IG5ld1NpemUgJiYgKGZsb2F0Qm94T25DbGVhbkxpbmUuc3R5bGUoKS5zdHlsZVR5
cGUoKSAhPSBQc2V1ZG9JZDo6Rmlyc3RMZXR0ZXIgfHwgIWZsb2F0Qm94T25DbGVhbkxpbmUuc3R5
bGUoKS5pbml0aWFsTGV0dGVyRHJvcCgpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTGF5b3V0
VW5pdCBmbG9hdFRvcCA9IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBvcmlnaW5hbEZsb2F0
UmVjdC55KCkgOiBvcmlnaW5hbEZsb2F0UmVjdC54KCk7Ci0gICAgTGF5b3V0VW5pdCBmbG9hdEhl
aWdodCA9IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBzdGQ6Om1heChvcmlnaW5hbEZsb2F0
UmVjdC5oZWlnaHQoKSwgbmV3U2l6ZS5oZWlnaHQoKSkKLSAgICAgICAgOiBzdGQ6Om1heChvcmln
aW5hbEZsb2F0UmVjdC53aWR0aCgpLCBuZXdTaXplLndpZHRoKCkpOwotICAgIGZsb2F0SGVpZ2h0
ID0gc3RkOjptaW4oZmxvYXRIZWlnaHQsIExheW91dFVuaXQ6Om1heCgpIC0gZmxvYXRUb3ApOwot
ICAgIGNsZWFuTGluZS5tYXJrRGlydHkoKTsKLSAgICBtYXJrTGluZXNEaXJ0eUluQmxvY2tSYW5n
ZShjbGVhbkxpbmUubGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGZsb2F0VG9wICsgZmxvYXRIZWln
aHQsICZjbGVhbkxpbmUpOwotICAgIExheW91dFJlY3QgbmV3RmxvYXRSZWN0ID0gb3JpZ2luYWxG
bG9hdFJlY3Q7Ci0gICAgbmV3RmxvYXRSZWN0LnNldFNpemUobmV3U2l6ZSk7Ci0gICAgbWF0Y2hp
bmdGbG9hdFdpdGhSZWN0LmFkanVzdFJlY3QobmV3RmxvYXRSZWN0KTsKLSAgICBkaXJ0aWVkQnlG
bG9hdCA9IHRydWU7Ci19Ci0KLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJt
aW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyKQotewotICAgIFJvb3RJbmxpbmVCb3gqIGN1cnJlbnRMaW5lID0g
bnVsbHB0cjsKLSAgICBSb290SW5saW5lQm94KiBsYXN0TGluZSA9IG51bGxwdHI7Ci0KLSAgICAv
LyBGSVhNRTogVGhpcyBlbnRpcmUgZmxvYXQtY2hlY2tpbmcgYmxvY2sgbmVlZHMgdG8gYmUgYnJv
a2VuIGludG8gYSBuZXcgZnVuY3Rpb24uCi0gICAgYXV0byYgZmxvYXRzID0gbGF5b3V0U3RhdGUu
ZmxvYXRMaXN0KCk7Ci0gICAgYm9vbCBkaXJ0aWVkQnlGbG9hdCA9IGZhbHNlOwotICAgIGlmICgh
bGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0KCkpIHsKLSAgICAgICAgLy8gUGFnaW5hdGUgYWxsIG9m
IHRoZSBjbGVhbiBsaW5lcy4KLSAgICAgICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkuZnJhbWVW
aWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmZyYW1lVmlldygp
LmxheW91dENvbnRleHQoKS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwotICAgICAgICBM
YXlvdXRVbml0IHBhZ2luYXRpb25EZWx0YTsKLSAgICAgICAgYXV0byBmbG9hdHNJdGVyYXRvciA9
IGZsb2F0cy5iZWdpbigpOwotICAgICAgICBhdXRvIGVuZCA9IGZsb2F0cy5lbmQoKTsKLSAgICAg
ICAgZm9yIChjdXJyZW50TGluZSA9IGZpcnN0Um9vdEJveCgpOyBjdXJyZW50TGluZSAmJiAhY3Vy
cmVudExpbmUtPmlzRGlydHkoKTsgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS0+bmV4dFJvb3RC
b3goKSkgewotICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewotICAgICAgICAgICAgICAgIGlm
IChsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChjdXJyZW50TGluZSwgMCwgbGF5b3V0
U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExp
bmUtPm1hcmtEaXJ0eSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgcGFnaW5hdGlvbkRlbHRhIC09IGN1cnJlbnRMaW5lLT5w
YWdpbmF0aW9uU3RydXQoKTsKLSAgICAgICAgICAgICAgICBib29sIG92ZXJmbG93c0ZyYWdtZW50
OwotICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24oY3VycmVu
dExpbmUsIHBhZ2luYXRpb25EZWx0YSwgb3ZlcmZsb3dzRnJhZ21lbnQsIGxheW91dFN0YXRlLmZy
YWdtZW50ZWRGbG93KCkpOwotICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uRGVsdGEpIHsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgfHwgIWZsb2F0cy5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBEbyBiZXR0ZXIgZXZl
bnR1YWxseS4gIEZvciBub3cgaWYgd2UgZXZlciBzaGlmdCBiZWNhdXNlIG9mIHBhZ2luYXRpb24g
YW5kIGZsb2F0cyBhcmUgcHJlc2VudCBqdXN0IGdvIHRvIGEgZnVsbCBsYXlvdXQuCi0gICAgICAg
ICAgICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS5tYXJrRm9yRnVsbExheW91dCgpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgICAgICAgICBsYXlvdXRTdGF0ZS51cGRhdGVSZXBhaW50UmFuZ2VGcm9tQm94KGN1cnJl
bnRMaW5lLCBwYWdpbmF0aW9uRGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGlu
ZS0+YWRqdXN0QmxvY2tEaXJlY3Rpb25Qb3NpdGlvbihwYWdpbmF0aW9uRGVsdGEpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZs
b3coKSkKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRGb3JMaW5lKGN1cnJlbnRM
aW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGF1dG8qIGNsZWFuTGluZUZs
b2F0cyA9IGN1cnJlbnRMaW5lLT5mbG9hdHNQdHIoKSkgewotICAgICAgICAgICAgICAgIC8vIElm
IGEgbmV3IGZsb2F0IGhhcyBiZWVuIGluc2VydGVkIGJlZm9yZSB0aGlzIGxpbmUgb3IgYmVmb3Jl
IGl0cyBsYXN0IGtub3duIGZsb2F0LCBqdXN0IGRvIGEgZnVsbCBsYXlvdXQuCi0gICAgICAgICAg
ICAgICAgYm9vbCBlbmNvdW50ZXJlZE5ld0Zsb2F0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
Zm9yIChhdXRvJiBmbG9hdEJveE9uQ2xlYW5MaW5lIDogKmNsZWFuTGluZUZsb2F0cykgewotICAg
ICAgICAgICAgICAgICAgICBBU1NFUlQoZmxvYXRzSXRlcmF0b3IgIT0gZW5kKTsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCFmbG9hdEJveE9uQ2xlYW5MaW5lKQotICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrRmxvYXRJbkNsZWFuTGlu
ZSgqY3VycmVudExpbmUsICpmbG9hdEJveE9uQ2xlYW5MaW5lLCAqZmxvYXRzSXRlcmF0b3IsIGVu
Y291bnRlcmVkTmV3RmxvYXQsIGRpcnRpZWRCeUZsb2F0KTsKLSAgICAgICAgICAgICAgICAgICAg
KytmbG9hdHNJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0c0l0ZXJhdG9y
ID09IGVuZCB8fCBlbmNvdW50ZXJlZE5ld0Zsb2F0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBsYXlvdXRTdGF0ZS5tYXJrRm9yRnVsbExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgaWYgKGRpcnRpZWRCeUZsb2F0IHx8IGVuY291bnRlcmVkTmV3RmxvYXQpCi0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
ICAgIC8vIENoZWNrIGlmIGEgbmV3IGZsb2F0IGhhcyBiZWVuIGluc2VydGVkIGFmdGVyIHRoZSBs
YXN0IGtub3duIGZsb2F0LgotICAgICAgICBpZiAoZmxvYXRzSXRlcmF0b3IgIT0gZW5kKSB7Ci0g
ICAgICAgICAgICBpZiAoIWN1cnJlbnRMaW5lKQotICAgICAgICAgICAgICAgIGxheW91dFN0YXRl
Lm1hcmtGb3JGdWxsTGF5b3V0KCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBmb3IgKDsgZmxvYXRzSXRlcmF0b3IgIT0gZW5kOyArK2Zsb2F0c0l0ZXJhdG9yKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0V2l0aFJlY3QgPSAqZmxvYXRzSXRlcmF0b3I7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICghZmxvYXRXaXRoUmVjdC0+cmVuZGVyZXIoKS5uZWVkc0xh
eW91dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAg
ICAgICAgIGxheW91dFN0YXRlLm1hcmtGb3JGdWxsTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChsYXlvdXRTdGF0ZS5pc0Z1bGxMYXlvdXQoKSkgewotICAgICAgICBt
X2xpbmVCb3hlcy5kZWxldGVMaW5lQm94VHJlZSgpOwotICAgICAgICBjdXJyZW50TGluZSA9IG51
bGxwdHI7Ci0gICAgICAgIEFTU0VSVCghZmlyc3RSb290Qm94KCkgJiYgIWxhc3RSb290Qm94KCkp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjdXJyZW50TGluZSkgewotICAgICAgICAgICAg
Ly8gV2UgaGF2ZSBhIGRpcnR5IGxpbmUuCi0gICAgICAgICAgICBpZiAoUm9vdElubGluZUJveCog
cHJldlJvb3RCb3ggPSBjdXJyZW50TGluZS0+cHJldlJvb3RCb3goKSkgewotICAgICAgICAgICAg
ICAgIC8vIFdlIGhhdmUgYSBwcmV2aW91cyBsaW5lLgotICAgICAgICAgICAgICAgIGlmICghZGly
dGllZEJ5RmxvYXQgJiYgKCFwcmV2Um9vdEJveC0+ZW5kc1dpdGhCcmVhaygpCi0gICAgICAgICAg
ICAgICAgICAgIHx8ICFwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkKLSAgICAgICAgICAgICAg
ICAgICAgfHwgKGlzPFJlbmRlclRleHQ+KCpwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkpCi0g
ICAgICAgICAgICAgICAgICAgICYmIHByZXZSb290Qm94LT5saW5lQnJlYWtQb3MoKSA+PSBkb3du
Y2FzdDxSZW5kZXJUZXh0PigqcHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKS50ZXh0KCkubGVu
Z3RoKCkpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgbGluZSBkaWRu
J3QgYnJlYWsgY2xlYW5seSBvciBicm9rZSBhdCBhIG5ld2xpbmUKLSAgICAgICAgICAgICAgICAg
ICAgLy8gdGhhdCBoYXMgYmVlbiBkZWxldGVkLCBzbyB0cmVhdCBpdCBhcyBkaXJ0eSB0b28uCi0g
ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gcHJldlJvb3RCb3g7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHdlIGhhdmUg
bm8gZGlydHkgbGluZXMsIHRoZW4gbGFzdCBpcyBqdXN0IHRoZSBsYXN0IHJvb3QgYm94LgotICAg
ICAgICBsYXN0TGluZSA9IGN1cnJlbnRMaW5lID8gY3VycmVudExpbmUtPnByZXZSb290Qm94KCkg
OiBsYXN0Um9vdEJveCgpOwotICAgIH0KLQotICAgIGlmICghZmxvYXRzLmlzRW1wdHkoKSkgewot
ICAgICAgICBMYXlvdXRVbml0IHNhdmVkTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsK
LSAgICAgICAgLy8gUmVzdG9yZSBmbG9hdHMgZnJvbSBjbGVhbiBsaW5lcy4KLSAgICAgICAgUm9v
dElubGluZUJveCogbGluZSA9IGZpcnN0Um9vdEJveCgpOwotICAgICAgICB3aGlsZSAobGluZSAh
PSBjdXJyZW50TGluZSkgewotICAgICAgICAgICAgaWYgKGF1dG8qIGNsZWFuTGluZUZsb2F0cyA9
IGxpbmUtPmZsb2F0c1B0cigpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdGlu
Z0JveCA6ICpjbGVhbkxpbmVGbG9hdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmbG9h
dGluZ0JveCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
ICAgICAgICBhdXRvKiBmbG9hdGluZ09iamVjdCA9IGluc2VydEZsb2F0aW5nT2JqZWN0KCpmbG9h
dGluZ0JveCk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJ
Q0FUSU9OKCFmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwotICAgICAgICAgICAg
ICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRpbmdMaW5lKCpsaW5lKTsKLSAgICAg
ICAgICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wRm9yQ2hpbGQoKmZsb2F0
aW5nQm94KSAtIG1hcmdpbkJlZm9yZUZvckNoaWxkKCpmbG9hdGluZ0JveCkpOwotICAgICAgICAg
ICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOwotICAgICAgICAgICAgICAgICAgICBmbG9h
dHMuc2V0TGFzdENsZWFuRmxvYXQoKmZsb2F0aW5nQm94KTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKTsKLSAg
ICAgICAgfQotICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KHNhdmVkTG9naWNhbEhlaWdodCk7Ci0g
ICAgfQotCi0gICAgbGF5b3V0U3RhdGUubGluZUluZm8oKS5zZXRGaXJzdExpbmUoIWxhc3RMaW5l
KTsKLSAgICBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5s
eSghbGFzdExpbmUgfHwgbGFzdExpbmUtPmVuZHNXaXRoQnJlYWsoKSk7Ci0KLSAgICBpZiAobGFz
dExpbmUpIHsKLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChsYXN0TGluZS0+bGluZUJvdHRvbVdp
dGhMZWFkaW5nKCkpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciBpdGVyID0gSW5saW5lSXRlcmF0
b3IodGhpcywgbGFzdExpbmUtPmxpbmVCcmVha09iaigpLCBsYXN0TGluZS0+bGluZUJyZWFrUG9z
KCkpOwotICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihpdGVyLCBudW1iZXJPZklzb2xhdGVB
bmNlc3RvcnMoaXRlcikpOwotICAgICAgICByZXNvbHZlci5zZXRTdGF0dXMobGFzdExpbmUtPmxp
bmVCcmVha0JpZGlTdGF0dXMoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVGV4dERpcmVjdGlv
biBkaXJlY3Rpb24gPSBzdHlsZSgpLmRpcmVjdGlvbigpOwotICAgICAgICBpZiAoc3R5bGUoKS51
bmljb2RlQmlkaSgpID09IFBsYWludGV4dCkKLSAgICAgICAgICAgIGRldGVybWluZURpcmVjdGlv
bmFsaXR5KGRpcmVjdGlvbiwgSW5saW5lSXRlcmF0b3IodGhpcywgYmlkaUZpcnN0U2tpcHBpbmdF
bXB0eUlubGluZXMoKnRoaXMpLCAwKSk7Ci0gICAgICAgIHJlc29sdmVyLnNldFN0YXR1cyhCaWRp
U3RhdHVzKGRpcmVjdGlvbiwgaXNPdmVycmlkZShzdHlsZSgpLnVuaWNvZGVCaWRpKCkpKSk7Ci0g
ICAgICAgIElubGluZUl0ZXJhdG9yIGl0ZXIgPSBJbmxpbmVJdGVyYXRvcih0aGlzLCBiaWRpRmly
c3RTa2lwcGluZ0VtcHR5SW5saW5lcygqdGhpcywgJnJlc29sdmVyKSwgMCk7Ci0gICAgICAgIHJl
c29sdmVyLnNldFBvc2l0aW9uKGl0ZXIsIG51bWJlck9mSXNvbGF0ZUFuY2VzdG9ycyhpdGVyKSk7
Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50TGluZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIFJv
b3RJbmxpbmVCb3gqIHN0YXJ0TGluZSwgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBC
aWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKQotewotICAgIGF1dG8gaXRlcmF0b3JGb3JG
aXJzdERpcnR5RmxvYXQgPSBbXShMaW5lTGF5b3V0U3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzKSB7
Ci0gICAgICAgIGF1dG8gbGFzdENsZWFuRmxvYXQgPSBmbG9hdHMubGFzdENsZWFuRmxvYXQoKTsK
LSAgICAgICAgaWYgKCFsYXN0Q2xlYW5GbG9hdCkKLSAgICAgICAgICAgIHJldHVybiBmbG9hdHMu
YmVnaW4oKTsKLSAgICAgICAgYXV0byogbGFzdENsZWFuRmxvYXRXaXRoUmVjdCA9IGZsb2F0cy5m
bG9hdFdpdGhSZWN0KCpsYXN0Q2xlYW5GbG9hdCk7Ci0gICAgICAgIEFTU0VSVChsYXN0Q2xlYW5G
bG9hdFdpdGhSZWN0KTsKLSAgICAgICAgcmV0dXJuICsrZmxvYXRzLmZpbmQoKmxhc3RDbGVhbkZs
b2F0V2l0aFJlY3QpOwotICAgIH07Ci0KLSAgICBBU1NFUlQoIWxheW91dFN0YXRlLmVuZExpbmUo
KSk7Ci0gICAgYXV0byBmbG9hdHNJdGVyYXRvciA9IGl0ZXJhdG9yRm9yRmlyc3REaXJ0eUZsb2F0
KGxheW91dFN0YXRlLmZsb2F0TGlzdCgpKTsKLSAgICBhdXRvIGVuZCA9IGxheW91dFN0YXRlLmZs
b2F0TGlzdCgpLmVuZCgpOwotICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gbnVsbHB0cjsK
LSAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnJlbnRMaW5lID0gc3RhcnRMaW5lLT5uZXh0Um9v
dEJveCgpOyBjdXJyZW50TGluZTsgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS0+bmV4dFJvb3RC
b3goKSkgewotICAgICAgICBpZiAoIWN1cnJlbnRMaW5lLT5pc0RpcnR5KCkpIHsKLSAgICAgICAg
ICAgIGlmIChhdXRvKiBjbGVhbkxpbmVGbG9hdHMgPSBjdXJyZW50TGluZS0+ZmxvYXRzUHRyKCkp
IHsKLSAgICAgICAgICAgICAgICBib29sIGVuY291bnRlcmVkTmV3RmxvYXQgPSBmYWxzZTsKLSAg
ICAgICAgICAgICAgICBib29sIGRpcnRpZWRCeUZsb2F0ID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgZm9yIChhdXRvJiBmbG9hdEJveE9uQ2xlYW5MaW5lIDogKmNsZWFuTGluZUZsb2F0cykgewot
ICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb2F0Qm94T25DbGVhbkxpbmUpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0
c0l0ZXJhdG9yICE9IGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrRmxvYXRJbkNsZWFu
TGluZSgqY3VycmVudExpbmUsICpmbG9hdEJveE9uQ2xlYW5MaW5lLCAqZmxvYXRzSXRlcmF0b3Is
IGVuY291bnRlcmVkTmV3RmxvYXQsIGRpcnRpZWRCeUZsb2F0KTsKLSAgICAgICAgICAgICAgICAg
ICAgKytmbG9hdHNJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0c0l0ZXJh
dG9yID09IGVuZCB8fCBlbmNvdW50ZXJlZE5ld0Zsb2F0KQotICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICBpZiAoY3VycmVudExpbmUtPmlzRGlydHkoKSkKLSAgICAgICAgICAgIGxhc3RMaW5l
ID0gbnVsbHB0cjsKLSAgICAgICAgZWxzZSBpZiAoIWxhc3RMaW5lKQotICAgICAgICAgICAgbGFz
dExpbmUgPSBjdXJyZW50TGluZTsKLSAgICB9Ci0KLSAgICBpZiAoIWxhc3RMaW5lKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50LCB8bGFzdHwgaXMgdGhlIGZpcnN0IGxp
bmUgaW4gYSBydW4gb2YgY2xlYW4gbGluZXMgdGhhdCBlbmRzIHdpdGggdGhlIGxhc3QgbGluZQot
ICAgIC8vIGluIHRoZSBibG9jay4KLSAgICBSb290SW5saW5lQm94KiBwcmV2aW91c0xpbmUgPSBs
YXN0TGluZS0+cHJldlJvb3RCb3goKTsKLSAgICBjbGVhbkxpbmVTdGFydCA9IElubGluZUl0ZXJh
dG9yKHRoaXMsIHByZXZpb3VzTGluZS0+bGluZUJyZWFrT2JqKCksIHByZXZpb3VzTGluZS0+bGlu
ZUJyZWFrUG9zKCkpOwotICAgIGNsZWFuTGluZUJpZGlTdGF0dXMgPSBwcmV2aW91c0xpbmUtPmxp
bmVCcmVha0JpZGlTdGF0dXMoKTsKLSAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lTG9naWNhbFRv
cChwcmV2aW91c0xpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKLQotICAgIGZvciAoUm9v
dElubGluZUJveCogbGluZSA9IGxhc3RMaW5lOyBsaW5lOyBsaW5lID0gbGluZS0+bmV4dFJvb3RC
b3goKSkgewotICAgICAgICAvLyBEaXNjb25uZWN0IGFsbCBsaW5lIGJveGVzIGZyb20gdGhlaXIg
cmVuZGVyIG9iamVjdHMgd2hpbGUgcHJlc2VydmluZyB0aGVpciBjb25uZWN0aW9ucyB0byBvbmUg
YW5vdGhlci4KLSAgICAgICAgbGluZS0+ZXh0cmFjdExpbmUoKTsKLSAgICB9Ci0gICAgbGF5b3V0
U3RhdGUuc2V0RW5kTGluZShsYXN0TGluZSk7Ci19Ci0KLWJvb2wgUmVuZGVyQmxvY2tGbG93Ojpj
aGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRT
dGF0ZSkKLXsKLSAgICBMYXlvdXRVbml0IGxpbmVEZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAtIGxh
eW91dFN0YXRlLmVuZExpbmVMb2dpY2FsVG9wKCk7Ci0KLSAgICBib29sIHBhZ2luYXRlZCA9IHZp
ZXcoKS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCku
ZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7
Ci0gICAgaWYgKHBhZ2luYXRlZCAmJiBsYXlvdXRTdGF0ZS5mcmFnbWVudGVkRmxvdygpKSB7Ci0g
ICAgICAgIC8vIENoZWNrIGFsbCBsaW5lcyBmcm9tIGhlcmUgdG8gdGhlIGVuZCwgYW5kIHNlZSBp
ZiB0aGUgaHlwb3RoZXRpY2FsIG5ldyBwb3NpdGlvbiBmb3IgdGhlIGxpbmVzIHdpbGwgcmVzdWx0
Ci0gICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoLgotICAgICAg
ICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3ggPSBsYXlvdXRTdGF0ZS5lbmRMaW5lKCk7IGxp
bmVCb3g7IGxpbmVCb3ggPSBsaW5lQm94LT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICBp
ZiAocGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCB0aGUgcmVhbCBt
b3ZlIHdlJ3JlIGdvaW5nIHRvIGRvLCBzbyBkb24ndCB1cGRhdGUgdGhlIGxpbmUgYm94J3MgcGFn
aW5hdGlvbgotICAgICAgICAgICAgICAgIC8vIHN0cnV0IHlldC4KLSAgICAgICAgICAgICAgICBM
YXlvdXRVbml0IG9sZFBhZ2luYXRpb25TdHJ1dCA9IGxpbmVCb3gtPnBhZ2luYXRpb25TdHJ1dCgp
OwotICAgICAgICAgICAgICAgIGJvb2wgb3ZlcmZsb3dzRnJhZ21lbnQ7Ci0gICAgICAgICAgICAg
ICAgbGluZURlbHRhIC09IG9sZFBhZ2luYXRpb25TdHJ1dDsKLSAgICAgICAgICAgICAgICBhZGp1
c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmVCb3gsIGxpbmVEZWx0YSwgb3ZlcmZsb3dz
RnJhZ21lbnQsIGxheW91dFN0YXRlLmZyYWdtZW50ZWRGbG93KCkpOwotICAgICAgICAgICAgICAg
IGxpbmVCb3gtPnNldFBhZ2luYXRpb25TdHJ1dChvbGRQYWdpbmF0aW9uU3RydXQpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2Vk
KGxpbmVCb3gsIGxpbmVEZWx0YSwgbGF5b3V0U3RhdGUuZnJhZ21lbnRlZEZsb3coKSkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlm
ICghbGluZURlbHRhIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgCi0gICAgLy8gU2VlIGlmIGFueSBmbG9hdHMgZW5kIGluIHRoZSByYW5nZSBhbG9uZyB3
aGljaCB3ZSB3YW50IHRvIHNoaWZ0IHRoZSBsaW5lcyB2ZXJ0aWNhbGx5LgotICAgIExheW91dFVu
aXQgbG9naWNhbFRvcCA9IHN0ZDo6bWluKGxvZ2ljYWxIZWlnaHQoKSwgbGF5b3V0U3RhdGUuZW5k
TGluZUxvZ2ljYWxUb3AoKSk7Ci0KLSAgICBSb290SW5saW5lQm94KiBsYXN0TGluZSA9IGxheW91
dFN0YXRlLmVuZExpbmUoKTsKLSAgICB3aGlsZSAoUm9vdElubGluZUJveCogbmV4dExpbmUgPSBs
YXN0TGluZS0+bmV4dFJvb3RCb3goKSkKLSAgICAgICAgbGFzdExpbmUgPSBuZXh0TGluZTsKLQot
ICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSA9IGxhc3RMaW5lLT5saW5lQm90dG9tV2l0aExl
YWRpbmcoKSArIGFic29sdXRlVmFsdWUobGluZURlbHRhKTsKLQotICAgIGNvbnN0IEZsb2F0aW5n
T2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsK
LSAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwotICAgIGZvciAoYXV0byBp
dCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAg
ICBjb25zdCBhdXRvJiBmbG9hdGluZ09iamVjdCA9ICppdC0+Z2V0KCk7Ci0gICAgICAgIGlmIChs
b2dpY2FsQm90dG9tRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpID49IGxvZ2ljYWxUb3AgJiYgbG9n
aWNhbEJvdHRvbUZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSA8IGxvZ2ljYWxCb3R0b20pCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJv
b2wgUmVuZGVyQmxvY2tGbG93OjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChSb290
SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVyRnJhZ21lbnRl
ZEZsb3cqIGZyYWdtZW50ZWRGbG93KSBjb25zdAotewotICAgIGlmICghZnJhZ21lbnRlZEZsb3cp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlbmRlckZyYWdtZW50Q29udGFpbmVyKiBj
dXJyZW50RnJhZ21lbnQgPSBmcmFnbWVudEF0QmxvY2tPZmZzZXQocm9vdEJveC0+bGluZVRvcFdp
dGhMZWFkaW5nKCkgKyBsaW5lRGVsdGEpOwotICAgIC8vIEp1c3QgYmFpbCBpZiB0aGUgZnJhZ21l
bnQgZGlkbid0IGNoYW5nZS4KLSAgICBpZiAocm9vdEJveC0+Y29udGFpbmluZ0ZyYWdtZW50KCkg
PT0gY3VycmVudEZyYWdtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHJv
b3RCb3gtPnBhZ2luYXRlZExpbmVXaWR0aCgpICE9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNv
bnRlbnQoY3VycmVudEZyYWdtZW50KTsKLX0KLQotYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNo
ZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGluZUJpZGlS
ZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNv
bnN0IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMpCi17Ci0gICAgaWYgKHJlc29sdmVyLnBvc2l0
aW9uKCkgPT0gZW5kTGluZVN0YXJ0KSB7Ci0gICAgICAgIGlmIChyZXNvbHZlci5zdGF0dXMoKSAh
PSBlbmRMaW5lU3RhdHVzKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1
cm4gY2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKGxheW91dFN0YXRlKTsKLSAgICB9
Ci0KLSAgICAvLyBUaGUgZmlyc3QgY2xlYW4gbGluZSBkb2Vzbid0IG1hdGNoLCBidXQgd2UgY2Fu
IGNoZWNrIGEgaGFuZGZ1bCBvZiBmb2xsb3dpbmcgbGluZXMgdG8gdHJ5Ci0gICAgLy8gdG8gbWF0
Y2ggYmFjayB1cC4KLSAgICBzdGF0aWMgY29uc3QgaW50IG51bUxpbmVzID0gODsgLy8gVGhlICMg
b2YgbGluZXMgd2UncmUgd2lsbGluZyB0byBtYXRjaCBhZ2FpbnN0LgotICAgIFJvb3RJbmxpbmVC
b3gqIG9yaWdpbmFsRW5kTGluZSA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsKLSAgICBSb290SW5s
aW5lQm94KiBsaW5lID0gb3JpZ2luYWxFbmRMaW5lOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bnVtTGluZXMgJiYgbGluZTsgaSsrLCBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkgewotICAg
ICAgICBpZiAobGluZS0+bGluZUJyZWFrT2JqKCkgPT0gcmVzb2x2ZXIucG9zaXRpb24oKS5yZW5k
ZXJlcigpICYmIGxpbmUtPmxpbmVCcmVha1BvcygpID09IHJlc29sdmVyLnBvc2l0aW9uKCkub2Zm
c2V0KCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4KLSAgICAgICAgICAgIGlm
IChsaW5lLT5saW5lQnJlYWtCaWRpU3RhdHVzKCkgIT0gcmVzb2x2ZXIuc3RhdHVzKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyAuLi5idXQgdGhlIGJpZGkgc3RhdGUgZG9lc24n
dCBtYXRjaC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbCBtYXRjaGVkID0gZmFsc2U7
Ci0gICAgICAgICAgICBSb290SW5saW5lQm94KiByZXN1bHQgPSBsaW5lLT5uZXh0Um9vdEJveCgp
OwotICAgICAgICAgICAgbGF5b3V0U3RhdGUuc2V0RW5kTGluZShyZXN1bHQpOwotICAgICAgICAg
ICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGxheW91dFN0YXRlLnNldEVuZExpbmVM
b2dpY2FsVG9wKGxpbmUtPmxpbmVCb3R0b21XaXRoTGVhZGluZygpKTsKLSAgICAgICAgICAgICAg
ICBtYXRjaGVkID0gY2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKGxheW91dFN0YXRl
KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm93IGRlbGV0ZSB0aGUgbGluZXMg
dGhhdCB3ZSBmYWlsZWQgdG8gc3luYy4KLSAgICAgICAgICAgIGRlbGV0ZUxpbmVSYW5nZShsYXlv
dXRTdGF0ZSwgb3JpZ2luYWxFbmRMaW5lLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIG1h
dGNoZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wg
UmVuZGVyQmxvY2s6OmdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKFJlbmRlck9iamVj
dCogaW5saW5lT2JqKQotewotICAgIEFTU0VSVChpbmxpbmVPYmotPnBhcmVudCgpID09IHRoaXMp
OwotCi0gICAgSW5saW5lSXRlcmF0b3IgaXQodGhpcywgaW5saW5lT2JqLCAwKTsKLSAgICAvLyBG
SVhNRTogV2Ugc2hvdWxkIHBhc3MgY29ycmVjdCB2YWx1ZSBmb3IgV2hpdGVzcGFjZVBvc2l0aW9u
LgotICAgIHdoaWxlICghaXQuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0KSkKLSAgICAg
ICAgaXQuaW5jcmVtZW50KCk7Ci0KLSAgICByZXR1cm4gIWl0LmF0RW5kKCk7Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2tGbG93OjphZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpCi17Ci0gICAg
aWYgKGF1dG8gbGF5b3V0ID0gc2ltcGxlTGluZUxheW91dCgpKSB7Ci0gICAgICAgIEFTU0VSVCgh
aGFzT3ZlcmZsb3dDbGlwKCkpOwotICAgICAgICBTaW1wbGVMaW5lTGF5b3V0Ojpjb2xsZWN0Rmxv
d092ZXJmbG93KCp0aGlzLCAqbGF5b3V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBM
YXlvdXRVbml0IGVuZFBhZGRpbmcgPSBoYXNPdmVyZmxvd0NsaXAoKSA/IHBhZGRpbmdFbmQoKSA6
IDBfbHU7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gZmluZCBhbm90aGVyIHdheSB0byBkbyB0aGlz
LCBzaW5jZSBzY3JvbGxiYXJzIGNvdWxkIHNob3cgd2hlbiB3ZSBkb24ndCB3YW50IHRoZW0gdG8u
Ci0gICAgaWYgKGhhc092ZXJmbG93Q2xpcCgpICYmICFlbmRQYWRkaW5nICYmIGVsZW1lbnQoKSAm
JiBlbGVtZW50KCktPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmIHN0eWxlKCkuaXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpKQotICAgICAgICBlbmRQYWRkaW5nID0gMTsKLSAgICBmb3IgKFJvb3RJ
bmxpbmVCb3gqIGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRS
b290Qm94KCkpIHsKLSAgICAgICAgYWRkTGF5b3V0T3ZlcmZsb3coY3Vyci0+cGFkZGVkTGF5b3V0
T3ZlcmZsb3dSZWN0KGVuZFBhZGRpbmcpKTsKLSAgICAgICAgUmVuZGVyRnJhZ21lbnRDb250YWlu
ZXIqIGZyYWdtZW50ID0gZW5jbG9zaW5nRnJhZ21lbnRlZEZsb3coKSA/IGN1cnItPmNvbnRhaW5p
bmdGcmFnbWVudCgpIDogbnVsbHB0cjsKLSAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAgICAg
ICAgZnJhZ21lbnQtPmFkZExheW91dE92ZXJmbG93Rm9yQm94KHRoaXMsIGN1cnItPnBhZGRlZExh
eW91dE92ZXJmbG93UmVjdChlbmRQYWRkaW5nKSk7Ci0gICAgICAgIGlmICghaGFzT3ZlcmZsb3dD
bGlwKCkpIHsKLSAgICAgICAgICAgIExheW91dFJlY3QgY2hpbGRWaXN1YWxPdmVyZmxvd1JlY3Qg
PSBjdXJyLT52aXN1YWxPdmVyZmxvd1JlY3QoY3Vyci0+bGluZVRvcCgpLCBjdXJyLT5saW5lQm90
dG9tKCkpOwotICAgICAgICAgICAgYWRkVmlzdWFsT3ZlcmZsb3coY2hpbGRWaXN1YWxPdmVyZmxv
d1JlY3QpOwotICAgICAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAgICAgICAgICAgIGZyYWdt
ZW50LT5hZGRWaXN1YWxPdmVyZmxvd0ZvckJveCh0aGlzLCBjaGlsZFZpc3VhbE92ZXJmbG93UmVj
dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxldGVF
bGxpcHNpc0xpbmVCb3hlcygpCi17Ci0gICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHls
ZSgpLnRleHRBbGlnbigpOwotICAgIGJvb2wgbHRyID0gc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGly
ZWN0aW9uKCk7Ci0gICAgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQgPSBJbmRlbnRU
ZXh0OwotICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJy
OyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICBpZiAoY3Vyci0+aGFzRWxs
aXBzaXNCb3goKSkgewotICAgICAgICAgICAgY3Vyci0+Y2xlYXJUcnVuY2F0aW9uKCk7Ci0KLSAg
ICAgICAgICAgIC8vIFNoaWZ0IHRoZSBsaW5lIGJhY2sgd2hlcmUgaXQgYmVsb25ncyBpZiB3ZSBj
YW5ub3QgYWNjb21vZGF0ZSBhbiBlbGxpcHNpcy4KLSAgICAgICAgICAgIGZsb2F0IGxvZ2ljYWxM
ZWZ0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5k
ZW50VGV4dCk7Ci0gICAgICAgICAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBsb2dp
Y2FsUmlnaHRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgRG9Ob3RJbmRlbnRUZXh0KSAt
IGxvZ2ljYWxMZWZ0OwotICAgICAgICAgICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSBjdXJy
LT5sb2dpY2FsV2lkdGgoKTsKLSAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdu
bWVudCh0ZXh0QWxpZ24sIGN1cnIsIDAsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwg
YXZhaWxhYmxlTG9naWNhbFdpZHRoLCAwKTsKLQotICAgICAgICAgICAgaWYgKGx0cikKLSAgICAg
ICAgICAgICAgICBjdXJyLT5hZGp1c3RMb2dpY2FsUG9zaXRpb24oKGxvZ2ljYWxMZWZ0IC0gY3Vy
ci0+bG9naWNhbExlZnQoKSksIDApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbigtKGN1cnItPmxvZ2ljYWxMZWZ0KCkgLSBsb2dp
Y2FsTGVmdCksIDApOwotICAgICAgICB9Ci0gICAgICAgIHNob3VsZEluZGVudFRleHQgPSBEb05v
dEluZGVudFRleHQ7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tMaW5l
c0ZvclRleHRPdmVyZmxvdygpCi17Ci0gICAgLy8gRGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUg
ZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KLSAgICAvLyBGSVhNRTogQ1NTMyBzYXlz
IHRoaXMgaXMgY29uZmlndXJhYmxlLCBhbHNvIG5lZWQgdG8gdXNlIDB4MDAyRSAoRlVMTCBTVE9Q
KSBpZiBob3Jpem9udGFsIGVsbGlwc2lzIGlzICJub3QgcmVuZGVyYWJsZSIKLSAgICBjb25zdCBG
b250Q2FzY2FkZSYgZm9udCA9IHN0eWxlKCkuZm9udENhc2NhZGUoKTsKLSAgICBzdGF0aWMgTmV2
ZXJEZXN0cm95ZWQ8QXRvbVN0cmluZz4gZWxsaXBzaXNTdHIoJmhvcml6b250YWxFbGxpcHNpcywg
MSk7Ci0gICAgY29uc3QgRm9udENhc2NhZGUmIGZpcnN0TGluZUZvbnQgPSBmaXJzdExpbmVTdHls
ZSgpLmZvbnRDYXNjYWRlKCk7Ci0gICAgZmxvYXQgZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA9IGZp
cnN0TGluZUZvbnQud2lkdGgoY29uc3RydWN0VGV4dFJ1bigmaG9yaXpvbnRhbEVsbGlwc2lzLCAx
LCBmaXJzdExpbmVTdHlsZSgpKSk7Ci0gICAgZmxvYXQgZWxsaXBzaXNXaWR0aCA9IChmb250ID09
IGZpcnN0TGluZUZvbnQpID8gZmlyc3RMaW5lRWxsaXBzaXNXaWR0aCA6IGZvbnQud2lkdGgoY29u
c3RydWN0VGV4dFJ1bigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxLCBzdHlsZSgpKSk7Ci0KLSAgICAv
LyBGb3IgTFRSIHRleHQgdHJ1bmNhdGlvbiwgd2Ugd2FudCB0byBnZXQgdGhlIHJpZ2h0IGVkZ2Ug
b2Ygb3VyIHBhZGRpbmcgYm94LCBhbmQgdGhlbiB3ZSB3YW50IHRvIHNlZQotICAgIC8vIGlmIHRo
ZSByaWdodCBlZGdlIG9mIGEgbGluZSBib3ggZXhjZWVkcyB0aGF0LiAgRm9yIFJUTCwgd2UgdXNl
IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHBhZGRpbmcgYm94IGFuZAotICAgIC8vIGNoZWNrIHRoZSBs
ZWZ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94IHRvIHNlZSBpZiBpdCBpcyBsZXNzCi0gICAgLy8gSW5j
bHVkZSB0aGUgc2Nyb2xsYmFyIGZvciBvdmVyZmxvdyBibG9ja3MsIHdoaWNoIG1lYW5zIHdlIHdh
bnQgdG8gdXNlICJjb250ZW50V2lkdGgoKSIKLSAgICBib29sIGx0ciA9IHN0eWxlKCkuaXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpOwotICAgIFRleHRBbGlnbk1vZGUgdGV4dEFsaWduID0gc3R5bGUo
KS50ZXh0QWxpZ24oKTsKLSAgICBib29sIGZpcnN0TGluZSA9IHRydWU7Ci0gICAgZm9yIChSb290
SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0
Um9vdEJveCgpKSB7Ci0gICAgICAgIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0ID0g
Zmlyc3RMaW5lID8gSW5kZW50VGV4dCA6IERvTm90SW5kZW50VGV4dDsKLSAgICAgICAgTGF5b3V0
VW5pdCBibG9ja1JpZ2h0RWRnZSA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoY3Vyci0+bGlu
ZVRvcCgpLCBzaG91bGRJbmRlbnRUZXh0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBibG9ja0xlZnRF
ZGdlID0gbG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKGN1cnItPmxpbmVUb3AoKSwgc2hvdWxkSW5k
ZW50VGV4dCk7Ci0gICAgICAgIExheW91dFVuaXQgbGluZUJveEVkZ2UgeyBsdHIgPyBjdXJyLT54
KCkgKyBjdXJyLT5sb2dpY2FsV2lkdGgoKSA6IGN1cnItPngoKSB9OwotICAgICAgICBpZiAoKGx0
ciAmJiBsaW5lQm94RWRnZSA+IGJsb2NrUmlnaHRFZGdlKSB8fCAoIWx0ciAmJiBsaW5lQm94RWRn
ZSA8IGJsb2NrTGVmdEVkZ2UpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGxpbmUgc3BpbGxzIG91
dCBvZiBvdXIgYm94IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uICBOb3cgd2UgbmVlZCB0
byBzZWUgaWYgdGhlIGxpbmUKLSAgICAgICAgICAgIC8vIGNhbiBiZSB0cnVuY2F0ZWQuICBJbiBv
cmRlciBmb3IgdHJ1bmNhdGlvbiB0byBiZSBwb3NzaWJsZSwgdGhlIGxpbmUgbXVzdCBoYXZlIHN1
ZmZpY2llbnQgc3BhY2UgdG8KLSAgICAgICAgICAgIC8vIGFjY29tbW9kYXRlIG91ciB0cnVuY2F0
aW9uIHN0cmluZywgYW5kIG5vIHJlcGxhY2VkIGVsZW1lbnRzIChpbWFnZXMsIHRhYmxlcykgY2Fu
IG92ZXJsYXAgdGhlIGVsbGlwc2lzCi0gICAgICAgICAgICAvLyBzcGFjZS4KLSAgICAgICAgICAg
IExheW91dFVuaXQgd2lkdGggeyBmaXJzdExpbmUgPyBmaXJzdExpbmVFbGxpcHNpc1dpZHRoIDog
ZWxsaXBzaXNXaWR0aCB9OwotICAgICAgICAgICAgTGF5b3V0VW5pdCBibG9ja0VkZ2UgeyBsdHIg
PyBibG9ja1JpZ2h0RWRnZSA6IGJsb2NrTGVmdEVkZ2UgfTsKLSAgICAgICAgICAgIGlmIChjdXJy
LT5saW5lQ2FuQWNjb21tb2RhdGVFbGxpcHNpcyhsdHIsIGJsb2NrRWRnZSwgbGluZUJveEVkZ2Us
IHdpZHRoKSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHRvdGFsTG9naWNhbFdpZHRoID0gY3Vy
ci0+cGxhY2VFbGxpcHNpcyhlbGxpcHNpc1N0ciwgbHRyLCBibG9ja0xlZnRFZGdlLCBibG9ja1Jp
Z2h0RWRnZSwgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgZmxvYXQgbG9naWNhbExlZnQgPSAw
OyAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBkZWx0YSBmcm9tIHRoZSBiYXNlIHBv
c2l0aW9uLgotICAgICAgICAgICAgICAgIGZsb2F0IHRydW5jYXRlZFdpZHRoID0gYXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yTGluZShjdXJyLT5saW5lVG9wKCksIHNob3VsZEluZGVudFRleHQpOwot
ICAgICAgICAgICAgICAgIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFsaWdubWVudCh0ZXh0QWxpZ24s
IGN1cnIsIG51bGxwdHIsIGxvZ2ljYWxMZWZ0LCB0b3RhbExvZ2ljYWxXaWR0aCwgdHJ1bmNhdGVk
V2lkdGgsIDApOwotICAgICAgICAgICAgICAgIGlmIChsdHIpCi0gICAgICAgICAgICAgICAgICAg
IGN1cnItPmFkanVzdExvZ2ljYWxQb3NpdGlvbihsb2dpY2FsTGVmdCwgMCk7Ci0gICAgICAgICAg
ICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjdXJyLT5hZGp1c3RMb2dpY2FsUG9zaXRp
b24oLSh0cnVuY2F0ZWRXaWR0aCAtIChsb2dpY2FsTGVmdCArIHRvdGFsTG9naWNhbFdpZHRoKSks
IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpcnN0TGluZSA9IGZhbHNl
OwotICAgIH0KLX0KLQotYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbkxp
bmUoY29uc3QgRmxvYXRpbmdPYmplY3QmIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRo
KQotewotICAgIGlmICghcG9zaXRpb25OZXdGbG9hdHMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgd2lkdGguc2hyaW5rQXZhaWxhYmxlV2lkdGhGb3JOZXdGbG9hdElmTmVlZGVkKG5l
d0Zsb2F0KTsKLQotICAgIC8vIFdlIG9ubHkgY29ubmVjdCBmbG9hdHMgdG8gbGluZXMgZm9yIHBh
Z2luYXRpb24gcHVycG9zZXMgaWYgdGhlIGZsb2F0cyBvY2N1ciBhdCB0aGUgc3RhcnQgb2YKLSAg
ICAvLyB0aGUgbGluZSBhbmQgdGhlIHByZXZpb3VzIGxpbmUgaGFkIGEgaGFyZCBicmVhayAoc28g
dGhpcyBsaW5lIGlzIGVpdGhlciB0aGUgZmlyc3QgaW4gdGhlIGJsb2NrCi0gICAgLy8gb3IgZm9s
bG93cyBhIDxicj4pLgotICAgIGlmICghbmV3RmxvYXQucGFnaW5hdGlvblN0cnV0KCkgfHwgIWxp
bmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpIHx8ICFsaW5lSW5mby5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZs
b2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgIEFTU0VSVChm
bG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCkgPT0gJm5ld0Zsb2F0KTsKLQotICAgIExheW91
dFVuaXQgZmxvYXRMb2dpY2FsVG9wID0gbG9naWNhbFRvcEZvckZsb2F0KG5ld0Zsb2F0KTsKLSAg
ICBMYXlvdXRVbml0IHBhZ2luYXRpb25TdHJ1dCA9IG5ld0Zsb2F0LnBhZ2luYXRpb25TdHJ1dCgp
OwotCi0gICAgaWYgKGZsb2F0TG9naWNhbFRvcCAtIHBhZ2luYXRpb25TdHJ1dCAhPSBsb2dpY2Fs
SGVpZ2h0KCkgKyBsaW5lSW5mby5mbG9hdFBhZ2luYXRpb25TdHJ1dCgpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLQotICAgIGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICAt
LWl0OyAvLyBMYXN0IGZsb2F0IGlzIG5ld0Zsb2F0LCBza2lwIHRoYXQgb25lLgotICAgIGF1dG8g
YmVnaW4gPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBiZWdp
bikgewotICAgICAgICAtLWl0OwotICAgICAgICBhdXRvJiBmbG9hdGluZ09iamVjdCA9ICppdC0+
Z2V0KCk7Ci0gICAgICAgIGlmICgmZmxvYXRpbmdPYmplY3QgPT0gbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobG9naWNhbFRvcEZvckZs
b2F0KGZsb2F0aW5nT2JqZWN0KSA9PSBsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSW5mby5mbG9hdFBh
Z2luYXRpb25TdHJ1dCgpKSB7Ci0gICAgICAgICAgICBmbG9hdGluZ09iamVjdC5zZXRQYWdpbmF0
aW9uU3RydXQocGFnaW5hdGlvblN0cnV0ICsgZmxvYXRpbmdPYmplY3QucGFnaW5hdGlvblN0cnV0
KCkpOwotICAgICAgICAgICAgUmVuZGVyQm94JiBmbG9hdEJveCA9IGZsb2F0aW5nT2JqZWN0LnJl
bmRlcmVyKCk7Ci0gICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoZmxvYXRCb3gsIGxv
Z2ljYWxUb3BGb3JDaGlsZChmbG9hdEJveCkgKyBtYXJnaW5CZWZvcmVGb3JDaGlsZChmbG9hdEJv
eCkgKyBwYWdpbmF0aW9uU3RydXQpOwotCi0gICAgICAgICAgICBpZiAodXBkYXRlRnJhZ21lbnRS
YW5nZUZvckJveENoaWxkKGZsb2F0Qm94KSkKLSAgICAgICAgICAgICAgICBmbG9hdEJveC5zZXRO
ZWVkc0xheW91dChNYXJrT25seVRoaXMpOwotICAgICAgICAgICAgZWxzZSBpZiAoaXM8UmVuZGVy
QmxvY2s+KGZsb2F0Qm94KSkKLSAgICAgICAgICAgICAgICBkb3duY2FzdDxSZW5kZXJCbG9jaz4o
ZmxvYXRCb3gpLnNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsKLSAgICAgICAgICAg
IGZsb2F0Qm94LmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgICAgIC8vIFNhdmUgdGhlIG9s
ZCBsb2dpY2FsIHRvcCBiZWZvcmUgY2FsbGluZyByZW1vdmVQbGFjZWRPYmplY3Qgd2hpY2ggd2ls
bCBzZXQKLSAgICAgICAgICAgIC8vIGlzUGxhY2VkIHRvIGZhbHNlLiBPdGhlcndpc2UgaXQgd2ls
bCB0cmlnZ2VyIGFuIGFzc2VydCBpbiBsb2dpY2FsVG9wRm9yRmxvYXQuCi0gICAgICAgICAgICBM
YXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yRmxvYXQoZmxvYXRpbmdPYmpl
Y3QpOwotICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPnJlbW92ZVBsYWNlZE9iamVjdCgm
ZmxvYXRpbmdPYmplY3QpOwotICAgICAgICAgICAgc2V0TG9naWNhbFRvcEZvckZsb2F0KGZsb2F0
aW5nT2JqZWN0LCBvbGRMb2dpY2FsVG9wICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5hZGRQbGFjZWRPYmplY3QoJmZsb2F0aW5nT2JqZWN0KTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIEp1c3QgdXBkYXRlIHRoZSBsaW5lIGluZm8ncyBwYWdp
bmF0aW9uIHN0cnV0IHdpdGhvdXQgYWx0ZXJpbmcgb3VyIGxvZ2ljYWwgaGVpZ2h0IHlldC4gSWYg
dGhlIGxpbmUgZW5kcyB1cCBjb250YWluaW5nCi0gICAgLy8gbm8gY29udGVudCwgdGhlbiB3ZSBk
b24ndCB3YW50IHRvIGltcHJvcGVybHkgZ3JvdyB0aGUgaGVpZ2h0IG9mIHRoZSBibG9jay4KLSAg
ICBsaW5lSW5mby5zZXRGbG9hdFBhZ2luYXRpb25TdHJ1dChsaW5lSW5mby5mbG9hdFBhZ2luYXRp
b25TdHJ1dCgpICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotTGF5
b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OnN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUoTGF5b3V0
VW5pdCBwb3NpdGlvbiwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQpCi17Ci0gICAg
VGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24gPSBzdHlsZSgpLnRleHRBbGlnbigpOwotICAgIGJvb2wg
c2hvdWxkQXBwbHlJbmRlbnRUZXh0ID0gZmFsc2U7Ci0gICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsK
LSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpX
ZWJLaXRMZWZ0OgotICAgICAgICBzaG91bGRBcHBseUluZGVudFRleHQgPSBzdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUZXh0QWxpZ25N
b2RlOjpSaWdodDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgotICAgICAg
ICBzaG91bGRBcHBseUluZGVudFRleHQgPSAhc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6U3RhcnQ6Ci0gICAg
ICAgIHNob3VsZEFwcGx5SW5kZW50VGV4dCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRl
ZmF1bHQ6Ci0gICAgICAgIHNob3VsZEFwcGx5SW5kZW50VGV4dCA9IGZhbHNlOwotICAgIH0KLSAg
ICAvLyA8cmRhcjovL3Byb2JsZW0vMTU0Mjc1NzE+Ci0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDUyMgotICAgIC8vIFRoaXMgcXVpcmsgaXMgZm9yIGxl
Z2FjeSBjb250ZW50IHRoYXQgZG9lc24ndCB3b3JrIHByb3Blcmx5IHdpdGggdGhlIGNlbnRlciBw
b3NpdGlvbmluZyBzY2hlbWUKLSAgICAvLyBiZWluZyBob25vcmVkIChlLmcuLCBlcHVicykuCi0g
ICAgaWYgKHNob3VsZEFwcGx5SW5kZW50VGV4dCB8fCBzZXR0aW5ncygpLnVzZUxlZ2FjeVRleHRB
bGlnblBvc2l0aW9uZWRFbGVtZW50QmVoYXZpb3IoKSkgLy8gRklYTUU6IEhhbmRsZSBUZXh0QWxp
Z25Nb2RlOjpFbmQgaGVyZQotICAgICAgICByZXR1cm4gc3RhcnRPZmZzZXRGb3JMaW5lKHBvc2l0
aW9uLCBzaG91bGRJbmRlbnRUZXh0KTsKLQotICAgIC8vIHVwZGF0ZUxvZ2ljYWxXaWR0aEZvckFs
aWdubWVudCgpIGhhbmRsZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgc28gbm8gbmVlZCB0
byBjb25zaWRlciBpdCBoZXJlCi0gICAgZmxvYXQgdG90YWxMb2dpY2FsV2lkdGggPSAwOwotICAg
IGZsb2F0IGxvZ2ljYWxMZWZ0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKGxvZ2ljYWxIZWln
aHQoKSwgRG9Ob3RJbmRlbnRUZXh0KTsKLSAgICBmbG9hdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgg
PSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKGxvZ2ljYWxIZWlnaHQoKSwgRG9Ob3RJbmRlbnRU
ZXh0KSAtIGxvZ2ljYWxMZWZ0OwotCi0gICAgLy8gRklYTUU6IEJ1ZyAxMjkzMTE6IFdlIG5lZWQg
dG8gcGFzcyBhIHZhbGlkIFJvb3RJbmxpbmVCb3ggaGVyZSwgY29uc2lkZXJpbmcgdGhlIGJpZGkg
bGV2ZWwgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGxpbmUuCi0gICAgdXBkYXRlTG9naWNhbFdpZHRo
Rm9yQWxpZ25tZW50KHRleHRBbGlnbiwgMCwgMCwgbG9naWNhbExlZnQsIHRvdGFsTG9naWNhbFdp
ZHRoLCBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIDApOwotCi0gICAgaWYgKCFzdHlsZSgpLmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgcmV0dXJuIExheW91dFVuaXQobG9naWNhbFdp
ZHRoKCkgLSBsb2dpY2FsTGVmdCk7Ci0gICAgcmV0dXJuIExheW91dFVuaXQobG9naWNhbExlZnQp
OwotfQotCi12b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlRnJhZ21lbnRGb3JMaW5lKFJvb3RJ
bmxpbmVCb3gqIGxpbmVCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxpbmVCb3gpOwotCi0gICAg
aWYgKCFoYXNGcmFnbWVudFJhbmdlSW5GcmFnbWVudGVkRmxvdygpKQotICAgICAgICBsaW5lQm94
LT5jbGVhckNvbnRhaW5pbmdGcmFnbWVudCgpOwotICAgIGVsc2UgewotICAgICAgICBpZiAoYXV0
byBjb250YWluaW5nRnJhZ21lbnQgPSBmcmFnbWVudEF0QmxvY2tPZmZzZXQobGluZUJveC0+bGlu
ZVRvcFdpdGhMZWFkaW5nKCkpKQotICAgICAgICAgICAgbGluZUJveC0+c2V0Q29udGFpbmluZ0Zy
YWdtZW50KCpjb250YWluaW5nRnJhZ21lbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBs
aW5lQm94LT5jbGVhckNvbnRhaW5pbmdGcmFnbWVudCgpOwotICAgIH0KLQotICAgIFJvb3RJbmxp
bmVCb3gqIHByZXZMaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKLSAgICBpZiAoIXBy
ZXZMaW5lQm94KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIGNoZWNrIGlzIG1vcmUg
YWNjdXJhdGUgdGhhbiB0aGUgb25lIGluIHxhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9u
fCBiZWNhdXNlIGl0IHRha2VzIGludG8KLSAgICAvLyBhY2NvdW50IGp1c3QgdGhlIGNvbnRhaW5l
ciBjaGFuZ2VzIGJldHdlZW4gbGluZXMuIFRoZSBiZWZvcmUgbWVudGlvbmVkIGZ1bmN0aW9uIGRv
ZXNuJ3Qgc2V0IHRoZSBmbGFnCi0gICAgLy8gY29ycmVjdGx5IGlmIHRoZSBsaW5lIGlzIHBvc2l0
aW9uZWQgYXQgdGhlIHRvcCBvZiB0aGUgbGFzdCBmcmFnbWVudCBjb250YWluZXIuCi0gICAgaWYg
KGxpbmVCb3gtPmNvbnRhaW5pbmdGcmFnbWVudCgpICE9IHByZXZMaW5lQm94LT5jb250YWluaW5n
RnJhZ21lbnQoKSkKLSAgICAgICAgbGluZUJveC0+c2V0SXNGaXJzdEFmdGVyUGFnZUJyZWFrKHRy
dWUpOwotfQotCi19CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcApfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkRlbGV0ZWQ6IHN2bjplb2wt
c3R5bGUKIyMgLTEgKzAsMCAjIwotbmF0aXZlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVy
dHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAko
cmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlC
YXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjAsNyArNjAsNyBAQCBSZW5kZXJSdWJ5UnVuKiBS
ZW5kZXJSdWJ5QmFzZTo6cnVieVJ1bigpCiAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlclJ1YnlS
dW4+KHBhcmVudCgpKTsKIH0KIAotVGV4dEFsaWduTW9kZSBSZW5kZXJSdWJ5QmFzZTo6dGV4dEFs
aWdubWVudEZvckxpbmUoYm9vbCAvKiBlbmRzV2l0aFNvZnRCcmVhayAqLykgY29uc3QKK09wdGlv
bmFsPFRleHRBbGlnbk1vZGU+IFJlbmRlclJ1YnlCYXNlOjpvdmVycmlkZVRleHRBbGlnbm1lbnRG
b3JMaW5lKGJvb2wgLyogZW5kc1dpdGhTb2Z0QnJlYWsgKi8pIGNvbnN0CiB7CiAgICAgcmV0dXJu
IFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyUnVieUJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyUnVieUJhc2UuaAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDcg
QEAgcHVibGljOgogcHJpdmF0ZToKICAgICBib29sIGlzUnVieUJhc2UoKSBjb25zdCBvdmVycmlk
ZSB7IHJldHVybiB0cnVlOyB9CiAgICAgYm9vbCBpc0NoaWxkQWxsb3dlZChjb25zdCBSZW5kZXJP
YmplY3QmLCBjb25zdCBSZW5kZXJTdHlsZSYpIGNvbnN0IG92ZXJyaWRlOwotICAgIFRleHRBbGln
bk1vZGUgdGV4dEFsaWdubWVudEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3Qg
b3ZlcnJpZGU7CisgICAgT3B0aW9uYWw8VGV4dEFsaWduTW9kZT4gb3ZlcnJpZGVUZXh0QWxpZ25t
ZW50Rm9yTGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdCBvdmVycmlkZTsKICAgICB2
b2lkIGFkanVzdElubGluZURpcmVjdGlvbkxpbmVCb3VuZHMoaW50IGV4cGFuc2lvbk9wcG9ydHVu
aXR5Q291bnQsIGZsb2F0JiBsb2dpY2FsTGVmdCwgZmxvYXQmIGxvZ2ljYWxXaWR0aCkgY29uc3Qg
b3ZlcnJpZGU7CiAKICAgICBmbG9hdCBtX2luaXRpYWxPZmZzZXQ7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieVRleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5jcHAJKHJldmlzaW9uIDI0ODUwMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTU3LDEyICs1NywxMiBAQCBib29sIFJlbmRlclJ1YnlUZXh0Ojppc0NoaWxkQWxsb3dl
ZChjb25zCiAgICAgcmV0dXJuIGNoaWxkLmlzSW5saW5lKCk7CiB9CiAKLVRleHRBbGlnbk1vZGUg
UmVuZGVyUnVieVRleHQ6OnRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dpdGhTb2Z0QnJl
YWspIGNvbnN0CitPcHRpb25hbDxUZXh0QWxpZ25Nb2RlPiBSZW5kZXJSdWJ5VGV4dDo6b3ZlcnJp
ZGVUZXh0QWxpZ25tZW50Rm9yTGluZShib29sKSBjb25zdAogewogICAgIFRleHRBbGlnbk1vZGUg
dGV4dEFsaWduID0gc3R5bGUoKS50ZXh0QWxpZ24oKTsKICAgICAvLyBGSVhNRTogVGhpcyBjaGVj
ayBpcyBib2d1cyBzaW5jZSB1c2VyIGNhbiBzZXQgdGhlIGluaXRpYWwgdmFsdWUuCiAgICAgaWYg
KHRleHRBbGlnbiAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFRleHRBbGlnbigpKQotICAgICAgICBy
ZXR1cm4gUmVuZGVyQmxvY2tGbG93Ojp0ZXh0QWxpZ25tZW50Rm9yTGluZShlbmRzV2l0aFNvZnRC
cmVhayk7CisgICAgICAgIHJldHVybiB7IH07CiAKICAgICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlv
ciBpcyB0byBhbGxvdyBydWJ5IHRleHQgdG8gZXhwYW5kIGlmIGl0IGlzIHNob3J0ZXIgdGhhbiB0
aGUgcnVieSBiYXNlLgogICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OwpJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlUZXh0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlUZXh0LmgJKHJldmlzaW9uIDI0ODUw
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5VGV4dC5oCSh3b3JraW5n
IGNvcHkpCkBAIC01NCw3ICs1NCw3IEBAIHByaXZhdGU6CiAKICAgICBib29sIGF2b2lkc0Zsb2F0
cygpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ25tZW50Rm9y
TGluZShib29sIGVuZHNXaXRoU29mdEJyZWFrKSBjb25zdCBvdmVycmlkZTsKKyAgICBPcHRpb25h
bDxUZXh0QWxpZ25Nb2RlPiBvdmVycmlkZVRleHRBbGlnbm1lbnRGb3JMaW5lKGJvb2wgZW5kc1dp
dGhTb2Z0QnJlYWspIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgYWRqdXN0SW5saW5lRGlyZWN0
aW9uTGluZUJvdW5kcyhpbnQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCwgZmxvYXQmIGxvZ2lj
YWxMZWZ0LCBmbG9hdCYgbG9naWNhbFdpZHRoKSBjb25zdCBvdmVycmlkZTsKIH07CiAKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9TaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvU2ltcGxlTGluZUxheW91dEZ1
bmN0aW9ucy5jcHAJKHJldmlzaW9uIDI0ODUwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9TaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzU2LDcg
KzM1Niw3IEBAIHZvaWQgZ2VuZXJhdGVMaW5lQm94VHJlZShSZW5kZXJCbG9ja0Zsb3cKICAgICAg
ICAgLy8gbGluZUluZm8uc2V0TGFzdExpbmUobGFzdExpbmUpOwogICAgICAgICBsaW5lSW5mby5z
ZXRFbXB0eSghYmlkaVJ1bnMucnVuQ291bnQoKSk7CiAgICAgICAgIGJpZGlSdW5zLnNldExvZ2lj
YWxseUxhc3RSdW4oYmlkaVJ1bnMubGFzdFJ1bigpKTsKLSAgICAgICAgYXV0byogcm9vdCA9IGZs
b3cuY29uc3RydWN0TGluZShiaWRpUnVucywgbGluZUluZm8pOworICAgICAgICBhdXRvKiByb290
ID0gZmxvdy5jb21wbGV4TGluZUxheW91dCgpLmNvbnN0cnVjdExpbmUoYmlkaVJ1bnMsIGxpbmVJ
bmZvKTsKICAgICAgICAgYmlkaVJ1bnMuY2xlYXIoKTsKICAgICAgICAgaWYgKCFyb290KQogICAg
ICAgICAgICAgY29udGludWU7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9M
aW5lQnJlYWtlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xp
bmUvTGluZUJyZWFrZXIuY3BwCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY2LDcgKzY2
LDcgQEAgdm9pZCBMaW5lQnJlYWtlcjo6c2tpcExlYWRpbmdXaGl0ZXNwYWNlKAogICAgICAgICAg
ICAgICAgIGxpbmVJbmZvLmluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKICAg
ICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKQotICAg
ICAgICAgICAgbV9ibG9jay5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKCptX2Jsb2NrLmluc2VydEZs
b2F0aW5nT2JqZWN0KGRvd25jYXN0PFJlbmRlckJveD4ob2JqZWN0KSksIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7CisgICAgICAgICAgICBtX2Jsb2NrLmNvbXBs
ZXhMaW5lTGF5b3V0KCkucG9zaXRpb25OZXdGbG9hdE9uTGluZSgqbV9ibG9jay5pbnNlcnRGbG9h
dGluZ09iamVjdChkb3duY2FzdDxSZW5kZXJCb3g+KG9iamVjdCkpLCBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCBsaW5lSW5mbywgd2lkdGgpOwogICAgICAgICBlbHNlIGlmIChvYmplY3Quc3R5
bGUoKS5oYXNUZXh0Q29tYmluZSgpICYmIGlzPFJlbmRlckNvbWJpbmVUZXh0PihvYmplY3QpKSB7
CiAgICAgICAgICAgICBkb3duY2FzdDxSZW5kZXJDb21iaW5lVGV4dD4ob2JqZWN0KS5jb21iaW5l
VGV4dElmTmVlZGVkKCk7CiAgICAgICAgICAgICBpZiAoZG93bmNhc3Q8UmVuZGVyQ29tYmluZVRl
eHQ+KG9iamVjdCkuaXNDb21iaW5lZCgpKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L2xpbmUvTGluZUJyZWFrZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lQnJlYWtlci5oCShyZXZpc2lvbiAyNDg1MDApCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02Niw3ICs2
Niw3IEBAIHByaXZhdGU6CiAgICAgRmxvYXRpbmdPYmplY3QqIGluc2VydEZsb2F0aW5nT2JqZWN0
KFJlbmRlckJveCYgZmxvYXRCb3gpIHsgcmV0dXJuIG1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmpl
Y3QoZmxvYXRCb3gpOyB9CiAgICAgYm9vbCBwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGNvbnN0IEZs
b2F0aW5nT2JqZWN0JiBuZXdGbG9hdCwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUsIExpbmVJbmZvJiBsaW5lSW5mbywgTGluZVdpZHRoJiB3aWR0aCkKICAgICB7Ci0g
ICAgICAgIHJldHVybiBtX2Jsb2NrLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUobmV3RmxvYXQsIGxh
c3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7CisgICAgICAgIHJldHVy
biBtX2Jsb2NrLmNvbXBsZXhMaW5lTGF5b3V0KCkucG9zaXRpb25OZXdGbG9hdE9uTGluZShuZXdG
bG9hdCwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbGluZUluZm8sIHdpZHRoKTsKICAgICB9
CiAKICAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJzLmgJKHJldmlzaW9uIDI0ODUw
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNs
dWRlICJMaW5lSW5mby5oIgogI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKQEAgLTEyOSw3ICsxMzAsNyBAQCBpbmxpbmUgdm9pZCBzZXRTdGF0aWNQb3NpdGlv
bnMoUmVuZGVyQmxvCiAgICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxpbmUgZW5j
bG9zZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIKICAg
ICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQgfHN0YXRp
Y0lubGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSByZWxhdGl2
ZSBwb3NpdGlvbmVkCiAgICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRhaW4gdGhl
IHZhbHVlIGxhdGVyLgotICAgICAgICBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpjb250YWluZXJC
bG9jaykubGF5ZXIoKS0+c2V0U3RhdGljSW5saW5lUG9zaXRpb24oYmxvY2suc3RhcnRBbGlnbmVk
T2Zmc2V0Rm9yTGluZShibG9ja0hlaWdodCwgRG9Ob3RJbmRlbnRUZXh0KSk7CisgICAgICAgIGRv
d25jYXN0PFJlbmRlcklubGluZT4oKmNvbnRhaW5lckJsb2NrKS5sYXllcigpLT5zZXRTdGF0aWNJ
bmxpbmVQb3NpdGlvbihibG9jay5jb21wbGV4TGluZUxheW91dCgpLnN0YXJ0QWxpZ25lZE9mZnNl
dEZvckxpbmUoYmxvY2tIZWlnaHQsIERvTm90SW5kZW50VGV4dCkpOwogICAgICAgICBkb3duY2Fz
dDxSZW5kZXJJbmxpbmU+KCpjb250YWluZXJCbG9jaykubGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQ
b3NpdGlvbihibG9ja0hlaWdodCk7CiAgICAgfQogICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGlu
ZVBvc2l0aW9uRm9yQ2hpbGQoY2hpbGQsIGJsb2NrSGVpZ2h0LCBzaG91bGRJbmRlbnRUZXh0KTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUZXh0LmNw
cAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5k
ZXJTVkdUZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDI1LDEzICs0MjUsNiBAQCB2b2lkIFJl
bmRlclNWR1RleHQ6OmxheW91dCgpCiAgICAgY2xlYXJOZWVkc0xheW91dCgpOwogfQogCi1zdGQ6
OnVuaXF1ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyU1ZHVGV4dDo6Y3JlYXRlUm9vdElubGlu
ZUJveCgpCi17Ci0gICAgYXV0byBib3ggPSBzdGQ6Om1ha2VfdW5pcXVlPFNWR1Jvb3RJbmxpbmVC
b3g+KCp0aGlzKTsKLSAgICBib3gtPnNldEhhc1ZpcnR1YWxMb2dpY2FsSGVpZ2h0KCk7Ci0gICAg
cmV0dXJuIGJveDsKLX0KLQogYm9vbCBSZW5kZXJTVkdUZXh0Ojpub2RlQXRGbG9hdFBvaW50KGNv
bnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50SW5QYXJlbnQsIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikK
IHsKICAgICBQb2ludGVyRXZlbnRzSGl0UnVsZXMgaGl0UnVsZXMoUG9pbnRlckV2ZW50c0hpdFJ1
bGVzOjpTVkdfVEVYVF9ISVRURVNUSU5HLCByZXF1ZXN0LCBzdHlsZSgpLnBvaW50ZXJFdmVudHMo
KSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RleHQu
aAkocmV2aXNpb24gMjQ4NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5k
ZXJTVkdUZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTg3LDcgKzg3LDYgQEAgcHJpdmF0ZToKIAog
ICAgIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgbG9jYWxUb1BhcmVudFRyYW5zZm9ybSgpIGNvbnN0
IG92ZXJyaWRlIHsgcmV0dXJuIG1fbG9jYWxUcmFuc2Zvcm07IH0KICAgICBBZmZpbmVUcmFuc2Zv
cm0gbG9jYWxUcmFuc2Zvcm0oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2xvY2FsVHJhbnNm
b3JtOyB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJbmxp
bmVCb3goKSBvdmVycmlkZTsKIAogICAgIFJlbmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNv
bnN0IG92ZXJyaWRlOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvdXBkYXRpbmcv
UmVuZGVyVHJlZUJ1aWxkZXJMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvdXBkYXRpbmcvUmVuZGVyVHJlZUJ1aWxkZXJMaXN0LmNwcAkocmV2aXNpb24gMjQ4
NTAwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3VwZGF0aW5nL1JlbmRlclRyZWVCdWls
ZGVyTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJSZW5kZXJUcmVlQnVpbGRlckxpc3QuaCIKIAorI2luY2x1ZGUg
IklubGluZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGluZUlubGluZUhlYWRlcnMuaCIKICNpbmNs
dWRlICJSZW5kZXJDaGlsZEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5o
IgogI2luY2x1ZGUgIlJlbmRlck11bHRpQ29sdW1uRmxvdy5oIgpAQCAtMzIsNiArMzQsMTUgQEAK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCisvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgbmVlZCBJ
bmxpbmVJdGVyYXRvcgorc3RhdGljIGJvb2wgZ2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hp
bGQoUmVuZGVyQmxvY2smIGN1cnJlbnQsIFJlbmRlck9iamVjdCogaW5saW5lT2JqKQoreworICAg
IElubGluZUl0ZXJhdG9yIGl0KCZjdXJyZW50LCBpbmxpbmVPYmosIDApOworICAgIHdoaWxlICgh
aXQuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0KSkKKyAgICAgICAgaXQuaW5jcmVtZW50
KCk7CisgICAgcmV0dXJuICFpdC5hdEVuZCgpOworfQorCiBzdGF0aWMgUmVuZGVyQmxvY2sqIGdl
dFBhcmVudE9mRmlyc3RMaW5lQm94KFJlbmRlckJsb2NrJiBjdXJyZW50LCBSZW5kZXJPYmplY3Qm
IG1hcmtlcikKIHsKICAgICBib29sIGluUXVpcmtzTW9kZSA9IGN1cnJlbnQuZG9jdW1lbnQoKS5p
blF1aXJrc01vZGUoKTsKQEAgLTM5LDcgKzUwLDcgQEAgc3RhdGljIFJlbmRlckJsb2NrKiBnZXRQ
YXJlbnRPZkZpcnN0TGluZQogICAgICAgICBpZiAoJmNoaWxkID09ICZtYXJrZXIpCiAgICAgICAg
ICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoY2hpbGQuaXNJbmxpbmUoKSAmJiAoIWlzPFJl
bmRlcklubGluZT4oY2hpbGQpIHx8IGN1cnJlbnQuZ2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5l
Q2hpbGQoJmNoaWxkKSkpCisgICAgICAgIGlmIChjaGlsZC5pc0lubGluZSgpICYmICghaXM8UmVu
ZGVySW5saW5lPihjaGlsZCkgfHwgZ2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoY3Vy
cmVudCwgJmNoaWxkKSkpCiAgICAgICAgICAgICByZXR1cm4gJmN1cnJlbnQ7CiAKICAgICAgICAg
aWYgKGNoaWxkLmlzRmxvYXRpbmcoKSB8fCBjaGlsZC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkK
</data>

          </attachment>
      

    </bug>

</bugzilla>